diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml new file mode 100644 index 00000000..424ec283 --- /dev/null +++ b/.github/workflows/cd.yml @@ -0,0 +1,43 @@ +name: CD Workflow + +on: + push: + branches: + - "main" + +permissions: + contents: read + id-token: write + +jobs: + deploy: + runs-on: ubuntu-latest + environment: + name: pypi + steps: + - uses: actions/checkout@v4 + + - name: Setup Python 3.8.13 + uses: actions/setup-python@v3 + with: + python-version: "3.8.13" + + - name: Setup Miniconda + uses: conda-incubator/setup-miniconda@v2 + with: + python-version: 3.8.13 + auto-activate-base: false + + - name: Build package + shell: bash -l {0} + run: | + conda create -n deploy_env python=3.8.13 libgdal=3.5.2 build -c conda-forge -y + conda activate deploy_env + python -m build -C--global-option=bdist_wheel -C--global-option=--build-number=0 --wheel + + - name: Publish package + uses: pypa/gh-action-pypi-publish@release/v1 + with: + user: __token__ + verbose: true + password: ${{ secrets.PYPI_PASSWORD }} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..1201d2b9 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,53 @@ +name: CI Workflow + +on: + pull_request: + branches: + - "main" +permissions: + contents: read + +jobs: + quality: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup Python 3.8.13 + uses: actions/setup-python@v3 + with: + python-version: "3.8.13" + - name: Create test env + shell: bash -l {0} + run: | + pip install pylint mccabe + - name: code quality + shell: bash -l {0} + run: | + pylint --disable=all --fail-under=10 --enable=too-many-statements src/eolab/rastertools/ + pylint --disable=all --fail-under=10 --enable=too-many-nested-blocks src/eolab/rastertools/ + ./continuous_integration/scripts/check_mccabe_complexity.sh 25 src/eolab/rastertools + test: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup Python 3.8.13 + uses: actions/setup-python@v3 + with: + python-version: "3.8.13" + - name: Setup Miniconda + uses: conda-incubator/setup-miniconda@v2 + with: + python-version: 3.8.13 + auto-activate-base: false + - name: Create test env + shell: bash -l {0} + run: | + conda create -n test_env python=3.8.13 libgdal=3.5.2 -c conda-forge -c defaults -y + conda activate test_env + PIP_NO_BINARY=rasterio,rioxarray pip install . + pip install pylint mccabe + - name: test + shell: bash -l {0} + run: | + conda activate test_env + pytest --cov-fail-under=65 --compare --durations=0 diff --git a/.gitignore b/.gitignore index de023137..cec64376 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,6 @@ # Distribution / packaging .Python build/ develop-eggs/ -dist/ downloads/ eggs/ .eggs/ @@ -15,10 +14,11 @@ parts/ sdist/ var/ wheels/ -*.whl +dist/ *.egg-info/ .installed.cfg *.egg +*.whl *.manifest *.spec diff --git a/METADATA b/METADATA new file mode 100644 index 00000000..1b08b3ec --- /dev/null +++ b/METADATA @@ -0,0 +1,195 @@ +Metadata-Version: 2.1 +Name: rastertools +Version: 0.1.0 +Summary: Collection of tools for raster data +Home-page: https://github.com/CNES/rastertools +Author: Olivier Queyrut +Author-email: olivier.queyrut@cnes.fr +License: apache v2 +Project-URL: Source, https://github.com/cnes/rastertools +Project-URL: Changelog, https://github.com/cnes/rastertools/blob/master/CHANGELOG.rst +Project-URL: Issues, https://github.com/cnes/rastertools/issues +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Programming Language :: Python +Requires-Python: ==3.8.13 +Description-Content-Type: text/x-rst; charset=UTF-8 +License-File: LICENSE.txt +License-File: AUTHORS.rst +Requires-Dist: click +Requires-Dist: rasterio==1.3.0 +Requires-Dist: pytest>=3.6 +Requires-Dist: pytest-cov +Requires-Dist: geopandas==0.13 +Requires-Dist: python-dateutil==2.9.0 +Requires-Dist: kiwisolver==1.4.5 +Requires-Dist: fonttools==4.53.1 +Requires-Dist: matplotlib==3.7.3 +Requires-Dist: packaging==24.1 +Requires-Dist: Shapely==1.8.5.post1 +Requires-Dist: tomli==2.0.2 +Requires-Dist: Rtree==1.3.0 +Requires-Dist: Pillow==9.2.0 +Requires-Dist: pip==24.2 +Requires-Dist: pyproj==3.4.0 +Requires-Dist: matplotlib +Requires-Dist: scipy==1.8 +Requires-Dist: pyscaffold +Requires-Dist: gdal==3.5.0 +Requires-Dist: tqdm==4.66 +Provides-Extra: testing +Requires-Dist: setuptools; extra == "testing" +Requires-Dist: pytest; extra == "testing" +Requires-Dist: pytest-cov; extra == "testing" + +============ +Raster tools +============ + +This project provides a command line named **rastertools** that enables various calculation tools: + + +- the calculation of radiometric indices on satellite images +- the calculation of the speed of evolution of radiometry from images between two dates +- the calculation of zonal statistics of the bands of a raster, that is to say statistics such as min, max, average, etc. + on subareas (defined by a vector file) of the area of interest. + +The **rastertools** project also aims to make the handling of the following image products transparent: + +- Sentinel-2 L1C PEPS (https://peps.cnes.fr/rocket/#/search) +- Sentinel-2 L2A PEPS (https://peps.cnes.fr/rocket/#/search) +- Sentinel-2 L2A THEIA (https://theia.cnes.fr/atdistrib/rocket/#/search?collection=SENTINEL2) +- Sentinel-2 L3A THEIA (https://theia.cnes.fr/atdistrib/rocket/#/search?collection=SENTINEL2) +- SPOT 6/7 Ortho de GEOSUD (http://ids.equipex-geosud.fr/web/guest/catalog) + +It is thus possible to input files in the command line in any of the formats above. +It is also possible to specify your own product types by providing a JSON file as a parameter of the command line (cf. docs/usage.rst) + +Finally, **rastertools** offers an API for calling these different tools in Python and for extending its capabilities, for example by defining new radiometric indices. + +Installation +============ + +Create a conda environment by typing the following: + +.. code-block:: bash + + conda env create -f environment.yml + conda env update -f env_update.yml + +The following dependencies will be installed in the ``rastertools`` environment: + +- pyscaffold +- geopandas +- scipy +- gdal +- rasterio +- tqdm + +Install ``rastertools`` in the conda environment by typing the following: + +.. code-block:: bash + + conda activate rastertools + pip install -e . + +.. note:: + + Note: Installing in a *virtualenv* does not work properly for this project. For unexplained reasons, + the VRTs that are created in memory by rastertools to handle image products are not properly managed + with an installation in a virtualenv. + +For more details, including installation as a Docker or Singularity image, please refer to the documentation. : `Installation `_ + + +Usage +===== + +rastertools +^^^^^^^^^^^ +The rastertools command line is the high-level command for activating the various tools. + +.. code-block:: console + + $ rastertools --help + usage: rastertools [-h] [-t RASTERTYPE] [--version] [-v] [-vv] + {filter,fi,radioindice,ri,speed,sp,svf,hillshade,hs,zonalstats,zs,tiling,ti} + ... + + Collection of tools on raster data + + optional arguments: + -h, --help show this help message and exit + -t RASTERTYPE, --rastertype RASTERTYPE + JSON file defining additional raster types of input + files + --version show program's version number and exit + -v, --verbose set loglevel to INFO + -vv, --very-verbose set loglevel to DEBUG + + Commands: + {filter,fi,radioindice,ri,speed,sp,svf,hillshade,hs,zonalstats,zs,tiling,ti} + filter (fi) Apply a filter to a set of images + radioindice (ri) Compute radiometric indices + speed (sp) Compute speed of rasters + svf Compute Sky View Factor of a Digital Height Model + hillshade (hs) Compute hillshades of a Digital Height Model + zonalstats (zs) Compute zonal statistics + tiling (ti) Generate image tiles + +Calling rastertools returns the following exit codes: + +.. code-block:: console + + 0: everything went well + 1: processing error + 2: incorrect invocation parameters + +Details of the various subcommands are presented in the documentation : `Usage `_ + + +Tests & documentation +===================== + +To run tests and generate documentation, the following dependencies must be installed in the conda environment. : + +- py.test et pytest-cov (tests execution) +- sphinx (documentation generation) + +Pour cela, exécuter la commande suivante : + +.. code-block:: console + + conda env update -f env_test.yml + + +Tests +^^^^^ + +The project comes with a suite of unit and functional tests. To run them, +launch the command ``pytest tests``. To run specific tests, execute ``pytest tests -k ""``. + +The tests may perform comparisons between generated files and reference files. +In this case, the tests depend on the numerical precision of the platforms. +To enable these comparisons, you need to add the option. "--compare" for instance ``pytest tests --compare``. + +The execution of the tests includes a coverage analysis via pycov. + +Documentation generation +^^^^^^^^^^^^^^^^^^^^^^^^ + +To generate the documentation, run: + +.. code-block:: console + + cd docs + sphinx-quickstart + make html + +The documentation is generated using the theme "readthedocs". + +Note +==== + +This project has been set up using PyScaffold. For details and usage +information on PyScaffold see https://pyscaffold.org/. diff --git a/RECORD b/RECORD new file mode 100644 index 00000000..bac79304 --- /dev/null +++ b/RECORD @@ -0,0 +1,71 @@ +eolab/rastertools/__init__.py,sha256=DbSf1azum6xDyKo310y0ykW-nJYZW2HOI4_1soFygGo,1387 +eolab/rastertools/filtering.py,sha256=KJZVcX4eQYQbHk5VfAbX8q-VvAtq5r5Q6LmCY9hV2PU,8240 +eolab/rastertools/hillshade.py,sha256=2QkUkAfYEZyIFfc-hJ_nEmvIdoa5XFB5Grd7YJ-DPu4,7084 +eolab/rastertools/main.py,sha256=JMe_9GB754LqywhjBVCIFqgwJW3vm9T5WH5qT6CQ2Ek,9038 +eolab/rastertools/radioindice.py,sha256=paQXc1yjWFPKzigI5O1mhoEFLTlusShmLiSgHrlVXU0,25856 +eolab/rastertools/rastertools.py,sha256=BB5W_bJX1Nq6tNAJsdtpupK_wBoFFVypaTLnG3Noofo,7375 +eolab/rastertools/speed.py,sha256=82gn8hXhvyd7fGkd8P2mB6MiyYma57m_5IFCWxpdtvk,7041 +eolab/rastertools/svf.py,sha256=LJ2Q_A1tcwU_iXXewpNKaboSiaVC85NN5X_6lYTb1M0,5910 +eolab/rastertools/tiling.py,sha256=krRVt1dyPw3LaCqNZosfLPCTvu1shzuC9ByY9BoZDB0,8415 +eolab/rastertools/timeseries.py,sha256=qN7BGA_jM97H2SRnVB7mq60KrHqbRJV7qwM_M37VxOQ,10203 +eolab/rastertools/utils.py,sha256=ce_ZKhr4lI-BQPEPvEm9gFAs0bi4Z5kt4g5YdDQVHVI,2997 +eolab/rastertools/zonalstats.py,sha256=T-op7SucTlXA_bf3yLe22JmKZSJp6pRVshEjJnuENak,25706 +eolab/rastertools/__pycache__/__init__.cpython-38.pyc,sha256=we04K-dthGOyVFpOGT49h_ta9VxeqYuzX7lL0mMsur0,1168 +eolab/rastertools/__pycache__/filtering.cpython-38.pyc,sha256=qTAHn_YMwao4ZUhWXnxMcf1j2kGEoynF1GXI9akRo3Q,6678 +eolab/rastertools/__pycache__/hillshade.cpython-38.pyc,sha256=P9cfRDL3Upttnz-JzrPZ9lvn2cX_dBpjbbFPbtt2Ti4,5330 +eolab/rastertools/__pycache__/main.cpython-38.pyc,sha256=ZQkljzVKCq99AqC5XfNOtqfGilDr5l4LraXzwZwNYsY,8449 +eolab/rastertools/__pycache__/radioindice.cpython-38.pyc,sha256=S-JcrFkIHkcrdSLgZ7lgRDPqr9gNuvjBpg35z0jQGao,9723 +eolab/rastertools/__pycache__/rastertools.cpython-38.pyc,sha256=xbVzuffc_o-zNLdcnMBfdP42VGVQd77NI0RNAO3PDjk,7904 +eolab/rastertools/__pycache__/speed.cpython-38.pyc,sha256=o4oPXSbMXKUkOvNTRAGjPzm0WhDsqmai-eOpR5O-v_g,5934 +eolab/rastertools/__pycache__/svf.cpython-38.pyc,sha256=IRYM2sc95TElKvnkiAwaQFDmC-b9f53bI9KDPBpFQ9g,5953 +eolab/rastertools/__pycache__/tiling.cpython-38.pyc,sha256=Gw_QGu8DHGtGKwLJYEjdHQwaZsYnnUEGFkxTq1tGcnY,7250 +eolab/rastertools/__pycache__/timeseries.cpython-38.pyc,sha256=05PbNI5h0odVU_mEJBup6t-iZVJTrV0U0LZLDxnFuaw,8371 +eolab/rastertools/__pycache__/utils.cpython-38.pyc,sha256=WNbk152mH27fEvwqh7vspa_dmeV0UmesTIW8FTtL6pc,3645 +eolab/rastertools/__pycache__/zonalstats.cpython-38.pyc,sha256=TnUEpK3N3qJ6rCTCVCU2qUK1V6mpb9lGRBpInS9g7rU,20867 +eolab/rastertools/cli/__init__.py,sha256=_GH5byj-EOmqUTHK_I_AT0piYoHOM9AvWfFkWq5Ezlg,2071 +eolab/rastertools/cli/filtering.py,sha256=fhGY-oOoKrDtrlaTNUWZJLOxYyVTg3nwB3oADq4F0q4,4627 +eolab/rastertools/cli/hillshade.py,sha256=JjinEhyxPs9uzmEDKR7iuggd-97wUtOCqNn9v0Wh6og,2221 +eolab/rastertools/cli/radioindice.py,sha256=LWMDxu3fau8DtEp1Jmuq2UfKTpogo_CrN7w3pZ28AY4,5212 +eolab/rastertools/cli/speed.py,sha256=v2OuHu0QjNaq9ycY8ilpYwlQOVGQLStBsTBFW7nUF9E,1535 +eolab/rastertools/cli/svf.py,sha256=gnyr72ha-TlVfNbWdjZzdFZtZv13gg0N3Nfg8iP7C1k,2313 +eolab/rastertools/cli/tiling.py,sha256=W6dC5fC0FC7JvKSN7WMnhTgeI8bPRWotBClpiQ50BYM,3187 +eolab/rastertools/cli/timeseries.py,sha256=0OpKK0jCcJJnLb8XC8pjUkKVPcCLx9F84LJxv8tPwPI,3033 +eolab/rastertools/cli/utils_cli.py,sha256=29nyMTEtJ0fhiRfgnq01f42t4y5pw_pETwQJX5J-12Q,3974 +eolab/rastertools/cli/zonalstats.py,sha256=2jBAm87Wh3RsHNEIumt-510okKLqSW9qxbRcwCTrVVo,4819 +eolab/rastertools/cli/__pycache__/__init__.cpython-38.pyc,sha256=bZAxTPmh9GkIIuuRsXCQifP4HFtAvvrKSSFLCyIAeoo,1910 +eolab/rastertools/cli/__pycache__/filtering.cpython-38.pyc,sha256=H_l1uP8Vt41dKMRQXSZRofCZT6IJG-UJXe08Rl2XrxM,2828 +eolab/rastertools/cli/__pycache__/hillshade.cpython-38.pyc,sha256=d7btMY8OTuSW6M2Yai_p2WZvjqq8Edl_LQS9gqe8LEM,2909 +eolab/rastertools/cli/__pycache__/radioindice.cpython-38.pyc,sha256=PjPnBaTmne2zaAwRmgjVE_5V-UqRcB24HI8tBYqLipI,4567 +eolab/rastertools/cli/__pycache__/speed.cpython-38.pyc,sha256=ejc98LZyezfe8eGNC1IcYO-Ym4xItbhqGFThvlsuHBw,2110 +eolab/rastertools/cli/__pycache__/svf.cpython-38.pyc,sha256=2nnA5pIVPFvk9c955hcf56VpxQ9NQcB2D-8fweJrFew,2727 +eolab/rastertools/cli/__pycache__/tiling.cpython-38.pyc,sha256=tD6THKbDeF-cFFxg6wGZz5XO8phqi2_V39NcqDpwtM4,3307 +eolab/rastertools/cli/__pycache__/timeseries.cpython-38.pyc,sha256=Z2s2j2Ji0GnsPU-MCgx7PFWl1Ktv78snaVtSJCXrfAA,3264 +eolab/rastertools/cli/__pycache__/zonalstats.cpython-38.pyc,sha256=RmF6AbIdB1_otub76D7BiMcQ9IbxN7KwirGD0CTo7bA,5417 +eolab/rastertools/processing/__init__.py,sha256=ODB6rtMFA17jWtEJgE_ixrrzAAe1rRRrAqxXV8khZ5k,999 +eolab/rastertools/processing/algo.py,sha256=C0Yu_7KS2xHgQRZvY2hOFCevhtvSrJd1I8rDm3jFR_k,32409 +eolab/rastertools/processing/rasterproc.py,sha256=rya9aWsV1ESDGCE_qgfSzeFlCSXrOrvf_zxWX5DMU-g,9547 +eolab/rastertools/processing/sliding.py,sha256=-fDkygwN7s6oyx6-uB9_bMDbbRFsksBxkDbzdVOePuw,11623 +eolab/rastertools/processing/stats.py,sha256=j56dCl-ErdOTL9fYs30oWMJrzNCvWoh7K9Gf8xSwuV4,22996 +eolab/rastertools/processing/vector.py,sha256=phz_JQLlEJSXPivHAUSjxRDChBnCNvhQQ-1JIOX_ZMU,17852 +eolab/rastertools/processing/__pycache__/__init__.cpython-38.pyc,sha256=tPHsY3nLkszJ3K5RK0b_4fLlPSvf20uk-ubl8mi4ddw,824 +eolab/rastertools/processing/__pycache__/algo.cpython-38.pyc,sha256=Z2LuukZoZx4QKQnkLURq7NPV0_im8EAs8zyymW6WSCw,14808 +eolab/rastertools/processing/__pycache__/rasterproc.cpython-38.pyc,sha256=RCucwDicycqLnB6ITNGMRJ8HL4p8mBUttXHqfAZPriY,9427 +eolab/rastertools/processing/__pycache__/sliding.cpython-38.pyc,sha256=w6Mujw6nKeH104uoe-cXW82-pmNjCubf1-zI2QyEZpA,7822 +eolab/rastertools/processing/__pycache__/stats.cpython-38.pyc,sha256=GTXjwU2qJHiGi-ix6uuL5ur47JpcoYKci33MtMlmTjo,14262 +eolab/rastertools/processing/__pycache__/vector.cpython-38.pyc,sha256=LWVaibJUZ_2Z7JUY6IpE6XU6rt1SxY5i_AT3UwC2ZtU,13412 +eolab/rastertools/product/__init__.py,sha256=Vh8R8brVzLY8sxcTZhn7J_-uZOR66uY_8ZAXjBzE8Wk,834 +eolab/rastertools/product/rasterproduct.py,sha256=i_M2o8-Xgex-ZcGs7pTrLUkUvqTECaE3VpTKOCeYHS4,30177 +eolab/rastertools/product/rastertype.py,sha256=8Uza3yuLi0ZCSRDi2Cp8HVC2CcL0Sg8AnvxjlT3K7q0,13948 +eolab/rastertools/product/rastertypes.json,sha256=0gfiOaOW5calf9B5nNYU0uqQoHg69C1HZSSOdWxp-Sc,6524 +eolab/rastertools/product/vrt.py,sha256=xLflRLFiUkY6-9Cdrwj8W7cfVmj53JsVEJYBoKKrZMQ,6131 +eolab/rastertools/product/__pycache__/__init__.cpython-38.pyc,sha256=eKG-UruwbnxXAiv9UdevyfVwWAinIYu-9jleiE5haaY,993 +eolab/rastertools/product/__pycache__/rasterproduct.cpython-38.pyc,sha256=_AaZErO4Ax78CI7nBPkSJvNxNZbIVFW2Ll6DSwiA7L8,19766 +eolab/rastertools/product/__pycache__/rastertype.cpython-38.pyc,sha256=9LHvYsyboWcmrp3ttfU1YC18jfP2XXyglvBLkN0sxQk,15064 +eolab/rastertools/product/__pycache__/vrt.cpython-38.pyc,sha256=tMdO02V0-zIgtwwCVEM8QO4QJYuXEVmi4dP1zvCPvBM,4900 +rastertools-0.1.0.dist-info/AUTHORS.rst,sha256=99aFJCitK64uanDEQmcudASd-9ZkBphip7iLAFPpgbs,206 +rastertools-0.1.0.dist-info/LICENSE.txt,sha256=Pd-b5cKP4n2tFDpdx27qJSIq0d1ok0oEcGTlbtL6QMU,11560 +rastertools-0.1.0.dist-info/METADATA,sha256=Tb2-yzcqeBl2_U1dYG-TTTVq6NVpea-Y2Ev1OsEu7jQ,6491 +rastertools-0.1.0.dist-info/WHEEL,sha256=OpXWERl2xLPRHTvd2ZXo_iluPEQd8uSbYkJ53NAER_Y,109 +rastertools-0.1.0.dist-info/entry_points.txt,sha256=AKcER9TFv3luXEf6dCzgyzwQ4y6HUysdwvs6QlVOtaE,72 +rastertools-0.1.0.dist-info/top_level.txt,sha256=MVosVtKjYB3qvKmsjhMnKUiUtuPjN73wjTROJ92QJoU,6 +rastertools-0.1.0.dist-info/RECORD,, diff --git a/WHEEL b/WHEEL new file mode 100644 index 00000000..ee810efb --- /dev/null +++ b/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.3.0) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/continuous_integration/scripts/check_mccabe_complexity.sh b/continuous_integration/scripts/check_mccabe_complexity.sh new file mode 100755 index 00000000..c7e6766f --- /dev/null +++ b/continuous_integration/scripts/check_mccabe_complexity.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +if [ -z "$1" ] || [ -z "$2" ]; then + echo "Error: You must specify a McCabe threshold and a directory to analyze." + echo "Usage: $0 " + exit 1 +fi + +threshold=$1 +directory=$2 + +if [ ! -d "$directory" ]; then + echo "Error: The directory '$directory' does not exist." + exit 1 +fi + +all_files_ok=true +for file in $(find "$directory" -name "*.py"); do + echo "Analyzing $file ..." + output=$(python -m mccabe --min "$threshold" "$file") + + if [ -n "$output" ]; then + echo "Error: McCabe complexity too high in $file" + echo "$output" + all_files_ok=false + fi +done + +if $all_files_ok; then + echo "✅ All files have McCabe scores less than or equal to $threshold. ✅" +else + echo "❌ Some files have a complexity higher than $threshold ❌" + exit 1 +fi + +exit 0 diff --git a/docs/.coverage b/docs/.coverage new file mode 100644 index 00000000..4b165c48 Binary files /dev/null and b/docs/.coverage differ diff --git a/docs/_build/doctrees/api/eolab.doctree b/docs/_build/doctrees/api/eolab.doctree new file mode 100644 index 00000000..72f3efa4 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.__init__.doctree new file mode 100644 index 00000000..75be6fe8 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.adaptive_gaussian.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.adaptive_gaussian.doctree new file mode 100644 index 00000000..517b779f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.adaptive_gaussian.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.bands.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.bands.doctree new file mode 100644 index 00000000..8209097f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.bands.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.doctree new file mode 100644 index 00000000..59880add Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.get_default_filters.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.get_default_filters.doctree new file mode 100644 index 00000000..7fc32418 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.get_default_filters.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.keep_vrt.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.keep_vrt.doctree new file mode 100644 index 00000000..2a704e7b Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.keep_vrt.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.local_mean.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.local_mean.doctree new file mode 100644 index 00000000..12238556 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.local_mean.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.local_sum.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.local_sum.doctree new file mode 100644 index 00000000..9fd31b35 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.local_sum.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.median_filter.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.median_filter.doctree new file mode 100644 index 00000000..04829dfb Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.median_filter.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.outputdir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.outputdir.doctree new file mode 100644 index 00000000..8bfeba5e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.outputdir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.pad_mode.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.pad_mode.doctree new file mode 100644 index 00000000..4118b805 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.pad_mode.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.postprocess_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.postprocess_files.doctree new file mode 100644 index 00000000..a99b5567 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.postprocess_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.process_file.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.process_file.doctree new file mode 100644 index 00000000..afa1df4f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.process_file.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.process_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.process_files.doctree new file mode 100644 index 00000000..3c80c108 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.process_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.raster_filter.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.raster_filter.doctree new file mode 100644 index 00000000..df849388 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.raster_filter.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.vrt_dir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.vrt_dir.doctree new file mode 100644 index 00000000..6487c397 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.vrt_dir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.window_size.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.window_size.doctree new file mode 100644 index 00000000..d33a5350 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.window_size.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.with_filter_configuration.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.with_filter_configuration.doctree new file mode 100644 index 00000000..05f8054b Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.with_filter_configuration.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.with_output.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.with_output.doctree new file mode 100644 index 00000000..ede4ce44 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.with_output.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.with_vrt_stored.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.with_vrt_stored.doctree new file mode 100644 index 00000000..e21dde67 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.with_vrt_stored.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Filtering.with_windows.doctree b/docs/_build/doctrees/api/eolab.rastertools.Filtering.with_windows.doctree new file mode 100644 index 00000000..74ae645a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Filtering.with_windows.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.__init__.doctree new file mode 100644 index 00000000..cde9eb90 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.azimuth.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.azimuth.doctree new file mode 100644 index 00000000..9687bb1e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.azimuth.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.doctree new file mode 100644 index 00000000..520ac3d0 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.elevation.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.elevation.doctree new file mode 100644 index 00000000..d8b6c5e0 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.elevation.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.keep_vrt.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.keep_vrt.doctree new file mode 100644 index 00000000..4cd71d67 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.keep_vrt.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.outputdir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.outputdir.doctree new file mode 100644 index 00000000..951e5d02 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.outputdir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.pad_mode.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.pad_mode.doctree new file mode 100644 index 00000000..44e40c48 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.pad_mode.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.postprocess_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.postprocess_files.doctree new file mode 100644 index 00000000..5a846600 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.postprocess_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.process_file.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.process_file.doctree new file mode 100644 index 00000000..601844f8 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.process_file.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.process_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.process_files.doctree new file mode 100644 index 00000000..27a3acd5 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.process_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.radius.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.radius.doctree new file mode 100644 index 00000000..af805d38 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.radius.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.resolution.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.resolution.doctree new file mode 100644 index 00000000..793504bc Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.resolution.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.vrt_dir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.vrt_dir.doctree new file mode 100644 index 00000000..003b42a2 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.vrt_dir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.window_size.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.window_size.doctree new file mode 100644 index 00000000..7b7291c9 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.window_size.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.with_output.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.with_output.doctree new file mode 100644 index 00000000..c1783c67 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.with_output.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.with_vrt_stored.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.with_vrt_stored.doctree new file mode 100644 index 00000000..22c01460 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.with_vrt_stored.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Hillshade.with_windows.doctree b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.with_windows.doctree new file mode 100644 index 00000000..8990e3d6 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Hillshade.with_windows.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.__init__.doctree new file mode 100644 index 00000000..7c8e4340 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.bi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.bi.doctree new file mode 100644 index 00000000..3069b0f4 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.bi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.bi2.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.bi2.doctree new file mode 100644 index 00000000..fa21fa25 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.bi2.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.doctree new file mode 100644 index 00000000..73556d28 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.evi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.evi.doctree new file mode 100644 index 00000000..45bdec2c Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.evi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.get_default_indices.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.get_default_indices.doctree new file mode 100644 index 00000000..bb7fd1e1 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.get_default_indices.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.indices.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.indices.doctree new file mode 100644 index 00000000..bed52b16 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.indices.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ipvi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ipvi.doctree new file mode 100644 index 00000000..1dfabe31 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ipvi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.keep_vrt.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.keep_vrt.doctree new file mode 100644 index 00000000..db5bc862 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.keep_vrt.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.merge.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.merge.doctree new file mode 100644 index 00000000..4c4ed010 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.merge.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.mndwi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.mndwi.doctree new file mode 100644 index 00000000..3499bf1c Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.mndwi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.msavi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.msavi.doctree new file mode 100644 index 00000000..f6aea849 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.msavi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.msavi2.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.msavi2.doctree new file mode 100644 index 00000000..76e18dbb Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.msavi2.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndbi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndbi.doctree new file mode 100644 index 00000000..afc0eaed Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndbi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndpi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndpi.doctree new file mode 100644 index 00000000..14516b11 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndpi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndti.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndti.doctree new file mode 100644 index 00000000..ec1f7ceb Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndti.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndvi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndvi.doctree new file mode 100644 index 00000000..21363127 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndvi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndwi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndwi.doctree new file mode 100644 index 00000000..3e3ab84f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndwi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndwi2.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndwi2.doctree new file mode 100644 index 00000000..63183b00 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndwi2.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.outputdir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.outputdir.doctree new file mode 100644 index 00000000..ce587d99 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.outputdir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.pad_mode.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.pad_mode.doctree new file mode 100644 index 00000000..929e9e64 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.pad_mode.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.postprocess_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.postprocess_files.doctree new file mode 100644 index 00000000..24cafe7b Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.postprocess_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.process_file.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.process_file.doctree new file mode 100644 index 00000000..9547e740 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.process_file.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.process_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.process_files.doctree new file mode 100644 index 00000000..66beaeaf Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.process_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.pvi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.pvi.doctree new file mode 100644 index 00000000..442470c6 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.pvi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ri.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ri.doctree new file mode 100644 index 00000000..1ea2a2a6 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.ri.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.roi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.roi.doctree new file mode 100644 index 00000000..c02c2856 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.roi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.rvi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.rvi.doctree new file mode 100644 index 00000000..c68b6eb7 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.rvi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.savi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.savi.doctree new file mode 100644 index 00000000..2e1a01c2 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.savi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.tndvi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.tndvi.doctree new file mode 100644 index 00000000..bf9f6540 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.tndvi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.tsavi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.tsavi.doctree new file mode 100644 index 00000000..528c9627 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.tsavi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.vrt_dir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.vrt_dir.doctree new file mode 100644 index 00000000..d252068e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.vrt_dir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.window_size.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.window_size.doctree new file mode 100644 index 00000000..34b4c4f9 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.window_size.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_output.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_output.doctree new file mode 100644 index 00000000..7bc0a4ed Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_output.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_roi.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_roi.doctree new file mode 100644 index 00000000..51d4fb9f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_roi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_vrt_stored.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_vrt_stored.doctree new file mode 100644 index 00000000..1dfa7d23 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_vrt_stored.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_windows.doctree b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_windows.doctree new file mode 100644 index 00000000..d236123b Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_windows.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Rastertool.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.__init__.doctree new file mode 100644 index 00000000..5df18589 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Rastertool.doctree b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.doctree new file mode 100644 index 00000000..da8e4dc5 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Rastertool.keep_vrt.doctree b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.keep_vrt.doctree new file mode 100644 index 00000000..092fba93 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.keep_vrt.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Rastertool.outputdir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.outputdir.doctree new file mode 100644 index 00000000..263a900e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.outputdir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Rastertool.postprocess_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.postprocess_files.doctree new file mode 100644 index 00000000..375e0843 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.postprocess_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Rastertool.process_file.doctree b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.process_file.doctree new file mode 100644 index 00000000..edd603ec Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.process_file.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Rastertool.process_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.process_files.doctree new file mode 100644 index 00000000..7cf03f60 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.process_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Rastertool.vrt_dir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.vrt_dir.doctree new file mode 100644 index 00000000..14989b13 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.vrt_dir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Rastertool.with_output.doctree b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.with_output.doctree new file mode 100644 index 00000000..7632e276 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.with_output.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Rastertool.with_vrt_stored.doctree b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.with_vrt_stored.doctree new file mode 100644 index 00000000..75068d12 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Rastertool.with_vrt_stored.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.RastertoolConfigurationException.doctree b/docs/_build/doctrees/api/eolab.rastertools.RastertoolConfigurationException.doctree new file mode 100644 index 00000000..4680023a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.RastertoolConfigurationException.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.__init__.doctree new file mode 100644 index 00000000..060b6f9a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.altitude.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.altitude.doctree new file mode 100644 index 00000000..7a228422 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.altitude.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.doctree new file mode 100644 index 00000000..8bcf8b30 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.keep_vrt.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.keep_vrt.doctree new file mode 100644 index 00000000..51913381 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.keep_vrt.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.nb_directions.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.nb_directions.doctree new file mode 100644 index 00000000..294c24a6 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.nb_directions.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.outputdir.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.outputdir.doctree new file mode 100644 index 00000000..7340472d Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.outputdir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.pad_mode.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.pad_mode.doctree new file mode 100644 index 00000000..6f1ffee7 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.pad_mode.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.postprocess_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.postprocess_files.doctree new file mode 100644 index 00000000..53e76ced Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.postprocess_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.process_file.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.process_file.doctree new file mode 100644 index 00000000..1160cafb Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.process_file.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.process_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.process_files.doctree new file mode 100644 index 00000000..a8abf3c4 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.process_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.radius.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.radius.doctree new file mode 100644 index 00000000..63cf19fa Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.radius.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.resolution.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.resolution.doctree new file mode 100644 index 00000000..4f169931 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.resolution.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.vrt_dir.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.vrt_dir.doctree new file mode 100644 index 00000000..820fccc2 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.vrt_dir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.window_size.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.window_size.doctree new file mode 100644 index 00000000..cf854f3e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.window_size.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.with_altitude.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.with_altitude.doctree new file mode 100644 index 00000000..8f2fdd02 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.with_altitude.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.with_output.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.with_output.doctree new file mode 100644 index 00000000..54652087 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.with_output.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.with_vrt_stored.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.with_vrt_stored.doctree new file mode 100644 index 00000000..aef759f2 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.with_vrt_stored.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.SVF.with_windows.doctree b/docs/_build/doctrees/api/eolab.rastertools.SVF.with_windows.doctree new file mode 100644 index 00000000..674c18cb Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.SVF.with_windows.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Speed.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.Speed.__init__.doctree new file mode 100644 index 00000000..33158cc7 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Speed.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Speed.bands.doctree b/docs/_build/doctrees/api/eolab.rastertools.Speed.bands.doctree new file mode 100644 index 00000000..23195ddb Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Speed.bands.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Speed.doctree b/docs/_build/doctrees/api/eolab.rastertools.Speed.doctree new file mode 100644 index 00000000..eb256f26 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Speed.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Speed.keep_vrt.doctree b/docs/_build/doctrees/api/eolab.rastertools.Speed.keep_vrt.doctree new file mode 100644 index 00000000..0c79c40d Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Speed.keep_vrt.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Speed.outputdir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Speed.outputdir.doctree new file mode 100644 index 00000000..dd54306d Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Speed.outputdir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Speed.postprocess_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Speed.postprocess_files.doctree new file mode 100644 index 00000000..8640bbed Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Speed.postprocess_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Speed.process_file.doctree b/docs/_build/doctrees/api/eolab.rastertools.Speed.process_file.doctree new file mode 100644 index 00000000..69d181a7 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Speed.process_file.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Speed.process_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Speed.process_files.doctree new file mode 100644 index 00000000..5ef54bd3 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Speed.process_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Speed.vrt_dir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Speed.vrt_dir.doctree new file mode 100644 index 00000000..5f9807f4 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Speed.vrt_dir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Speed.with_output.doctree b/docs/_build/doctrees/api/eolab.rastertools.Speed.with_output.doctree new file mode 100644 index 00000000..863820fe Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Speed.with_output.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Speed.with_vrt_stored.doctree b/docs/_build/doctrees/api/eolab.rastertools.Speed.with_vrt_stored.doctree new file mode 100644 index 00000000..d56fd9f7 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Speed.with_vrt_stored.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Tiling.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.Tiling.__init__.doctree new file mode 100644 index 00000000..d9d49f6f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Tiling.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Tiling.doctree b/docs/_build/doctrees/api/eolab.rastertools.Tiling.doctree new file mode 100644 index 00000000..507a4ef8 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Tiling.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Tiling.grid.doctree b/docs/_build/doctrees/api/eolab.rastertools.Tiling.grid.doctree new file mode 100644 index 00000000..09fa3603 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Tiling.grid.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Tiling.keep_vrt.doctree b/docs/_build/doctrees/api/eolab.rastertools.Tiling.keep_vrt.doctree new file mode 100644 index 00000000..48c9283a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Tiling.keep_vrt.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Tiling.output_basename.doctree b/docs/_build/doctrees/api/eolab.rastertools.Tiling.output_basename.doctree new file mode 100644 index 00000000..2b2529c8 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Tiling.output_basename.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Tiling.output_subdir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Tiling.output_subdir.doctree new file mode 100644 index 00000000..945e2b8e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Tiling.output_subdir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Tiling.outputdir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Tiling.outputdir.doctree new file mode 100644 index 00000000..a213ae65 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Tiling.outputdir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Tiling.postprocess_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Tiling.postprocess_files.doctree new file mode 100644 index 00000000..eb25815e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Tiling.postprocess_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Tiling.process_file.doctree b/docs/_build/doctrees/api/eolab.rastertools.Tiling.process_file.doctree new file mode 100644 index 00000000..a883278e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Tiling.process_file.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Tiling.process_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Tiling.process_files.doctree new file mode 100644 index 00000000..627a0a58 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Tiling.process_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Tiling.vrt_dir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Tiling.vrt_dir.doctree new file mode 100644 index 00000000..262e3d2e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Tiling.vrt_dir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Tiling.with_id_column.doctree b/docs/_build/doctrees/api/eolab.rastertools.Tiling.with_id_column.doctree new file mode 100644 index 00000000..3d0ff1dc Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Tiling.with_id_column.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Tiling.with_output.doctree b/docs/_build/doctrees/api/eolab.rastertools.Tiling.with_output.doctree new file mode 100644 index 00000000..c4a9ed84 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Tiling.with_output.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Tiling.with_vrt_stored.doctree b/docs/_build/doctrees/api/eolab.rastertools.Tiling.with_vrt_stored.doctree new file mode 100644 index 00000000..73e1af7f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Tiling.with_vrt_stored.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.__init__.doctree new file mode 100644 index 00000000..650e3df5 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.bands.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.bands.doctree new file mode 100644 index 00000000..755be96a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.bands.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.doctree new file mode 100644 index 00000000..3d306854 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.end_date.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.end_date.doctree new file mode 100644 index 00000000..69d1ff40 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.end_date.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.keep_vrt.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.keep_vrt.doctree new file mode 100644 index 00000000..93fc39e0 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.keep_vrt.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.outputdir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.outputdir.doctree new file mode 100644 index 00000000..132db917 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.outputdir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.pad_mode.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.pad_mode.doctree new file mode 100644 index 00000000..11233b73 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.pad_mode.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.period.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.period.doctree new file mode 100644 index 00000000..f226ce4e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.period.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.postprocess_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.postprocess_files.doctree new file mode 100644 index 00000000..169dd4b2 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.postprocess_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.process_file.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.process_file.doctree new file mode 100644 index 00000000..378c5316 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.process_file.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.process_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.process_files.doctree new file mode 100644 index 00000000..f7cb41a7 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.process_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.start_date.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.start_date.doctree new file mode 100644 index 00000000..c8c5ae34 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.start_date.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.vrt_dir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.vrt_dir.doctree new file mode 100644 index 00000000..322618cd Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.vrt_dir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.window_size.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.window_size.doctree new file mode 100644 index 00000000..d098d20c Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.window_size.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.with_output.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.with_output.doctree new file mode 100644 index 00000000..c34b727a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.with_output.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.with_vrt_stored.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.with_vrt_stored.doctree new file mode 100644 index 00000000..1e1f53df Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.with_vrt_stored.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Timeseries.with_windows.doctree b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.with_windows.doctree new file mode 100644 index 00000000..4c1c4cb3 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Timeseries.with_windows.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Windowable.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.Windowable.__init__.doctree new file mode 100644 index 00000000..b7d06b8f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Windowable.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Windowable.doctree b/docs/_build/doctrees/api/eolab.rastertools.Windowable.doctree new file mode 100644 index 00000000..f466522b Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Windowable.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Windowable.pad_mode.doctree b/docs/_build/doctrees/api/eolab.rastertools.Windowable.pad_mode.doctree new file mode 100644 index 00000000..0c1301a4 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Windowable.pad_mode.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Windowable.window_size.doctree b/docs/_build/doctrees/api/eolab.rastertools.Windowable.window_size.doctree new file mode 100644 index 00000000..e67a7138 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Windowable.window_size.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Windowable.with_windows.doctree b/docs/_build/doctrees/api/eolab.rastertools.Windowable.with_windows.doctree new file mode 100644 index 00000000..8f29312e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Windowable.with_windows.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.__init__.doctree new file mode 100644 index 00000000..367a89aa Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.area.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.area.doctree new file mode 100644 index 00000000..571e3c7d Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.area.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.bands.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.bands.doctree new file mode 100644 index 00000000..2d539918 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.bands.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.categorical.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.categorical.doctree new file mode 100644 index 00000000..59f2a6cf Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.categorical.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_file.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_file.doctree new file mode 100644 index 00000000..62d36aca Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_file.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_file_type.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_file_type.doctree new file mode 100644 index 00000000..ee484079 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_file_type.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_index.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_index.doctree new file mode 100644 index 00000000..9e85277e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_index.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_labels.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_labels.doctree new file mode 100644 index 00000000..c8d4282a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_labels.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.chart_file.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.chart_file.doctree new file mode 100644 index 00000000..ab363a79 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.chart_file.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.compute_stats.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.compute_stats.doctree new file mode 100644 index 00000000..70b87ab5 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.compute_stats.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.display_chart.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.display_chart.doctree new file mode 100644 index 00000000..8b564186 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.display_chart.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.doctree new file mode 100644 index 00000000..e2dfa6cc Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.generated_stats.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.generated_stats.doctree new file mode 100644 index 00000000..c85244d7 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.generated_stats.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.generated_stats_dates.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.generated_stats_dates.doctree new file mode 100644 index 00000000..44971a99 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.generated_stats_dates.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.generated_stats_per_date.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.generated_stats_per_date.doctree new file mode 100644 index 00000000..d5fcb115 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.generated_stats_per_date.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.geometries.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.geometries.doctree new file mode 100644 index 00000000..6362c51d Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.geometries.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.geometry_index.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.geometry_index.doctree new file mode 100644 index 00000000..88cc8064 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.geometry_index.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.keep_vrt.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.keep_vrt.doctree new file mode 100644 index 00000000..b81d042a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.keep_vrt.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.output_format.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.output_format.doctree new file mode 100644 index 00000000..17d4c9be Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.output_format.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.outputdir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.outputdir.doctree new file mode 100644 index 00000000..6025af8d Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.outputdir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.postprocess_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.postprocess_files.doctree new file mode 100644 index 00000000..e16455fe Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.postprocess_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.prefix.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.prefix.doctree new file mode 100644 index 00000000..d1ad5996 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.prefix.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.process_file.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.process_file.doctree new file mode 100644 index 00000000..2d8d7533 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.process_file.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.process_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.process_files.doctree new file mode 100644 index 00000000..9164a418 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.process_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.sigma.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.sigma.doctree new file mode 100644 index 00000000..1db46285 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.sigma.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.stats.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.stats.doctree new file mode 100644 index 00000000..6f4803b6 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.stats.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.supported_output_formats.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.supported_output_formats.doctree new file mode 100644 index 00000000..ef2fbae5 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.supported_output_formats.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.valid_stats.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.valid_stats.doctree new file mode 100644 index 00000000..b5a35624 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.valid_stats.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.valid_threshold.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.valid_threshold.doctree new file mode 100644 index 00000000..9263fc15 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.valid_threshold.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.vrt_dir.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.vrt_dir.doctree new file mode 100644 index 00000000..361d048e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.vrt_dir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_chart.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_chart.doctree new file mode 100644 index 00000000..632b861e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_chart.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_geometries.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_geometries.doctree new file mode 100644 index 00000000..026728ba Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_geometries.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_outliers.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_outliers.doctree new file mode 100644 index 00000000..f4a9ac47 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_outliers.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_output.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_output.doctree new file mode 100644 index 00000000..426eb13d Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_output.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_per_category.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_per_category.doctree new file mode 100644 index 00000000..0fa0b3d4 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_per_category.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_vrt_stored.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_vrt_stored.doctree new file mode 100644 index 00000000..2df3aed9 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_vrt_stored.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.within.doctree b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.within.doctree new file mode 100644 index 00000000..28537d60 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.Zonalstats.within.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.doctree new file mode 100644 index 00000000..abca470e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.create_argparser.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.create_argparser.doctree new file mode 100644 index 00000000..dc5cc0cc Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.create_argparser.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.create_filter.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.create_filter.doctree new file mode 100644 index 00000000..eb771c57 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.create_filter.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.create_filtering.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.create_filtering.doctree new file mode 100644 index 00000000..ec2f990c Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.create_filtering.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.doctree new file mode 100644 index 00000000..9469589f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.filter_options.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.filter_options.doctree new file mode 100644 index 00000000..fc68b37d Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.filter_options.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.handle_result.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.handle_result.doctree new file mode 100644 index 00000000..26b2008a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering.handle_result.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.create_filter.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.create_filter.doctree new file mode 100644 index 00000000..33f8c78d Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.create_filter.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.create_filtering.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.create_filtering.doctree new file mode 100644 index 00000000..c102cd65 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.create_filtering.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.doctree new file mode 100644 index 00000000..0b837068 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.filter_options.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.filter_options.doctree new file mode 100644 index 00000000..a7fd9700 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.filter_options.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.handle_result.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.handle_result.doctree new file mode 100644 index 00000000..f1409cdd Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.handle_result.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.hillshade.create_argparser.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.hillshade.create_argparser.doctree new file mode 100644 index 00000000..fadb3a10 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.hillshade.create_argparser.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.hillshade.create_hillshade.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.hillshade.create_hillshade.doctree new file mode 100644 index 00000000..cdb1fdfd Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.hillshade.create_hillshade.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.hillshade.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.hillshade.doctree new file mode 100644 index 00000000..5ae135d5 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.hillshade.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.create_argparser.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.create_argparser.doctree new file mode 100644 index 00000000..36383c16 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.create_argparser.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.create_radioindice.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.create_radioindice.doctree new file mode 100644 index 00000000..75399a66 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.create_radioindice.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.doctree new file mode 100644 index 00000000..d99545a9 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.indices_opt.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.indices_opt.doctree new file mode 100644 index 00000000..da73c363 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.indices_opt.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.speed.create_argparser.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.speed.create_argparser.doctree new file mode 100644 index 00000000..9c59d5dc Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.speed.create_argparser.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.speed.create_speed.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.speed.create_speed.doctree new file mode 100644 index 00000000..9942aa77 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.speed.create_speed.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.speed.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.speed.doctree new file mode 100644 index 00000000..c1db1329 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.speed.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.svf.create_argparser.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.svf.create_argparser.doctree new file mode 100644 index 00000000..d53a0e68 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.svf.create_argparser.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.svf.create_svf.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.svf.create_svf.doctree new file mode 100644 index 00000000..47d34739 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.svf.create_svf.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.svf.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.svf.doctree new file mode 100644 index 00000000..c1dfde58 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.svf.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.tiling.create_argparser.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.tiling.create_argparser.doctree new file mode 100644 index 00000000..92e5f652 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.tiling.create_argparser.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.tiling.create_tiling.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.tiling.create_tiling.doctree new file mode 100644 index 00000000..84af4306 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.tiling.create_tiling.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.tiling.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.tiling.doctree new file mode 100644 index 00000000..84ad887e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.tiling.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.timeseries.create_argparser.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.timeseries.create_argparser.doctree new file mode 100644 index 00000000..b2d71edc Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.timeseries.create_argparser.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.timeseries.create_timeseries.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.timeseries.create_timeseries.doctree new file mode 100644 index 00000000..53e72b94 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.timeseries.create_timeseries.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.timeseries.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.timeseries.doctree new file mode 100644 index 00000000..5b9d7cde Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.timeseries.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.utils_cli.apply_process.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.utils_cli.apply_process.doctree new file mode 100644 index 00000000..8e861df4 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.utils_cli.apply_process.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.utils_cli.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.utils_cli.doctree new file mode 100644 index 00000000..671b6774 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.utils_cli.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.with_bands_arguments.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.with_bands_arguments.doctree new file mode 100644 index 00000000..683aec8b Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.with_bands_arguments.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.with_outputdir_arguments.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.with_outputdir_arguments.doctree new file mode 100644 index 00000000..7830cf5c Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.with_outputdir_arguments.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.with_window_arguments.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.with_window_arguments.doctree new file mode 100644 index 00000000..89e87bad Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.with_window_arguments.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.zonalstats.create_argparser.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.zonalstats.create_argparser.doctree new file mode 100644 index 00000000..88907731 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.zonalstats.create_argparser.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.zonalstats.create_zonalstats.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.zonalstats.create_zonalstats.doctree new file mode 100644 index 00000000..cd459443 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.zonalstats.create_zonalstats.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.cli.zonalstats.doctree b/docs/_build/doctrees/api/eolab.rastertools.cli.zonalstats.doctree new file mode 100644 index 00000000..74edc3c2 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.cli.zonalstats.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.doctree b/docs/_build/doctrees/api/eolab.rastertools.doctree new file mode 100644 index 00000000..62893b29 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.adaptive_gaussian.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.adaptive_gaussian.doctree new file mode 100644 index 00000000..68ca600e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.adaptive_gaussian.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.brightness_index.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.brightness_index.doctree new file mode 100644 index 00000000..316e22e3 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.brightness_index.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.brightness_index2.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.brightness_index2.doctree new file mode 100644 index 00000000..d1fe35ce Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.brightness_index2.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.doctree new file mode 100644 index 00000000..3062914c Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.evi.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.evi.doctree new file mode 100644 index 00000000..8d5090aa Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.evi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.hillshade.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.hillshade.doctree new file mode 100644 index 00000000..f712c72b Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.hillshade.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.interpolated_timeseries.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.interpolated_timeseries.doctree new file mode 100644 index 00000000..b1a95e31 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.interpolated_timeseries.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.ipvi.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.ipvi.doctree new file mode 100644 index 00000000..96767077 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.ipvi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.local_mean.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.local_mean.doctree new file mode 100644 index 00000000..1e11a018 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.local_mean.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.local_sum.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.local_sum.doctree new file mode 100644 index 00000000..ad6d8501 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.local_sum.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.median.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.median.doctree new file mode 100644 index 00000000..7d1d3de1 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.median.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.msavi.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.msavi.doctree new file mode 100644 index 00000000..764ffca2 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.msavi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.msavi2.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.msavi2.doctree new file mode 100644 index 00000000..79da0dc7 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.msavi2.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.normalized_difference.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.normalized_difference.doctree new file mode 100644 index 00000000..4f1c9062 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.normalized_difference.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.pvi.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.pvi.doctree new file mode 100644 index 00000000..015d09d3 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.pvi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.redness_index.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.redness_index.doctree new file mode 100644 index 00000000..62bb1827 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.redness_index.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.rvi.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.rvi.doctree new file mode 100644 index 00000000..aa26cb0e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.rvi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.savi.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.savi.doctree new file mode 100644 index 00000000..0702be0e Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.savi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.speed.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.speed.doctree new file mode 100644 index 00000000..17af1705 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.speed.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.svf.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.svf.doctree new file mode 100644 index 00000000..6594fdee Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.svf.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.tndvi.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.tndvi.doctree new file mode 100644 index 00000000..148e644b Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.tndvi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.algo.tsavi.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.tsavi.doctree new file mode 100644 index 00000000..b244bba3 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.algo.tsavi.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.doctree new file mode 100644 index 00000000..fe93e565 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.doctree new file mode 100644 index 00000000..75b34fbd Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.doctree new file mode 100644 index 00000000..62f5391f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.doctree new file mode 100644 index 00000000..1f987b72 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.doctree new file mode 100644 index 00000000..8f09ad44 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.doctree new file mode 100644 index 00000000..5586c0cc Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.doctree new file mode 100644 index 00000000..2717163f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.doctree new file mode 100644 index 00000000..732b350f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.doctree new file mode 100644 index 00000000..9dc213bb Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.doctree new file mode 100644 index 00000000..b28d693c Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.doctree new file mode 100644 index 00000000..4b911981 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.doctree new file mode 100644 index 00000000..d15f2f9f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.doctree new file mode 100644 index 00000000..a0816b1b Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.doctree new file mode 100644 index 00000000..e90ddeed Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.doctree new file mode 100644 index 00000000..a87e9f73 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.doctree new file mode 100644 index 00000000..5e25b461 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.doctree new file mode 100644 index 00000000..beb9a833 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.doctree new file mode 100644 index 00000000..0021dd41 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.doctree new file mode 100644 index 00000000..8d4dc887 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.doctree new file mode 100644 index 00000000..f207db71 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.doctree new file mode 100644 index 00000000..2f422ad2 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.doctree new file mode 100644 index 00000000..b5c22e65 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.doctree new file mode 100644 index 00000000..54ab94cc Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.doctree new file mode 100644 index 00000000..f428af8f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.doctree new file mode 100644 index 00000000..40d63de8 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.doctree new file mode 100644 index 00000000..bf6ac07c Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.doctree new file mode 100644 index 00000000..9da87a2c Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.doctree new file mode 100644 index 00000000..bc914e86 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.doctree new file mode 100644 index 00000000..30334e05 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.doctree new file mode 100644 index 00000000..33235e8d Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.doctree new file mode 100644 index 00000000..a54d2600 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.doctree new file mode 100644 index 00000000..fdea5e80 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.doctree new file mode 100644 index 00000000..6da1c3fc Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.doctree new file mode 100644 index 00000000..e922f1bb Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.doctree new file mode 100644 index 00000000..b351bce2 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.doctree new file mode 100644 index 00000000..80365d21 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.doctree new file mode 100644 index 00000000..a704c4a9 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.doctree new file mode 100644 index 00000000..726c91e0 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.doctree new file mode 100644 index 00000000..d4c5e66b Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.doctree new file mode 100644 index 00000000..ddac2b16 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.doctree new file mode 100644 index 00000000..85083857 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.doctree new file mode 100644 index 00000000..25fd35b9 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.doctree new file mode 100644 index 00000000..74bf9d2c Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.doctree new file mode 100644 index 00000000..badf69e3 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.doctree new file mode 100644 index 00000000..48de5285 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.doctree new file mode 100644 index 00000000..61e52fe7 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.doctree new file mode 100644 index 00000000..d44b0975 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.doctree new file mode 100644 index 00000000..c53b52a7 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.doctree new file mode 100644 index 00000000..edc68afc Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.doctree new file mode 100644 index 00000000..329ae474 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.doctree new file mode 100644 index 00000000..778a92fe Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.doctree new file mode 100644 index 00000000..c3038a57 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.doctree new file mode 100644 index 00000000..e1e34f0f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.doctree new file mode 100644 index 00000000..2a4442ea Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.doctree new file mode 100644 index 00000000..f921e9eb Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.doctree new file mode 100644 index 00000000..c60fda0a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.doctree new file mode 100644 index 00000000..2ad7b825 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.doctree new file mode 100644 index 00000000..be715dc5 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.sliding.compute_sliding.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.sliding.compute_sliding.doctree new file mode 100644 index 00000000..1a7387fc Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.sliding.compute_sliding.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.sliding.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.sliding.doctree new file mode 100644 index 00000000..50d0554c Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.sliding.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.stats.compute_zonal_stats.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.stats.compute_zonal_stats.doctree new file mode 100644 index 00000000..65afd197 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.stats.compute_zonal_stats.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.doctree new file mode 100644 index 00000000..0c94f8b1 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.stats.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.stats.doctree new file mode 100644 index 00000000..0e00eff4 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.stats.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.stats.extract_zonal_outliers.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.stats.extract_zonal_outliers.doctree new file mode 100644 index 00000000..e80731eb Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.stats.extract_zonal_outliers.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.stats.plot_stats.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.stats.plot_stats.doctree new file mode 100644 index 00000000..1dbc9835 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.stats.plot_stats.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.vector.clip.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.clip.doctree new file mode 100644 index 00000000..ee269992 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.clip.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.vector.crop.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.crop.doctree new file mode 100644 index 00000000..40b23722 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.crop.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.vector.dissolve.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.dissolve.doctree new file mode 100644 index 00000000..c37b67ee Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.dissolve.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.vector.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.doctree new file mode 100644 index 00000000..e46a5e15 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.vector.filter.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.filter.doctree new file mode 100644 index 00000000..22e065d6 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.filter.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.vector.filter_dissolve.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.filter_dissolve.doctree new file mode 100644 index 00000000..52a8f3aa Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.filter_dissolve.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.vector.get_raster_shape.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.get_raster_shape.doctree new file mode 100644 index 00000000..405cd75f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.get_raster_shape.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.vector.rasterize.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.rasterize.doctree new file mode 100644 index 00000000..aa692631 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.rasterize.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.vector.reproject.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.reproject.doctree new file mode 100644 index 00000000..9b1f56bd Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.reproject.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.processing.vector.vectorize.doctree b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.vectorize.doctree new file mode 100644 index 00000000..32405190 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.processing.vector.vectorize.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.doctree new file mode 100644 index 00000000..cebddd38 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.doctree new file mode 100644 index 00000000..586bd153 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.doctree new file mode 100644 index 00000000..6e9d180f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.doctree new file mode 100644 index 00000000..c4717ad0 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.create_in_memory_vrt.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.create_in_memory_vrt.doctree new file mode 100644 index 00000000..68dd3c75 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.create_in_memory_vrt.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.doctree new file mode 100644 index 00000000..6209e7cb Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.doctree new file mode 100644 index 00000000..e56f41c7 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.doctree new file mode 100644 index 00000000..ac4f70fa Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.doctree new file mode 100644 index 00000000..d4b8dcb0 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.doctree new file mode 100644 index 00000000..b0ef879f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.doctree new file mode 100644 index 00000000..9ba22900 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.doctree new file mode 100644 index 00000000..cae52592 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.doctree new file mode 100644 index 00000000..b72582b2 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.doctree new file mode 100644 index 00000000..fd8b2000 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.doctree new file mode 100644 index 00000000..07b57bb4 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.doctree new file mode 100644 index 00000000..f480a466 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.doctree new file mode 100644 index 00000000..4b7fe3fe Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.doctree new file mode 100644 index 00000000..9d0b9bc5 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.doctree new file mode 100644 index 00000000..84641f40 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.__init__.doctree new file mode 100644 index 00000000..0a299419 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.description.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.description.doctree new file mode 100644 index 00000000..786018a7 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.description.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.doctree new file mode 100644 index 00000000..b59e28b4 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.identifier.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.identifier.doctree new file mode 100644 index 00000000..90e402e9 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.identifier.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.blue.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.blue.doctree new file mode 100644 index 00000000..eccbedda Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.blue.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.doctree new file mode 100644 index 00000000..0e838f35 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.doctree new file mode 100644 index 00000000..75ed45a7 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.green.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.green.doctree new file mode 100644 index 00000000..123d6e94 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.green.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.mir.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.mir.doctree new file mode 100644 index 00000000..fa36e3a1 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.mir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.doctree new file mode 100644 index 00000000..d2ae2fff Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.nir.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.nir.doctree new file mode 100644 index 00000000..f809279a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.nir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.doctree new file mode 100644 index 00000000..e886aa54 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red.doctree new file mode 100644 index 00000000..d1196220 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.doctree new file mode 100644 index 00000000..21091339 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.doctree new file mode 100644 index 00000000..f0f141fe Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.doctree new file mode 100644 index 00000000..f23bff4a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.doctree new file mode 100644 index 00000000..e4e4fc76 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.swir.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.swir.doctree new file mode 100644 index 00000000..4b88cd8d Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.swir.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.__init__.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.__init__.doctree new file mode 100644 index 00000000..dc2f831a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.__init__.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.accept.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.accept.doctree new file mode 100644 index 00000000..55d4753b Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.accept.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.add.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.add.doctree new file mode 100644 index 00000000..67324e04 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.add.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.doctree new file mode 100644 index 00000000..704cbf5a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.channels.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.channels.doctree new file mode 100644 index 00000000..6ca853fb Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.channels.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.date_format.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.date_format.doctree new file mode 100644 index 00000000..9585d323 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.date_format.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.doctree new file mode 100644 index 00000000..991ae772 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.find.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.find.doctree new file mode 100644 index 00000000..d3a4269f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.find.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get.doctree new file mode 100644 index 00000000..4553205a Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.doctree new file mode 100644 index 00000000..1425445f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.doctree new file mode 100644 index 00000000..921078a8 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.doctree new file mode 100644 index 00000000..e87da9d5 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.doctree new file mode 100644 index 00000000..ebd04ce2 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.doctree new file mode 100644 index 00000000..98c978fb Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_date.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_date.doctree new file mode 100644 index 00000000..bfb0fc61 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_date.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_group.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_group.doctree new file mode 100644 index 00000000..039460e9 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_group.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask.doctree new file mode 100644 index 00000000..406ea35f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.doctree new file mode 100644 index 00000000..dd66fbf1 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.doctree new file mode 100644 index 00000000..54e69dff Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.doctree new file mode 100644 index 00000000..80346829 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.has_channel.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.has_channel.doctree new file mode 100644 index 00000000..61678272 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.has_channel.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.has_channels.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.has_channels.doctree new file mode 100644 index 00000000..c3bb6689 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.has_channels.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.has_mask.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.has_mask.doctree new file mode 100644 index 00000000..901f5921 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.has_mask.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.doctree new file mode 100644 index 00000000..b0912bfd Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.masknodata.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.masknodata.doctree new file mode 100644 index 00000000..e967dd25 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.masknodata.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.name.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.name.doctree new file mode 100644 index 00000000..6bb1f75f Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.name.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.nodata.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.nodata.doctree new file mode 100644 index 00000000..1f5b6021 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.nodata.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.doctree new file mode 100644 index 00000000..559395dd Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.doctree new file mode 100644 index 00000000..7e6a2ad4 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.doctree new file mode 100644 index 00000000..376c0ec9 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.rastertype.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.s2_maja_mask.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.s2_maja_mask.doctree new file mode 100644 index 00000000..369e06a0 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.s2_maja_mask.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.vrt.add_masks_to_vrt.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.vrt.add_masks_to_vrt.doctree new file mode 100644 index 00000000..47fd78c6 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.vrt.add_masks_to_vrt.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.vrt.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.vrt.doctree new file mode 100644 index 00000000..f8388d45 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.vrt.doctree differ diff --git a/docs/_build/doctrees/api/eolab.rastertools.product.vrt.set_band_descriptions.doctree b/docs/_build/doctrees/api/eolab.rastertools.product.vrt.set_band_descriptions.doctree new file mode 100644 index 00000000..149d5ba7 Binary files /dev/null and b/docs/_build/doctrees/api/eolab.rastertools.product.vrt.set_band_descriptions.doctree differ diff --git a/docs/_build/doctrees/api/modules.doctree b/docs/_build/doctrees/api/modules.doctree new file mode 100644 index 00000000..071b77e7 Binary files /dev/null and b/docs/_build/doctrees/api/modules.doctree differ diff --git a/docs/_build/doctrees/authors.doctree b/docs/_build/doctrees/authors.doctree new file mode 100644 index 00000000..59d08737 Binary files /dev/null and b/docs/_build/doctrees/authors.doctree differ diff --git a/docs/_build/doctrees/changelog.doctree b/docs/_build/doctrees/changelog.doctree new file mode 100644 index 00000000..7ce7d175 Binary files /dev/null and b/docs/_build/doctrees/changelog.doctree differ diff --git a/docs/_build/doctrees/cli.doctree b/docs/_build/doctrees/cli.doctree new file mode 100644 index 00000000..6338587d Binary files /dev/null and b/docs/_build/doctrees/cli.doctree differ diff --git a/docs/_build/doctrees/cli/filtering.doctree b/docs/_build/doctrees/cli/filtering.doctree new file mode 100644 index 00000000..e09970e0 Binary files /dev/null and b/docs/_build/doctrees/cli/filtering.doctree differ diff --git a/docs/_build/doctrees/cli/hillshade.doctree b/docs/_build/doctrees/cli/hillshade.doctree new file mode 100644 index 00000000..90efdbd6 Binary files /dev/null and b/docs/_build/doctrees/cli/hillshade.doctree differ diff --git a/docs/_build/doctrees/cli/radioindice.doctree b/docs/_build/doctrees/cli/radioindice.doctree new file mode 100644 index 00000000..157fe4b9 Binary files /dev/null and b/docs/_build/doctrees/cli/radioindice.doctree differ diff --git a/docs/_build/doctrees/cli/speed.doctree b/docs/_build/doctrees/cli/speed.doctree new file mode 100644 index 00000000..738192bf Binary files /dev/null and b/docs/_build/doctrees/cli/speed.doctree differ diff --git a/docs/_build/doctrees/cli/svf.doctree b/docs/_build/doctrees/cli/svf.doctree new file mode 100644 index 00000000..c1789890 Binary files /dev/null and b/docs/_build/doctrees/cli/svf.doctree differ diff --git a/docs/_build/doctrees/cli/tiling.doctree b/docs/_build/doctrees/cli/tiling.doctree new file mode 100644 index 00000000..5262ee48 Binary files /dev/null and b/docs/_build/doctrees/cli/tiling.doctree differ diff --git a/docs/_build/doctrees/cli/timeseries.doctree b/docs/_build/doctrees/cli/timeseries.doctree new file mode 100644 index 00000000..5c0c28f3 Binary files /dev/null and b/docs/_build/doctrees/cli/timeseries.doctree differ diff --git a/docs/_build/doctrees/cli/zonalstats.doctree b/docs/_build/doctrees/cli/zonalstats.doctree new file mode 100644 index 00000000..5e19e43f Binary files /dev/null and b/docs/_build/doctrees/cli/zonalstats.doctree differ diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle new file mode 100644 index 00000000..e37118cd Binary files /dev/null and b/docs/_build/doctrees/environment.pickle differ diff --git a/docs/_build/doctrees/index.doctree b/docs/_build/doctrees/index.doctree new file mode 100644 index 00000000..feac7f9b Binary files /dev/null and b/docs/_build/doctrees/index.doctree differ diff --git a/docs/_build/doctrees/install.doctree b/docs/_build/doctrees/install.doctree new file mode 100644 index 00000000..d314edeb Binary files /dev/null and b/docs/_build/doctrees/install.doctree differ diff --git a/docs/_build/doctrees/license.doctree b/docs/_build/doctrees/license.doctree new file mode 100644 index 00000000..61e77d96 Binary files /dev/null and b/docs/_build/doctrees/license.doctree differ diff --git a/docs/_build/doctrees/private_api.doctree b/docs/_build/doctrees/private_api.doctree new file mode 100644 index 00000000..91fbc9a2 Binary files /dev/null and b/docs/_build/doctrees/private_api.doctree differ diff --git a/docs/_build/doctrees/rasterproduct.doctree b/docs/_build/doctrees/rasterproduct.doctree new file mode 100644 index 00000000..1a725cd2 Binary files /dev/null and b/docs/_build/doctrees/rasterproduct.doctree differ diff --git a/docs/_build/doctrees/usage.doctree b/docs/_build/doctrees/usage.doctree new file mode 100644 index 00000000..a8017232 Binary files /dev/null and b/docs/_build/doctrees/usage.doctree differ diff --git a/docs/_build/html/.buildinfo b/docs/_build/html/.buildinfo new file mode 100644 index 00000000..8f29b071 --- /dev/null +++ b/docs/_build/html/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: ae4f88f06d84e4c8f580cb8042b34a78 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-grn.jpg b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-grn.jpg new file mode 100644 index 00000000..2600c62b Binary files /dev/null and b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-grn.jpg differ diff --git a/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg new file mode 100644 index 00000000..b35d861f Binary files /dev/null and b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg differ diff --git a/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg.aux.xml b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg.aux.xml new file mode 100644 index 00000000..a68509f6 --- /dev/null +++ b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg.aux.xml @@ -0,0 +1,43 @@ + + + JPEG + PIXEL + YCbCr + + + + JPEG + + + 255 + 200.4369815418 + 0 + 35.080097698202 + 100 + + + + + JPEG + + + 255 + 200.4369815418 + 0 + 35.080097698202 + 100 + + + + + JPEG + + + 255 + 200.4369815418 + 0 + 35.080097698202 + 100 + + + diff --git a/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-geoms.jpg b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-geoms.jpg new file mode 100644 index 00000000..f5cbc2dd Binary files /dev/null and b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-geoms.jpg differ diff --git a/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.jpg b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.jpg new file mode 100644 index 00000000..fb6601e5 Binary files /dev/null and b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.jpg differ diff --git a/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.jpg b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.jpg new file mode 100644 index 00000000..30c63903 Binary files /dev/null and b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.jpg differ diff --git a/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats.jpg b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats.jpg new file mode 100644 index 00000000..c3ac4627 Binary files /dev/null and b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats.jpg differ diff --git a/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats2.jpg b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats2.jpg new file mode 100644 index 00000000..5d746565 Binary files /dev/null and b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats2.jpg differ diff --git a/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.jpg b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.jpg new file mode 100644 index 00000000..fb6601e5 Binary files /dev/null and b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.jpg differ diff --git a/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.png b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.png new file mode 100644 index 00000000..542d2ef1 Binary files /dev/null and b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.png differ diff --git a/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg new file mode 100644 index 00000000..220fe911 Binary files /dev/null and b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg differ diff --git a/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi_cropped.jpg b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi_cropped.jpg new file mode 100644 index 00000000..592f0ad3 Binary files /dev/null and b/docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi_cropped.jpg differ diff --git a/docs/_build/html/_images/dsm-hillshade1.jpg b/docs/_build/html/_images/dsm-hillshade1.jpg new file mode 100644 index 00000000..9cddea48 Binary files /dev/null and b/docs/_build/html/_images/dsm-hillshade1.jpg differ diff --git a/docs/_build/html/_images/dsm-hillshade2.jpg b/docs/_build/html/_images/dsm-hillshade2.jpg new file mode 100644 index 00000000..dfa5f86b Binary files /dev/null and b/docs/_build/html/_images/dsm-hillshade2.jpg differ diff --git a/docs/_build/html/_images/dsm-hillshade3.jpg b/docs/_build/html/_images/dsm-hillshade3.jpg new file mode 100644 index 00000000..2f818e57 Binary files /dev/null and b/docs/_build/html/_images/dsm-hillshade3.jpg differ diff --git a/docs/_build/html/_images/dsm-svf.jpg b/docs/_build/html/_images/dsm-svf.jpg new file mode 100644 index 00000000..2c1a199f Binary files /dev/null and b/docs/_build/html/_images/dsm-svf.jpg differ diff --git a/docs/_build/html/_images/dsm-svf0.jpg b/docs/_build/html/_images/dsm-svf0.jpg new file mode 100644 index 00000000..6e8ce7e1 Binary files /dev/null and b/docs/_build/html/_images/dsm-svf0.jpg differ diff --git a/docs/_build/html/_images/dsm.jpg b/docs/_build/html/_images/dsm.jpg new file mode 100644 index 00000000..6adb8e21 Binary files /dev/null and b/docs/_build/html/_images/dsm.jpg differ diff --git a/docs/_build/html/_images/oso-stats.jpg b/docs/_build/html/_images/oso-stats.jpg new file mode 100644 index 00000000..18b01d96 Binary files /dev/null and b/docs/_build/html/_images/oso-stats.jpg differ diff --git a/docs/_build/html/_images/speed_ndvi.jpg b/docs/_build/html/_images/speed_ndvi.jpg new file mode 100644 index 00000000..6e0def5e Binary files /dev/null and b/docs/_build/html/_images/speed_ndvi.jpg differ diff --git a/docs/_build/html/_modules/eolab/rastertools/cli.html b/docs/_build/html/_modules/eolab/rastertools/cli.html new file mode 100644 index 00000000..95ebf315 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/cli.html @@ -0,0 +1,192 @@ + + + + + + + + eolab.rastertools.cli — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.cli

+# -*- coding: utf-8 -*-
+"""Module that defines the subcommands of rastertools.
+This module's API is not intended for external use.
+"""
+
+
+
[docs]def with_window_arguments(parser, pad: bool = True): + """Add arguments to set the windowing parameters of the raster tool + + Args: + parser: the argument parser to configure + pad: whether to add an argument for the padding + """ + # argument to set the window size + parser.add_argument( + '-ws', + '--window_size', + dest="window_size", + default=1024, + type=int, + help="Size of tiles to distribute processing, default: 1024") + + if pad: + # argument to set the padding strategy + parser.add_argument( + '-p', + '--pad', + dest="pad", + default="edge", + choices=["none", "edge", "maximum", "mean", "median", + "minimum", "reflect", "symmetric", "wrap"], + help="Pad to use around the image, default : edge " + "(see https://numpy.org/doc/stable/reference/generated/numpy.pad.html" + " for more information)")
+ + +
[docs]def with_outputdir_arguments(parser): + """Add arguments to set the output dir + + Args: + parser: the argument parser to configure + """ + # argument to set the output dir + parser.add_argument( + '-o', + '--output', + dest="output", + default=".", + help="Output dir where to store results (by default current dir)")
+ + +
[docs]def with_bands_arguments(parser): + """Add arguments to set the list of bands to process + + Args: + parser: the argument parser to configure + """ + # two arguments to manage the bands selection: + # - specify a list of requested bands + # - or use all existing bands + parser.add_argument( + '-b', + '--bands', + nargs="+", + dest="bands", + help="List of bands to compute") + parser.add_argument( + '-a', + '--all', + dest="all_bands", + action="store_true", + help="Compute all bands")
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/cli/filtering.html b/docs/_build/html/_modules/eolab/rastertools/cli/filtering.html new file mode 100644 index 00000000..e195f403 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/cli/filtering.html @@ -0,0 +1,258 @@ + + + + + + + + eolab.rastertools.cli.filtering — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.cli.filtering

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+CLI definition for the filtering tool
+"""
+from eolab.rastertools import Filtering
+from eolab.rastertools.cli.utils_cli import apply_process, pad_opt, win_opt, all_opt, band_opt
+import click
+import os
+
+CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
+
+
+
[docs]def create_filtering(output : str, window_size : int, pad : str, argsdict : dict, filter : str, bands : list, kernel_size : int, all_bands : bool) -> Filtering: + """ + This function initializes a `Filtering` tool instance and configures it with specified settings. + + It selects the filter type, kernel size, output settings, and processing bands. If `all_bands` is set + to True, the filter will apply to all bands in the raster; otherwise, it applies only to specified bands. + + Args: + output (str): The path for the filtered output file. + + window_size (int): Size of the processing window used by the filter. + + pad (str): Padding method used for windowing (default : 'edge'). + + argsdict (dict): Dictionary of additional filter configuration arguments. + + filter (str): The filter type to apply (must be a valid name in `Filtering` filters). + + bands (list): List of bands to process. If empty and `all_bands` is False, defaults to [1]. + + kernel_size (int): Size of the kernel used by the filter. + + all_bands (bool): Whether to apply the filter to all bands (True) or specific bands (False). + + Returns: + :obj:`eolab.rastertools.Filtering`: A configured `Filtering` instance ready for execution. + """ + # get the bands to process + if all_bands: + bands = None + else: + bands = list(map(int, bands)) if bands else [1] + + # create the rastertool object + raster_filters_dict = {rf.name: rf for rf in Filtering.get_default_filters()} + tool = Filtering(raster_filters_dict[filter], kernel_size, bands) + + # set up config with args values + tool.with_output(output) \ + .with_windows(window_size, pad) \ + .with_filter_configuration(argsdict) + + return tool
+ + +
[docs]def filter_options(options : list): + def wrapper(function): + for option in options: + function = option(function) + return function + return wrapper
+ + +inpt_arg = click.argument('inputs', type=str, nargs = -1, required = 1) + +ker_opt = click.option('--kernel_size', type=int, help="Kernel size of the filter function, e.g. 3 means a square" + " of 3x3 pixels on which the filter function is computed" + " (default: 8)") + +out_opt = click.option('-o', '--output', default = os.getcwd(), help="Output directory to store results (by default current directory)") + +sigma = click.option('--sigma', type=int, required = True, help="Standard deviation of the Gaussian distribution") + +@click.group(context_settings=CONTEXT_SETTINGS) +@click.pass_context +def filter(ctx): + """ + Apply a filter to a set of images. + """ + ctx.ensure_object(dict) + + +
[docs]def create_filter(filter_name : str): + + list_opt = [inpt_arg, ker_opt, out_opt, win_opt, pad_opt, band_opt, all_opt] + if filter_name == 'adaptive_gaussian': + list_opt.append(sigma) + + @filter.command(filter_name, context_settings=CONTEXT_SETTINGS) + @filter_options(list_opt) + @click.pass_context + def filter_filtername(ctx, inputs : list, output : str, window_size : int, pad : str, kernel_size : int, bands : list, all_bands : bool, **kwargs): + """ + Execute the requested filter on the input files with the specified parameters. + The `inputs` argument can either be a single file or a `.lst` file containing a list of input files. + + Arguments: + + inputs TEXT + + Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). + You can provide a single file with extension \".lst\" (e.g. \"filtering.lst\") that lists + the input files to process (one input file per line in .lst). + """ + argsdict = {"inputs": inputs} + + if filter_name == 'adaptive_gaussian': + argsdict = {"sigma" : kwargs["sigma"]} + + # Configure the filter tool instance + tool = create_filtering( + output=output, + window_size=window_size, + pad=pad, + argsdict=argsdict, + filter=filter_name, + bands=bands, + kernel_size=kernel_size, + all_bands=all_bands) + + apply_process(ctx, tool, inputs)
+ + +median = create_filter("median") +mean = create_filter("mean") +sum = create_filter("sum") +adaptive_gaussian = create_filter("adaptive_gaussian") + + + + + + + +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/cli/filtering_dyn.html b/docs/_build/html/_modules/eolab/rastertools/cli/filtering_dyn.html new file mode 100644 index 00000000..008593a2 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/cli/filtering_dyn.html @@ -0,0 +1,272 @@ + + + + + + + + eolab.rastertools.cli.filtering_dyn — rastertools 0.6.1.post1.dev19+gebce3d0.d20241113 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.cli.filtering_dyn

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+CLI definition for the filtering tool
+"""
+from typing import Callable
+
+from eolab.rastertools import Filtering
+#from eolab.rastertools.main import get_logger
+from eolab.rastertools.cli.utils_cli import apply_process
+#from eolab.rastertools.main import rastertools #Import the click group named rastertools
+import click
+import os
+
+CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
+
+
+
[docs]def create_filtering(output : str, window_size : int, pad : str, argsdict : dict, filter : str, bands : list, kernel_size : int, all_bands : bool) -> Filtering: + """ + This function initializes a `Filtering` tool instance and configures it with specified settings. + + It selects the filter type, kernel size, output settings, and processing bands. If `all_bands` is set + to True, the filter will apply to all bands in the raster; otherwise, it applies only to specified bands. + + Args: + output (str): The path for the filtered output file. + window_size (int): Size of the processing window used by the filter. + pad (str): Padding method used for windowing (e.g., 'reflect', 'constant', etc.). + argsdict (dict): Dictionary of additional filter configuration arguments. + filter (str): The filter type to apply (must be a valid name in `Filtering` filters). + bands (list): List of bands to process. If empty and `all_bands` is False, defaults to [1]. + kernel_size (int): Size of the kernel used by the filter. + all_bands (bool): Whether to apply the filter to all bands (True) or specific bands (False). + + Returns: + :obj:`eolab.rastertools.Filtering`: A configured `Filtering` instance ready for execution. + """ + # get the bands to process + if all_bands: + bands = None + else: + bands = list(map(int, bands)) if bands else [1] + + # create the rastertool object + raster_filters_dict = {rf.name: rf for rf in Filtering.get_default_filters()} + tool = Filtering(raster_filters_dict[filter], kernel_size, bands) + + # set up config with args values + tool.with_output(output) \ + .with_windows(window_size, pad) \ + .with_filter_configuration(argsdict) + + return tool
+ + +
[docs]def filter_options(options : list): + def wrapper(function): + for option in options: + function = option(function) + return function + return wrapper
+ + +inpt_arg = click.argument('inputs', type=str, nargs = -1, required = 1) + +ker_opt = click.option('--kernel_size', type=int, help="Kernel size of the filter function, e.g. 3 means a square" + "of 3x3 pixels on which the filter function is computed" + "(default: 8)") + +out_opt = click.option('-o', '--output', default = os.getcwd(), help="Output directory to store results (by default current directory)") + +win_opt = click.option('-ws', '--window_size', type=int, default = 1024, help="Size of tiles to distribute processing, default: 1024") + +pad_opt = click.option('-p','--pad',default="edge", type=click.Choice(['none','edge','maximum','mean','median','minimum','reflect','symmetric','wrap']), + help="Pad to use around the image, default : edge" + "(see https://numpy.org/doc/stable/reference/generated/numpy.pad.html" + "for more information)") + +band_opt = click.option('-b','--bands', multiple = True, type=int, help="List of bands to process") + +all_opt = click.option('-a', '--all','all_bands', type=bool, is_flag=True, help="Process all bands") + +sigma = click.option('--sigma', type=int, required = True, help="Standard deviation of the Gaussian distribution") + +@click.group(context_settings=CONTEXT_SETTINGS) +@click.pass_context +def filter(ctx): + """ + Apply a filter to a set of images. + """ + ctx.ensure_object(dict) + + +
[docs]def create_filter(filter_name : str): + + list_opt = [inpt_arg, ker_opt, out_opt, win_opt, pad_opt, band_opt, all_opt] + if filter_name == 'adaptive_gaussian': + list_opt.append(sigma) + + @filter.command(filter_name, context_settings=CONTEXT_SETTINGS) + @filter_options(list_opt) + @click.pass_context + def filter_filtername(ctx, inputs : list, output : str, window_size : int, pad : str, kernel_size : int, bands : list, all_bands : bool, **kwargs): + """ + Execute the requested filter on the input files with the specified parameters. + The `inputs` argument can either be a single file or a `.lst` file containing a list of input files. + + Arguments: + + inputs TEXT + + Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). + You can provide a single file with extension \".lst\" (e.g. \"filtering.lst\") that lists + the input files to process (one input file per line in .lst). + """ + argsdict = {"inputs": inputs} + + if filter_name == 'adaptive_gaussian': + argsdict = {"sigma" : kwargs["sigma"]} + + # Configure the filter tool instance + tool = create_filtering( + output=output, + window_size=window_size, + pad=pad, + argsdict=argsdict, + filter=filter_name, + bands=bands, + kernel_size=kernel_size, + all_bands=all_bands) + + apply_process(ctx, tool, inputs)
+ + +median = create_filter("median") +mean = create_filter("mean") +sum = create_filter("sum") +adaptive_gaussian = create_filter("adaptive_gaussian") + +
[docs]@filter.result_callback() +@click.pass_context +def handle_result(ctx): + if ctx.invoked_subcommand is None: + click.echo(ctx.get_help()) + ctx.exit()
+ + + + + + +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/cli/hillshade.html b/docs/_build/html/_modules/eolab/rastertools/cli/hillshade.html new file mode 100644 index 00000000..574696d2 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/cli/hillshade.html @@ -0,0 +1,218 @@ + + + + + + + + eolab.rastertools.cli.hillshade — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.cli.hillshade

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+CLI definition for the hillshade tool
+"""
+import eolab.rastertools.cli as cli
+from eolab.rastertools import Hillshade
+
+
+
[docs]def create_argparser(rastertools_parsers): + """Adds the hillshade subcommand to the given rastertools subparser + + Args: + rastertools_parsers: + The rastertools subparsers to which this subcommand shall be added. + + This argument provides from a code like this:: + + import argparse + main_parser = argparse.ArgumentParser() + rastertools_parsers = main_parser.add_subparsers() + hillshade.create_argparser(rastertools_parsers) + + Returns: + The rastertools subparsers updated with this subcommand + """ + parser = rastertools_parsers.add_parser( + "hillshade", aliases=["hs"], + help="Compute hillshades of a Digital Elevation / Surface / Height Model " + "(a raster containing the height of the point as pixel values)", + description="Compute hillshades of a Digital Elevation / Surface / Height Model.") + + # add specific arguments of the hillshade processing + arguments = { + "elevation": { + "required": True, + "type": float, + "help": "Elevation of the sun in degrees, [0°, 90°] where 90°=zenith and 0°=horizon" + }, + "azimuth": { + "required": True, + "type": float, + "help": "Azimuth of the sun in degrees, [0°, 360°] " + "where 0°=north, 90°=east, 180°=south and 270°=west" + }, + "radius": { + "required": False, + "type": int, + "help": "Max distance (in pixels) around a point to evaluate horizontal" + " elevation angle. If not set, it is automatically computed from" + " the range of altitudes in the digital model." + }, + "resolution": { + "default": 0.5, + "required": True, + "type": float, + "help": "Pixel resolution in meter" + }, + } + # add argument declared in the hillshade processing definition + for argument_name, argument_params in arguments.items(): + parser.add_argument(f"--{argument_name}", **argument_params) + + # add common arguments (inputs, output dir, window size, pad mode) + parser.add_argument( + "inputs", + nargs='+', + help="Input file to process (i.e. geotiff that contains the height " + "of the points as pixel values). " + "You can provide a single file with extension \".lst\" (e.g. \"filtering.lst\") " + "that lists the input files to process (one input file per line in .lst)") + cli.with_outputdir_arguments(parser) + cli.with_window_arguments(parser) + + # set the function to call when this subcommand is called + parser.set_defaults(func=create_hillshade) + + return rastertools_parsers
+ + +
[docs]def create_hillshade(args) -> Hillshade: + """Create and configure a new rastertool "Hillshade" according to argparse args + + Args: + args: args extracted from command line + + Returns: + :obj:`eolab.rastertools.Hillshade`: The configured rastertool to run + """ + # create the rastertool object + tool = Hillshade(args.elevation, args.azimuth, args.resolution, args.radius) + + # set up config with args values + tool.with_output(args.output) + tool.with_windows(args.window_size, args.pad) + + return tool
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/cli/radioindice.html b/docs/_build/html/_modules/eolab/rastertools/cli/radioindice.html new file mode 100644 index 00000000..db9ee8ac --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/cli/radioindice.html @@ -0,0 +1,246 @@ + + + + + + + + eolab.rastertools.cli.radioindice — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.cli.radioindice

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+CLI definition for the radioindice tool
+"""
+import logging
+
+from eolab.rastertools import RastertoolConfigurationException, Radioindice
+from eolab.rastertools.cli.utils_cli import apply_process, win_opt
+from eolab.rastertools.product import BandChannel
+from eolab.rastertools.processing import RadioindiceProcessing
+import sys
+import click
+import os
+
+_logger = logging.getLogger(__name__)
+
+CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help'])
+
+
+
[docs]def indices_opt(function): + """ + Create options for all the possible indices + """ + dict_indices = {'--ndvi' : "ndvi", '--tndvi' : "tndvi", '--rvi' : "rvi", '--pvi' : "pvi", '--savi' : "savi", '--tsavi' : "tsavi", + '--msavi' : "msavi", '--msavi2' : "msavi2", '--ipvi' : "ipvi", + '--evi' : "evi", '--ndwi' : "ndwi", '--ndwi2' : "ndwi2", '--mndwi' : "mndwi", + '--ndpi' : "ndpi", '--ndti' : "ndti", '--ndbi' : "ndbi", '--ri' : "ri", '--bi' : "bi", '--bi2' : "bi2"} + + for idc in dict_indices.keys(): + function = click.option(idc, is_flag=True, help=f"Compute " + dict_indices[idc] + " indice")(function) + return function
+ + +#Radioindice command +@click.command("radioindice",context_settings=CONTEXT_SETTINGS) +@click.argument('inputs', type=str, nargs = -1, required = 1) + +@click.option('-o','--output', default = os.getcwd(), help="Output directory to store results (by default current directory)") + +@click.option('-m', '--merge', is_flag = True, help="Merge all indices in the same image (i.e. one band per indice)") + +@click.option('-r', '--roi', type= str, help="Region of interest in the input image (vector)") + +@win_opt + +@click.option('-i', '--indices', type=str, multiple = True, + help=" List of indices to compute. Possible indices are: bi, bi2, evi, ipvi, mndwi, msavi, msavi2, ndbi, ndpi," + " ndti, ndvi, ndwi, ndwi2, pvi, ri, rvi, savi, tndvi, tsavi") + + +@indices_opt + +@click.option('-nd', '--normalized_difference','nd',type=str, + multiple=True, nargs=2, metavar="band1 band2", + help="Compute the normalized difference of two bands defined" + " as parameter of this option, e.g. \"-nd red nir\" will compute (red-nir)/(red+nir). " + "See eolab.rastertools.product.rastertype.BandChannel for the list of bands names. " + "Several nd options can be set to compute several normalized differences.") + + +@click.pass_context +def radioindice(ctx, inputs : list, output : str, indices : list, merge : bool, roi : str, window_size : int, nd : str, **kwargs) : + """ + Compute the requested radio indices on raster data. + + This command computes various vegetation and environmental indices on satellite or raster data based on the + provided input images and options. The tool can compute specific indices, merge the results into one image, + compute normalized differences between bands, and apply processing using a region of interest (ROI) and specified + tile/window size. + + Arguments: + + inputs TEXT + + Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). + You can provide a single file with extension \".lst\" (e.g. \"radioindice.lst\") that lists + the input files to process (one input file per line in .lst). + """ + indices_opt = [key for key, value in kwargs.items() if value] + indices_to_compute = [] + + # append indices defined with --<name_of_indice> + indices_to_compute.extend([indice for indice in Radioindice.get_default_indices() + if indice.name in indices_opt]) + + # append indices defined with --indices + if indices: + indices_dict = {indice.name: indice for indice in Radioindice.get_default_indices()} + for ind in indices: + if ind in indices_dict: + indices_to_compute.append(indices_dict[ind]) + else: + _logger.exception(RastertoolConfigurationException(f"Invalid indice name: {ind}")) + sys.exit(2) + + if nd: + for nd_bands in nd: + if nd_bands[0] in BandChannel.__members__ and nd_bands[1] in BandChannel.__members__: + channel1 = BandChannel[nd_bands[0]] + channel2 = BandChannel[nd_bands[1]] + new_indice = RadioindiceProcessing(f"nd[{nd_bands[0]}-{nd_bands[1]}]").with_channels( + [channel2, channel1]) + indices_to_compute.append(new_indice) + else: + _logger.exception(RastertoolConfigurationException(f"Invalid band(s) in normalized difference: {nd_bands[0]} and/or {nd_bands[1]}")) + sys.exit(2) + + # handle special case: no indice setup + if len(indices_to_compute) == 0: + indices_to_compute.append(Radioindice.ndvi) + indices_to_compute.append(Radioindice.ndwi) + indices_to_compute.append(Radioindice.ndwi2) + + # create the rastertool object + tool = Radioindice(indices_to_compute) + + # set up config with args values + tool.with_output(output, merge) + tool.with_roi(roi) + tool.with_windows(window_size) + + apply_process(ctx, tool, inputs) + + +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/cli/speed.html b/docs/_build/html/_modules/eolab/rastertools/cli/speed.html new file mode 100644 index 00000000..f0270dde --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/cli/speed.html @@ -0,0 +1,190 @@ + + + + + + + + eolab.rastertools.cli.speed — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.cli.speed

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+CLI definition for the speed tool
+"""
+import eolab.rastertools.cli as cli
+from eolab.rastertools import Speed
+
+
+
[docs]def create_argparser(rastertools_parsers): + """Adds the speed subcommand to the given rastertools subparser + + Args: + rastertools_parsers: + The rastertools subparsers to which this subcommand shall be added. + + This argument provides from a code like this:: + + import argparse + main_parser = argparse.ArgumentParser() + rastertools_parsers = main_parser.add_subparsers() + speed.create_argparser(rastertools_parsers) + + Returns: + The rastertools subparsers updated with this subcommand + """ + parser = rastertools_parsers.add_parser( + "speed", aliases=["sp"], + help="Compute speed of rasters", + description="Compute the speed of radiometric values of several raster images", + epilog="By default only first band is computed.") + parser.add_argument( + "inputs", + nargs='+', + help="Input files to process (e.g. Sentinel2 L2A MAJA from THEIA). " + "You can provide a single file with extension \".lst\" (e.g. \"speed.lst\") " + "that lists the input files to process (one input file per line in .lst)") + cli.with_bands_arguments(parser) + cli.with_outputdir_arguments(parser) + + # set the function to call when this subcommand is called + parser.set_defaults(func=create_speed) + + return rastertools_parsers
+ + +
[docs]def create_speed(args) -> Speed: + """Create and configure a new rastertool "Speed" according to argparse args + + Args: + args: args extracted from command line + + Returns: + :obj:`eolab.rastertools.Speed`: The configured rastertool to run + """ + + # get the bands to process + if args.all_bands: + bands = None + else: + bands = list(map(int, args.bands)) if args.bands else [1] + + # create the rastertool object + tool = Speed(bands) + + # set up config with args values + tool.with_output(args.output) + + return tool
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/cli/svf.html b/docs/_build/html/_modules/eolab/rastertools/cli/svf.html new file mode 100644 index 00000000..aa63aa4e --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/cli/svf.html @@ -0,0 +1,218 @@ + + + + + + + + eolab.rastertools.cli.svf — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.cli.svf

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+CLI definition for the SVF (Sky View Factor) tool
+"""
+import eolab.rastertools.cli as cli
+from eolab.rastertools import SVF
+
+
+
[docs]def create_argparser(rastertools_parsers): + """Adds the SVF subcommand to the given rastertools subparser + + Args: + rastertools_parsers: + The rastertools subparsers to which this subcommand shall be added. + + This argument provides from a code like this:: + + import argparse + main_parser = argparse.ArgumentParser() + rastertools_parsers = main_parser.add_subparsers() + svf.create_argparser(rastertools_parsers) + + Returns: + The rastertools subparsers updated with this subcommand + """ + parser = rastertools_parsers.add_parser( + "svf", + help="Compute Sky View Factor of a Digital Height Model", + description="Compute Sky View Factor of a Digital Height Model.") + + # add specific argument of the svf processing + arguments = { + "radius": { + "default": 16, + "required": True, + "type": int, + "help": "Max distance (in pixels) around a point to evaluate horizontal" + " elevation angle" + }, + "directions": { + "default": 12, + "required": True, + "type": int, + "help": "Number of directions on which to compute the horizon elevation angle" + }, + "resolution": { + "default": 0.5, + "required": True, + "type": float, + "help": "Pixel resolution in meter" + }, + "altitude": { + "type": int, + "help": "Reference altitude to use for computing the SVF. If this option is not" + " specified, SVF is computed for every point at the altitude of the point" + } + } + for argument_name, argument_params in arguments.items(): + parser.add_argument(f"--{argument_name}", **argument_params) + + # add common arguments (inputs, output dir, window size, pad mode) + parser.add_argument( + "inputs", + nargs='+', + help="Input file to process (i.e. geotiff corresponding to a Digital Height Model). " + "You can provide a single file with extension \".lst\" (e.g. \"filtering.lst\") " + "that lists the input files to process (one input file per line in .lst)") + cli.with_outputdir_arguments(parser) + cli.with_window_arguments(parser) + + # set the function to call when this subcommand is called + parser.set_defaults(func=create_svf) + + return rastertools_parsers
+ + +
[docs]def create_svf(args) -> SVF: + """Create and configure a new rastertool "SVF" according to argparse args + + Args: + args: args extracted from command line + + Returns: + :obj:`eolab.rastertools.SVF`: The configured rastertool to run + """ + + # create the rastertool object + tool = SVF(args.directions, args.radius, args.resolution) + + # set up config with args values + tool.with_output(args.output) + tool.with_windows(args.window_size, args.pad) + if args.altitude is not None: + tool.with_altitude(args.altitude) + + return tool
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/cli/tiling.html b/docs/_build/html/_modules/eolab/rastertools/cli/tiling.html new file mode 100644 index 00000000..21e9c22a --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/cli/tiling.html @@ -0,0 +1,223 @@ + + + + + + + + eolab.rastertools.cli.tiling — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.cli.tiling

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+CLI definition for the tiling tool
+"""
+import eolab.rastertools.cli as cli
+from eolab.rastertools import Tiling
+
+
+
[docs]def create_argparser(rastertools_parsers): + """Adds the tiling subcommand to the given rastertools subparser + + Args: + rastertools_parsers: + The rastertools subparsers to which this subcommand shall be added. + + This argument provides from a code like this:: + + import argparse + main_parser = argparse.ArgumentParser() + rastertools_parsers = main_parser.add_subparsers() + tiling.create_argparser(rastertools_parsers) + + Returns: + The rastertools subparsers updated with this subcommand + """ + parser = rastertools_parsers.add_parser( + "tiling", aliases=["ti"], + help="Generate image tiles", + description="Generate tiles of an input raster image following the geometries " + "defined by a given grid") + parser.add_argument( + "inputs", + nargs='+', + help="Raster files to process. " + "You can provide a single file with extension \".lst\" (e.g. \"tiling.lst\") " + "that lists the input files to process (one input file per line in .lst)") + parser.add_argument( + '-g', + '--grid', + dest="grid_file", + help="vector-based spatial data file containing the grid to use to generate the tiles", + required=True) + parser.add_argument( + "--id_col", + dest="id_column", + help="Name of the column in the grid file used to number the tiles. When ids are defined," + " this argument is required to identify which column corresponds to the defined ids", + ) + parser.add_argument( + "--id", + dest="id", + help="Tiles ids of the grid to export as new tile, default all", + nargs="+", + type=int + ) + cli.with_outputdir_arguments(parser) + parser.add_argument( + "-n", + "--name", + dest="output_name", + help="Basename for the output raster tiles, default: \"{}_tile{}\". " + "The basename must be defined as a formatted string where tile index is at position 1 " + "and original filename is at position 0. For instance, tile{1}.tif will generate the " + "filename tile75.tif for the tile id = 75.", + default="{}_tile{}" + ) + parser.add_argument( + "-d", + "--dir", + dest="subdir_name", + help="When each tile must be generated in a different subdir, it defines the naming " + "convention for the subdir. It is a formatted string with one positional parameter " + "corresponding to the tile index. For instance, tile{} will generate the subdir " + "name tile75/ for the tile id = 75. By default, subdir is not defined and output " + "files will be generated directly in the outputdir." + ) + + # set the function to call when this subcommand is called + parser.set_defaults(func=create_tiling) + + return rastertools_parsers
+ + +
[docs]def create_tiling(args) -> Tiling: + """Create and configure a new rastertool "Tiling" according to argparse args + + Args: + args: args extracted from command line + + Returns: + :obj:`eolab.rastertools.Tiling`: The configured rastertool to run + """ + + # create the rastertool object + tool = Tiling(args.grid_file) + + # set up config with args values + tool.with_output(args.output, args.output_name, args.subdir_name) + tool.with_id_column(args.id_column, args.id) + + return tool
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/cli/timeseries.html b/docs/_build/html/_modules/eolab/rastertools/cli/timeseries.html new file mode 100644 index 00000000..6ea95493 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/cli/timeseries.html @@ -0,0 +1,224 @@ + + + + + + + + eolab.rastertools.cli.timeseries — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.cli.timeseries

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+CLI definition for the timeseries tool
+"""
+from datetime import datetime
+
+import eolab.rastertools.cli as cli
+from eolab.rastertools import RastertoolConfigurationException, Timeseries
+
+
+
[docs]def create_argparser(rastertools_parsers): + """Adds the timeseries subcommand to the given rastertools subparser + + Args: + rastertools_parsers: + The rastertools subparsers to which this subcommand shall be added. + + This argument provides from a code like this:: + + import argparse + main_parser = argparse.ArgumentParser() + rastertools_parsers = main_parser.add_subparsers() + timeseries.create_argparser(rastertools_parsers) + + Returns: + The rastertools subparsers updated with this subcommand + """ + parser = rastertools_parsers.add_parser( + "timeseries", aliases=["ts"], + help="Temporal gap filling of an image time series", + description="Generate a timeseries of images (without gaps) from a set of input images. " + "Data not present in the input images (no image for the date or masked data) " + "are interpolated (with linear interpolation) so that all gaps are filled.", + epilog="By default only first band is computed.") + parser.add_argument( + "inputs", + nargs='+', + help="Input files to process (e.g. Sentinel2 L2A MAJA from THEIA). " + "You can provide a single file with extension \".lst\" (e.g. \"speed.lst\") " + "that lists the input files to process (one input file per line in .lst)") + cli.with_bands_arguments(parser) + cli.with_outputdir_arguments(parser) + parser.add_argument( + "-s", + "--start_date", + help="Start date of the timeseries to generate in the following format: yyyy-MM-dd") + parser.add_argument( + "-e", + "--end_date", + help="End date of the timeseries to generate in the following format: yyyy-MM-dd") + parser.add_argument( + "-p", + "--time_period", + type=int, + help="Time period (number of days) between two consecutive images in the timeseries " + "to generate e.g. 10 = generate one image every 10 days") + cli.with_window_arguments(parser, pad=False) + + # set the function to call when this subcommand is called + parser.set_defaults(func=create_timeseries) + + return rastertools_parsers
+ + +
[docs]def create_timeseries(args) -> Timeseries: + """Create and configure a new rastertool "Timeseries" according to argparse args + + Args: + args: args extracted from command line + + Returns: + :obj:`eolab.rastertools.Timeseries`: The configured rastertool to run + """ + + # get the bands to process + if args.all_bands: + bands = None + else: + bands = list(map(int, args.bands)) if args.bands else [1] + + # convert start/end dates to datetime + try: + start_date = datetime.strptime(args.start_date, "%Y-%m-%d") + except Exception: + raise RastertoolConfigurationException( + f"Invalid format for start date: {args.start_date} (must be %Y-%m-%d)") + + # convert start/end dates to datetime + try: + end_date = datetime.strptime(args.end_date, "%Y-%m-%d") + except Exception: + raise RastertoolConfigurationException( + f"Invalid format for end date: {args.end_date} (must be %Y-%m-%d)") + + # create the rastertool object + tool = Timeseries(start_date, end_date, args.time_period, bands) + + # set up config with args values + tool.with_output(args.output) + tool.with_windows(args.window_size) + + return tool
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/cli/utils_cli.html b/docs/_build/html/_modules/eolab/rastertools/cli/utils_cli.html new file mode 100644 index 00000000..05eca6d0 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/cli/utils_cli.html @@ -0,0 +1,225 @@ + + + + + + + + eolab.rastertools.cli.utils_cli — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.cli.utils_cli

+from eolab.rastertools import RastertoolConfigurationException
+import logging
+import sys
+import click
+
+#TO DO
+_logger = logging.getLogger(__name__)
+
+all_opt = click.option('-a', '--all','all_bands', type=bool, is_flag=True, help="Process all bands")
+
+band_opt = click.option('-b','--bands', type=int, multiple = True, help="List of bands to process")
+
+win_opt = click.option('-ws', '--window_size', type=int, default = 1024, help="Size of tiles to distribute processing, default: 1024")
+
+pad_opt = click.option('-p', '--pad',default="edge", type=click.Choice(['none','edge','maximum','mean','median','minimum','reflect','symmetric','wrap']),
+              help="Pad to use around the image, default : edge" 
+                  "(see https://numpy.org/doc/stable/reference/generated/numpy.pad.html"
+                  " for more information)")
+
+def _extract_files_from_list(cmd_inputs):
+    """
+    Extracts a list of file paths from a command line input.
+
+    If the input is a single file with a `.lst` extension, it reads the file line-by-line and treats each
+    line as an individual file path, returning the list of paths. If the input is already a
+    list of file paths, it is returned as-is.
+
+    Args:
+        cmd_inputs (list of str):
+            Command line inputs for file paths. If it contains a single `.lst` file, this file
+            is read to obtain the list of files. Otherwise, it is assumed to be a direct list of files.
+
+    Returns:
+        list of str: A list of file paths, either extracted from the `.lst` file or passed directly.
+
+    Example:
+        _extract_files_from_list(["files.lst"])
+
+        _extract_files_from_list(["file1.tif", "file2.tif"])
+
+    Notes:
+        The `.lst` file is expected to have one file path per line. Blank lines in the `.lst`
+        file will be ignored.
+    """
+
+    # handle the input file of type "lst"
+    if len(cmd_inputs) == 1 and cmd_inputs[0][-4:].lower() == ".lst":
+        # parse the listing
+        with open(cmd_inputs[0]) as f:
+            inputs = f.read().splitlines()
+    else:
+        inputs = cmd_inputs
+
+    return inputs
+
+
+
[docs]def apply_process(ctx, tool, inputs : list): + """ + Apply the chosen process to a set of input files. + + This function extracts input files from a provided list or direct paths, configures the specified tool, + and processes the files through the given tool. Additionally, it handles debug settings (such as storing + intermediate VRT files) and manages any exceptions during the process. If an error occurs, the function + logs the exception and terminates the process with an appropriate exit code. + + Args: + ctx (click.Context): + The context object that contains configuration options. + + tool (Filtering or Hillshade or any raster processing tool): + The configured tool instance that will apply the process to the input files. The tool should have + been properly set up with parameters. + + inputs (list or str): + A list of input file paths or a path to a `.lst` file containing a list of input file paths. + This argument specifies the files that the tool will process. + + Raises: + RastertoolConfigurationException: + If there is a configuration error with the tool or its parameters. + + Exception: + Any other exceptions that occur during the processing of the input files. + """ + try: + # handle the input file of type "lst" + inputs_extracted = _extract_files_from_list(inputs) + + # setup debug mode in which intermediate VRT files are stored to disk or not + tool.with_vrt_stored(ctx.obj.get('keep_vrt')) + + # launch process + tool.process_files(inputs_extracted) + + _logger.info("Done!") + + except RastertoolConfigurationException as rce: + _logger.exception(rce) + sys.exit(2) + + except Exception as err: + _logger.exception(err) + sys.exit(1) + sys.exit(0)
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/cli/zonalstats.html b/docs/_build/html/_modules/eolab/rastertools/cli/zonalstats.html new file mode 100644 index 00000000..37c812e6 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/cli/zonalstats.html @@ -0,0 +1,303 @@ + + + + + + + + eolab.rastertools.cli.zonalstats — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.cli.zonalstats

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+CLI definition for the zonalstats tool
+"""
+import eolab.rastertools.cli as cli
+from eolab.rastertools import Zonalstats
+
+
+
[docs]def create_argparser(rastertools_parsers): + """Adds the zonalstats subcommand to the given rastertools subparser + + Args: + rastertools_parsers: + The rastertools subparsers to which this subcommand shall be added. + + This argument provides from a code like this:: + + import argparse + main_parser = argparse.ArgumentParser() + rastertools_parsers = main_parser.add_subparsers() + zonalstats.create_argparser(rastertools_parsers) + + Returns: + The rastertools subparsers updated with this subcommand + """ + parser = rastertools_parsers.add_parser( + "zonalstats", aliases=["zs"], + help="Compute zonal statistics", + description="Compute zonal statistics of a raster image.\n Available statistics are: " + "min max range mean std percentile_x (x in [0, 100]) median mad " + "count valid nodata sum majority minority unique", + epilog="By default only first band is computed.") + parser.add_argument( + "inputs", + nargs='+', + help="Raster files to process. " + "You can provide a single file with extension \".lst\" (e.g. \"zonalstats.lst\") " + "that lists the input files to process (one input file per line in .lst)") + cli.with_outputdir_arguments(parser) + parser.add_argument( + '-f', + '--format', + dest="output_format", + help="Output format of the results when input geometries are provided (by default ESRI " + f"Shapefile). Possible values are {', '.join(Zonalstats.supported_output_formats)}") + parser.add_argument( + '-g', + '--geometry', + dest="geometries", + help="List of geometries where to compute statistics (vector like a shapefile or geojson)") + parser.add_argument( + '-w', + '--within', + dest="within", + action="store_true", + help="When activated, statistics are computed for the geometries that are within " + "the raster shape. The default behaviour otherwise is to compute statistics " + "for all geometries that intersect the raster shape.") + parser.add_argument( + '--stats', + dest="stats", + nargs="+", + help="List of stats to compute. Possible stats are: " + "min max range mean std percentile_x (x in [0, 100]) median mad " + "count valid nodata sum majority minority unique") + parser.add_argument( + '--categorical', + dest="categorical", + action="store_true", + help="If the input raster is categorical (i.e. raster values represent discrete classes) " + "compute the counts of every unique pixel values.") + parser.add_argument( + '--valid_threshold', + dest="valid_threshold", + type=float, + help="Minimum percentage of valid pixels in a shape to compute its statistics.") + parser.add_argument( + '--area', + dest='area', + action="store_true", + help="Whether to multiply all stats by the area of a cell of the input raster." + ) + parser.add_argument( + '--prefix', + dest="prefix", + help="Add a prefix to the keys (default: None). One prefix per band (e.g. 'band1 band2')") + + cli.with_bands_arguments(parser) + + # argument group for the outliers image generation + outliers_pc = parser.add_argument_group("Options to output the outliers") + outliers_pc.add_argument( + '--sigma', + dest="sigma", + help="Distance to the mean value (in sigma) in order to produce a raster " + "that highlights outliers.") + + # argument group for generating stats charts + chart_pc = parser.add_argument_group('Options to plot the generated stats') + chart_pc.add_argument( + '-c', + '--chart', + dest="chartfile", + help="Generate a chart per stat and per geometry " + "(x=timestamp of the input products / y=stat value) and " + "store it in the file defined by this argument") + chart_pc.add_argument( + '-d', + '--display', + dest="display", + action="store_true", + help="Display the chart") + chart_pc.add_argument( + '-gi', + '--geometry-index', + dest="geom_index", + default='ID', + help="Name of the geometry index used for the chart (default='ID')") + + # argument group to generate stats per category + group_pc = parser.add_argument_group('Options to compute stats per category in geometry. ' + 'If activated, the generated geometries will contain ' + 'stats for every categories present in the geometry') + group_pc.add_argument( + '--category_file', + help="File (raster or geometries) containing discrete classes classifying the ROI." + ) + group_pc.add_argument( + '--category_index', + help="Column name identifying categories in categroy_file " + "(only if file format is geometries)", + default="Classe" + ) + group_pc.add_argument( + '--category_names', + help="JSON files containing a dict with classes index as keys and names " + "to display classes as values.", + default="" + ) + + # set the function to call when this subcommand is called + parser.set_defaults(func=create_zonalstats) + + return rastertools_parsers
+ + +
[docs]def create_zonalstats(args) -> Zonalstats: + """Create and configure a new rastertool "Zonalstats" according to argparse args + + Args: + args: args extracted from command line + + Returns: + :obj:`eolab.rastertools.Zonalstats`: The configured rastertool to run + """ + # get and check the list of stats to compute + if args.stats: + stats_to_compute = args.stats + elif args.categorical: + stats_to_compute = [] + else: + stats_to_compute = ['count', 'min', 'max', 'mean', 'std'] + + # get the bands to process + if args.all_bands: + bands = None + else: + bands = list(map(int, args.bands)) if args.bands else [1] + + # create the rastertool object + tool = Zonalstats(stats_to_compute, args.categorical, args.valid_threshold, + args.area, args.prefix, bands) + + # set up config with args values + tool.with_output(args.output, args.output_format) \ + .with_geometries(args.geometries, args.within) \ + .with_outliers(args.sigma) \ + .with_chart(args.chartfile, args.geom_index, args.display) \ + .with_per_category(args.category_file, args.category_index, args.category_names) + + return tool
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/filtering.html b/docs/_build/html/_modules/eolab/rastertools/filtering.html new file mode 100644 index 00000000..7e49c0a8 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/filtering.html @@ -0,0 +1,349 @@ + + + + + + + + eolab.rastertools.filtering — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.filtering

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+This module defines a rastertool named Filtering that can apply different kind
+of filters on raster images.
+"""
+import logging.config
+from typing import List, Dict
+from pathlib import Path
+
+from eolab.rastertools import utils
+from eolab.rastertools import Rastertool, Windowable
+from eolab.rastertools.processing import algo
+from eolab.rastertools.processing import RasterFilter, compute_sliding
+from eolab.rastertools.product import RasterProduct
+
+
+_logger = logging.getLogger(__name__)
+
+
+
[docs]class Filtering(Rastertool, Windowable): + """Raster tool that applies a filter on a raster image. + + Predefined filters are available: + + - Median filter + - Local sum + - Local mean + - Adaptive gaussian filter. + + A filter is applied on a kernel of a configurable size. To set the kernel size, you need + to call: + + .. code-block:: python + + tool = Filtering(Filtering.median_filter, kernel_size=16) + + Custom additional filters can be easily added by instanciating a RasterFilter (see + :obj:`eolab.rastertools.processing.RasterFilter`). + + The parameters that customize the filter algo can be passed by following this procedure: + + .. code-block:: python + + def myalgo(input_data, **kwargs): + # kwargs contain the values of the algo parameters + kernel_size = kwargs.get('kernel_size', 8) + myparam = kwargs.get('myparam', 1) + # ... do someting ... + + my_filter = RasterFilter( + "myfilter", algo=myalgo + ).with_documentation( + help="Apply my filter", + description="Apply my filter" + ).with_arguments({ + "myparam": { + # configure the command line interface for this param, this can be skipped + "default": 8, + "required": True, + "type": int, + "help": "my configuration param for myalgo" + } + }) + + # create the raster tool + tool = Filtering(my_filter, kernel_size=16) + my_filter.with_output(".") + my_filter.with_window(1024, "edge") + # set the configuration parameter of the algo + my_filter.with_filter_configuration({"myparam": 1024}) + # run the tool + tool.process_file("./mytif.tif") + """ + median_filter = RasterFilter( + "median", algo=algo.median + ).with_documentation( + help="Apply median filter", + description="Apply a median filter (see scipy median_filter for more information)" + ) + """ + Applies a Median Filter to the input data using + `scipy.ndimage.median_filter <https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.median_filter.html>`_. + The filter computes the median contained in the sliding window determined by kernel_size. + + Returns: + Numpy array containing the input data filtered by the median filter + """ + + local_sum = RasterFilter( + "sum", algo=algo.local_sum + ).with_documentation( + help="Apply local sum filter", + description="Apply a local sum filter using integral image method" + ) + """Computes the local sums of the input data. + Each element is the sum of the pixels contained in the sliding window determined by kernel_size. + + Returns: + Numpy array of the size of input_data containing the computed local sums + """ + + local_mean = RasterFilter( + "mean", algo=algo.local_mean + ).with_documentation( + help="Apply local mean filter", + description="Apply a local mean filter using integral image method", + ) + """Computes the local means of the input data. + Each element is the mean of the pixels contained in the sliding window determined by kernel_size. + + Returns: + Numpy array of the size of input_data containing the computed local means + """ + + adaptive_gaussian = RasterFilter( + "adaptive_gaussian", algo=algo.adaptive_gaussian, per_band_algo=True + ).with_documentation( + help="Apply adaptive gaussian filter", + description="Apply an adaptive (Local gaussian of 3x3) recursive filter on the input image", + ).with_arguments({ + "sigma": { + "default": 1, + "required": True, + "type": float, + "help": "Standard deviation of the Gaussian distribution (sigma)" + }, + }) + """RasterFilter that applies an adaptive gaussian filter to the kernel. The parameter sigma defines the standard deviation + of the Gaussian distribution. + + Returns: + Numpy array containing the input data filtered by the Gaussian filter. + """ + +
[docs] @staticmethod + def get_default_filters(): + """Get the list of predefined raster filters + + Returns: + [:obj:`eolab.rastertools.processing.RasterFilter`] List of the predefined + raster filters ([Median, Local sum, Local mean, Adaptive gaussian]) + """ + return [ + Filtering.median_filter, Filtering.local_sum, + Filtering.local_mean, Filtering.adaptive_gaussian + ]
+ +
[docs] def __init__(self, raster_filter: RasterFilter, kernel_size: int, bands: List[int] = [1]): + """Constructor + + Args: + raster_filter (:obj:`eolab.rastertools.processing.RasterFilter`): + The instance of RasterFilter to apply + kernel_size (int): + Size of the kernel on which the filter is applied + bands ([int], optional, default=[1]): + List of bands in the input image to process. + Set None if all bands shall be processed. + """ + super().__init__() + # initialize default windowing configuration + self.with_windows() + # the raster filter processing + self._raster_filter = raster_filter + self._raster_filter.configure({"kernel_size": kernel_size}) + + self._bands = bands
+ + @property + def bands(self) -> List[int]: + """List of bands to process""" + return self._bands + + @property + def raster_filter(self) -> RasterFilter: + """Name of the filter to apply to the raster""" + return self._raster_filter + +
[docs] def with_filter_configuration(self, argsdict: Dict): + """Configure the filter with its specific arguments' values + + Args: + argsdict (dict): + Dictionary of filter's arguments names and values. Shall contain at least + the kernel size (key="kernel") + + Returns: + :obj:`eolab.rastertools.Filtering`: The current instance so that it is + possible to chain the with... calls (fluent API) + """ + self.raster_filter.configure(argsdict) + return self
+ +
[docs] def process_file(self, inputfile: str) -> List[str]: + """Apply the filter to the input file + + Args: + inputfile (str): + Input image to process + + Returns: + ([str]) A list of one element containing the path of the generated filtered image. + """ + _logger.info(f"Processing file {inputfile}") + + overlap = (self.raster_filter.kernel_size + 1) // 2 + if overlap >= min(self.window_size) / 2: + raise ValueError("The kernel size (option --kernel_size, " + f"value={self.raster_filter.kernel_size}) " + "must be strictly less than the window size minus 1 " + f"(option --window_size, value={min(self.window_size)})") + + # STEP 1: Prepare the input image so that it can be processed + with RasterProduct(inputfile, vrt_outputdir=self.vrt_dir) as product: + + # STEP 2: apply filter + outdir = Path(self.outputdir) + output_image = outdir.joinpath( + f"{utils.get_basename(inputfile)}-{self.raster_filter.name}.tif") + + compute_sliding( + product.get_raster(), output_image, self.raster_filter, + window_size=self.window_size, + window_overlap=(self.raster_filter.kernel_size + 1) // 2, + pad_mode=self.pad_mode, + bands=self.bands) + + return [output_image.as_posix()]
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/hillshade.html b/docs/_build/html/_modules/eolab/rastertools/hillshade.html new file mode 100644 index 00000000..daf2a23f --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/hillshade.html @@ -0,0 +1,290 @@ + + + + + + + + eolab.rastertools.hillshade — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.hillshade

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+This module defines a rastertool named Hillshade which computes the hillshade
+of a Digital Height Model corresponding to a given solar position (elevation and azimuth).
+"""
+import logging.config
+from typing import List
+from pathlib import Path
+import numpy as np
+
+import rasterio
+from rasterio.windows import Window
+
+from eolab.rastertools import utils
+from eolab.rastertools import Rastertool, Windowable
+from eolab.rastertools.processing import algo
+from eolab.rastertools.processing import RasterProcessing, compute_sliding
+
+
+_logger = logging.getLogger(__name__)
+
+
+
[docs]class Hillshade(Rastertool, Windowable): + """Raster tool that computes the hillshades of a Digital Elevation / Surface / Height Model + corresponding to a given solar position. + + The input image is a raster that contains the height of the points as pixel values. + + At a given position p, the Hillshade tool check if the point is in the hillshade generated by + any other points in the direction of the sun. To achieve this goal, the algorithm computes the + angle :math:`\\gamma`: :math:`\\tan \\frac{Height}{Distance}`:: + + _____ + x| | ^ + x | | | Height (from Digital Model) + x __ | | | + ____p_______| |___| |__v____________ + <--------------> + Distance + + The point is in the hillshade of another one if :math:`\\gamma < elevation_{sun}`. + To avoid testing too many points, the "radius" parameter defines the max distance of the pixel + to test. The radius can be set by the user or automatically computed by the Hillshade tool. In + this latter case, the radius is :math:`\\frac{\\Delta h}{\\tan{elevation_{sun}}}` where + :math:`\\Delta h` is :math:`max - min` of the pixel values in the input raster. + + The output image is a mask where pixels corresponding to hillshades equal to 1. + """ + +
[docs] def __init__(self, elevation: float, azimuth: float, resolution: float, radius: int = None): + """ Constructor for the Hillshade class. + + Args: + elevation (float): + Elevation of the sun (in degrees), 0 is vertical top (zenith). + azimuth (float): + Azimuth of the sun (in degrees), measured clockwise from north. + resolution (float): + Resolution of a raster pixel (in meters). + radius (int, optional): + Maximum distance from the current point (in pixels) to consider + for evaluating the hillshade. If None, the radius is calculated + based on the data range. + """ + super().__init__() + self.with_windows() + + self._elevation = elevation + self._azimuth = azimuth + self._resolution = resolution + self._radius = radius
+ + @property + def elevation(self): + """Return the elevation of the sun (in degrees)""" + return self._elevation + + @property + def azimuth(self): + """Return the azimuth of the sun (in degrees)""" + return self._azimuth + + @property + def resolution(self): + """Return the resolution of a raster pixel (in meter)""" + return self._resolution + + @property + def radius(self): + """Return the maximum distance from current point (in pixels) + for evaluating the maximum elevation angle""" + return self._radius + +
[docs] def process_file(self, inputfile: str) -> List[str]: + """ + Compute hillshade for the input file. + + Args: + inputfile (str): + Input image file path to process. + + Returns: + List[str]: A list containing the file path of the generated hillshade image. + + Raises: + ValueError: If the input file contains more than one band or if the radius exceeds constraints. + """ + _logger.info(f"Processing file {inputfile}") + outdir = Path(self.outputdir) + output_image = outdir.joinpath(f"{utils.get_basename(inputfile)}-hillshade.tif") + + # compute the radius from data range + # radius represents the max distance of buildings that can create a hillshade + # considering the sun elevation. + wmax = None + wmin = None + with rasterio.open(inputfile) as src: + if src.count != 1: + raise ValueError("Invalid input file, it must contain a single band.") + for i in range(src.height // self.window_size[0] + 1): + for j in range(src.width // self.window_size[1] + 1): + # Oversized window (out of source bounds) is handled by Window + win = Window(i*self.window_size[0] , j*self.window_size[1] , self.window_size[0] , self.window_size[1]) + data = src.read(1, masked=True, window=win) + if data.size and not np.isnan(data).all(): + wmax = np.maximum(wmax, np.nanmax(data)) if wmax is not None else np.nanmax(data) + wmin = np.minimum(wmin, np.nanmin(data)) if wmin is not None else np.nanmin(data) + delta = int((wmax - wmin) / self.resolution) + optimal_radius = abs(int(delta / np.tan(np.radians(self.elevation)))) + + if self.radius is None or optimal_radius <= self.radius: + self._radius = optimal_radius + _logger.info(f"Using optimal radius {self.radius} for hillshade computation") + else: + _logger.warning(f"The optimal radius value is {optimal_radius} exceeding {self.radius} threshold. " + f"Oversized radius affects computation time and so radius is set to {self.radius}. " + "Result may miss some shadow pixels.") + + if self.radius >= min(self.window_size) / 2: + raise ValueError(f"The radius (option --radius, value={self.radius}) must be strictly " + "less than half the size of the window (option --window_size, " + f"value={min(self.window_size)})") + + # Configure the processing + hillshade = RasterProcessing("hillshade", algo=algo.hillshade, dtype=np.int8, in_dtype=np.float32, + nbits=1, compress='lzw', per_band_algo=True) + hillshade.with_arguments({ + "elevation": None, + "azimuth": None, + "resolution": None, + "radius": None + }) + # set the configuration of the raster processing + hillshade_conf = { + "elevation": self.elevation, + "azimuth": self.azimuth, + "resolution": self.resolution, + "radius": self.radius + } + hillshade.configure(hillshade_conf) + + # Run the hillshade processing + compute_sliding( + inputfile, output_image, hillshade, + window_size=self.window_size, + window_overlap=self.radius, + pad_mode=self.pad_mode) + + return [output_image.as_posix()]
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/main.html b/docs/_build/html/_modules/eolab/rastertools/main.html new file mode 100644 index 00000000..9fb6d30e --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/main.html @@ -0,0 +1,362 @@ + + + + + + + + eolab.rastertools.main — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.main

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+This module contains the rastertools command line interface. The command line
+has several subcommands such as *radioindice* and *zonalstats*.
+
+Usage examples::
+
+  rastertools radioindice --help
+  rastertools zonalstats --help
+
+"""
+import logging
+import logging.config
+import os
+import sys
+import json
+import click
+from eolab.rastertools.cli.filtering import filter
+from eolab.rastertools.cli.hillshade import hillshade
+from eolab.rastertools.cli.speed import speed
+from eolab.rastertools.cli.svf import svf
+from eolab.rastertools.cli.tiling import tiling
+from eolab.rastertools.cli.timeseries import timeseries
+from eolab.rastertools.cli.radioindice import radioindice
+from eolab.rastertools.cli.zonalstats import zonalstats
+from eolab.rastertools import __version__
+from eolab.rastertools.product import RasterType
+
+
+
[docs]def add_custom_rastertypes(rastertypes): + """Add definition of new raster types. The json string shall have the following format: + + .. code-block:: json + + { + "rastertypes": [ + { + "name": "RGB_TIF", + "product_pattern": "^RGB_TIF_(?P<date>[0-9_]*)\\.(tif|TIF)$", + "bands": [ + { + "channel": "red", + "description": "red" + }, + { + "channel": "green", + "description": "green" + }, + { + "channel": "blue", + "description": "blue" + }, + { + "channel": "nir", + "description": "nir" + } + ], + "date_format": "%Y%m%d_%H%M%S", + "nodata": 0 + }, + { + "name": "RGB_TIF_ARCHIVE", + "product_pattern": "^RGB_TIF_(?P<date>[0-9\\_]*).*$", + "bands_pattern": "^TIF_(?P<bands>{}).*\\.(tif|TIF)$", + "bands": [ + { + "channel": "red", + "identifier": "r", + "description": "red" + }, + { + "channel": "green", + "identifier": "g", + "description": "green" + }, + { + "channel": "blue", + "identifier": "b", + "description": "blue" + }, + { + "channel": "nir", + "identifier": "n", + "description": "nir" + } + ], + "date_format": "%Y%m%d_%H%M%S", + "nodata": 0 + } + ] + } + + - name : unique name of raster type + - product_pattern: regexp to identify raster product matching the raster type. Regexp can + contain catching groups that identifies metadata: date (groupe name=date), relative + orbit number (relorbit), tile number (tile), any other group (free name of the group). + - bands_pattern (optional) : when the raster product of this type is an archive + (zip, tar, tar.gz, etc.), the pattern enables to identify the files of the different + raster bands. The raster product can contain one raster file per band or one multi-bands + raster file. In the first case, the pattern must contain a group that identify + the band to which the file corresponds. This group must be defined as follows (?P<bands>{}) + in which the variable part {} will be replaced by the identifier of the band (see below). + - date_format (optional): date format in the product name. By default: %Y%m%d-%H%M%S + - nodata (optional): no data value of raster bands. By default: -10000 + - masknnodata (optional): nodata value in the mask band + - For every bands: + + * channel: channel of the band. Must be one of: blue, green, red, nir, mir, swir, + red_edge1, red_edge2, red_edge3, red_edge4, blue_60m, nir_60m and mir_60m. + * identifier (optional): string that identifies the band in the filenames of a raster + product that it is an archive. This identifier is inserted in the group ``bands`` of + the bands_pattern. + * description (optional): band description that will be reused in the generated products. + + - For every masks: + + * identifier (optional): string that identifies the mask band in the filenames of a raster + product that it is an archive. This identifier is inserted in the group ``bands`` of + the bands_pattern. + * description (optional): mask band description that will be reused in the generated products. + * maskfunc (optional): fully qualified name of the python function that converts the mask + band values to a binary mask (0 = masked; 1 = unmasked) + + Args: + rastertypes: JSON string that contains the new raster types definition + """ + RasterType.add(rastertypes)
+ + +#Rastertools CLI group +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) + + +# @with_plugins(iter_entry_points('rasterio.plugins')) +@click.group(context_settings=CONTEXT_SETTINGS) +@click.option( + '-t', '--rastertype', + 'rastertype', + default = None, + # Click automatically uses the last argument as the variable name, so "dest" is this last parameter + type=click.Path(exists=True), + help="JSON file defining additional raster types of input files") +@click.option( + '--max_workers', + "max_workers", + type=int, + help="Maximum number of workers for parallel processing. If not given, it will default to " + "the number of processors on the machine. When all processors are not allocated to " + "run rastertools, it is thus recommended to set this option.") +@click.option( + '--debug', + "keep_vrt", + is_flag=True, + help="Store to disk the intermediate VRT images that are generated when handling " + "the input files which can be complex raster product composed of several band files.") +@click.option( + '-v', + '--verbose', + is_flag=True, + help="set loglevel to INFO") +@click.option( + '-vv', + '--very-verbose', + is_flag=True, + help="set loglevel to DEBUG") +@click.version_option(version='rastertools {}'.format(__version__)) # Ensure __version__ is defined +@click.pass_context + +def rastertools(ctx, rastertype : str, max_workers : int, keep_vrt : bool, verbose : bool, very_verbose : bool): + """ + Main entry point for the `rastertools` Command Line Interface. + + The `rastertools` CLI provides tools for raster processing and analysis and allows configurable data handling, parallel processing, + and debugging support. + + Logging: + + - INFO level (`-v`) gives detailed step information. + + - DEBUG level (`-vv`) offers full debug-level tracing. + + Environment Variables: + + - `RASTERTOOLS_NOTQDM`: If the log level is above INFO, sets this to disable progress bars. + + - `RASTERTOOLS_MAXWORKERS`: If `max_workers` is set, it defines the max workers for rastertools. + """ + #Saving keep_vrt to use it in the subcommands + ctx.ensure_object(dict) + ctx.obj['keep_vrt'] = keep_vrt + + # Setup logging + if very_verbose: + loglevel = logging.DEBUG + elif verbose: + loglevel = logging.INFO + else: + loglevel = logging.WARNING + + logformat = "[%(asctime)s] %(levelname)s - %(name)s - %(message)s" + logging.basicConfig(level=loglevel, stream=sys.stdout, format=logformat, datefmt="%Y-%m-%d %H:%M:%S") + + if "RASTERTOOLS_NOTQDM" not in os.environ: + os.environ["RASTERTOOLS_NOTQDM"] = "True" if loglevel > logging.INFO else "False" + + if "RASTERTOOLS_MAXWORKERS" not in os.environ and max_workers is not None: + os.environ["RASTERTOOLS_MAXWORKERS"] = f"{max_workers}" + + # Handle rastertype option + if rastertype: + with open(rastertype) as json_content: + RasterType.add(json.load(json_content)) + + +# Register subcommands from other modules +rastertools.add_command(filter, name = "fi") +rastertools.add_command(filter, name = "filter") +rastertools.add_command(hillshade, name = "hs") +rastertools.add_command(hillshade, name = "hillshade") +rastertools.add_command(radioindice, name = "ri") +rastertools.add_command(radioindice, name = "radioindice") +rastertools.add_command(speed, name = "sp") +rastertools.add_command(speed, name = "speed") +rastertools.add_command(svf, name = "svf") +rastertools.add_command(tiling, name = "ti") +rastertools.add_command(tiling, name = "tiling") +rastertools.add_command(timeseries, name = "ts") +rastertools.add_command(timeseries, name = "timeseries") +rastertools.add_command(zonalstats, name = "zs") +rastertools.add_command(zonalstats, name = "zonalstats") + + +
[docs]def run(*args, **kwargs): + """ + Entry point for console_scripts + """ + rastertools(*args, **kwargs)
+ + +if __name__ == "__main__": + run() +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/processing/algo.html b/docs/_build/html/_modules/eolab/rastertools/processing/algo.html new file mode 100644 index 00000000..ac9ef6ff --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/processing/algo.html @@ -0,0 +1,922 @@ + + + + + + + + eolab.rastertools.processing.algo — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for eolab.rastertools.processing.algo

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Algorithms on raster data
+"""
+import math
+
+import numpy
+import numpy as np
+import numpy.ma as ma
+from scipy import ndimage, signal
+
+
+
[docs]def normalized_difference(bands : np.ndarray) -> numpy.ndarray : + """ + Compute the Normalized Difference Vegetation Index + The coefficient ranges from -1 to 1 in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + NDVI = \\frac{NIR - RED}{NIR + RED} + + Args: + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. + + Returns: + Numpy array of the size (number of lines, number of columns) containing the computed TNDVI. + """ + np.seterr(divide='ignore') + return (bands[1] - bands[0]) / (bands[1] + bands[0])
+ + +
[docs]def tndvi(bands : np.ndarray) -> numpy.ndarray : + """ + Compute the Transformed Normalized Difference Vegetation Index + The coefficient is positive in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + TNDVI = \\sqrt{NDVI + 0.5} + + Args: + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. + + Returns: + Numpy array of the size (number of lines, number of columns) containing the computed TNDVI. + + References: + `Deering D.W., Rouse J.W., Haas R.H., and Schell J.A., 1975. Measuring forage production + of grazing units from Landsat MSS data. Pages 1169-1178 In: Cook J.J. (Ed.), Proceedings + of the Tenth International Symposium on Remote Sensing of Environment (Ann Arbor, 1975), + Vol. 2, Ann Arbor, Michigan, USA. <https://www.scirp.org/reference/referencespapers?referenceid=1046714>`_ + """ + np.seterr(invalid='ignore') + ratio = normalized_difference(bands) + 0.5 + ratio[ratio < 0] = 0 + return np.sqrt(ratio)
+ + +
[docs]def rvi(bands : np.ndarray) -> numpy.ndarray : + """ + Compute the Ratio Vegetation Index + The coefficient is positive in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + PVI = \\frac{NIR}{RED} + + Args: + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. + + Returns: + Numpy array of the size (number of lines, number of columns) containing the computed RVI. + + References: + `Jordan C.F., 1969. Derivation of leaf area index from quality of light on the forest + floor. Ecology 50:663-666 <https://esajournals.onlinelibrary.wiley.com/doi/10.2307/1936256>`_ + """ + np.seterr(divide='ignore') + return bands[1] / bands[0]
+ + +
[docs]def pvi(bands : np.ndarray) -> numpy.ndarray : + """ + Compute the Perpendicular Vegetation Index + The coefficient ranges from -1 to 1 in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + PVI = 0.74 (NIR - 0.90893 RED - 7.46216) + + Args: + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. + + Returns: + Numpy array of the size (number of lines, number of columns) containing the computed PVI. + + References: + `Richardson A.J., Wiegand C.L., 1977. Distinguishing vegetation from soil background + information. Photogramm Eng Rem S 43-1541-1552 <https://www.asprs.org/wp-content/uploads/pers/1977journal/dec/1977_dec_1541-1552.pdf>`_ + """ + return (bands[1] - 0.90893 * bands[0] - 7.46216) * 0.74
+ + +
[docs]def savi(bands : np.ndarray) -> numpy.ndarray : + """ + Compute the Soil Adjusted Vegetation Index + The coefficient ranges from -1 to 1 in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + SAVI = \\frac{(NIR - RED) (1 + 0.5)}{NIR + RED + 0.5} + + Args: + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. + + Returns: + Numpy array of the size (number of lines, number of columns) containing the computed SAVI. + + References: + `Huete A.R., 1988. A soil-adjusted vegetation index (SAVI). Remote Sens Environ 25:295-309 <https://www.sciencedirect.com/science/article/abs/pii/003442578890106X>`_ + """ + np.seterr(divide='ignore') + return (1. + 0.5) * (bands[1] - bands[0]) / (bands[1] + bands[0] + 0.5)
+ + +
[docs]def tsavi(bands : np.ndarray) -> numpy.ndarray : + """ + Compute the Transformed Soil Adjusted Vegetation Index + The coefficient ranges from -1 to 1 in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + TSAVI = \\frac{0.7 (NIR - 0.7 RED - 0.9)}{0.7 NIR + RED + 0.08 (1 + 0.7^2)} + + Args: + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. + + Returns: + Numpy array of the size (number of lines, number of columns) containing the computed TSAVI. + + References: + `Baret F., Guyot G., Major D., 1989. TSAVI: a vegetation index which minimizes soil + brightness effects on LAI or APAR estimation. 12th Canadian Symposium on Remote + Sensing and IGARSS 1990, Vancouver, Canada, 07/10-14. <https://www.researchgate.net/publication/3679422_TSAVI_A_vegetation_index_which_minimizes_soil_brightness_effects_on_LAI_and_APAR_estimation>`_ + """ + np.seterr(divide='ignore') + denominator = 0.7 * bands[1] + bands[0] + 0.08 * (1 + 0.7 * 0.7) + numerator = 0.7 * (bands[1] - 0.7 * bands[0] - 0.9) + return numerator / denominator
+ + +def _wdvi(bands : numpy.ndarray) -> numpy.ndarray : + """ + Compute the Weighted Difference Vegetation Index of the input data. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + WDVI = NIR - 0.4 RED + + Args: + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. + + Returns: + Numpy array of the size (number of lines, number of columns) containing the computed WDVI. + """ + return bands[1] - 0.4 * bands[0] + + +
[docs]def msavi(bands : numpy.ndarray) -> numpy.ndarray : + """ + Compute the Modified Soil Adjusted Vegetation Index of the input data. + The coefficient ranges from -1 to 1 in each pixel. + + grdtbrbr The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + MSAVI = \\frac{(NIR - RED) (1 + L)} {NIR + RED + L} \\\\ + + With : :math:`L = 1 - 2 * 0.4 * NDVI * WDVI` + + Parameters + ---------- + input_data : np.ndarray + A 3D numpy array of shape (number of bands, number of lines, number of columns) where number of bands > 1. + + Returns + ------- + np.ndarray + A 2D numpy array of shape (number of lines, number of columns) containing the computed MSAVI values. + + References + ------- + `Qi J., Chehbouni A., Huete A.R., Kerr Y.H., 1994. Modified Soil Adjusted Vegetation + Index (MSAVI). Remote Sens Environ 48:119-126 <https://www.researchgate.net/publication/223906415_A_Modified_Soil_Adjusted_Vegetation_Index>`_ + + `Qi J., Kerr Y., Chehbouni A., 1994. External factor consideration in vegetation index + development. Proc. of Physical Measurements and Signatures in Remote Sensing, + ISPRS, 723-730. <https://www.academia.edu/20596726/External_factor_consideration_in_vegetation_index_development>`_ + """ + np.seterr(divide='ignore') + ndvi = normalized_difference(bands) + wdvi = _wdvi(bands) + dl = 1 - 2 * 0.4 * ndvi * wdvi + denominator = bands[1] + bands[0] + dl + return (1 + dl) * (bands[1] - bands[0]) / denominator
+ + +
[docs]def msavi2(bands : numpy.ndarray) -> numpy.ndarray : + """ + Compute the Modified Soil Adjusted Vegetation Index of the input data. + The coefficient ranges from -1 to 1 in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + MSAVI2 = (2 * NIR + 1)^2 - 8 (NIR - RED) + + Args: + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. + + Returns: + Numpy array of the size (number of lines, number of columns) containing the computed MSAVI. + """ + np.seterr(divide='ignore', invalid='ignore') + dsqrt = (2. * bands[1] + 1) ** 2 - 8 * (bands[1] - bands[0]) + return (2. * bands[1] + 1) - np.sqrt(dsqrt)
+ + +
[docs]def ipvi(bands : numpy.ndarray) -> numpy.ndarray : + """ + Compute the Infrared Percentage Vegetation Index of the input data. + The coefficient ranges from 0 to 1 in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + IPVI = \\frac{NIR}{NIR + RED} + + Args: + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. + + Returns: + Numpy array of size (number of lines, number of columns) containing the computed IPVI. + + References: + `Crippen, R. E. 1990. Calculating the Vegetation Index Faster, Remote Sensing of + Environment, vol 34., pp. 71-73. <https://www.sciencedirect.com/science/article/abs/pii/003442579090085Z>`_ + """ + np.seterr(divide='ignore') + return bands[1] / (bands[1] + bands[0])
+ + +
[docs]def evi(bands : np.ndarray) -> numpy.ndarray : + """ + Compute the Enhanced vegetation index of the input data. + The coefficient ranges from -1 to 1 in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red), Blue. + + Args: + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 2. + + Returns: + Numpy array of the size (number of lines, number of columns) containing the computed EVI. + + .. math:: + EVI = \\frac{G (NIR - RED)} {NIR + C1 * RED - C2 * BLUE + L} + + With : + - $L$ : Canopy background adjustment term, it reduces the influence of soil brightness. + - $C1$, $C2$ : Coefficients that correct the influence of aerosol. + - $G$ : A gain factor. The greater is G, the more the EVI is sensitive to vegetation changes. + """ + np.seterr(divide='ignore') #Ignore divisions by zero + return 2.5 * (bands[1] - bands[0]) / ((bands[1] + 6.0 * bands[0] - 7.5 * bands[2]) + 1.0)
+ + +
[docs]def redness_index(bands : np.ndarray) -> numpy.ndarray : + """ + Compute the Redness Index of the input data. + + .. math:: + RI = \\frac{RED^2} {GREEN^3} + + The function considers the bands of the input data in the following order : + Red, Green. + + Args: + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. + + Returns: + Numpy array of size (number of lines, number of columns) containing the computed Redness Index. + """ + np.seterr(divide='ignore') + return bands[0] ** 2 / bands[1] ** 3
+ + +
[docs]def brightness_index(bands : np.ndarray) -> numpy.ndarray : + """ + Compute the Brightness Index of the input data. + + The function considers the first 2 bands of the input data to be Red and Green. + + .. math:: + BI = \\sqrt{ \\frac{RED^2 + GREEN^2} {2} } + + Args: + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. + + Returns: + Numpy array of the size (number of lines, number of columns) containing the computed Brightness Index. + """ + np.seterr(invalid='ignore') + bi = (bands[0] ** 2 + bands[1] ** 2) / 2 + return np.sqrt(bi)
+ + +
[docs]def brightness_index2(bands : np.ndarray) -> numpy.ndarray : + """ + Compute the Brightness Index of the input data. + + The function considers the first 3 bands of the input data to be Red, Green, Blue. + + .. math:: + BI = \\sqrt{ \\frac{RED^2 + BLUE^2 + GREEN^2} {2} } + + Args: + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 2. + + Returns: + Numpy array of the size (number of lines, number of columns) containing the computed Brightness Index. + """ + np.seterr(invalid='ignore') + bi2 = (bands[0] ** 2 + bands[1] ** 2 + bands[2] ** 2) / 3 + return np.sqrt(bi2)
+ + +
[docs]def speed(data0 : np.ndarray, data1 : np.ndarray, interval : float) -> numpy.ndarray : + """ + Compute the speed of the input data based on the difference between two time points. + + Args: + data0 (numpy.ndarray): Numpy array containing the band value(s) at the first date. + Shape must be (number_of_lines, number_of_columns). + + data1 (numpy.ndarray): Numpy array containing the band value(s) at the second date. + Shape must match `data0`. + + interval (float): Time interval (in the same units as the timestamps of the input data) + between the first and second dates. + + Returns: + numpy.ndarray: Numpy array of shape (number_of_lines, number_of_columns) + containing the computed speed of the sequence. The values represent + the change in band values per unit time. + + Raises: + ValueError: If `data0` and `data1` do not have the same shape, or if `interval` is zero. + """ + return (data1 - data0) / interval
+ + +
[docs]def interpolated_timeseries(dates : numpy.ma.masked_array, series : numpy.ma.masked_array, output_dates : numpy.array, nodata) -> numpy.ndarray: + """ + Interpolate a timeseries of data. Dates and series must be sorted in ascending order. + + Args: + dates (numpy.ma.masked_array): A masked array of timestamps (dates) corresponding to + the input series. Should be in ascending order. + + series (numpy.ma.masked_array): A list of 3D masked arrays, each with shape + (bands, height, width), containing the raster data + for each timestamp in `dates`. + + output_dates (numpy.array): A 1D array of timestamps for which to generate the interpolated + rasters. + + nodata (float): Value to use for pixels where input data is NaN or missing. + + Returns: + numpy.ndarray: A 4D numpy array of shape (time, bands, height, width), containing + the interpolated raster data for each output date. If there are no valid + data points for a specific pixel, the corresponding pixel will be filled with `nodata`. + + Raises: + ValueError: If `series` is empty, or if `dates` and `series` dimensions do not match. + """ + #Create stack, an array of dimension time x band x height x width from a list of band x height x width arrays + stack = ma.stack(series) + stack_shape = stack.shape + # flatten the stacked data: shape is pixel x time + pixel_series = stack.transpose((1, 2, 3, 0)).reshape( + stack_shape[1] * stack_shape[2] * stack_shape[3], -1) + + output = [] + for serie in pixel_series: + compressed = serie.compressed() + if serie.count() > 1: + output.append(np.interp( + output_dates, + ma.masked_array(dates, serie.mask).compressed(), + compressed, + compressed[0], + compressed[-1])) + else: + default_val = serie.sum() if serie.count() > 0 else nodata + output.append([default_val] * len(output_dates)) + + output = np.array(output) + return output.transpose(1, 0).reshape( + -1, stack_shape[1], stack_shape[2], stack_shape[3])
+ + +def _local_sum(data : np.ndarray, kernel_width: int) -> numpy.ndarray : + """ + Computes the local sums of the input data using a sliding window defined by the kernel size. + Each element in the output is the sum of the pixels within the specified kernel size window. + + Args: + input_data (np.ndarray): A 3D numpy array of shape (1, number_of_lines, number_of_columns) + containing the Digital Height Model (DHM). + The function only accepts arrays with one band. + + kernel_size (int): The size of the sliding window used to compute the local sum. + + If kernel_size = 1 : The output array equals to the input + Otherwise : Sums the pixels belonging to a sliding window of size radius * radius (with radius = (kernel_width + 1) // 2) + The top-left pixel of the window is the current pixel + + Returns: + Numpy array of the size of input_data containing the computed local sums. Computed data have a size minored by the kernel_size + and are centered in the output shape. + + Raises: + ValueError: If `input_data` does not have 3 dimensions or if the first dimension is not of size 1. + """ + if kernel_width == 1: + output = data.copy() + else: + # special case: size = 1 ==> returns data + if np.issubdtype(data.dtype, np.floating): + ii_dtype = np.float64 + elif np.issubdtype(data.dtype, np.int32): + ii_dtype = np.int64 + else: + ii_dtype = data.dtype + + # create the integral image + line_cumsum = np.nancumsum(data, axis=data.ndim - 1, dtype=ii_dtype) + ii = np.nancumsum(line_cumsum, axis=data.ndim - 2) + + # if input data is a masked array, ii is a masked array + if hasattr(ii, 'mask'): + # get the data of the masked array + ii = ii.data + + # compute local sum at each pixel from integral image + output = np.zeros(data.shape, dtype=ii.dtype) + posd = (kernel_width + 1) // 2 + posf = kernel_width - posd + if data.ndim == 3: + output[:, posd:-posf, posd:-posf] = ii[:, :-kernel_width, :-kernel_width] \ + + ii[:, kernel_width:, kernel_width:] \ + - ii[:, :-kernel_width, kernel_width:] \ + - ii[:, kernel_width:, :-kernel_width] + else: + output[posd:-posf, posd:-posf] = ii[:-kernel_width, :-kernel_width] \ + + ii[kernel_width:, kernel_width:] \ + - ii[:-kernel_width, kernel_width:] \ + - ii[kernel_width:, :-kernel_width] + + return output.astype(data.dtype) + + +
[docs]def median(input_data : np.ndarray, kernel_size : int) -> numpy.ndarray : + """ + Applies a Median Filter to the input data using `scipy.ndimage.median_filter <https://docs.scipy.org/doc/scipy/reference/generated/scipy.ndimage.median_filter.html>`_. + The filter computes the median of the values contained within a sliding window determined by the kernel size. + + Args: + input_data (np.ndarray): A 3D numpy array of shape (1, number_of_lines, number_of_columns) + containing the Digital Height Model (DHM). The function only accepts arrays with one band. + + kernel_size (int): The size of the sliding window (kernel) used to compute the median. + + Returns: + np.ndarray: A numpy array of the same shape as `input_data`, containing the filtered data with the median values computed in the specified kernel. + + Raises: + ValueError: If `input_data` does not have 3 dimensions or if the first dimension is not of size 1, + or if `kernel_size` is not a positive odd integer. + """ + if len(input_data.shape) != 3: + raise ValueError("adaptive_gaussian only accepts 3 dims numpy arrays") + + #kernel_size = kwargs.get('kernel_size', 8) + output = ndimage.median_filter(input_data, size=(1, kernel_size, kernel_size)) + return output
+ + +
[docs]def local_sum(input_data : np.ndarray, kernel_size : int = 8) -> numpy.ndarray : + """ + Computes the local sums of the input data using a sliding window defined by the kernel size. + Each element in the output is the sum of the pixels within the specified kernel size window. + + Args: + input_data (np.ndarray): A 3D numpy array of shape (1, number_of_lines, number_of_columns) + containing the Digital Height Model (DHM). + The function only accepts arrays with one band. + + kernel_size (int): The size of the sliding window used to compute the local sum. + + Returns: + np.ndarray: A numpy array of the same size as `input_data` containing the computed local sums. + + Raises: + ValueError: If `input_data` does not have 3 dimensions or if the first dimension is not of size 1. + """ + + #kernel_size = kwargs.get('kernel_size', 8) + # compute local sum of band pixels + output = _local_sum(input_data, kernel_size) + return output
+ + +
[docs]def local_mean(input_data : np.ndarray, kernel_size : int = 8) -> numpy.ndarray : + """ + Computes the local means of the input data using a sliding window defined by the kernel size. + Each element in the output is the mean of the pixels within the specified kernel size window. + + Args: + input_data (np.ndarray): A 3D numpy array of shape (1, number_of_lines, number_of_columns) + containing the Digital Height Model (DHM). + The function only accepts arrays with one band. + + kernel_size (int): The size of the sliding window used to compute the local mean. + + Returns: + np.ndarray: A numpy array of the same size as `input_data` containing the computed local means. + + Raises: + ValueError: If `input_data` does not have 3 dimensions or if the first dimension is not of size 1. + """ + #kernel_size = kwargs.get('kernel_size', 8) + # compute local sum of band pixels + output = _local_sum(input_data, kernel_size) + # compute local sum of band mask: number of valid pixels + # in the kernel + if ma.is_masked(input_data): + valid = _local_sum(1 - input_data.mask, kernel_size) + else: + valid = kernel_size ** 2 + # compute mean for the band + return np.divide(output, valid, out=np.zeros_like(output), where=valid != 0)
+ + +
[docs]def adaptive_gaussian(input_data : np.ndarray, kernel_size : int = 8, sigma : int = 1) -> numpy.ndarray : + """ + Applies an Adaptive Gaussian Filter to the input data that smoothes the input while preserving edges. + + Args: + input_data (np.ndarray): A 3D numpy array of shape (1, number_of_lines, number_of_columns) + containing the Digital Height Model (DHM). + The function only accepts arrays with one band. + + kernel_size (int): The size of the kernel used for the adaptive filtering. Default is 8. + + sigma (int): The standard deviation of the Gaussian distribution, which controls the level of smoothing. + Default is 1. + + Returns: + np.ndarray: A numpy array of the same shape as `input_data`, containing the filtered data. + + Raises: + ValueError: If `input_data` does not have 3 dimensions or if the first dimension is not of size 1. + """ + if len(input_data.shape) != 3: + raise ValueError("adaptive_gaussian only accepts 3 dims numpy arrays") + if input_data.shape[0] != 1: + raise ValueError("adaptive_gaussian only accepts numpy arrays with first dim of size 1") + + dtype = input_data.dtype + + w_1 = (input_data[0, :, :-2] - input_data[0, :, 2:]) ** 2 + w_2 = (input_data[0, :-2, :] - input_data[0, 2:, :]) ** 2 + w = np.exp(-(w_1[1:-1, :] + w_2[:, 1:-1]) / (2 * sigma ** 2)) + w_sum = signal.convolve2d(w, np.ones((3, 3), dtype=dtype), boundary='symm', mode='same') + w_sum += np.finfo(dtype).eps + out = input_data + for i in range(kernel_size): + prod = w * out[0, 1:-1, 1:-1] + conv = signal.convolve2d(prod, np.ones((3, 3), dtype=dtype), boundary='symm', mode='same') + out[0, 1:-1, 1:-1] = conv / w_sum + return out
+ + +
[docs]def svf(input_data : np.ndarray, radius : int = 8, directions : int = 12, resolution : float = 0.5, altitude = None) -> np.ndarray: + """ + Computes the Sky View Factor (SVF), which represents the fraction of the visible sky from each point in a Digital Height Model (DHM). + + More information about the Sky View Factor can be found `here <https://www.researchgate.net/publication/257315893_Application_of_sky-view_factor_for_the_visualization_of_historic_landscape_features_in_lidar-derived_relief_models>`_. + + Args: + input_data (np.ndarray): A 3D numpy array of shape (1, number_of_lines, number_of_columns) containing the Digital Height Model (DHM). + The function only accepts arrays with one band (the first dimension must be 1). + + radius (int): The maximum distance (in pixels) around each point to evaluate the horizontal elevation angle. Default is 8. + + direction (int): The number of discrete directions to compute the vertical angle. Default is 12. + + resolution (float): The spatial resolution of the input data in meters. Default is 0.5. + + altitude (Optional[np.ndarray]): A reference altitude to use for computing the SVF. If not specified, SVF is computed using the elevation of each point. + + Returns: + np.ndarray: A numpy array of the same size as `input_data`, containing the Sky View Factor for each point, + where values range from 0 (no visible sky) to 1 (full sky visibility). + + Raises: + ValueError: If `input_data` does not have 3 dimensions or if the first dimension is not of size 1. + + """ + if len(input_data.shape) != 3: + raise ValueError("svf only accepts 3 dims numpy arrays") + if input_data.shape[0] != 1: + raise ValueError("svf only accepts numpy arrays with first dim of size 1") + + nb_directions = directions + + # initialize output + shape = input_data.shape + out = np.zeros(shape, dtype=np.float32) + + # prevent nodata problem + # change the NaN in the input array to 0 + input_band = np.nan_to_num(input_data[0], copy=False, nan=0) + + # compute directions + axes = [_bresenham_line(360 * i / nb_directions, radius) + for i in range(nb_directions)] + + # get altitude of current point to consider for computing elevation angle + if altitude is None: + view = input_band[radius: shape[1] - radius, radius: shape[2] - radius] + else: + view = altitude + + # iterate over axes to identify the largest elevation in the radius + for axe in axes: + ratios = np.zeros((shape[1] - 2 * radius, shape[2] - 2 * radius), dtype=np.float32) + for x_tr, y_tr, r in axe: + new_ratios = input_band[radius + x_tr: shape[1] - radius + x_tr, + radius + y_tr: shape[2] - radius + y_tr] - view + # tangente de l'angle + new_ratios /= (r * resolution) + ratios = np.maximum(ratios, new_ratios) + + # SVF = (cosinus de l'angle avec la relation : cos² = sqrt(1 / (1+tan²)) + ratios = 1 / np.sqrt(ratios**2 + 1) # = np.sin(np.arctan(ratios / self.pixel_size)) + out[0, radius: shape[1] - radius, radius: shape[2] - radius] += ratios + + out /= nb_directions + return out
+ + +def _bresenham_line(theta : int, radius : int) -> tuple : + """ + Implementation of the `Bresenham's line algorithm <https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm>`_ + + This function generates points along a line from the origin (0, 0) based on the given angle (theta) + and length (radius). + + Args: + theta (int): The angle of the line in degrees (0 degrees points to the right, 90 degrees points up). + radius (int): The length of the line in units. If radius is less than or equal to zero, an empty list will be returned. + + Returns: + list: A list of tuples representing the coordinates of the line points in the format + (x, y, r), where (x, y) are the coordinates of the point and r is the distance + from the origin to that point. The origin point (0, 0) is not included. + """ + x, y = 0, 0 + dx = math.cos(math.radians(theta)) + dy = math.sin(math.radians(theta)) + sx = -1 if dx < 0 else 1 + sy = -1 if dy < 0 else 1 + pts = list() + r = 0 + if abs(dx) > abs(dy): + delta = abs(math.tan(math.radians(theta))) + err = 0 + while r < radius: + x += sx + err += delta + if err > 0.5: + y += sy + err -= 1.0 + r = math.sqrt(x ** 2 + y ** 2) + pts.append((x, y, r)) + else: + delta = abs(math.tan(math.radians(90 - theta))) + err = 0 + while r < radius: + y += sy + err += delta + if err > 0.5: + x += sx + err -= 1.0 + r = math.sqrt(x ** 2 + y ** 2) + pts.append((x, y, r)) + + return pts + + +
[docs]def hillshade(input_data : np.ndarray, elevation : float = 0.0, azimuth : float = 0.0, radius : int = 8, resolution : float = 0.5) -> numpy.ndarray : + """ + Computes a mask of cast shadows in a Digital Height Model (DHM). + + This function calculates the shadows based on the specified elevation and azimuth angles, + and returns a mask indicating where shadows are cast. + + Args: + input_data (np.ndarray): A 3D numpy array of shape (1, number_of_lines, number_of_columns) containing the Digital Height Model (DHM). + The function only accepts arrays with one band. + + elevation (float): The angle (in degrees) between the horizon and the line of sight from an observer to the satellite. + + azimuth (float): The angle (in degrees) between true north and the projection of the satellite's position onto the horizontal plane, + measured in a clockwise direction. + + radius (int): The radius around each pixel to consider when calculating shadows. + + resolution (float): The spatial resolution of the input data, used for scaling calculations. + + Returns: + np.ndarray: A boolean numpy array of the same size as `input_data`, indicating the mask of cast shadows, + where True represents shadowed areas and False represents illuminated areas. + + Raises: + ValueError: If the input_data does not have 3 dimensions or if the first dimension is not of size 1. + """ + if len(input_data.shape) != 3: + raise ValueError("hillshade only accepts 3 dims numpy arrays") + if input_data.shape[0] != 1: + raise ValueError("hillshade only accepts numpy arrays with first dim of size 1") + + # initialize output + shape = input_data.shape + out = np.zeros(shape, dtype=bool) + + # prevent nodata problem + input_band = np.nan_to_num(input_data[0], copy=False, nan=0) + + # compute direction + axe = _bresenham_line(180 - azimuth, radius) + + # identify the largest elevation in the radius + view = input_band[radius: shape[1] - radius, radius: shape[2] - radius] + ratios = np.zeros((shape[1] - 2 * radius, shape[2] - 2 * radius), dtype=np.float32) + for x_tr, y_tr, r in axe: + new_ratios = input_band[radius + x_tr: shape[1] - radius + x_tr, + radius + y_tr: shape[2] - radius + y_tr] - view + # tangente de l'angle + new_ratios /= (r * resolution) + ratios = np.maximum(ratios, new_ratios) + + angles = np.arctan(ratios) + out[0, radius: shape[1] - radius, radius: shape[2] - radius] = angles > elevation + + return out
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/processing/rasterproc.html b/docs/_build/html/_modules/eolab/rastertools/processing/rasterproc.html new file mode 100644 index 00000000..378822d0 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/processing/rasterproc.html @@ -0,0 +1,380 @@ + + + + + + + + eolab.rastertools.processing.rasterproc — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for eolab.rastertools.processing.rasterproc

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Definition of a radiometric indice and functions to compute it.
+"""
+from typing import List, Callable, Union
+
+import numpy
+import numpy as np
+
+from eolab.rastertools.processing import algo
+from eolab.rastertools.product import BandChannel
+
+
+
[docs]class RasterProcessing: + """ + Defines a processing algorithm for raster image data. + + This class allows users to define custom processing operations on raster data + by specifying an algorithm, data types, compression, and other parameters. + """ + +
[docs] def __init__(self, name: str, + algo: Callable = None, + nodata: float = None, + dtype: np.dtype = None, + in_dtype: np.dtype = None, + compress: str = None, + nbits: int = False, + per_band_algo: bool = False): + """Constructor + + Args: + name (str): + Display name of the processing + algo (Callable[[List[np.ndarray], kwargs], np.ndarray], optional, default=None): + Lambda function used to compute the indice. The lambda function + takes as input a multidimensional array of data to process and the list of + the arguments values of the processing (see with\\_argument()). + It returns the processed data. + nodata (float, optional, default=None): + Nodata value for the output data + dtype (rasterio or numpy data type, optional, default=None): + Type of generated data. When None, the generated data are supposed + to be of the same type as input data. + in_dtype (rasterio or numpy data type, optional, default=None): + Type of processed data. When None, the processed data are supposed + to be of the same type as dtype parameter. + compress (str, optional, default=None): + Set the compression to use. + nbits (int, optional, default=None): + Create a file with less than 8 bits per sample by passing a value from + 1 to 7. The apparent pixel type should be Byte. + per_band_algo (bool, optional, default=False): + Whether the algo is applied on a dataset that contains only one band + (per_band_algo=True) or on a dataset with all bands (per_band_algo=False) + """ + self._name = name + self._algo = algo + self._per_band_algo = per_band_algo + self._nodata = nodata + self._dtype = dtype + self._in_dtype = in_dtype + self._compress = compress + self._nbits = nbits + self._arguments = dict()
+ + def __repr__(self) -> str: + return self._name + + @property + def name(self) -> str: + """Name of the processing""" + return self._name + + @property + def algo(self) -> Callable: + """Process an algo that is called on a multidimensional array of data""" + return self._algo + + @property + def per_band_algo(self) -> bool: + """Whether the algo is applied on a dataset that contains only one band + (per_band_algo=True) or on a dataset with all bands (per_band_algo=False)""" + return self._per_band_algo + + @property + def nodata(self) -> float: + """No data value of the generated data""" + return self._nodata + + @property + def dtype(self): + """Type of the generated data""" + return self._dtype + + @property + def in_dtype(self): + """Type of the processed data""" + return self._in_dtype + + @property + def compress(self) -> str: + """Set the compression to use""" + return self._compress + + @property + def nbits(self) -> int: + """Bits size of the generated data""" + return self._nbits + + @property + def description(self): + """Long description of the processing""" + return self._description + + @property + def help(self): + """Help message of the processing""" + return self._help + + @property + def aliases(self): + """Aliases of the processing""" + return self._aliases + + @property + def arguments(self): + """Definition of Arguments that parametrize the processing algorithm (see with_arguments for + the description of the data structure)""" + return self._arguments + +
[docs] def with_documentation(self, aliases: List[str] = None, + help: str = "", description: str = ""): + """Set up the documentation for the processing + + Args: + aliases ([str], optional, default=None): + List of command aliases + help (str, optional, default=""): + Help message + description (str, optional, default=""): + Long description + + Returns: + self: Current instance so that it is possible to chain the with... calls (fluent API) + """ + self._aliases = aliases or list() + self._help = help + self._description = description + return self
+ +
[docs] def with_arguments(self, arguments): + """Add new arguments that parametrize the processing algorithm. + + Args: + arguments (Dict[str, Dict]): + Dictionary where the keys are the arguments' names and the values are dictionaries + of arguments' properties as defined in `ArgumentParser.add_argument <https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser>`_ . + The properties dictionaries are used to configure the command line 'rastertools'.* + The possible keys are: action, nargs, const, default, type, choices, required, help, + metavar and dest + + Returns: + self: Current instance so that it is possible to chain the with... calls (fluent API) + """ + self._arguments.update(arguments) + return self
+ +
[docs] def configure(self, argsdict): + """Configure the processing algo with its specific arguments' values + + Args: + argsdict (dict): + Dictionary of arguments names and values, for instance {"kernel_size": 8} + """ + [setattr(self, argument, argsdict[argument]) + for argument in self.arguments if argument in argsdict]
+ +
[docs] def compute(self, input_data: Union[List[np.ndarray], np.ndarray]) -> numpy.ndarray: + """Compute the output from the different bands of the input data. Output + data are supposed to be the same size as input_data. + + Args: + input_data ([np.ndarray] or np.ndarray): + List of input data (one np.ndarray per band) or a 3 dimensions np.ndarray + with all bands + + Returns: + Numpy array or list of numpy arrays of the size of input data + """ + if self.algo is not None: + argparameters = {arg: getattr(self, arg, None) for arg in self.arguments} + output = self.algo(input_data, **argparameters) + else: + output = input_data + return output
+ + +
[docs]class RadioindiceProcessing(RasterProcessing): + """Class that defines a raster processing for computing radiometric indice. + This class defines the list of BandChannel necessary to compute the radiometric indice. + """ + +
[docs] def __init__(self, name: str, + algo: Callable = algo.normalized_difference, + nodata: float = -2.0, + dtype: np.dtype = np.float32): + """Constructor. See documentation of RasterProcessing.__init__ for + the description of input arguments. + """ + super().__init__(name, algo=algo, nodata=nodata, dtype=dtype, per_band_algo=False)
+ + @property + def channels(self) -> List[BandChannel]: + """List of channels necessary to compute the radiometric indice""" + return self._channels + +
[docs] def with_channels(self, channels: List[BandChannel]) : + """Set the BandChannels necessary to compute the radiometric indice + + Args: + channels ([:obj:`eolab.rastertools.product.BandChannel`]): + Channels to process, default None + + Returns: + The current instance so that it is possible to chain the with... calls (fluent API) + """ + self._channels = channels + return self
+ + +
[docs]class RasterFilter(RasterProcessing): + """Class that defines a raster processing for applying a filter on a kernel (square of + configurable size). + """ + +
[docs] def __init__(self, name: str, + algo: Callable = None, + nodata: float = -2.0, + dtype: np.dtype = np.float32, + per_band_algo: bool = False): + """Constructor. See documentation of RasterProcessing.__init__ for + the description of input arguments. + """ + super().__init__(name, algo=algo, nodata=nodata, dtype=dtype, per_band_algo=per_band_algo) + + # kernel size of the filter + self._kernel_size = 8 + # define an argument for the kernel size + self.with_arguments({ + "kernel_size": { + "default": 8, + "required": True, + "type": int, + "help": "Kernel size of the filter function, e.g. 3 means a square of 3x3 pixels" + " on which the filter function is computed (default: 8)" + } + }) + self.with_documentation(f"Apply {name} filter", f"Apply {name} filter")
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/processing/sliding.html b/docs/_build/html/_modules/eolab/rastertools/processing/sliding.html new file mode 100644 index 00000000..88cab066 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/processing/sliding.html @@ -0,0 +1,394 @@ + + + + + + + + eolab.rastertools.processing.sliding — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for eolab.rastertools.processing.sliding

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+This module defines a method to run a RasterProcessing on sliding windows.
+"""
+from itertools import repeat
+import logging.config
+import os
+from typing import List
+import multiprocessing
+
+import numpy as np
+import numpy.ma as ma
+import rasterio
+from rasterio.windows import Window
+from tqdm.contrib.concurrent import process_map
+
+from eolab.rastertools import utils
+from eolab.rastertools.processing import RasterProcessing
+
+_logger = logging.getLogger(__name__)
+
+
+
[docs]def compute_sliding(input_image: str, output_image: str, rasterprocessing: RasterProcessing, + window_size: tuple = (1024, 1024), window_overlap: int = 0, + pad_mode: str = "edge", bands: List[int] = None): + """ + Apply a sliding window raster processing operation on an input image and save the result. + + This function processes a raster image in small sliding windows, allowing efficient + memory management for large datasets by processing chunks. The specified `rasterprocessing` + operation is applied to each window, with options for padding and overlapping windows. + + Args: + input_image (str): Path to the input raster image file to be processed. + output_image (str): Path to save the output raster image after processing. + rasterprocessing (RasterProcessing): A processing object defining the algorithm and + parameters to apply on each window of the input image. + window_size (tuple(int, int), optional): Size of each window for processing, + default is (1024, 1024). + window_overlap (int, optional): Number of pixels to overlap between consecutive windows, + default is 0. + pad_mode (str, optional, default="edge"): Padding mode for the edges of the windows, default is "edge". + Refer to `numpy.pad <https://numpy.org/doc/stable/reference/generated/numpy.pad.html`_ documentation for valid modes. + bands (List[int], optional): List of specific bands to process. If None, all bands in + the input image will be processed. + + Raises: + ValueError: If specified band indices are out of range for the input image. + + Note: + This function supports concurrent processing and makes use of a thread pool for efficient + handling of multiple windows. Window padding at the image boundaries is applied as + specified, and sliding window indices are computed internally. + """ + with rasterio.Env(GDAL_VRT_ENABLE_PYTHON=True): + + src = rasterio.open(input_image) + profile = src.profile + + # set block size + blockxsize, blockysize = window_size + if src.width < blockxsize: + blockxsize = utils.highest_power_of_2(src.width) + if src.height < blockysize: + blockysize = utils.highest_power_of_2(src.height) + + # dtype and creation options of output data + dtype = rasterprocessing.dtype or rasterio.float32 + in_dtype = rasterprocessing.in_dtype or dtype + nbits = rasterprocessing.nbits + compress = rasterprocessing.compress or src.compression or 'lzw' + nodata = rasterprocessing.nodata or src.nodata + + # check band index and handle all bands options (when bands is an empty list) + if bands is None or len(bands) == 0: + bands = src.indexes + elif min(bands) < 1 or max(bands) > src.count: + raise ValueError(f"Invalid bands, all values are not in range [1, {src.count}]") + + # setup profile for output image + profile.update(driver='GTiff', blockxsize=blockxsize, blockysize=blockysize, + tiled=True, dtype=dtype, nbits=nbits, compress=compress, + nodata=nodata, count=len(bands)) + + with rasterio.open(output_image, "w", **profile): + # file is created + pass + + # create the generator of sliding windows + sliding_gen = _sliding_windows((src.width, src.height), + window_size, window_overlap) + + if rasterprocessing.per_band_algo: + sliding_windows_bands = [(w, [b]) for w in sliding_gen for b in bands] + else: + sliding_windows_bands = [(w, bands) for w in sliding_gen] + src.close() + + m = multiprocessing.Manager() + write_lock = m.Lock() + + # compute using concurrent.futures.ThreadPoolExecutor and tqdm + kwargs = { + "total": len(sliding_windows_bands), + "disable": os.getenv("RASTERTOOLS_NOTQDM", 'False').lower() in ['true', '1'] + } + max_workers = os.getenv("RASTERTOOLS_MAXWORKERS") + if max_workers is not None: + kwargs["max_workers"] = int(max_workers) + + process_map(_process_sliding, repeat(rasterprocessing), + repeat(input_image), repeat(output_image), + sliding_windows_bands, repeat(window_overlap), + repeat(pad_mode), repeat(in_dtype), + repeat(write_lock), + **kwargs)
+ + +def _process_sliding(rasterprocessing: RasterProcessing, + input_image, output_image, + sliding_windowbands, window_overlap, + pad_mode, dtype, write_lock): + """Internal method that computes the raster data for a specific window. + This method can be called safely by several processes thanks to the locks + that prevent from writing files simultaneously. + """ + sliding_window, bands = sliding_windowbands + r_window, pad, w_window = sliding_window + + with rasterio.Env(GDAL_VRT_ENABLE_PYTHON=True): + with rasterio.open(input_image) as src: + dataset = _read_dataset(src, bands, r_window, pad, pad_mode) + dataset = dataset.astype(dtype) + + # The computation can be performed concurrently + output = rasterprocessing.compute(dataset) + + # Use of the lock to avoid writing in // + with write_lock: + with rasterio.open(output_image, mode="r+") as dst: + if rasterprocessing.per_band_algo: + # here bands only contain a single item which is the band number + dst.write_band( + bands[0], + output[0, window_overlap:-window_overlap, + window_overlap:-window_overlap], + window=w_window) + else: + dst.write( + output[:, + window_overlap:-window_overlap, + window_overlap:-window_overlap], + window=w_window) + + +def _read_dataset(src, bands: List[int], window: Window, pad: tuple, pad_mode: str): + """Read a src dataset + + Args: + src: + Source dataset as given by rasterio.open(...) + bands ([int]): + Bands to read or None if all bands shall be read + window (:obj:`rasterio.windows.Window`): + Window of data to read + pad (tuple of tuple of int): + Pad to apply to the read data: (padx, pady). padx + and pady are also a tuple. The first (resp. second) value is the + pad to apply at the beginning (resp. end) of the window. + pad_mode: + Method to pad data + (See https://numpy.org/doc/stable/reference/generated/numpy.pad.html) + + Returns: + The numpy masked array + """ + # get all bands values as a np.ndarray of 2 or 3 dimensions depending + # on band argument (if None, all bands are read simultaneously and the + # dataset contains all bands and is thus a 3-dims array) + if bands is not None: + dataset = src.read(bands, window=window, masked=True) + else: + dataset = src.read(window=window, masked=True) + + # pad the dataset if necessary + pad_width = [(0, 0)] + padx, pady = pad + if padx != (0, 0) or pady != (0, 0): + pad_width.extend([pady, padx]) + pad_dataset = np.pad(dataset, pad_width=pad_width, mode=pad_mode) + + # reapply a padded mask if a mask exists + if ma.is_masked(dataset): + mask = np.pad(dataset.mask, pad_width=pad_width, mode=pad_mode) + dataset = ma.masked_array(pad_dataset, mask=mask) + else: + dataset = ma.masked_array(pad_dataset) + + return dataset + + +def _sliding_windows(image_size, window_size, overlap): + """Create a generator of windows of a given size with an overlap. + + (*) = Image boundaries + (-) = Windows boundaries + + 1st window starts at position (-overlap, -overlap) in the + coordinates reference of the image. + Last window ends at position (width + overlap, height + overlap) + in the coordinates reference of the image + + ``` + (-o,-o) + |-----------| ... ---------| + | (0,0) | | + | ********|********************** | + | * | * | + |-----------| ---------| + * * + * * + * * + | * | * | + | * | * | + | ********|********************** | + | | (w,h)| + |-----------| ... ---------| + (w+o,h+o) + ``` + + Args: + image_size (tuple or int): + Total size of the image that is windowed + window_size (tuple or int): + Window size + overlap (tuple or int): + Number of pixels that overlap previous (or next) window + + Returns: + A generator of tuples. Each tuple contains: the window to read, + the pad to apply when the window is on the edge of the image, the + corresponding window of "useful data" (the window without the + overlapping pixels). Pad is given as a tuple (padx, pady). padx + and pady are also a tuple. The first (resp. second) value is the + pad to apply at the beginning (resp. end) of the window. + """ + w_width, w_height = utils.to_tuple(window_size) + width, height = utils.to_tuple(image_size) + c_overlap, r_overlap = utils.to_tuple(overlap) + + # compute 2d slices from input parameters + slices = utils.slices_2d(window_size, + # shift is reduced by 2 * overlap + (w_width - 2 * c_overlap, w_height - 2 * r_overlap), + # stop is increased by overlap + (width + c_overlap, height + r_overlap), + # start is decreased by overlap + (-c_overlap, -r_overlap)) + + # iterate the slices and compute windows and padding + for row_start, row_stop, col_start, col_stop in slices: + # compute padding when the window is partially outside the image + padx = (max(0, -col_start), max(0, col_stop - width)) + pady = (max(0, -row_start), max(0, row_stop - height)) + + # read window should not be outside the actual dataset window + r_window = Window.from_slices((max(0, row_start), min(height, row_stop)), + (max(0, col_start), min(width, col_stop))) + # write window corresponds to the window without overlap + w_window = Window.from_slices((row_start + r_overlap, row_stop - r_overlap), + (col_start + c_overlap, col_stop - c_overlap)) + + yield(r_window, (padx, pady), w_window) +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/processing/stats.html b/docs/_build/html/_modules/eolab/rastertools/processing/stats.html new file mode 100644 index 00000000..c2f00f99 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/processing/stats.html @@ -0,0 +1,677 @@ + + + + + + + + eolab.rastertools.processing.stats — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for eolab.rastertools.processing.stats

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Functions to compute statistics on raster images.
+"""
+import os
+from typing import List, Dict
+import re
+import datetime
+
+import numpy as np
+from scipy.stats import median_abs_deviation
+import pandas as pd
+import geopandas as gpd
+import matplotlib
+import matplotlib.pyplot as plt
+import rasterio
+from rasterio import features
+from tqdm import tqdm
+
+from eolab.rastertools.utils import get_metadata_name
+from eolab.rastertools.processing.vector import rasterize, filter_dissolve
+
+
+
[docs]def compute_zonal_stats(geoms: gpd.GeoDataFrame, image: str, + bands: List[int] = [1], + stats: List[str] = ["min", "max", "mean", "std"], + categorical: bool = False) -> List[List[Dict[str, float]]]: + """ + Compute zonal statistics for an input raster image over specified geometries. + + This function calculates statistical summaries (e.g., min, max, mean, standard deviation) + for each feature in the provided geometries (GeoDataFrame) using the specified raster image. + If the raster is categorical, the function can compute counts of unique values. + + Args: + geoms (GeoDataFrame): + A GeoDataFrame containing geometries (e.g., polygons) for which statistics will be computed. + image (str): + Path to the raster image file to process. + bands (List[int], optional): + A list of raster band indices to process. Defaults to [1] (the first band). + stats (List[str], optional): + A list of statistical metrics to compute. Possible values include: + - "min": Minimum value within the geometry. + - "max": Maximum value within the geometry. + - "mean": Mean (average) value within the geometry. + - "std": Standard deviation within the geometry. + - Other metrics may be supported based on the implementation of `_compute_stats`. + Defaults to ["min", "max", "mean", "std"]. + categorical (bool, optional): + If True, treats the raster as categorical, computing counts of unique values within each geometry. + Defaults to False. + + Returns: + List[List[Dict[str, float]]]: + A nested list where: + - The outer list corresponds to each geometry in the GeoDataFrame. + - The inner list corresponds to each band processed. + - Each dictionary contains the computed statistics, with stat names as keys and their values as values. + + Example: + ``` + import geopandas as gpd + from rastertools import compute_zonal_stats + + geoms = gpd.read_file("polygons.shp") + stats = compute_zonal_stats(geoms, "input_image.tif", bands=[1, 2], stats=["mean", "std"]) + print(stats) + ``` + """ + nb_geoms = len(geoms) + + src = rasterio.open(image) + geom_gen = (geoms.iloc[i].geometry for i in range(nb_geoms)) + geom_windows = ((geom, features.geometry_window(src, [geom])) for geom in geom_gen) + + statistics = [] + disable = os.getenv("RASTERTOOLS_NOTQDM", 'False').lower() in ['true', '1'] + for geom, window in tqdm(geom_windows, total=nb_geoms, disable=disable, desc="zonalstats"): + data = src.read(bands, window=window) + transform = src.window_transform(window) + + s = _compute_stats((data, transform, [geom], window), + src.nodata, stats, categorical) + statistics.append(s) + src.close() + return statistics
+ + +
[docs]def compute_zonal_stats_per_category(geoms: gpd.GeoDataFrame, image: str, + bands: List[int] = [1], + stats: List[str] = ["min", "max", "mean", "std"], + categories: gpd.GeoDataFrame = None, + category_index: str = 'Classe', + category_labels: Dict[str, str] = None): + """ + Compute zonal statistics for an input raster image, categorized by specified subregions. + + This function calculates statistical metrics for a raster image over a set of geometries + (e.g., polygons) provided in `geoms`. If a set of categories (subregions within each geometry) + is provided, statistics are computed separately for each category within each geometry. + + Args: + geoms (GeoDataFrame): + A GeoDataFrame containing the input geometries (e.g., polygons) to compute + statistics over. + image (str): + The file path to the input raster image. + bands (List[int], optional): + A list of raster band indices to process. Defaults to [1] (the first band). + stats (List[str], optional): + A list of statistical metrics to compute. Supported values include: + - "min": Minimum value within the geometry. + - "max": Maximum value within the geometry. + - "mean": Mean value within the geometry. + - "std": Standard deviation within the geometry. + Defaults to ["min", "max", "mean", "std"]. + categories (GeoDataFrame, optional): + A GeoDataFrame containing category geometries that define subregions of the + input geometries. Defaults to None. + category_index (str, optional): + The column in the `categories` GeoDataFrame that identifies category labels + for each geometry. Defaults to 'Classe'. + category_labels (Dict[str, str], optional): + A dictionary mapping category values (from `category_index`) to human-readable + labels. If provided, these labels replace category values in the output. + Defaults to None. + + Returns: + List[List[Dict[str, float]]]: + A nested list of dictionaries containing the computed statistics: + - Outer list corresponds to each input geometry in `geoms`. + - Inner list corresponds to each raster band being processed. + - Each dictionary maps statistic names (e.g., "mean", "max") to their respective values. + + Raises: + IOError: + If any input geometry is not of type Polygon or MultiPolygon. + + Notes: + - For each geometry in `geoms`, the function subdivides it into subregions based + on the geometries in `categories` (if provided). Statistics are then computed + for each subregion separately. + - The function assumes that the raster image is georeferenced and aligned with + the coordinate system of the input geometries. + + Example: + ``` + import geopandas as gpd + from rastertools import compute_zonal_stats_per_category + + geoms = gpd.read_file("regions.shp") + categories = gpd.read_file("landcover.shp") + image_path = "satellite_image.tif" + + stats = compute_zonal_stats_per_category( + geoms=geoms, + image=image_path, + categories=categories, + category_index="Land_Type", + category_labels={1: "Forest", 2: "Urban", 3: "Water"} + ) + + for geometry_stats in stats: + print(geometry_stats) + ``` + """ + def _get_list_of_polygons(geom): + """Get the list of polygons from the geometry""" + polygons = None + if geom.geom_type == 'MultiPolygon': + polygons = list(geom.geoms) + elif geom.geom_type == 'Polygon': + polygons = list([geom]) + else: + raise IOError('Shape is not a polygon.') + return polygons + + statistics = [] + # Process geometries one by one + nb_geoms = len(geoms) + nb_bands = len(bands) + + with rasterio.open(image) as src: + # each input geometry is split following the categorical geometries. + # geom_by_class contains the list of categorical geometries (one list of categorical + # geometries per input geometry) + geom_gen = (geoms.iloc[[i]] for i in range(nb_geoms)) + geom_by_class = [filter_dissolve(roi, categories, id=category_index) + for roi in geom_gen] + + # Compute the number of categorical geometries for each input geometry + nb_class_roi = [geom_by_class.shape[0] for geom_by_class in geom_by_class] + + # compute stats prefix + index_list_roi = [str(el) + for geom_by_class in geom_by_class + for el in geom_by_class[category_index]] + + # change index_list_roi names if a dict is given + if category_labels: + index_list_roi = [category_labels[el] if el in category_labels else el + for el in index_list_roi] + + # Generator to creates windows associated with each category + # geom_window_gen is a generator whose elements are list of geometries per class and per roi + geom_windows = [(_get_list_of_polygons(geom), + features.geometry_window(src, _get_list_of_polygons(geom))) + for geom_by_class in geom_by_class + for geom in geom_by_class.geometry] + + substats = [] + disable = os.getenv("RASTERTOOLS_NOTQDM", 'False').lower() in ['true', '1'] + for geom_window, stats_prefix in tqdm(zip(geom_windows, index_list_roi), + disable=disable, desc="zonalstats"): + """Read input raster and compute stats""" + geom, window = geom_window + + data = src.read(bands, window=window) + transform = src.window_transform(window) + + s = _compute_stats((data, transform, geom, window), + src.nodata, stats, False, stats_prefix) + substats.append(s) + + offset = 0 + # re-order output so that all stats of catagorical geometries that correspond + # to the same input geometry are concatenated in the same list + for i in range(nb_geoms): + results_roi = [{}] * nb_bands + [results_roi[u].update(substats[v + offset][u]) + for u in range(nb_bands) + for v in range(nb_class_roi[i])] + offset = offset + nb_class_roi[i] + statistics.append(results_roi) + + return statistics
+ + +
[docs]def extract_zonal_outliers(geoms: gpd.GeoDataFrame, image: str, outliers_image: str, + prefix: List[str] = None, bands: List[int] = [1], sigma: float = 2): + """Extract the outliers of an input image and store the results in a new image where + all outliers are written with their real values and other pixels are stored with the + mean value. The outliers are computed for each geometry. The stats mean and std of the + geometries shall have been computed by the function compute_zonal_stats. + + Args: + geoms (GeoDataFrame): + Geometries that contain as metadata the statistics (at least the mean and std) + image (str): + Filename of the input image to process + outliers_image (str): + Filename of the ioutput image + prefix ([str]): + Add a prefix to the stats keys. Must have the same size as bands + bands ([int], optional, default=[1]): + List of bands to process in the input image + sigma (float, optional, default=2): + Distance (in sigma) to the mean value to consider a point as an outlier + """ + for i, band in enumerate(bands): + mean_attr = get_metadata_name(band, prefix[i], "mean") + std_attr = get_metadata_name(band, prefix[i], "std") + geoms = geoms[~np.isnan(geoms[mean_attr])] + geoms = geoms[~np.isnan(geoms[std_attr])] + + with rasterio.open(image) as dataset: + profile = dataset.profile + data = dataset.read(band, masked=True) + + with rasterio.open(outliers_image, "w", **profile) as output: + # rasterisation du mean et du std + mean = rasterize(geoms, image, burn=mean_attr, burn_type=rasterio.float32, + nodata=dataset.nodata) # , output=image[:-4] + "-mean.tif") + std = rasterize(geoms, image, burn=std_attr, burn_type=rasterio.float32, + nodata=dataset.nodata) # , output=image[:-4] + "-std.tif") + + outliers = np.logical_and(mean > -1, + np.logical_or(data <= mean - float(sigma) * std, + data >= mean + float(sigma) * std)) + + mean[outliers] = data[outliers] + output.write_band(band, mean)
+ + +
[docs]def plot_stats(chartfile: str, stats_per_date: Dict[datetime.datetime, gpd.GeoDataFrame], + stats: List[str] = ["min", "max", "mean", "std"], + index_name: str = 'ID', display: bool = False): + """ + Plot temporal statistics for geometries across multiple dates. + + This function visualizes the evolution of specified statistics (e.g., "min", "mean") + over time for different zones defined in the input GeoDataFrames. The output is + saved as a chart file, and optionally displayed. + + Args: + chartfile (str): + Path to the file where the generated chart will be saved. + stats_per_date (Dict[datetime.datetime, gpd.GeoDataFrame]): + A dictionary mapping each date to a GeoDataFrame containing the statistics + for that date. Each GeoDataFrame should include the specified `index_name` + column and relevant statistics columns. + stats (List[str], optional): + A list of statistics to plot (e.g., "min", "max", "mean", "std"). Defaults + to ["min", "max", "mean", "std"]. + index_name (str, optional): + Name of the column in the GeoDataFrames that uniquely identifies the zones + (e.g., region IDs). Defaults to 'ID'. + display (bool, optional): + If `True`, the generated plot is displayed after saving. Defaults to `False`. + + Raises: + ValueError: + If the specified `index_name` is not present in the combined GeoDataFrame. + + Notes: + - The `stats_per_date` dictionary must be ordered or sortable by date to ensure + proper time-series plotting. + - Each GeoDataFrame in `stats_per_date` should have columns named in the format + `<prefix>.<stat>` (e.g., "temperature.mean"). + + Example: + ``` + import geopandas as gpd + import datetime + from plot_tools import plot_stats + + # Example input + stats_per_date = { + datetime.datetime(2023, 1, 1): gpd.GeoDataFrame({...}), + datetime.datetime(2023, 2, 1): gpd.GeoDataFrame({...}), + } + + plot_stats( + chartfile="output_chart.png", + stats_per_date=stats_per_date, + stats=["mean", "std"], + index_name="RegionID", + display=True + ) + ``` + + Output: + - Saves a time-series plot of the specified statistics as `chartfile`. + - Optionally displays the plot if `display=True`. + """ + + # convert dates to datenumber format + sorted_dates = sorted(stats_per_date.keys()) + x = np.array([matplotlib.dates.date2num(date) for date in sorted_dates]) + + all_stats = pd.concat([stats_per_date[date] for date in sorted_dates], ignore_index=True) + if index_name not in all_stats.columns: + raise ValueError(f"Index '{index_name}' is not present in the geometries. " + "Please provide a valid value for -gi option.") + zones = all_stats[index_name].unique() + + # extract the prefixes present in the stats + prefix_pattern = re.compile("(.+)\\.name") + prefixes = [] + for col in all_stats.columns: + m = prefix_pattern.match(col) + if m: + prefixes.append(m.group(1)) + + fignum = 1 + lines = [] + for i, prefix in enumerate(prefixes): + for stat in stats: + plt.subplot(len(prefixes), len(stats), fignum) + stat_name = get_metadata_name(-1, prefix, stat) + + for zone in zones: + y = np.array(all_stats.loc[all_stats[index_name] == zone][stat_name]) + line, = plt.plot_date(x, y, '-') + lines.append(line) + + plt.title(stat_name) + fignum = fignum + 1 + + plt.xlabel('date') + plt.ylabel('values') + + plt.figlegend(lines, zones, loc='lower center', ncol=2, fancybox=True, shadow=True) + plt.savefig(chartfile, bbox_inches='tight') + if display: + plt.show()
+ + +def _compute_stats(pack, nodata, stats: List[str] = None, + categorical: bool = False, prefix_stats: str = ""): + """Compute the statistics. + + Args: + pack: + A quadruplet containing an array of data (1 per band), the geo transform, the geometry + where to compute stats, and the window corresponding to the geometry + nodata: + The value that corresponds to nodata + stats: + The list of stats to compute + categorical: + Whether to consider the input raster as categorical + prefix_stats: + A prefix to name the stats + + Returns: + A list of statistics (one item per band). Statistics are provided as a dict that associates + the stats names and the stats values. + """ + datas, transform, geom, window = pack + + # prepare the mask to apply to input dataset: any pixel outside the geom shall be masked + all_geoms = [(g, 1) for g in geom] + mask = features.rasterize(shapes=all_geoms, + fill=0, out_shape=rasterio.windows.shape(window), + transform=transform, + dtype=rasterio.uint8).astype(bool) + + # list of stats computed, one item per band + all_stats = [] + # for every bands + for data in datas: + # create the dataset on which stats will be computed + if nodata and np.isnan(nodata): + dataset = np.ma.MaskedArray(data, mask=(np.isnan(data) | ~mask)) + else: + dataset = np.ma.MaskedArray(data, mask=((data == nodata) | ~mask)) + + count = dataset.count() + if count == 0: + # nothing here, fill with None and move on + feature_stats = dict([(stat, None) for stat in stats]) + else: + # generate the statistics + feature_stats = _gen_stats(dataset, stats, categorical, prefix_stats) + # generate the categorical statistics + feature_stats.update(_gen_stats_cat(dataset, stats, categorical, prefix_stats)) + + # generate the counting stats + if "count" in stats: + feature_stats[f'{prefix_stats}count'] = count + if 'valid' in stats or 'nodata' in stats: + all_count = np.count_nonzero(mask) + if 'nodata' in stats: + feature_stats[f'{prefix_stats}nodata'] = all_count - count + if 'valid' in stats: + valid = 1.0 * count / (all_count + 1e-5) + feature_stats[f'{prefix_stats}valid'] = valid + + # append the generated stats to the structure that contains the stats for all bands + all_stats.append(feature_stats) + return all_stats + + +def _gen_stats(dataset, stats: List[str] = None, + categorical: bool = False, prefix_stats: str = ""): + """Generates the statistics + + Args: + dataset: + The dataset (numpy MaskedArray) from which stats are computed + stats: + The stats to compute + categorical: + Whether to consider the input raster as categorical + prefix_stats: + A prefix to name the stats + + Returns: + The list of statistics for the input dataset as a dict that associates the + stats names and the stats values. + + """ + feature_stats = dict() + + # compute stats + functions = { + 'min': np.ma.min, + 'max': np.ma.max, + 'mean': np.ma.mean, + 'sum': np.ma.sum, + 'std': np.ma.std, + 'median': np.ma.median + } + + for key, function in functions.items(): + if key in stats: + feature_stats[f'{prefix_stats}{key}'] = float(function(dataset)) + + if 'range' in stats: + min_key = f'{prefix_stats}min' + rmin = feature_stats[min_key] if min_key in feature_stats.keys() else float(dataset.min()) + max_key = f'{prefix_stats}max' + rmax = feature_stats[max_key] if max_key in feature_stats.keys() else float(dataset.max()) + feature_stats[f'{prefix_stats}range'] = rmax - rmin + + # compute percentiles on the compressed dataset (i.e. the numpy array without the masked values) + # because np.ma has no percentile computation capabilities + dataset_com = dataset.compressed() + for pctile in [s for s in stats if s.startswith('percentile_')]: + q = float(pctile.replace("percentile_", '')) + feature_stats[f'{prefix_stats}{pctile}'] = np.percentile(dataset_com, q) + if 'mad' in stats: + feature_stats[f'{prefix_stats}mad'] = median_abs_deviation(dataset_com.flatten()) + + return feature_stats + + +def _gen_stats_cat(dataset, stats: List[str] = None, + categorical: bool = False, prefix_stats: str = ""): + """Generates the statistics + + Args: + dataset: + The dataset (numpy MaskedArray) from which stats are computed + stats: + The stats to compute + categorical: + Whether to consider the input raster as categorical + prefix_stats: + A prefix to name the stats + + Returns: + The list of statistics for the input dataset as a dict that associates the + stats names and the stats values. + + """ + + # if categorical stats is requested, extract all unique values from the dataset + if categorical or 'majority' in stats or 'minority' in stats or 'unique' in stats: + keys, counts = np.unique(dataset.compressed(), return_counts=True) + # pixel_count is a dict that associates a unique value with the number + # of occurrences in the dataset + pixel_count = dict(zip([k.item() for k in keys], + [c.item() for c in counts])) + + # initialize the feature_stats dict + feature_stats = dict(pixel_count) if categorical else {} + + def _key_assoc_val(d, func, exclude=None): + """return the key associated with the value returned by func + """ + vs = list(d.values()) + ks = list(d.keys()) + key = ks[vs.index(func(vs))] + return key + + if 'majority' in stats: + feature_stats[f'{prefix_stats}majority'] = float(_key_assoc_val(pixel_count, max)) + if 'minority' in stats: + feature_stats[f'{prefix_stats}minority'] = float(_key_assoc_val(pixel_count, min)) + if 'unique' in stats: + feature_stats[f'{prefix_stats}unique'] = len(list(pixel_count.keys())) + + return feature_stats +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/processing/vector.html b/docs/_build/html/_modules/eolab/rastertools/processing/vector.html new file mode 100644 index 00000000..78f11d6d --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/processing/vector.html @@ -0,0 +1,527 @@ + + + + + + + + eolab.rastertools.processing.vector — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for eolab.rastertools.processing.vector

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Utilities methods on vector images
+"""
+import math
+from typing import Union
+from pathlib import Path
+
+import numpy as np
+import pandas as pd
+import geopandas as gpd
+import shapely.geometry
+from osgeo import gdal
+import rasterio
+from rasterio import features, warp, windows
+
+from eolab.rastertools import utils
+
+
+def _get_geoms(geoms: Union[gpd.GeoDataFrame, Path, str]) -> gpd.GeoDataFrame:
+    """Internal method to extract the geometries as a GeoDataFrame"""
+    if isinstance(geoms, str):
+        geoms = gpd.read_file(geoms)
+    elif isinstance(geoms, Path):
+        geoms = gpd.read_file(geoms.as_posix())
+    return geoms
+
+
+def _get_geoms_crs(geoms: Union[gpd.GeoDataFrame, Path, str]) -> rasterio.crs.CRS:
+    """Internal method to extract the CRS of the geometries"""
+    from packaging.version import Version
+    from pyproj.enums import WktVersion
+
+    proj_crs = _get_geoms(geoms).crs
+    if Version(rasterio.__gdal_version__) < Version("3.0.0"):
+        proj_crs = rasterio.crs.CRS.from_wkt(proj_crs.to_wkt(WktVersion.WKT1_GDAL))
+    else:
+        proj_crs = rasterio.crs.CRS.from_wkt(proj_crs.to_wkt())
+    return proj_crs
+
+
+
[docs]def filter(geoms: Union[gpd.GeoDataFrame, Path, str], raster: Union[Path, str], + within: bool = False, output: Union[Path, str] = None, + driver: str = 'GeoJSON') -> gpd.GeoDataFrame: + """Filter the geometries to keep those which intersect the raster bounds + + Args: + geoms (str or Path or :obj:`gpd.GeoDataFrame`): + Filename of the vector data (if str) or GeoDataFrame + raster (str or Path): + Raster image + within (bool, optional, default=False): + If true, statistics are computed for geometries within the raster shape. Otherwise + statistics are computed for geometries that intersect the raster shape. + output (str or Path, optional, default=None): + File where to save the filtered geoms + If None, nothing written to disk (only in memory) + driver (str, optional, default=GeoJSON): + Driver to write the output + + Returns: + :obj:`gpd.GeoDataFrame`: The geometries that intesect the raster + """ + geometries = _get_geoms(geoms) + geoms_crs = _get_geoms_crs(geometries) + + file = raster.as_posix() if isinstance(raster, Path) else raster + + dataset = rasterio.open(file) + l, b, r, t = dataset.bounds + px, py = ([l, l, r, r], [b, t, t, b]) + + if(geoms_crs != dataset.crs): + px, py = warp.transform(dataset.crs, geoms_crs, [l, l, r, r], [b, t, t, b]) + + polygon = shapely.geometry.Polygon([(x, y) for x, y in zip(px, py)]) + if within: + # convert geometries into GeoPandasBaseExtended to use the new cix property + filtered_geoms = geometries[geometries.within(polygon)] + else: + filtered_geoms = geometries[geometries.intersects(polygon)] + + if output: + outfile = output.as_posix() if isinstance(output, Path) else output + filtered_geoms.to_file(outfile, driver=driver) + dataset.close() + return filtered_geoms
+ + +
[docs]def clip(geoms: Union[gpd.GeoDataFrame, Path, str], raster: Union[Path, str], + output: Union[Path, str] = None, driver: str = 'GeoJSON') -> gpd.GeoDataFrame: + """Clip the geometries to the raster bounds. + Clipping is supposed to be a little bit faster than intersect + + Args: + geoms (str or Path or :obj:`gpd.GeoDataFrame`): + Filename of the vector data (if str) or GeoDataFrame + raster (str or Path): + Raster image + output (str or Path, optional, default=None): + File where to save the clipped geoms + If None, nothing written to disk (only in memory) + driver (str, optional, default=GeoJSON): + Driver to write the output + + Returns: + :obj:`gpd.GeoDataFrame`: The clipped geometries + """ + geometries = _get_geoms(geoms) + geoms_crs = _get_geoms_crs(geometries) + + file = raster.as_posix() if isinstance(raster, Path) else raster + + # first filter the geometries that overlap the raster bounds in order to + # avoid computing clipping many polygons + filtered_geoms = filter(geometries, raster) + + # then clip the resulting geometries to the raster bounds + with rasterio.open(file) as dataset: + l, b, r, t = dataset.bounds + px, py = ([l, l, r, r], [b, t, t, b]) + + if(geoms_crs != dataset.crs): + # reproject bounds in geoms crs + px, py = warp.transform(dataset.crs, geoms_crs, [l, l, r, r], [b, t, t, b]) + + # then clip the resulting geometries to the raster bounds + polygon = shapely.geometry.Polygon([(x, y) for x, y in zip(px, py)]) + clipped_geoms = gpd.clip(filtered_geoms, polygon) + + if output: + outfile = output.as_posix() if isinstance(output, Path) else output + clipped_geoms.to_file(outfile, driver=driver) + + return clipped_geoms
+ + +
[docs]def reproject(geoms: Union[gpd.GeoDataFrame, Path, str], raster: Union[Path, str], + output: Union[Path, str] = None, driver: str = 'GeoJSON') -> gpd.GeoDataFrame: + """Reproject the geometries in the raster CRS + + Args: + geoms (str or Path or :obj:`gpd.GeoDataFrame`): + Filename of the vector data (if str) or GeoDataFrame + raster (str or Path): + Raster image + output (str or Path, optional, default=None): + File where to save the reprojected geoms + If None, nothing written to disk (only in memory) + driver (str, optional, default="GeoJSON"): + Driver to write the output + + Returns: + :obj:`gpd.GeoDataFrame`: The geometries in the raster CRS + """ + geometries = _get_geoms(geoms) + geoms_crs = _get_geoms_crs(geometries) + + file = raster.as_posix() if isinstance(raster, Path) else raster + + dataset = rasterio.open(file) + + if(geoms_crs != dataset.crs): + reprojected_geoms = geometries.to_crs(dataset.crs) + else: + reprojected_geoms = geometries + + if output: + outfile = output.as_posix() if isinstance(output, Path) else output + reprojected_geoms.to_file(outfile, driver=driver) + + dataset.close() + return reprojected_geoms
+ + + +
[docs]def dissolve(geoms: Union[gpd.GeoDataFrame, Path, str], + output: Union[Path, str] = None, driver: str = 'GeoJSON') -> gpd.GeoDataFrame: + """Dissolves all geometries in one + + Args: + geoms (str or Path or :obj:`gpd.GeoDataFrame`): + Filename of the vector data (if str) or GeoDataFrame + output (str or Path, optional, default=None): + File where to save the dissolved geoms + If None, nothing written to disk (only in memory) + driver (str, optional, default=GeoJSON): + Driver to write the output + + Returns: + :obj:`gpd.GeoDataFrame`: The dissolved geometries + """ + geometries = _get_geoms(geoms) + + geometries['COMMON'] = 0 + union = geometries.dissolve(by='COMMON', as_index=False) + union = union.drop(columns='COMMON') + + if output: + outfile = output.as_posix() if isinstance(output, Path) else output + union.to_file(outfile, driver=driver) + + return union
+ + +
[docs]def get_raster_shape(raster: Union[Path, str], output: Union[Path, str] = None, + driver: str = 'GeoJSON') -> gpd.GeoDataFrame: + """Extract the raster extent (shape where raster values are not masked) + + Args: + raster (str or Path): + Raster image + output (str or Path, optional, default=None): + File where to save the shape geom + If None, nothing written to disk (only in memory) + driver (str, optional, default=GeoJSON): + Driver to write the output + + Returns: + :obj:`gpd.GeoDataFrame`: The geometries in the raster CRS + """ + file = raster.as_posix() if isinstance(raster, Path) else raster + with rasterio.open(file) as src: + geoms = [] + for band in range(1, src.count + 1): + mask = src.read_masks(band) + data = (mask > 0).astype(np.int16) + features_gen = features.shapes(data, mask, transform=src.transform) + for geom, val in features_gen: + if val > 0: + # transform geojson like dict to shapely geometry object + geoms.append(shapely.geometry.shape(geom)) + + # create geo data frame + df = pd.DataFrame({'geometry': geoms}) + gdf = gpd.GeoDataFrame(df, geometry='geometry') + # set crs + gdf.crs = src.crs + # dissolve all shapes per band in one shape + gdf['COMMON'] = 0 + raster_shape = gdf.dissolve(by='COMMON', as_index=False) + raster_shape = raster_shape.drop(columns='COMMON') + + if output: + outfile = output.as_posix() if isinstance(output, Path) else output + raster_shape.to_file(outfile, driver=driver) + return raster_shape
+ + +
[docs]def rasterize(geoms: Union[gpd.GeoDataFrame, Path, str], raster: Union[Path, str], + burn: str = "index", burn_type=rasterio.int32, nodata=-1, + output: Union[Path, str] = None): + """Rasterize geometries using the raster shape and CRS. Output is a GeoTiff where every pixels + have the value of the "burn" attribute of geometries. + + Args: + geoms (str or Path or :obj:`gpd.GeoDataFrame`): + Filename of the vector data (if str) or GeoDataFrame + raster (str or Path): + Filename of the raster image + burn (str, optional, default='index'): + Attribute to burn in the raster. Default is the index of the geometry. + burn_type (rasterio.dtypes, optional, default=rasterio.int32): + Type of the attribute values to burn. Must be coherent with actual + burned attribute. + nodata (value compatible with burn_type, optional, default=-1): + Value corresponding to nodata in the generated raster. + output (str or Path, optional, default=None): + Output file where to save the rasterized geometries. + If None, nothing written to disk (only in memory) + + Returns: + np.ndarray: The dataset containing the burned values + """ + geometries = _get_geoms(geoms) + + file = raster.as_posix() if isinstance(raster, Path) else raster + with rasterio.open(file) as src: + shapes = ((geom, i) + for geom, i in zip(geometries.geometry, + geometries.index if burn == "index" else geometries[burn])) + burned = features.rasterize(shapes=shapes, + fill=nodata, + out_shape=src.shape, + transform=src.transform, + dtype=burn_type) + + if output: + outfile = output.as_posix() if isinstance(output, Path) else output + profile = src.profile + profile.update(blockxsize=utils.highest_power_of_2(min(1024, src.width)), + blockysize=utils.highest_power_of_2(min(1024, src.height)), + tiled=True, dtype=burn_type, + driver='GTiff', count=1, nodata=nodata) + with rasterio.open(outfile, 'w', **profile) as dst: + dst.write(burned, 1) + + return burned
+ + + +
[docs]def crop(input_image: Union[Path, str], roi: Union[gpd.GeoDataFrame, Path, str], + output_image: Union[Path, str]): + """Crops an input image to the roi bounds. + + Args: + input_image (pathlib.Path or str): + Filename of the raster image to crop + roi (str or Path or GeoDataFrame): + Filename of the vector data (if str) or GeoDataFrame + output_image (pathlib.Path or str): + Filename of the generated raster image + """ + + pinput = input_image.as_posix() if isinstance(input_image, Path) else input_image + poutput = output_image.as_posix() if isinstance(output_image, Path) else output_image + + geometries = reproject(dissolve(roi), pinput) + geom_bounds = geometries.total_bounds + + raster = rasterio.open(pinput) + rst_bounds = raster.bounds + bounds = (math.floor(max(rst_bounds[0], geom_bounds[0])), + math.floor(max(rst_bounds[1], geom_bounds[1])), + math.ceil(min(rst_bounds[2], geom_bounds[2])), + math.ceil(min(rst_bounds[3], geom_bounds[3]))) + geotransform = raster.get_transform() + width = np.abs(geotransform[1]) + height = np.abs(geotransform[5]) + + ds = gdal.Warp(destNameOrDestDS=poutput, + srcDSOrSrcDSTab=pinput, + outputBounds=bounds, targetAlignedPixels=True, + cutlineDSName=roi, + cropToCutline=False, + xRes=width, yRes=height, + format="VRT") + del ds + raster.close()
+ + + + +
[docs]def vectorize(category_raster: Union[Path, str], raster: Union[Path, str], + category_column: str = "Classe") -> gpd.GeoDataFrame: + """Vectorize a raster containing categorical data. Only data intersecting the raster bounds + are vectorized. + + Args: + category_raster (str or Path): + Raster containing categories to vectorize data (if str) + raster (str or Path): + Raster image defining the zone of interest + category_column (str, optional, default="Classe"): + Name of the column containing the category in the resulting geodataframe + + Returns: + :obj:`gpd.GeoDataFrame`: The geometries generated by the vectorization in the category crs + """ + file = raster.as_posix() if isinstance(raster, Path) else raster + + with rasterio.open(file) as dataset: + with rasterio.open(category_raster) as category_dataset: + # get the raster bounds in the classif crs + l, b, r, t = dataset.bounds + if(category_dataset.crs != dataset.crs): + # reproject bounds in classif crs + l, b, r, t = warp.transform_bounds(dataset.crs, category_dataset.crs, + *dataset.bounds) + + # Compute window bounds for crop + window = windows.from_bounds(l, b, r, t, category_dataset.transform) + # After reading portion of file, rasterio looses georeferencing + # Thus, we record the georef and update it to match the cropped portion + transform_offset = category_dataset.window_transform(window) + # Now, read and vectorize crop + extract = category_dataset.read(1, window=window) + new_shapes = rasterio.features.shapes(extract, transform=transform_offset) + # Store this vectorization in a GeoDataFrame + geo_df = gpd.GeoDataFrame.from_records(new_shapes, + columns=['geometry', category_column]) + geo_df['geometry'] = geo_df['geometry'].apply(lambda x: shapely.geometry.shape(x)) + geo_df[category_column] = geo_df[category_column].apply(lambda x: int(x)) + geo_df = geo_df.set_geometry("geometry") + geo_df.crs = category_dataset.crs + return geo_df
+ + +
[docs]def filter_dissolve(geom: gpd.GeoDataFrame, cat_geom: gpd.GeoDataFrame, + id: str = 'Classe') -> gpd.GeoDataFrame: + """Filter a classification to the extent of a geometry. Returns a list of multipolygons + corresponding to each category. Categories are merged according to the id label if + entry is a geodataframe + + Args: + geom (:obj:`gpd.GeoDataFrame`): Geometry corresponding to ROI + cat_geom (:obj:`gpd.GeoDataFrame`): Geometries with labels, corresponding + to a classification + id (str, optional, default="Classe"): Name of classes label in cat_geom + + Returns: + :obj:`gpd.GeoDataFrame`: The filtered geometries + """ + intersection = gpd.overlay(geom, cat_geom) + result = intersection.dissolve(by=id, as_index=False) + return result
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/product.html b/docs/_build/html/_modules/eolab/rastertools/product.html new file mode 100644 index 00000000..2d4d2fb5 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/product.html @@ -0,0 +1,145 @@ + + + + + + + + eolab.rastertools.product — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.product

+# -*- coding: utf-8 -*-
+"""This module defines the raster product definition.
+"""
+import numpy as np
+
+from eolab.rastertools.product.rastertype import Band, BandChannel, RasterType
+from eolab.rastertools.product.rasterproduct import RasterProduct
+
+# import classes of rasterproduct and rastertype submodules
+__all__ = [
+    "Band", "BandChannel", "RasterType", "RasterProduct"
+]
+
+# initialize the default raster types
+import importlib.resources
+import json
+
+RasterType.add(json.load(importlib.resources.open_binary("eolab.rastertools.product", "rastertypes.json")))
+
+
+
[docs]def s2_maja_mask(in_ar, out_ar, xoff, yoff, xsize, ysize, + raster_xsize, raster_ysize, buf_radius, gt, **kwargs): + """Computes the mask band from the Sentinel2 L2A MAJA cloud mask + """ + out_ar[:] = np.where(np.sum(in_ar, axis=0) == 0, 1, 0)
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/product/rasterproduct.html b/docs/_build/html/_modules/eolab/rastertools/product/rasterproduct.html new file mode 100644 index 00000000..ed1dda0d --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/product/rasterproduct.html @@ -0,0 +1,741 @@ + + + + + + + + eolab.rastertools.product.rasterproduct — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.product.rasterproduct

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Data Model for raster product enabling to extract bands, timestamp, etc.
+"""
+from typing import Dict, List, Union, Tuple
+from pathlib import Path
+from datetime import datetime
+import logging
+import re
+import tarfile
+import zipfile
+import tempfile
+from uuid import uuid4
+
+from osgeo import gdal
+import rasterio
+
+from eolab.rastertools import utils
+from eolab.rastertools.product import RasterType
+from eolab.rastertools.product.vrt import add_masks_to_vrt, set_band_descriptions
+from eolab.rastertools.processing.vector import crop
+
+__author__ = "Olivier Queyrut"
+__copyright__ = "Copyright 2019, CNES"
+__license__ = "Apache v2.0"
+
+
+_logger = logging.getLogger(__name__)
+
+
+
[docs]class RasterProduct: + """Data model for a raster product that handles : + + - a raster type + - the list of available bands + - the path to the product + + A raster product can be easily like this:: + + with RasterProduct("my_product_filename.zip") as product: + rastertype = product.rastertype() + raster = product.get_raster() # raster is an in-memory VRT that can + # be opened using rasterio + with rasterio.open(raster) as rst: + print(rst.count) + data = rst.read([1, 2, 3], masked=True) # data is a numpy masked array + + A raster product handles several in-memory VRTs that must be properly released. The + with statement enables this. If you want to control the clean-up of the in-memory VRTs + you have to call ``free_in_memory_vrts()``. + """ + +
[docs] def __init__(self, file: Union[Path, str], vrt_outputdir: Union[Path, str] = None): + """Constructor + + Args: + file (Path or str): + Path to the raster product + vrt_outputdir (Path or str, optional, default=None): + Dir where to store the generated VRT image(s). If None, output is in memory. + """ + if file is None: + raise ValueError("'file' cannot be None") + + self._file = utils.to_path(file) + self._vrt_outputdir = vrt_outputdir + self._in_memory_vrts = [] + + # try to identify the type of raster product from the input file name + self._rastertype = RasterType.find(self._file) + + # if input file is an archive (or a dir) + suffix = utils.get_suffixes(self._file) + self._is_archive = suffix in [".zip", ".gz", ".tar", ".tar.gz"] or self._file.is_dir() + + # check if we will be able to open the raster and gets the list of bands and masks + if self._is_archive: + # inputfile is an archive, need to know its rastertype to open it + if self.rastertype is None: + _logger.error("Unrecognized raster type, " + "can not create a raster product from an archive of " + "unknown raster type") + raise ValueError(f"Unrecognized raster type for input file {file}") + + # extract bands files and masks files + bands_regexp = self.rastertype.get_bands_regexp() + masks_regexp = self.rastertype.get_mask_regexp() + self._bands_files, self._masks_files = \ + _extract_bands(self.file, bands_regexp, masks_regexp) + + else: + # inputfile is a regular image file. + # Check if the file can be opened using rasterio directly + try: + dataset = rasterio.open(self._file.as_posix()) + dataset.close() + self._bands_files = {"all": self._file.as_posix()} + self._masks_files = {} + except Exception: + raise ValueError(f"Unsupported input file {file}")
+ + def __repr__(self): + return f"{self._file.name} [{self._rastertype}]" + + def __enter__(self): + """Enter method for with statement""" + return self + + def __exit__(self, *args): + """Exit method for with statement, it cleans the in memory vrt products""" + self.free_in_memory_vrts() + +
[docs] def free_in_memory_vrts(self): + """ + Free in-memory VRTs by closing all MemoryFile objects. + """ + for vrt in self._in_memory_vrts: + gdal.Unlink(vrt.as_posix()) + self._in_memory_vrts = []
+ + @property + def file(self) -> Path: + """Product path""" + return self._file + + @property + def rastertype(self) -> RasterType: + """Type of the raster""" + return self._rastertype + + @property + def channels(self): + """List of available channels in the product""" + return self._rastertype.channels if self._rastertype is not None else [] + + @property + def bands_files(self): + """Dictionary of available bands. Key is the identifier of the band, + value is the path to the band. If all bands are in the same file, the + dictionary contains only one key named "all". + """ + return self._bands_files + + @property + def masks_files(self): + """Dictionary of available mask bands. Key is the identifier of the mask band, + value is the path to the band. + """ + return self._masks_files + + @property + def is_archive(self): + """Whether the raster product is an archive (zip, tar, dir, ...) or + a regular raster image""" + return self._is_archive + +
[docs] def get_date(self) -> datetime: + """Extracts the timestamp of the raster + + Returns: + :obj:`datetime.datetime`: Timestamp of the raster + """ + return self._rastertype.get_date(self._file) if self._rastertype is not None else None
+ +
[docs] def get_date_string(self, strformat: str = None) -> str: + """Extracts the timestamp of the raster and returns it as a formatted string + + Returns: + str: String formatted timestamp of the raster + """ + date = self.get_date() + f = strformat + if f is None: + f = self._rastertype.date_format if self._rastertype else "%Y%m%dT%H%M%S" + return date.strftime(f) if date is not None else ""
+ +
[docs] def get_tile(self) -> str: + """Extracts the tile identifier of the raster + + Returns: + str: Tile tile identifier of the raster + """ + return self._rastertype.get_group(self._file, + 'tile') if self._rastertype is not None else None
+ +
[docs] def get_relative_orbit(self) -> int: + """Extracts the relative orbit number of the raster + + Returns: + int: Relative orbit number of the raster + """ + relorbit = None + if self._rastertype is not None: + strval = self._rastertype.get_group(self._file, 'relorbit') + relorbit = int(strval) if strval is not None else None + return relorbit
+ +
[docs] def get_satellite(self) -> str: + """Extracts the satellite's name of the raster + + Returns: + str: Name of the satellite + """ + return self._rastertype.get_group(self._file, + 'satellite') if self._rastertype is not None else None
+ +
[docs] def open(self, + bands: Union[str, List[str]] = "all", + masks: Union[str, List[str]] = "all", + roi: Union[Path, str] = None): + return rasterio.open(self.get_raster(bands=bands, masks=masks, roi=roi))
+ +
[docs] def get_raster(self, + bands: Union[str, List[str]] = "all", + masks: Union[str, List[str]] = "all", + roi: Union[Path, str] = None, + create_maskband: bool = True): + """Gets the path to the raster corresponding to this product. + This method allows to crop the raster to a specified ROI and to apply the band masks. + + Args: + bands (str or [str], default="all"): + List of bands ids to get in the generated raster. If "all", all bands + defined in the rastertype will be present in the raster. + masks (str or [str], default="all"): + List of masks bands ids to get in the generated raster. If "all", all + masks bands defined in the rastertype will be present in the raster. If + None, no mask band will be present in the rastertype. + roi (Path or str, optional, default=None): + Region of interest defined by a vector data (e.g. GeoJSON) for + cropping the raster. + create_maskband (bool, optional, default=True): + Whether to create the VRT product with a maskband that is a composition + of all the given masks. + + Returns: + str: Raster path (either a path to a regular image or + a memory path such as /vsimem/...)""" + + if self.is_archive is False: + # general case: product is a regular raster image + rasterfile = self.file + else: + selected_bands, band_descriptions = self.__get_bands(bands) + selected_masks, mask_descriptions = self.__get_masks(masks) + in_memory = self._vrt_outputdir is None + if in_memory: + uuid = f"{uuid4()}_" + else: + uuid = "" + + # create the raster + rasterfile = self.__create_vrt(selected_bands, selected_masks, uuid=uuid) + if in_memory: + self._in_memory_vrts.append(rasterfile) + + # add band descriptions to the vrt + descr = band_descriptions + mask_descriptions + set_band_descriptions(rasterfile, descr) + + # clip the vrt to the ROI + if roi: + wrapped_vrt = self.__wrap(rasterfile, utils.to_path(roi), uuid=uuid) + if in_memory: + self._in_memory_vrts.append(wrapped_vrt) + + # add band descriptions + set_band_descriptions(wrapped_vrt, descr) + + rasterfile = wrapped_vrt + + # apply masks bands + if create_maskband and len(selected_masks): + # get the number of bands and masks to separate them in the generated VRT + nb_bands = len(selected_bands) + nb_masks = len(selected_masks) + masked_image = self.__apply_masks(rasterfile, nb_bands, nb_masks, uuid=uuid) + if in_memory: + self._in_memory_vrts.append(masked_image) + + # add band descriptions only + set_band_descriptions(masked_image, band_descriptions) + + rasterfile = masked_image + return rasterfile.as_posix()
+ + def __get_bands(self, bands: Union[str, List[str]] = "all"): + """Gets the bands files and descriptions corresponding to the given bands ids. + + Args: + bands (str or [str], default="all"): + List of bands ids to get in the generated raster. If "all", all bands + defined in the rastertype will be present in the raster. + + Returns: + List of bands files and descriptions + """ + # select the bands to include in the raster + if isinstance(bands, list) and len(bands): + for band in bands: + if band not in self.bands_files.keys(): + raise ValueError( + f"Invalid band id {band}: it does not exist in raster product") + selected_bands = {k: d for k, d in self.bands_files.items() if k in bands} + elif bands == "all": + selected_bands = self.bands_files + else: + raise ValueError("Invalid bands list: must be 'all' or a valid no " + "empty list of band ids") + + bl = bands if bands != "all" else self.rastertype.get_band_ids() + band_descriptions = [self.rastertype.get_band_description(channel) + for channel in self.channels + if self.rastertype.get_band_id(channel) in bl] + + return selected_bands, band_descriptions + + def __get_masks(self, masks: Union[str, List[str]] = "all"): + """Gets the masks files and descriptions corresponding to the given bands ids. + + Args: + masks (str or [str], default="all"): + List of bands ids to get in the generated raster. If "all", all bands + defined in the rastertype will be present in the raster. + + Returns: + List of masks files and descriptions + """ + # select the masks to include in the raster + if isinstance(masks, list): + for mask in masks: + if mask not in self.masks_files.keys(): + raise ValueError( + f"Invalid mask id {mask}: it does not exist in raster product") + selected_masks = {k: d for k, d in self.masks_files.items() if k in masks} + elif masks == "all": + # all masks + selected_masks = self.masks_files + else: + # no mask + selected_masks = {} + + # generate the descriptions of the bands and masks + # need to get bands descriptions in the order of channels + if masks is not None: + ml = masks if masks != "all" else self.rastertype.get_mask_ids() + else: + ml = [] + mask_descriptions = [self.rastertype.get_mask(mask_id).description + for mask_id in self.rastertype.get_mask_ids() + if mask_id in ml] + + return selected_masks, mask_descriptions + + def __create_vrt(self, + bands_files: Dict[str, str], + masks_files: Dict[str, str], + uuid: str = "") -> Path: + """Create a VRT for the product archive. + + If the product is a regular raster image then the raster file is simply the product file. + + If the product is an archive (tar, zip, dir, ...), a VRT is created using GDAL BuildVRT. It + contains the given bands and masks. + + TODO: add arguments to select the resolution and resampling algorithm + + Args: + bands_files (Dict[str, str]): + Bands files indexed by the bands ids + masks_files (Dict[str, str]): + Masks files indexed by the bands ids + uuid (str): + Unique identifier when the VRT is created in memory + + Returns: + Path: path to the raster file + """ + # convert parameters defined as str to Path + outdir = utils.to_path(self._vrt_outputdir, "/vsimem/") + basename = utils.get_basename(self.file) + + _logger.debug("Creating a VRT that handles the bands of the archive product") + + if 'all' in bands_files: + # one file contains all channels + bands = [bands_files['all']] + else: + # create the list of bands in the same order as rastertype's channels + bands = [bands_files[id] + for id in self.rastertype.get_band_ids() + if id in bands_files.keys()] + + # create the list of nodata values for every bands + nodatavals = [str(self.rastertype.nodata)] * len(bands) + + # when band masks exist, add them to the lists + if len(masks_files) > 0: + # add the list of masks in the same order as masks' ids + bands.extend([masks_files[id] for id in self.rastertype.get_mask_ids()]) + nodatavals.append(str(self.rastertype.masknodata)) + + # Create a VRT image with GDAL + rasterfile = outdir.joinpath(f"{uuid}{basename}.vrt") + ds = gdal.BuildVRT(rasterfile.as_posix(), + bands, + VRTNodata=' '.join(nodatavals), + resolution='highest', + # resampleAlg='nearest', + separate='all' not in bands_files) + _logger.debug(f"Generated VRT has {ds.RasterCount} bands") + # free resource from GDAL + del ds + + return rasterfile + + def __wrap(self, input_vrt: Path, roi: Path, uuid: str = "") -> Path: + """Clip the image to the given ROI. + + Args: + input_vrt (Path): + The input VRT to crop + roi (Path): + Region of interest defined by a vector data (e.g. GeoJSON) for + cropping the raster. + uuid (str): + Unique identifier when the VRT is created in memory + + Returns: + Path: The generated VRT + """ + # convert parameters defined as str to Path + outdir = utils.to_path(self._vrt_outputdir, "/vsimem/") + basename = utils.get_basename(self.file) + + # Clip image to the ROI + _logger.debug("Cropping the raster to fit the region of interest") + clipped_image = outdir.joinpath(f"{uuid}{basename}-clipped.vrt") + crop(input_vrt, roi.as_posix(), clipped_image) + + return clipped_image + + def __apply_masks(self, input_vrt: Path, nb_bands: int, nb_masks: int, uuid: str = "") -> Path: + """Use the masks files to mask the raster data. + + Args: + input_vrt (Path): + The input VRT to mask + nb_bands (int): + Number of bands in the input vrt + nb_masks (int): + Number of masks in the input vrt + uuid (str): + Unique identifier when the VRT is created in memory + + Returns: + Path: The generated VRT + """ + # convert parameters defined as str to Path + outdir = utils.to_path(self._vrt_outputdir, "/vsimem/") + basename = utils.get_basename(self.file) + + # create a tempdir for generated temporary files + tempdir = Path(tempfile.gettempdir()) + + # create a new vrt with only bands_files + # it must be written to disk so that we can read it and add a maskband + temp_image = tempdir.joinpath(f"{uuid}{basename}-temp.vrt") + ds = gdal.BuildVRT(temp_image.as_posix(), input_vrt.as_posix(), + bandList=range(1, nb_bands + 1)) + # free resource from GDAL + del ds + + # Add mask band + _logger.debug("Adding band masks") + masks_index = list(range(nb_bands + 1, nb_bands + nb_masks + 1)) + vrt_new_content = add_masks_to_vrt(temp_image, input_vrt, masks_index, + self.rastertype.maskfunc) + driver = gdal.GetDriverByName('VRT') + vrt = gdal.Open(vrt_new_content) + masked_image = outdir.joinpath(f"{uuid}{basename}-mask.vrt") + copy_ds = driver.CreateCopy(masked_image.as_posix(), vrt, strict=0) + del copy_ds + # delete temp image + temp_image.unlink() + # free resource from GDAL + del vrt + + return masked_image
+ + +def _extract_bands(inputfile: Path, + bands_pattern: str, + masks_pattern: str = None, + outputdir: Path = None) -> Tuple[Dict[str, str], Dict[str, str]]: + """Extracts the bands from an archive + + Args: + inputfile (Path): + Archive product that contains the raster bands + bands_pattern (str): + Pattern to identify the bands files in the product. + masks_pattern (str), optional, default=None): + Pattern to identify the masks files in the product if any. + outputdir (Path, optional, default=None): + Dir where to extract images if inputfile is an archive that can't be accessed with + a path like /vsizip or /vsitar. + + Returns: + (dict, dict): List of the bands and masks files indexed by their identifier + """ + bands_masks = None + if inputfile.is_dir(): + _logger.debug("Getting band files from dir resulting from the uncompressed archive") + bands_masks = _extract_bands_from_dir(inputfile, bands_pattern, + masks_pattern) + else: + _logger.debug("Getting band files from archive (zip, gz, tar or targz)") + bands_masks = _extract_bands_from_archive(inputfile, bands_pattern, + masks_pattern) + + _logger.debug(f"Identified bands {', '.join(bands_masks[0])}" + f" and masks {', '.join(bands_masks[1])}") + + return bands_masks + + +def _extract_bands_from_archive(inputfile: Path, + bands_pattern: str, + masks_pattern: str = None) -> Tuple[Dict[str, str], Dict[str, str]]: + """Extracts the bands from an archive (zip, gz, tar or targz) + + Args: + inputfile (Path): + Archive product that contains the raster bands + bands_pattern (str): + Pattern to identify the bands files in the product. + masks_pattern (str): + Pattern to identify the masks files in the product if any. + + Returns: + (dict, dict): List of the bands and masks files indexed by their identifier + """ + bands_files = {} + masks_files = {} + + band_regexp = re.compile(bands_pattern) + has_mask = masks_pattern is not None + mask_regexp = re.compile(masks_pattern) if has_mask else None + + suffix = utils.get_suffixes(inputfile) + if suffix in [".zip", ".gz"]: + # zip or gzip + rootpath = "/vsizip/" + with zipfile.ZipFile(inputfile.as_posix()) as myzip: + names = myzip.namelist() + + else: + # tar or tar.gz + rootpath = "/vsitar/" + with tarfile.open(inputfile.as_posix(), + mode='r:gz' if inputfile.suffix == "gz" else 'r') as mytar: + names = [tarinfo.name for tarinfo in mytar.getmembers()] + + for name in names: + m = band_regexp.match(name) + if m: + # if no catching group, store the band files with the key 'all' + # which means that all bands are in the file. + key = m.group("bands") if "bands" in band_regexp.groupindex else 'all' + bands_files[key] = f"{rootpath}{inputfile.joinpath(name).as_posix()}" + + elif has_mask: + m = mask_regexp.match(name) + if m: + key = m.group("bands") if "bands" in mask_regexp.groupindex else 'all' + masks_files[key] = f"{rootpath}{inputfile.joinpath(name).as_posix()}" + + return bands_files, masks_files + + +def _extract_bands_from_dir(inputfile: Path, + bands_pattern: str, + masks_pattern: str = None) -> Tuple[Dict[str, str], Dict[str, str]]: + """Extracts the bands from an uncompressed archive (i.e. a dir) + + Args: + inputfile (Path): + Archive product that contains the raster bands + bands_pattern (str): + Pattern to identify the bands files in the product. + mask_pattern (str): + Pattern to identify the masks files in the product if any. + + Returns: + (dict, dict): List of the bands and masks files indexed by their identifier + """ + bands_files = {} + masks_files = {} + + band_regexp = re.compile(bands_pattern) + has_mask = masks_pattern is not None + mask_regexp = re.compile(masks_pattern) if has_mask else None + + # the archive may have been extracted, find files in it + for path in inputfile.glob("**/*"): + if path.is_file(): + m = band_regexp.match(path.name) + if m: + key = m.group("bands") if "bands" in band_regexp.groupindex else 'all' + bands_files[key] = path.as_posix() + + elif has_mask: + m = mask_regexp.match(path.name) + if m: + key = m.group("bands") if "bands" in band_regexp.groupindex else 'all' + masks_files[key] = path.as_posix() + + return bands_files, masks_files +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/product/rastertype.html b/docs/_build/html/_modules/eolab/rastertools/product/rastertype.html new file mode 100644 index 00000000..dec624b7 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/product/rastertype.html @@ -0,0 +1,536 @@ + + + + + + + + eolab.rastertools.product.rastertype — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.product.rastertype

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Data Model for raster product enabling to extract bands, timestamp, etc.
+"""
+
+from typing import List, Dict, Union
+import re
+from datetime import datetime
+from enum import Enum
+from pathlib import Path
+
+from eolab.rastertools import utils
+
+__author__ = "Olivier Queyrut"
+__copyright__ = "Copyright 2019, CNES"
+__license__ = "Apache v2.0"
+
+
+
[docs]class BandChannel(Enum): + """Defines the band channel of a raster product + """ + blue = "blue" + green = "green" + red = "red" + nir = "nir" + mir = "mir" + swir = "swir" + + # specific to S2 products + red_edge1 = "red_edge1" + red_edge2 = "red_edge2" + red_edge3 = "red_edge3" + red_edge4 = "red_edge4" + blue_60m = "blue_60m" + nir_60m = "nir_60m" + mir_60m = "mir_60m"
+ + +
[docs]class Band: + """Definition of a band: its identifier in the product's name pattern and its description + """ + +
[docs] def __init__(self, identifier: str, description: str = None): + self._identifier = identifier + self._description = description or identifier
+ + def __repr__(self): + return f"Band {self._identifier}" + + @property + def identifier(self): + """String that enables to identify the band in a raster product""" + return self._identifier + + @property + def description(self): + """Description of the band""" + return self._description
+ + +
[docs]class RasterType: + """Raster type definition + """ + + # initialize rastertypes with the default ones defined in rastertypes.json + rastertypes = dict() + +
[docs] @staticmethod + def get(name: str): + """Get the raster type by its name""" + return RasterType.rastertypes[name] if name in RasterType.rastertypes else None
+ +
[docs] @staticmethod + def find(file: Union[Path, str]): + """Gets the raster type corresponding to the input file + + Args: + file (Path or str): + Product name or path to analyse + + Returns: + :obj:`eolab.rastertools.product.RasterType`: the RasterType corresponding + to the input file + """ + return next((t for n, t in RasterType.rastertypes.items() if t.accept(file)), None)
+ +
[docs] @staticmethod + def add(rastertypes): + """Add new raster types definitions from a json file + + Args: + rastertypes (str): rastertypes description as JSON string + + Returns: + [(str, tuple)]: List of rastertype's name and parameters. Parameters are + provided as a tuple. + """ + new_rastertypes = dict() + for rt in rastertypes['rastertypes']: + name = rt['name'] + product_pattern = rt['product_pattern'] + bands_pattern = rt['bands_pattern'] if "bands_pattern" in rt else None + date_format = rt['date_format'] if "date_format" in rt else "%Y%m%d-%H%M%S" + nodata = rt['nodata'] if "nodata" in rt else -10000 + maskfunc = rt['maskfunc'] if "maskfunc" in rt else None + masknodata = rt['masknodata'] if "masknodata" in rt else 0 + bands = dict() + for band in rt['bands']: + channel = band['channel'] + identifier = band['identifier'] if "identifier" in band else None + description = band['description'] if "description" in band else None + bands[BandChannel[channel]] = Band(identifier, description) + masks = list() + if "masks" in rt: + for mask in rt['masks']: + identifier = mask['identifier'] if "identifier" in mask else None + description = mask['description'] if "description" in mask else None + masks.append(Band(identifier, description)) + + rt_tuple = (name, product_pattern, bands_pattern, bands, masks, + date_format, maskfunc, nodata, masknodata) + new_rastertypes[name] = RasterType(*rt_tuple) + + # update the list of rastertypes with the new ones + RasterType.rastertypes.update(new_rastertypes)
+ +
[docs] def __init__(self, name: str, + product_pattern: str, + bands_pattern: str, + bands: Dict[BandChannel, Band], + masks: List[Band], + date_format: str = "%Y%m%d-%H%M%S", + maskfunc: str = None, + nodata: float = -10000, + masknodata: int = 1): + """Constructor + + Args: + name (str): + Display name of the rastertype + product_pattern (str): + Pattern to identify a file corresponding to this RasterType + The pattern can contain a capturing group corresponding to + the product timestamp + bands_pattern (str): + Pattern to identify a band file in the product. The pattern can + contain a capturing group corresponding to the bands' identifiers + in case bands are separated in different files + bands (dict(BandChannel, Band)): + Dictionary associating the channel and the band definition for all available bands + masks ([Band]): + List of bands that define the masks of the product type + date_format (str, optional, default="%Y%m%d-%H%M%S"): + Date format ot the product timestamp (used to convert a string to datetime) + maskfunc (str, optional, default=None): + Name of the function to convert pixels of the band defined as the mask + (typically the cloud mask) to boolean values. + nodata (float, optional, default=-10000): + No data value of the raster product + masknodata (int, optional, default=1): + No data value of the mask + """ + self._name = name + self._product_pattern = product_pattern + self._bands_pattern = bands_pattern + self._raster_bands = bands + self._masks = masks or list() + self._date_format = date_format + self._maskfunc = maskfunc + self._nodata = nodata + self._masknodata = masknodata
+ + def __repr__(self): + return f"{self.name}" + + @property + def name(self): + """Name of the raster type""" + return self._name + + @property + def product_pattern(self): + """Pattern that enables to identify products of this rastertype""" + return self._product_pattern + + @property + def bands_pattern(self): + """Pattern that enables to identify the bands in a product of this rastertype""" + return self._bands_pattern + + @property + def date_format(self): + """Format of the date in the product's name""" + return self._date_format + + @property + def maskfunc(self): + """Function that defines the mask of cloud from the raster band""" + return self._maskfunc + + @property + def nodata(self): + """Nodata value""" + return self._nodata + + @property + def masknodata(self): + """Nodata value of the mask""" + return self._masknodata + + @property + def channels(self) -> List[BandChannel]: + """Gets the list of all available channels + + Returns: + [:obj:`eolab.rastertools.product.BandChannel`]: + List of available bands channels for this type of product + """ + return list(self._raster_bands.keys()) + +
[docs] def accept(self, file: Union[Path, str]) -> bool: + """Check if the file corresponds to this raster type + + Args: + file (Path or str): + Product name or path to analyse + + Returns: + bool: True if the file matches this RasterType + """ + accept = False + if file is not None: + filename = utils.to_path(file).name + accept = re.match(self.product_pattern, filename) is not None + return accept
+ +
[docs] def get_date(self, file: Union[Path, str]) -> datetime: + """Extracts the timestamp of the raster from the input file + + Args: + file (Path or str): + Product name or path to analyse + + Returns: + :obj:`datetime.datetime`: Timestamp of the input file + """ + datestr = self.get_group(file, 'date') + return datetime.strptime(datestr, self.date_format) if datestr else None
+ +
[docs] def get_group(self, file: Union[Path, str], group: str) -> str: + """Extracts a group from the input file using the product pattern + + Args: + file (Path or str): + Product name or path to analyse + group (str): + Name of the group to extract + + Returns: + str: Group extracted from the raster file + """ + output = None + if file is not None: + regexp = re.compile(self.product_pattern) + if group in regexp.groupindex: + m = regexp.match(file.name if isinstance(file, Path) else file) + if m: + output = m.group(group) + return output
+ +
[docs] def has_channel(self, channel: BandChannel) -> bool: + """Checks if the product type contains the expected channel. + + Args: + channel (:obj:`eolab.rastertools.product.BandChannel`): + Band channel + + Returns: + bool: True if this RasterType contain the channel + """ + return channel in self._raster_bands
+ +
[docs] def has_channels(self, channels: List[BandChannel]) -> bool: + """Checks if the product type contains all the expected channels. + + Args: + channels ([:obj:`eolab.rastertools.product.BandChannel`]): + List of bands channels + + Returns: + bool: True if this RasterType contains all channels + """ + has_channels = False + if channels is not None and len(channels) > 0: + has_channels = all(channel in self._raster_bands for channel in channels) + return has_channels
+ +
[docs] def get_band_ids(self) -> List[str]: + """Gets the bands identifiers. + + Returns: + [str]: The bands ids + """ + return [self._raster_bands[channel].identifier for channel in self.channels]
+ +
[docs] def get_band_id(self, channel: BandChannel) -> str: + """Gets the band identifier of the specified channel. + + Args: + channel (:obj:`eolab.rastertools.product.BandChannel`): + Band channel + + Returns: + str: The band id if found, None otherwise + """ + return self._raster_bands[channel].identifier if self.has_channel(channel) else None
+ +
[docs] def get_band_descriptions(self) -> List[str]: + """Gets the descriptions of the bands. + + Returns: + str: The band description if found, None otherwise + """ + return [self._raster_bands[channel].description for channel in self.channels]
+ +
[docs] def get_band_description(self, channel: BandChannel) -> List[str]: + """Gets the band description of the given channel. + + Args: + channel (:obj:`eolab.rastertools.product.BandChannel`): + Band channel + + Returns: + str: The band description if found, None otherwise + """ + return self._raster_bands[channel].description if self.has_channel(channel) else None
+ +
[docs] def get_bands_regexp(self, channels: List[BandChannel] = None) -> str: + """Gets the regexp to identify the bands in the product. + + Args: + channels ([:obj:`eolab.rastertools.product.BandChannel`]): + List of bands channels + + Returns: + str: The regexp to identify the bands in the product + """ + regexp = None + + if channels is None: + channels = self.channels + + if self.bands_pattern is not None: + if not self.has_channels(channels): + raise ValueError(f"RasterType does not contain all the channels in {channels}") + + ids = [self.get_band_id(channel) for channel in channels] + str_bands = '|'.join(ids) if len(ids) > 0 and None not in ids else "" + regexp = self.bands_pattern.format(str_bands) + return regexp
+ +
[docs] def has_mask(self) -> bool: + """Checks if the product type contains a mask. + + Returns: + bool: True if this RasterType contains a mask + """ + return len(self._masks) > 0
+ +
[docs] def get_mask(self, mask_id: str) -> Band: + """Gets the mask corresponding to the given id. + + Args: + mask_id (str): + Id of the mask + + Returns: + Band: the mask corresponding to the given id, or None if no mask corresponds to + the id + """ + selected_mask = None + for mask in self._masks: + if mask.identifier == mask_id: + selected_mask = mask + return selected_mask
+ +
[docs] def get_mask_ids(self) -> List[str]: + """Gets the identifier of the masks + + Returns: + [str]: The identifiers of the masks if they are some, empty list otherwise + """ + return [mask.identifier for mask in self._masks]
+ +
[docs] def get_mask_descriptions(self) -> List[str]: + """Gets the descriptions of the masks + + Returns: + [str]: The descriptions of the masks if they are some, empty list otherwise + """ + return [mask.description for mask in self._masks]
+ +
[docs] def get_mask_regexp(self) -> str: + """Gets the regexp to identify the masks + + Returns: + str: The regexp to identify the masks + """ + regexp = None + if self.bands_pattern is not None and self.has_mask(): + ids = self.get_mask_ids() + str_masks = '|'.join(ids) if len(ids) > 0 and None not in ids else "" + regexp = self.bands_pattern.format(str_masks) + return regexp
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/product/vrt.html b/docs/_build/html/_modules/eolab/rastertools/product/vrt.html new file mode 100644 index 00000000..ee65fb5c --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/product/vrt.html @@ -0,0 +1,280 @@ + + + + + + + + eolab.rastertools.product.vrt — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.product.vrt

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Utilities to handle vrt image format
+"""
+from typing import Union, List
+import xml.etree.ElementTree as ET
+from pathlib import Path
+
+from osgeo import gdal
+import numpy as np
+
+__author__ = "Olivier Queyrut"
+__copyright__ = "Copyright 2019, CNES"
+__license__ = "Apache v2.0"
+
+
+def _file2vrt(xml_element, file: str, bands: List[int]):
+    """Adds a simple source to the vrt.
+
+    Args:
+        xml_element:
+            Parent XML element that will contains the function definition
+        file:
+            Raster file that contains the bands used as masks
+        bands (int):
+            Bands of the raster image to use as masks
+    """
+    fh = gdal.Open(file)
+    if fh is not None:
+        for band in bands:
+            rasterband = fh.GetRasterBand(band)
+            if rasterband is not None:
+                data_type_name = gdal.GetDataTypeName(rasterband.DataType)
+                block_size_x, block_size_y = rasterband.GetBlockSize()
+
+                # add a source
+                simplesource = ET.SubElement(xml_element, "SimpleSource")
+
+                sourcefilename = ET.SubElement(simplesource, "SourceFilename")
+                sourcefilename.attrib["relativeToVRT"] = '1'
+                sourcefilename.text = Path(file).name
+
+                sourceband = ET.SubElement(simplesource, "SourceBand")
+                sourceband.text = str(band)
+
+                # set the source properties with metadata from input raster
+                sourceprops = ET.SubElement(simplesource, "SourceProperties")
+                sourceprops.attrib["RasterXSize"] = str(fh.RasterXSize)
+                sourceprops.attrib["RasterYSize"] = str(fh.RasterYSize)
+                sourceprops.attrib["DataType"] = data_type_name
+                sourceprops.attrib["BlockXSize"] = str(block_size_x)
+                sourceprops.attrib["BlockYSize"] = str(block_size_y)
+
+                # set the source shape with the shape of the input raster
+                srcrect = ET.SubElement(simplesource, "SrcRect")
+                srcrect.attrib["xOff"] = "0"
+                srcrect.attrib["yOff"] = "0"
+                srcrect.attrib["xSize"] = str(fh.RasterXSize)
+                srcrect.attrib["ySize"] = str(fh.RasterYSize)
+
+                # set the dest shape the same way
+                dstrect = ET.SubElement(simplesource, "DstRect")
+                dstrect.attrib["xOff"] = "0"
+                dstrect.attrib["yOff"] = "0"
+                dstrect.attrib["xSize"] = str(fh.RasterXSize)
+                dstrect.attrib["ySize"] = str(fh.RasterYSize)
+
+    # free gdal resource
+    del fh
+
+
+def _func2vrt(xml_element, funcname: str, funcdef: str = None):
+    """Adds a pixel function to the vrt.
+
+    Args:
+        xml_element:
+            Parent XML element that will contains the function definition
+        funcname (str):
+            Fully qualified name of the function (e.g. indices.vrt.s2_maja_mask)
+        funcdef (str, optional, default=None):
+            Function definition (without its signature). If None, the function funcname
+            must be available in the scope
+    """
+    # Name of the pixel function
+    pixelfunctiontype = ET.SubElement(xml_element, "PixelFunctionType")
+    pixelfunctiontype.text = funcname
+
+    # Language of the pixel function
+    pixelfunctionlang = ET.SubElement(xml_element, "PixelFunctionLanguage")
+    pixelfunctionlang.text = "Python"
+
+    # Definition of the pixel function
+    if funcdef is not None:
+        code = f'<PixelFunctionCode><![CDATA[\n\
+            import numpy as np\n\
+            def {funcname}(in_ar, out_ar, xoff, yoff, xsize, ysize,\
+                           raster_xsize, raster_ysize, buf_radius, gt, **kwargs):\
+                {funcdef}\n\
+            ]]></PixelFunctionCode>'
+        pixelfunctioncode = ET.fromstring(code)
+        xml_element.append(pixelfunctioncode)
+
+
+
[docs]def add_masks_to_vrt(src_vrt: Union[Path, str], maskfile: Union[Path, str], bands: List[int] = [1], + funcname: str = None, funcdef: str = None) -> str: + """Adds a mask bands to the vrt. + + Args: + src_vrt (pathlib.Path or str): + Vrt input image + maskfile (pathlib.Path or str): + Input image that contains the bands to use as masks + bands ([int]): + Bands in the the input image to use as masks + funcname (str, optional, default=None): + Fully qualified name of the pixel function (e.g. indices.vrt.s2_maja_mask) + used to compute the mask from the maskfile dataset. + funcdef (str, optional, default=None): + Function definition (without its signature). If None, the function funcname + must be available in the scope + + Returns: + (str): XML content (vrt format) with the added mask band. + """ + svrt = src_vrt.as_posix() if isinstance(src_vrt, Path) else src_vrt + mask = maskfile.as_posix() if isinstance(maskfile, Path) else maskfile + + with open(svrt) as vrtContent: + tree = ET.parse(vrtContent) + root = tree.getroot() + vrtmaskband = ET.SubElement(root, 'MaskBand') + vrtrasterband = ET.SubElement(vrtmaskband, "VRTRasterBand") + vrtrasterband.attrib["dataType"] = "Byte" + vrtrasterband.attrib["subClass"] = "VRTDerivedRasterBand" + if funcname is not None: + _func2vrt(vrtrasterband, funcname, funcdef) + _file2vrt(vrtrasterband, mask, bands) + + return ET.tostring(root)
+ + +
[docs]def set_band_descriptions(src_vrt: Union[Path, str], descriptions: List[str]): + """Set the descriptions of the bands in a VRT image. + + Args: + src_vrt (pathlib.Path or str): + VRT input image + descriptions ([str]): + Descriptions of the bands + """ + ds = gdal.Open(src_vrt.as_posix() if isinstance(src_vrt, Path) else src_vrt, gdal.GA_Update) + for i, desc in enumerate(descriptions, 1): + rb = ds.GetRasterBand(i) + # if the band exists at the given position, set the description + if rb is not None: + rb.SetDescription(desc) + # free gdal resource + del ds
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/radioindice.html b/docs/_build/html/_modules/eolab/rastertools/radioindice.html new file mode 100644 index 00000000..65c99cf6 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/radioindice.html @@ -0,0 +1,677 @@ + + + + + + + + eolab.rastertools.radioindice — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for eolab.rastertools.radioindice

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+This module defines a command line named radioindice that computes radiometric
+indices on raster images: ndvi, ndwi, etc..
+"""
+import logging
+import logging.config
+import os
+from pathlib import Path
+from typing import List
+import threading
+
+import rasterio
+import numpy.ma as ma
+from tqdm import tqdm
+
+from eolab.rastertools import utils
+from eolab.rastertools import Rastertool, Windowable
+from eolab.rastertools.processing import algo
+from eolab.rastertools.processing import RadioindiceProcessing
+from eolab.rastertools.product import BandChannel, RasterProduct
+
+
+_logger = logging.getLogger(__name__)
+
+
+
[docs]class Radioindice(Rastertool, Windowable): + """Raster tool that computes radiometric indices of a raster product. + + If several indices are requested, the tool can generate one output image with one + band per indice (merge=True), or it can generate several images, one image per indice + (merge=False). + + The computation can be realized on a subset of the input image (a Region Of Interest) + defined by a vector file (e.g. shapefile, geojson). + + The radiometric indice is an instance of + :obj:`eolab.rastertools.processing.RadioindiceProcessing` + which defines the list of channels it needs to compute the indice. The input raster product + must be of a recognized raster type so that it is possible to match every channels required by + the indice with an existing band in the raster product. + """ + # Preconfigured radioindices + # Vegetation indices: ndvi + ndvi = RadioindiceProcessing("ndvi").with_channels( + [BandChannel.red, BandChannel.nir]) + """Normalized Difference Vegetation Index (red, nir channels) + + .. math:: + + ndvi = \\frac{nir - red}{nir + red} + + References: + Rouse J.W., Haas R.H., Schell J.A., Deering D.W., 1973. Monitoring vegetation systems in + the great plains with ERTS. Third ERTS Symposium, NASA SP-351. 1:309-317 + + Tucker C.J., 1979. Red and photographic infrared linear combinations for monitoring + vegetation. Remote Sens Environ 8:127-150 + + """ + + # Vegetation indices: tndvi + tndvi = RadioindiceProcessing("tndvi", algo=algo.tndvi).with_channels( + [BandChannel.red, BandChannel.nir]) + """Transformed Normalized Difference Vegetation Index (red, nir channels) + + .. math:: + :nowrap: + + \\begin{eqnarray} + ndvi & = & \\frac{nir - red}{nir + red} \\\\ + tndvi & = & \\sqrt{ndvi + 0.5} + \\end{eqnarray} + + References: + `Deering D.W., Rouse J.W., Haas R.H., and Schell J.A., 1975. Measuring forage production + of grazing units from Landsat MSS data. Pages 1169-1178 In: Cook J.J. (Ed.), Proceedings + of the Tenth International Symposium on Remote Sensing of Environment (Ann Arbor, 1975), + Vol. 2, Ann Arbor, Michigan, USA. <https://www.scirp.org/reference/referencespapers?referenceid=1046714>`_ + + """ + + # Vegetation indices: rvi + rvi = RadioindiceProcessing("rvi", algo=algo.rvi).with_channels( + [BandChannel.red, BandChannel.nir]) + """Ratio Vegetation Index (red, nir channels) + + .. math:: + + rvi = \\frac{nir}{red} + + References: + `Jordan C.F., 1969. Derivation of leaf area index from quality of light on the forest + floor. Ecology 50:663-666 <https://esajournals.onlinelibrary.wiley.com/doi/10.2307/1936256>`_ + """ + + # Vegetation indices: pvi + pvi = RadioindiceProcessing("pvi", algo=algo.pvi).with_channels( + [BandChannel.red, BandChannel.nir]) + """Perpendicular Vegetation Index (red, nir channels) + + .. math:: + + pvi = (nir - 0.90893 * red - 7.46216) * 0.74 + + References: + `Richardson A.J., Wiegand C.L., 1977. Distinguishing vegetation from soil background + information. Photogramm Eng Rem S 43-1541-1552 <https://www.asprs.org/wp-content/uploads/pers/1977journal/dec/1977_dec_1541-1552.pdf>`_ + """ + + # Vegetation indices: savi + savi = RadioindiceProcessing("savi", algo=algo.savi).with_channels( + [BandChannel.red, BandChannel.nir]) + """Soil Adjusted Vegetation Index (red, nir channels) + + .. math:: + + savi = \\frac{(nir - red) * (1. + 0.5)}{nir + red + 0.5} + + References: + `Huete A.R., 1988. A soil-adjusted vegetation index (SAVI). Remote Sens Environ 25:295-309 <https://www.sciencedirect.com/science/article/abs/pii/003442578890106X>`_ + """ + + # Vegetation indices: tsavi + tsavi = RadioindiceProcessing("tsavi", algo=algo.tsavi).with_channels( + [BandChannel.red, BandChannel.nir]) + """Transformed Soil Adjusted Vegetation Index (red, nir channels) + + .. math:: + + tsavi = \\frac{0.7 * (nir - 0.7 * red - 0.9)}{0.7 * nir + red + 0.08 * (1 + 0.7^2)} + + References: + `Baret F., Guyot G., Major D., 1989. TSAVI: a vegetation index which minimizes soil + brightness effects on LAI or APAR estimation. 12th Canadian Symposium on Remote + Sensing and IGARSS 1990, Vancouver, Canada, 07/10-14. <https://www.researchgate.net/publication/3679422_TSAVI_A_vegetation_index_which_minimizes_soil_brightness_effects_on_LAI_and_APAR_estimation>`_ + """ + + # Vegetation indices: msavi + msavi = RadioindiceProcessing("msavi", algo=algo.msavi).with_channels( + [BandChannel.red, BandChannel.nir]) + """Modified Soil Adjusted Vegetation Index (red, nir channels) + + .. math:: + :nowrap: + + \\begin{eqnarray} + wdvi & = & nir - 0.4 * red \\\\ + ndvi & = & \\frac{nir - red}{nir + red} \\\\ + L & = & 1 - 2 * 0.4 * ndvi * wdvi \\\\ + msavi & = & \\frac{(nir - red) * (1 + L)}{nir + red + L} + \\end{eqnarray} + + References: + `Qi J., Chehbouni A., Huete A.R., Kerr Y.H., 1994. Modified Soil Adjusted Vegetation + Index (MSAVI). Remote Sens Environ 48:119-126 <https://www.researchgate.net/publication/223906415_A_Modified_Soil_Adjusted_Vegetation_Index>`_ + + `Qi J., Kerr Y., Chehbouni A., 1994. External factor consideration in vegetation index + development. Proc. of Physical Measurements and Signatures in Remote Sensing, + ISPRS, 723-730. <https://www.academia.edu/20596726/External_factor_consideration_in_vegetation_index_development>`_ + """ + + # Vegetation indices: msavi2 + msavi2 = RadioindiceProcessing("msavi2", algo=algo.msavi2).with_channels( + [BandChannel.red, BandChannel.nir]) + """Modified Soil Adjusted Vegetation Index (red, nir channels) + + .. math:: + :nowrap: + + \\begin{eqnarray} + val & = & (2 * nir + 1)^2 - 8 * (nir - red) \\\\ + msavi2 & = & (2 * nir + 1 - \\sqrt{val}) / 2 + \\end{eqnarray} + """ + + # Vegetation indices: ipvi + ipvi = RadioindiceProcessing("ipvi", algo=algo.ipvi).with_channels( + [BandChannel.red, BandChannel.nir]) + """Infrared Percentage Vegetation Index (red, nir channels) + + .. math:: + ipvi = \\frac{nir}{nir + red} + + References: + `Crippen, R. E. 1990. Calculating the Vegetation Index Faster, Remote Sensing of + Environment, vol 34., pp. 71-73. <https://www.sciencedirect.com/science/article/abs/pii/003442579090085Z>`_ + """ + + # Vegetation indices: evi + evi = RadioindiceProcessing("evi", algo=algo.evi).with_channels( + [BandChannel.red, BandChannel.nir, BandChannel.blue]) + """Enhanced vegetation index (red, nir, blue channels) + + .. math:: + evi = \\frac{2.5 * (nir - red)}{nir + 6.0 * red - 7.5 * blue + 1.0} + + """ + + # Water indices: ndwi + ndwi = RadioindiceProcessing("ndwi").with_channels( + [BandChannel.mir, BandChannel.nir]) + """Normalized Difference Water Index (mir, nir channels) + + .. math:: + + ndwi = \\frac{nir - mir}{nir + mir} + + References: + Gao, B. C., 1996. NDWI - A normalized difference water index for remote sensing + of vegetation liquid water from space. Remote Sensing of Environment 58, 257-266. + """ + + # Water indices: ndwi2 + ndwi2 = RadioindiceProcessing("ndwi2").with_channels( + [BandChannel.nir, BandChannel.green]) + """Normalized Difference Water Index (nir, green channels) + + .. math:: + + ndwi2 = \\frac{green - nir}{green + nir} + """ + + # Water indices: mdwi + mndwi = RadioindiceProcessing("mndwi").with_channels( + [BandChannel.mir, BandChannel.green]) + """Modified Normalized Difference Water Index (green, mir channels) + + .. math:: + + mndwi = \\frac{green - mir}{green + mir} + + References: + Xu, H. Q., 2006. Modification of normalised difference water index (NDWI) to enhance + open water features in remotely sensed imagery. International Journal of Remote Sensing + 27, 3025-3033 + + """ + + # Water indices: ndpi + ndpi = RadioindiceProcessing("ndpi").with_channels( + [BandChannel.green, BandChannel.mir]) + """Normalized Difference Pond Index (green, mir channels) + + .. math:: + + ndpi = \\frac{mir - green}{mir + green} + + References: + J-P. Lacaux, Y. M. Tourre, C. Vignolle, J-A. Ndione, and M. Lafaye, "Classification + of Ponds from High-Spatial Resolution Remote Sensing: Application to Rift Valley Fever + Epidemics in Senegal," Remote Sensing of Environment 106 66–74, Elsevier Publishers: 2007 + """ + + # Water indices: ndti + ndti = RadioindiceProcessing("ndti").with_channels( + [BandChannel.green, BandChannel.red]) + """Normalized Difference Turbidity Index (green, red channels) + + .. math:: + + ndti = \\frac{red - green}{red + green} + + References: + J-P. Lacaux, Y. M. Tourre, C. Vignolle, J-A. Ndione, and M. Lafaye, "Classification + of Ponds from High-Spatial Resolution Remote Sensing: Application to Rift Valley Fever + Epidemics in Senegal," Remote Sensing of Environment 106 66–74, Elsevier Publishers: 2007 + """ + + # urban indices: ndbi + ndbi = RadioindiceProcessing("ndbi").with_channels( + [BandChannel.nir, BandChannel.mir]) + """Normalized Difference Built Up Index (nir, mir channels) + + .. math:: + + ndbi = \\frac{mir - nir}{mir + nir} + + """ + + # Soil indices: ri + ri = RadioindiceProcessing("ri", algo=algo.redness_index).with_channels( + [BandChannel.red, BandChannel.green]) + """Redness index (red, green channels) + + .. math:: + + ri = \\frac{red^2}{green^3} + + """ + + # Soil indices: bi + bi = RadioindiceProcessing("bi", algo=algo.brightness_index).with_channels( + [BandChannel.red, BandChannel.green]) + """Brightness index (red, green channels) + + .. math:: + + bi = \\frac{red^2 + green^2}{2} + + """ + + # Soil indices: bi2 + bi2 = RadioindiceProcessing("bi2", algo=algo.brightness_index2).with_channels( + [BandChannel.nir, BandChannel.red, BandChannel.green]) + """Brightness index (nir, red, green channels) + + .. math:: + + bi2 = \\frac{nir^2 + red^2 + green^2}{3} + + """ + +
[docs] @staticmethod + def get_default_indices(): + """Get the list of predefined radiometric indices + + Returns: + [:obj:`eolab.rastertools.processing.RadioindiceProcessing`]: list of + predefined radioindice. + """ + # returns all predefined radiometric indices + return [ + Radioindice.ndvi, Radioindice.tndvi, Radioindice.rvi, Radioindice.pvi, + Radioindice.savi, Radioindice.tsavi, Radioindice.msavi, Radioindice.msavi2, + Radioindice.ipvi, Radioindice.evi, Radioindice.ndwi, Radioindice.ndwi2, + Radioindice.mndwi, Radioindice.ndpi, Radioindice.ndti, Radioindice.ndbi, + Radioindice.ri, Radioindice.bi, Radioindice.bi2 + ]
+ +
[docs] def __init__(self, indices: List[RadioindiceProcessing]): + """ Constructor + + Args: + indices ([:obj:`eolab.rastertools.processing.RadioindiceProcessing`]): + List of indices to compute (class Indice) + """ + super().__init__() + self.with_windows() + + self._indices = indices + self._merge = False + self._roi = None
+ + @property + def indices(self) -> List[RadioindiceProcessing]: + """List of radiometric indices to compute""" + return self._indices + + @property + def merge(self) -> bool: + """If true, all indices are in the same output image (one band per indice). + Otherwise, each indice is in its own output image.""" + return self._merge + + @property + def roi(self) -> str: + """Filename of the vector data defining the ROI""" + return self._roi + +
[docs] def with_output(self, outputdir: str = ".", merge: bool = False): + """Set up the output. + + Args: + outputdir (str, optional, default="."): + Output dir where to store results. If none, it is set to current dir + merge (bool, optional, default=False): + Whether to merge all indices in the same image (i.e. one band per indice) + + Returns: + :obj:`eolab.rastertools.Radioindice`: The current instance so that it is + possible to chain the with... calls (fluent API) + """ + super().with_output(outputdir) + self._merge = merge + return self
+ +
[docs] def with_roi(self, roi: str): + """Set up the region of interest + + Args: + roi (str): + Filename of the vector data defining the ROI + (output images will be cropped to the geometry) + + Returns: + :obj:`eolab.rastertools.Radioindice`: The current instance so that it is + possible to chain the with... calls (fluent API) + """ + self._roi = roi
+ +
[docs] def process_file(self, inputfile: str) -> List[str]: + """Compute the indices for a single file + + Args: + inputfile (str): + Input image to process + + Returns: + [str]: List of indice images (posix paths) that have been generated + """ + _logger.info(f"Processing file {inputfile}") + + outdir = Path(self.outputdir) + + # STEP 1: Prepare the input image so that it can be processed + with RasterProduct(inputfile, vrt_outputdir=self.vrt_dir) as product: + _logger.debug(f"Raster product is : {product}") + + if product.rastertype is None: + raise ValueError("Unsupported input file, no matching raster type " + "identified to handle the file") + else: + filename = utils.to_path(inputfile).name + _logger.info(f"Raster type of image {filename} is {product.rastertype.name}") + + # check if all indices can be computed for this raster + indices = list() + for indice in self.indices: + # check if the rastertype has all channels + if not(product.rastertype.has_channels(indice.channels)): + _logger.error(f"Can not compute {indice} for {filename}: " + "raster product does not contain all required bands.") + else: + # indice is valid, add it to the list of indices to compute + indices.append(indice) + + # get the raster + raster = product.get_raster(roi=self.roi) + + # STEP 2: Compute the indices + outputs = [] + if self.merge: + # merge is True, compute all indices and generate a single image + _logger.info(f"Compute indices: {' '.join(indice.name for indice in indices)}") + indice_image = outdir.joinpath(f"{utils.get_basename(inputfile)}-indices.tif") + compute_indices(raster, product.channels, indice_image.as_posix(), + indices, self.window_size) + outputs.append(indice_image.as_posix()) + else: + # merge is False, compute all indices and generate one image per indice + for i, indice in enumerate(indices): + _logger.info(f"Compute {indice.name}") + indice_image = outdir.joinpath( + f"{utils.get_basename(inputfile)}-{indice.name}.tif") + compute_indices(raster, product.channels, indice_image.as_posix(), + [indice], self.window_size) + outputs.append(indice_image.as_posix()) + + # return the list of generated files + return outputs
+ +
[docs]def compute_indices(input_image: str, image_channels: List[BandChannel], + indice_image: str, indices: List[RadioindiceProcessing], + window_size: tuple = (1024, 1024)): + """ + Compute the indices on the input image and produce a multiple bands + image (one band per indice) + + The possible indices are the following : + ndvi, tndvi, rvi, pvi, savi, tsavi, msavi, msavi2, ipvi, evi, ndwi, ndwi2, mndwi, ndpi, ndti, ndbi, ri, bi, bi2 + + Args: + input_image (str): + Path of the raster to compute + image_channels ([:obj:`eolab.rastertools.product.BandChannel`]): + Ordered list of bands in the raster + indice_image (str): + Path of the output raster image + indices ([:obj:`eolab.rastertools.processing.RadioindiceProcessing`]): + List of indices to compute + window_size (tuple(int, int), optional, default=(1024, 1024)): + Size of windows for splitting the processed image in small parts + """ + with rasterio.Env(GDAL_VRT_ENABLE_PYTHON=True): + src = rasterio.open(input_image) + profile = src.profile + + # set block size to the configured window_size of first indice + blockxsize, blockysize = window_size + if src.width < blockxsize: + blockxsize = utils.highest_power_of_2(src.width) + if src.height < blockysize: + blockysize = utils.highest_power_of_2(src.height) + + # dtype of output data + dtype = indices[0].dtype or rasterio.float32 + + # setup profile for output image + profile.update(driver='GTiff', + blockxsize=blockysize, blockysize=blockxsize, tiled=True, + dtype=dtype, nodata=indices[0].nodata, + count=len(indices)) + + with rasterio.open(indice_image, "w", **profile) as dst: + # Materialize a list of destination block windows + windows = [window for ij, window in dst.block_windows()] + + # disable status of tqdm progress bar + disable = os.getenv("RASTERTOOLS_NOTQDM", 'False').lower() in ['true', '1'] + + # Dictionary to store statistics for each band + band_stats = {i: {"min": float('inf'), "max": float('-inf'), "sum": 0, "total_pix": 0, "count": 0} + for i in range(1, len(indices) + 1)} + + # compute every indices + for i, indice in enumerate(indices, 1): + # Get the bands necessary to compute the indice + bands = [image_channels.index(channel) + 1 for channel in indice.channels] + + read_lock = threading.Lock() + write_lock = threading.Lock() + + def process(window): + """Read input raster, compute indice and write output raster""" + with read_lock: + src_array = src.read(bands, window=window, masked=True) + src_array[src_array == src.nodata] = ma.masked + src_array = src_array.astype(dtype) + + # The computation can be performed concurrently + result = indice.algo(src_array).astype(dtype).filled(indice.nodata) + + # Update statistics + valid_pixels = result[result != indice.nodata] + if valid_pixels.size > 0: + band_stats[i]["min"] = min(band_stats[i]["min"], valid_pixels.min()) + band_stats[i]["max"] = max(band_stats[i]["max"], valid_pixels.max()) + band_stats[i]["sum"] += valid_pixels.sum() + band_stats[i]["total_pix"] += result.size + band_stats[i]["count"] += valid_pixels.size + + with write_lock: + dst.write_band(i, result, window=window) + + # compute using concurrent.futures.ThreadPoolExecutor and tqdm + for window in tqdm(windows, disable=disable, desc=f"{indice.name}"): + process(window) + + dst.set_band_description(i, indice.name) + + # Compute and set metadata tags + for i, stats in band_stats.items(): + # Compute and set metadata tags + mean = stats["sum"] / stats["count"] + sum_sq = (stats["sum"] - mean * stats["count"]) ** 2 + variance = sum_sq / stats["count"] + stddev = variance ** 0.5 if variance > 0 else 0 + + dst.update_tags(i, + STATISTICS_MINIMUM=f"{stats['min']:.14g}", + STATISTICS_MAXIMUM=f"{stats['max']:.14g}", + STATISTICS_MEAN=mean, + STATISTICS_STDDEV=stddev, + STATISTICS_VALID_PERCENT=(stats["count"] / stats["total_pix"] * 100))
+ +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/rastertools.html b/docs/_build/html/_modules/eolab/rastertools/rastertools.html new file mode 100644 index 00000000..9de204ed --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/rastertools.html @@ -0,0 +1,318 @@ + + + + + + + + eolab.rastertools.rastertools — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + + +
  • +
  • +
+
+
+
+
+ +

Source code for eolab.rastertools.rastertools

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+This module defines the base class for every Rastertool, namely :obj:`eolab.rastertools.Rastertool`.
+
+It also defines a specific Exception class that shall be raised when invalid rastertool's
+configuration parameters are setup.
+
+Finally, it defines additional decorator classes that factorize some rastertool configuration
+features. For example, the class :obj:`eolab.rastertools.Windowable` enables to configure a
+rastertool with windowable capabilities (i.e. capability to split the raster input file in small
+parts in order to distribute the processing over several cpus).
+"""
+from abc import ABC
+from typing import List
+import logging
+import sys
+
+from eolab.rastertools import utils
+
+_logger = logging.getLogger(__name__)
+
+
[docs]class RastertoolConfigurationException(Exception): + """This class defines an exception that is raised when the configuration of the raster tool + is invalid (wrong input parameter) + """ + pass
+ + +
[docs]class Rastertool(ABC): + """Base class for every raster tool which contains the common configuration: + + - the output dir where to store the results (by default, current dir) + - whether to save to disk the intermediate VRT images that can be created when + handling the input raster products (that can be an archive of several band files for + example). This parameter is mainly for debug purpose and is False by default. + """ + +
[docs] def __init__(self): + """Constructor + """ + self._outputdir = "." + self._keep_vrt = False
+ + @property + def outputdir(self) -> str: + """Path of the output directory where are stored the results""" + return self._outputdir + + @property + def keep_vrt(self) -> bool: + """Whether intermediate VRT images shall be kept""" + return self._keep_vrt + + @property + def vrt_dir(self) -> str: + """Dir where to store intermediate VRT images""" + return self.outputdir or "." if self.keep_vrt else None + +
[docs] def with_output(self, outputdir: str = "."): + """Set up the output. + + Args: + outputdir (str, optional, default="."): + Output dir where to store results. If none, it is set to current dir + + Returns: + :obj:`eolab.rastertools.Rastertool`: The current instance so that it is + possible to chain the with... calls (fluent API) + """ + if outputdir and not utils.is_dir(outputdir): + _logger.exception( + RastertoolConfigurationException(f"Output directory \"{str(outputdir)}\" does not exist.")) + sys.exit(2) + self._outputdir = outputdir + return self
+ +
[docs] def with_vrt_stored(self, keep_vrt: bool): + """Configure if the intermediate VRT images that are generated when handling + the input files (which can be complex raster product composed of several band files) + shall be stored to disk or not - for debug purpose for instance. + + Args: + keep_vrt (bool): + Whether intermediate VRT images shall be stored or not + + Returns: + :obj:`eolab.rastertools.Rastertool`: The current instance so that it is + possible to chain the with... calls (fluent API) + """ + self._keep_vrt = keep_vrt + return self
+ +
[docs] def process_files(self, inputfiles: List[str]): + """Run the rastertool to a set of input files. By default, this implementation + recursively calls "process_file" on each input file and then calls "postprocess_files". + + Note: + It is not meant to be overriden by subclasses. Prefer overriding process_file + and postproces_files instead. + + Args: + inputfiles ([str]): Input images to process + + Returns: + ([str]) The list of the generated files + """ + all_outputs = [] + for filename in inputfiles: + outputs = self.process_file(filename) + if outputs: + all_outputs.extend(outputs) + + # add a postprocessing call + outputs = self.postprocess_files(inputfiles, all_outputs) + + if outputs: + all_outputs.extend(outputs) + return all_outputs
+ +
[docs] def process_file(self, inputfile: str) -> List[str]: + """Run the rastertool to a single input file. + + Note: + This implementation does nothing. Override this method in the subclass + to achieve special processing of an inputfile. + + Args: + inputfile (str): + Input image to process + + Returns: + [str]: List of generated files (by default empty list) + """ + # nothing to do by default, just return input file as output + return list()
+ +
[docs] def postprocess_files(self, inputfiles: List[str], outputfiles: List[str]) -> List[str]: + """Run a postprocess when all input files have been processed. This step may consist + in transforming the outputs or mixing them to generate additional ones. + + Note: + This implementation does nothing. Override this method in the subclass + to achieve special processing that needs the whole list of inputfiles + and/or the output files generated when processing every single file (to mix + them for instance). + + Args: + inputfiles ([str]): Input images to process + outputfiles ([str]): List of generated files after executing the + rastertool on the input files + + Returns + [str]: Additional output files (by default empty list) + """ + # nothing to do by default + return list()
+ + +
[docs]class Windowable: + """Decorator of a :obj:`eolab.rastertools.Rastertool` that adds configuration + parameters to set the windowable capability of the tool: + + - the window size + - the mode for padding the window when at the edge of the image + """ + + @property + def window_size(self) -> int: + """Size of the windows to split the image in small parts""" + return self._window_size + + @property + def pad_mode(self) -> str: + """ + Mode used to `pad <https://numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image + The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty]. + """ + return self._pad_mode + +
[docs] def with_windows(self, window_size: int = 1024, pad_mode: str = "edge"): + """Configure the window generation for processing image + + Args: + window_size (int, optional, default=1024): + Size of windows for splitting the processed image in small parts + so that processing can be distributed on several cpus. + pad_mode (str, optional, default="edge"): + Mode for padding data around the windows that are on the edge of the image. + See https://numpy.org/doc/stable/reference/generated/numpy.pad.html + + Returns: + :obj:`eolab.rastertools.Rastertool`: The current instance so that it is + possible to chain the with... calls (fluent API) + """ + self._window_size = utils.to_tuple(window_size) + self._pad_mode = pad_mode + return self
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/speed.html b/docs/_build/html/_modules/eolab/rastertools/speed.html new file mode 100644 index 00000000..c490e76b --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/speed.html @@ -0,0 +1,324 @@ + + + + + + + + eolab.rastertools.speed — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.speed

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+This module defines a rastertool named speed that computes the time derivative (speed)
+of the radiometry of the input rasters.
+"""
+from datetime import datetime
+import logging.config
+import os
+from pathlib import Path
+import threading
+from typing import List
+
+import rasterio
+from tqdm.contrib.concurrent import thread_map
+
+from eolab.rastertools import utils
+from eolab.rastertools import Rastertool
+from eolab.rastertools.processing import algo
+from eolab.rastertools.product import RasterProduct
+
+
+_logger = logging.getLogger(__name__)
+
+
+
[docs]class Speed(Rastertool): + """Raster tool that computes the time derivative (speed) of raster images. + + For images of the same and known type, the tool extract the timestamp metadata + from the names of the images. It can then compute the time derivatives of every + bands. + """ + +
[docs] def __init__(self, bands: List[int] = [1]): + """ Constructor + + Args: + bands ([int], optional, default=[1]): + List of bands in the input image to process. + Set None if all bands shall be processed. + """ + super().__init__() + + self._bands = bands
+ + @property + def bands(self) -> List[int]: + """List of bands to process""" + return self._bands + +
[docs] def postprocess_files(self, inputfiles: List[str], outputfiles: List[str]) -> List[str]: + """Compute the temporal derivative of input files' radiometry + + Args: + inputfiles ([str]): Input images to process + outputfiles ([str]): List of generated files after executing the + rastertool on the input files individually + + Returns: + [str]: List of speed images that have been generated + """ + if len(inputfiles) < 2: + raise ValueError("Can not compute speed with 1 input image. Provide at least 2 images.") + + # STEP 1: Prepare the input images so that they can be processed + product_per_date = {} + same_type = True + common_rastertype = None + + for infile in inputfiles: + product = RasterProduct(infile, vrt_outputdir=self.vrt_dir) + if common_rastertype is None: + common_rastertype = product.rastertype + elif same_type and common_rastertype != product.rastertype: + raise ValueError("Speed can only be computed with images of the same type") + + product_per_date[product.get_date()] = (infile, product) + + # STEP 2: Compute speed + outdir = Path(self.outputdir) + outputs = [] + product0 = None + date0 = None + for i, date1 in enumerate(sorted(product_per_date.keys())): + infile, product1 = product_per_date[date1] + if i > 0: + # compute the speed + date0str = date0.strftime('%Y%m%d-%H%M%S') + date1str = date1.strftime('%Y%m%d-%H%M%S') + _logger.info(f"Compute speed between {date0str} and {date1str}") + speed_image = outdir.joinpath(f"{utils.get_basename(infile)}-speed-{date0str}.tif") + compute_speed(date0, date1, product0, product1, + speed_image.as_posix(), self.bands) + outputs.append(speed_image.as_posix()) + + product0 = product1 + date0 = date1 + + # free resources + for infile, product in product_per_date.values(): + product.free_in_memory_vrts() + + return outputs
+ + +
[docs]def compute_speed(date0: datetime, date1: datetime, + product0: RasterProduct, product1: RasterProduct, + speed_image: str, bands: List[int] = None): + """Compute the evolution of the raster band during a time interval + + Args: + date0 (:obj:`datetime.datetime`): + Date of the first dataset + date1 (:obj:`datetime.datetime`): + Date of the second dataset + product0 (:obj:`eolab.rastertools.product.RasterProduct`): + Path of the first raster image + product1 (:obj:`eolab.rastertools.product.RasterProduct`): + Path of the second raster image + speed_image (str): + Path of the output image + bands ([int], optional, default=None): + List of bands to process. None if all bands shall be processed + """ + with rasterio.Env(GDAL_VRT_ENABLE_PYTHON=True): + # compute time interval + interval = (date1 - date0).total_seconds() + + # open input images + with product0.open() as src0, product1.open() as src1: + if src1.count != src0.count: + raise ValueError(f"Number of bands in images {product0} and {product1}" + " are not the same") + if src1.width != src0.width or src1.height != src0.height: + raise ValueError(f"Images {product0} and {product1} have different sizes") + if src1.transform != src0.transform: + raise ValueError(f"Images {product0} and {product1} are not fully" + " geographically overlapping") + + profile = src0.profile + dtype = rasterio.float32 + nodata = src0.nodata + + # set block size + blockysize = 1024 if src0.width > 1024 else utils.highest_power_of_2(src0.width) + blockxsize = 1024 if src0.height > 1024 else utils.highest_power_of_2(src0.height) + + # check band index and handle all bands options (when bands is an empty list) + if bands is None or len(bands) == 0: + bands = src1.indexes + elif min(bands) < 1 or max(bands) > src1.count: + raise ValueError(f"Invalid bands, all values are not in range [1, {src1.count}]") + + profile.update(driver="GTiff", + blockxsize=blockysize, blockysize=blockxsize, tiled=True, + dtype=dtype, count=len(bands)) + + # Dictionary to store statistics for each band + stats = {"min": float('inf'), "max": float('-inf'), "sum": 0, "total_pix": 0, "count": 0} + + with rasterio.open(speed_image, "w", **profile) as dst: + # Materialize a list of destination block windows + windows = [window for ij, window in dst.block_windows()] + + read_lock = threading.Lock() + write_lock = threading.Lock() + + def process(window): + """Read input rasters, compute speed and write output raster""" + with read_lock: + data0 = src0.read(bands, window=window, masked=True).astype(dtype) + data1 = src1.read(bands, window=window, masked=True).astype(dtype) + + # The computation can be performed concurrently + result = algo.speed(data0, data1, interval).astype(dtype).filled(nodata) + + # Update statistics + valid_pixels = result[result != nodata] + if valid_pixels.size > 0: + stats["min"] = min(stats["min"], valid_pixels.min()) + stats["max"] = max(stats["max"], valid_pixels.max()) + stats["sum"] += valid_pixels.sum() + stats["total_pix"] += result.size + stats["count"] += valid_pixels.size + + with write_lock: + dst.write(result, window=window) + + disable = os.getenv("RASTERTOOLS_NOTQDM", 'False').lower() in ['true', '1'] + thread_map(process, windows, disable=disable, desc="speed") + + # Compute and set metadata tags + mean = stats["sum"] / stats["count"] + sum_sq = (stats["sum"] - mean * stats["count"])**2 + variance = sum_sq / stats["count"] + stddev = variance ** 0.5 if variance > 0 else 0 + + dst.update_tags(1, + STATISTICS_MINIMUM=f"{stats['min']:.14g}", + STATISTICS_MAXIMUM=f"{stats['max']:.14g}", + STATISTICS_MEAN=mean, + STATISTICS_STDDEV=stddev, + STATISTICS_VALID_PERCENT=(stats["count"] / stats["total_pix"] * 100), + STATISTICS_APPROXIMATE="YES")
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/svf.html b/docs/_build/html/_modules/eolab/rastertools/svf.html new file mode 100644 index 00000000..047a1920 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/svf.html @@ -0,0 +1,280 @@ + + + + + + + + eolab.rastertools.svf — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.svf

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+This module defines a rastertool named SVF (Sky View Factor) which computes the SVF
+of a Digital Height Model.
+"""
+import logging.config
+from pathlib import Path
+import numpy as np
+
+from eolab.rastertools import utils
+from eolab.rastertools import Rastertool, Windowable
+from eolab.rastertools.processing import algo
+from eolab.rastertools.processing import RasterProcessing, compute_sliding
+
+
+_logger = logging.getLogger(__name__)
+
+
+
[docs]class SVF(Rastertool, Windowable): + """Raster tool that computes the Sky View Factor (SVF) of a + Digital Elevation / Surface / Height Model. + + Kokalj, Žiga & all 2013: + + SVF is a geophysical parameter that measures the portion of the sky visible from a certain + point. The portion of the sky visible above the surface is especially relevant in energy balance + studies and computation of diffuse solar insolation. + + Sky-view factor is defined as the proportion of visible sky (:math:`\\Omega`) above a certain + observation point as seen from a two-dimensional representation. + + The light that falls from the sky onto a certain part of the surface is reduced by the obstacles + that form the horizon. These obstacles can be described in all directions by the vertical + elevation angle above the horizontal plane. + + A good SVF approximation can therefore be performed with the estimate of this angle + in several directions. After the vertical elevation angle is determined in the chosen + number of directions n, the SVF is determined as a sum of all portions of the sky within + each direction: :math:`\\sum \\frac {\\cos \\gamma_i}{n}`, where :math:`\\gamma_i` is the + vertical angle of the horizon in the`direction i. + + The angle :math:`\\gamma` is extracted from the Digital Model: + :math:`\\tan \\frac{Height}{Distance}`:: + + _____ + x| | ^ + x | | | Height (from Digital Model) + x __ | | | + ____p_______| |___| |__v____________ + <--------------> + Distance + + Where p is the current pixel where the SVF is computed. + + In a direction, the algorithm computes all angles and keeps the largest one. To avoid testing + too many points, the "radius" parameter defines the max distance of the pixel to test. + + The output image of SVF rastertool is a raster image with the SVF value computed at every pixels + of the input Digital Height Model. + """ + +
[docs] def __init__(self, nb_directions: int, radius: int, resolution: float): + """ Constructor + + Args: + nb_directions (int): + Number of directions to compute the SVF + radius (int): + Max distance from current point (in pixels) to consider + for evaluating the max elevation angle + resolution (float): + Resolution of the input Digital Height Model (in meter) + """ + super().__init__() + self.with_windows() + + self._radius = radius + self._nb_directions = nb_directions + self._resolution = resolution + self._altitude = None
+ + @property + def radius(self): + """Max distance from current point (in pixels) to consider + for evaluating the max elevation angle""" + return self._radius + + @property + def nb_directions(self): + """Number of directions to compute the SVF""" + return self._nb_directions + + @property + def resolution(self): + """Resolution of the input Digital Height Model (in meter)""" + return self._resolution + + @property + def altitude(self): + """The altitude at which SVF is computed. If None, the SVF is computed + at the altitude of the point.""" + return self._altitude + +
[docs] def with_altitude(self, altitude: float): + """Configure the altitude at which the Sky View Factor shall be computed. + If not set, the SVF is computed for each pixel at the pixel altitude. + + Args: + altitude (float): + Altitude at which SVF shall be computed + + Returns: + The current instance so that it is possible to chain the with... calls (fluent API) + """ + self._altitude = altitude
+ +
[docs] def process_file(self, inputfile: str): + """Compute SVF for the input file + + Args: + inputfile (str): + Input image to process + + Returns: + [str]: A list containing a single element: the generated Sky View Factor image. + """ + _logger.info(f"Processing file {inputfile}") + outdir = Path(self.outputdir) + output_image = outdir.joinpath(f"{utils.get_basename(inputfile)}-svf.tif") + + if self.radius >= min(self.window_size) / 2: + raise ValueError(f"The radius (option --radius, value={self.radius}) must be strictly " + "less than half the size of the window (option --window_size, " + f"value={min(self.window_size)})") + + # Configure the processing + svf = RasterProcessing("svf", algo=algo.svf, dtype=np.float32, per_band_algo=True) + svf.with_arguments({ + "radius": None, + "directions": None, + "resolution": None, + "altitude": None + }) + # set the configuration of the raster processing + svf.configure({ + "radius": self.radius, + "directions": self.nb_directions, + "resolution": self.resolution, + "altitude": self.altitude + }) + + # Run the SVF processing + compute_sliding( + inputfile, output_image, svf, + window_size=self.window_size, + window_overlap=self.radius, + pad_mode=self.pad_mode) + + return [output_image.as_posix()]
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/tiling.html b/docs/_build/html/_modules/eolab/rastertools/tiling.html new file mode 100644 index 00000000..7b39979e --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/tiling.html @@ -0,0 +1,355 @@ + + + + + + + + eolab.rastertools.tiling — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.tiling

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+This module defines a rastertool named Tiling that generates tiles a raster images based on
+a reference grid.
+"""
+import logging
+from typing import List
+from pathlib import Path
+
+import rasterio
+import rasterio.mask
+import geopandas as gpd
+import sys
+
+from eolab.rastertools import utils
+from eolab.rastertools import Rastertool, RastertoolConfigurationException
+from eolab.rastertools.processing import vector
+from eolab.rastertools.product import RasterProduct
+
+
+_logger = logging.getLogger(__name__)
+
+
+
[docs]class Tiling(Rastertool): + """Raster tool that tiles a raster following the geometries of a grid. + + The tool takes as input two files: a raster image and a grid file (shapefile, geojson ...). + The grid file defines the geometries of the tiles. + + Different options can be configured: + + - output dir: select the dir where tiles will be stored to disk + - output basename: naming rule of tiles. By default, the basename is the name of + the original file followed by "_tile" followed by the tile index. In the + formatted string, tile index is at position 1 and original filename is at + position 0. For instance, a naming rule such as "tile{1}.tif" will generate + the tile name "tile75.tif" for the tile id = 75. + - output subdir: naming rule for subdirs when every tile must be generated in a + different subdir. + + It is also possible to select the tiles to generate. The seleted tiles are the ones + which match the expected values of a given grid's property. + """ + +
[docs] def __init__(self, geometry_file: str): + """ Constructor + + Args: + geometry_file (str): + File name of the geometry file used to tile raster images + """ + super().__init__() + + self._grid = gpd.read_file(geometry_file) + self._output_basename = None + self._output_subdir = False
+ + @property + def grid(self): + """Get the grid that defines the geometries for tiling raster images""" + return self._grid + + @property + def output_basename(self) -> str: + """Base name for naming output""" + return self._output_basename + + @property + def output_subdir(self): + """Naming convention of the subdir where to store outputs. None if + no tiles shall not be generated in subdirs (but directly in the output dir)""" + return self._output_subdir + +
[docs] def with_output(self, outputdir: str = ".", output_basename: str = "{}_tile{}", + output_subdir: str = None): + """Set up the output. + + Args: + outputdir (str, optional, default="."): + Output dir where to store results. + output_basename (str, optional, default="{}_tile{}"): + Basename for the output file as a formatted string. By default, the + basename is the name of the original file followed by "_tile" followed + by the tile index. In the formatted string, tile index is at position 1 + and original filename is at position 0. For instance, tile{1}.tif will + generate the following name tile75.tif for the tile id = 75 + output_subdir (str, optional, default=None): + When each tile must be generated in a different subdir, output_subdir + defines the naming convention for the subdir. It is a formatted string + with one positional parameter corresponding to the tile index. + For instance, tile{} will generate the following subdir name: tile75/ + for the tile id = 75. If None, output files will be generated directly + in the outputdir. + + Returns: + :obj:`eolab.rastertools.Tiling`: The current instance so that it is + possible to chain the with... calls (fluent API) + """ + # Test if output repository is valid + super().with_output(outputdir) + self._output_basename = output_basename + self._output_subdir = output_subdir + return self
+ +
[docs] def with_id_column(self, id_column: str, ids: List[int]): + """Set up a filter on the geometries for which tiles shall be generated. + + Args: + id_column (str): + Name of the column in the vector file that contains the ids to filter. + ids: + List of ids values for which tiles shall be generated. + + Returns: + :obj:`eolab.rastertools.Tiling`: The current instance so that it is + possible to chain the with... calls (fluent API) + """ + + # Test if id_column is defined when ids are set + if id_column is not None: + if id_column not in self._grid.columns: + _logger.exception(RastertoolConfigurationException( + f"Invalid id column named \"{id_column}\": it does not exist in the grid")) + sys.exit(2) + self._grid = self._grid.set_index(id_column) + + if ids is not None: + if id_column is None: + _logger.exception(RastertoolConfigurationException( + "Ids cannot be specified when id_col is not defined")) + sys.exit(2) + + self._grid = self._grid[self._grid.index.isin(ids)] + if self._grid.empty: + # if no id common between grid and given ids + _logger.exception(RastertoolConfigurationException( + f"No value in the grid column \"{id_column}\" are matching " + f"the given list of ids {str(ids)}")) + sys.exit(2) + else: + invalid_ids = [i for i in ids if i not in self._grid.index] + if len(invalid_ids) > 0: + # log given ids which are not in the grid + _logger.error(f"The grid column \"{id_column}\" does not contain " + f"the following values: {str(invalid_ids)}") + return self
+ +
[docs] def process_file(self, inputfile: str): + """Tile the input file following the geometry file + + Args: + inputfile (str): + Input image to process + + Returns: + [str]: The list of generates tiles. + """ + _logger.info(f"Processing file {inputfile}") + + # STEP 1: Prepare the input image so that it can be processed + with RasterProduct(inputfile, vrt_outputdir=self.vrt_dir) as product: + + # STEP 2: Prepare grid (reproject it to raster's CRS) + grid = vector.reproject(self.grid, inputfile) + + # STEP 3: apply tiling + outputs = [] + with product.open() as dataset: + out_meta = dataset.meta + nodata = dataset.nodata + + # Crop and export every tiles + for shape, i in zip(grid.geometry, grid.index): + _logger.info("Crop and export tile " + str(i) + "...") + + # Dictionary to store statistics for each band + band_stats = {i: {"min": float('inf'), "max": float('-inf'), "mean": 0, "stddev": 0, "val_per": 0} + for i in range(1, dataset.meta["count"] + 1)} + + try: + # generate crop image + image, transform = rasterio.mask.mask(dataset, [shape], + crop=True, all_touched=True) + + # output location + output = Path(self.outputdir) + + if self.output_subdir is not None: # if we need to export in a subdirectory + output = output.joinpath(self.output_subdir.format(i)) + if not output.is_dir(): + output.mkdir() + + basename = utils.get_basename(inputfile) + output = output.joinpath(self.output_basename.format(basename, i) + ".tif") + + # export + out_meta.update({"height": image.shape[1], + "width": image.shape[2], + "transform": transform}) + + + with rasterio.open(output, 'w', **out_meta) as dst: + dst.write(image) + + for bd in range(1, dataset.meta["count"] + 1): + # Update statistics + valid_pixels = image[bd-1][image[bd-1] != nodata] + + + band_stats[bd]["min"] = valid_pixels.min() + band_stats[bd]["max"] = valid_pixels.max() + band_stats[bd]["mean"] = valid_pixels.sum() / valid_pixels.size + variance = (((valid_pixels - band_stats[bd]["mean"])**2).sum()) / valid_pixels.size + band_stats[bd]["stddev"] = variance ** 0.5 if variance > 0 else 0 + + val_per = valid_pixels.size / image[bd-1].size * 100 + if int(val_per) == 100 : + band_stats[bd]["val_per"] = int(val_per) + else: + band_stats[bd]["val_per"] = round(val_per,2) + + dst.update_tags(bd, + STATISTICS_MINIMUM=f"{band_stats[bd]['min']:.14g}", + STATISTICS_MAXIMUM=f"{band_stats[bd]['max']:.14g}", + STATISTICS_MEAN=f"{band_stats[bd]['mean']:.14g}", + STATISTICS_STDDEV=f"{band_stats[bd]['stddev']:.14g}", + STATISTICS_VALID_PERCENT= band_stats[bd]['val_per']) + + outputs.append(output.as_posix()) + _logger.info("Tile " + str(i) + " exported to " + str(output)) + except ValueError: # if no overlap + _logger.error("Input shape " + str(i) + " does not overlap raster") + + return outputs
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/timeseries.html b/docs/_build/html/_modules/eolab/rastertools/timeseries.html new file mode 100644 index 00000000..ad055788 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/timeseries.html @@ -0,0 +1,375 @@ + + + + + + + + eolab.rastertools.timeseries — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.timeseries

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+This module defines a rastertool named timeseries that generate a timeseries
+of rasters at different dates from a list of rasters that may contain gaps (due
+to clouds for instance). The timeseries is generated with a linear interpolation
+thus enabling to fill gaps.
+"""
+from datetime import datetime, timedelta
+from itertools import repeat
+import logging.config
+import multiprocessing
+import os
+from pathlib import Path
+from typing import Dict, List
+
+import numpy as np
+import rasterio
+from tqdm.contrib.concurrent import process_map
+
+from eolab.rastertools import utils
+from eolab.rastertools import Rastertool, Windowable
+from eolab.rastertools.processing import algo
+from eolab.rastertools.product import RasterProduct
+
+
+_logger = logging.getLogger(__name__)
+
+
+
[docs]class Timeseries(Rastertool, Windowable): + """Raster tool that generates the time series of raster images. The timeseries is + generated with a linear interpolation thus enabling to fill gaps. + """ + +
[docs] def __init__(self, start_date: datetime, end_date: datetime, period: int, + bands: List[int] = [1]): + """ Constructor + + Args: + start_date (datetime): + Start date of the timeseries to generate + end_date (datetime): + End date of the timeseries to generate + period (int): + Time period (in days) between two consecutive dates in the timeseries + bands ([int], optional, default=[1]): + List of bands in the input image to process. + Set None if all bands shall be processed. + """ + super().__init__() + self.with_windows() + + self._bands = bands + self._start_date = start_date + self._end_date = end_date + self._period = period
+ + @property + def start_date(self): + """Start date of the timeseries to generate""" + return self._start_date + + @property + def end_date(self): + """End date of the timeseries to generate""" + return self._end_date + + @property + def period(self): + """Period (in days) of the timeseries to generate""" + return self._period + + @property + def bands(self) -> List[int]: + """List of bands to process""" + return self._bands + +
[docs] def postprocess_files(self, inputfiles: List[str], outputfiles: List[str]) -> List[str]: + """Generates the timeseries from a list of inputfiles. + + Args: + inputfiles ([str]): Input images to process + outputfiles ([str]): List of generated files after executing the + rastertool on the input files individually + + Returns: + [str]: List of images that have been generated + """ + if len(inputfiles) < 2: + raise ValueError("Can not compute a timeseries with 1 input image. " + "Provide at least 2 images.") + + # STEP 1: Prepare the input images so that they can be processed + reftype = None + products_per_date = dict() + template_name = "" + for i, infile in enumerate(inputfiles): + product = RasterProduct(infile, vrt_outputdir=self.vrt_dir) + if reftype is None: + if product.rastertype is None: + raise ValueError(f"Unknown rastertype for input file {infile}") + else: + reftype = product.rastertype + elif product.rastertype != reftype: + raise ValueError("Timeseries can only be computed with images of the same type") + + d = product.get_date().replace(hour=0, minute=0, second=0, microsecond=0) + products_per_date[d.timestamp()] = product + + if i == 0: + template_name = utils.get_basename(infile).replace( + product.get_date_string(), "{}") + + # STEP 2: create the list of requested dates + dates = np.arange(self.start_date, + self.end_date, + timedelta(days=self.period)).astype(datetime) + # convert dates to timestamp + timestamps = np.array([d.timestamp() for d in dates]) + date_format = "%Y-%m-%d" + _logger.info("Compute timeseries at dates " + f"{[date.strftime(date_format) for date in dates]}") + + # STEP 3: Generate timeseries + # create the list of output files + outdir = Path(self.outputdir) + timeseries_images = [] + for date in dates: + img_name = f"{template_name.format(date.strftime(reftype.date_format))}-timeseries.tif" + timeseries_images.append(outdir.joinpath(img_name).as_posix()) + + # compute the timeseries + compute_timeseries(products_per_date, timestamps, timeseries_images, + self.bands, self.window_size) + + # free resources + for product in products_per_date.values(): + product.free_in_memory_vrts() + + return timeseries_images
+ + +
[docs]def compute_timeseries(products_per_date: Dict[float, RasterProduct], timeseries_dates: List[float], + timeseries_images: List[str], + bands: List[int] = None, window_size: tuple = (1024, 1024)): + """Generate the timeseries + + Args: + products_per_date (dict[float, :obj:`eolab.rastertools.product.RasterProduct`]): + List of input images indexed by their timestamp + timeseries_dates ([float]: + List of dates (timestamps) in the requested timeseries + timeseries_images ([str]): + Paths of the output images (one per requested date) + bands ([int], optional, default=None): + List of bands to process. None if all bands shall be processed + window_size (tuple(int, int), optional, default=(1024, 1024)): + Size of windows for splitting the process in small parts + """ + with rasterio.Env(GDAL_VRT_ENABLE_PYTHON=True): + + # open all input rasters + products_dates = sorted(products_per_date.keys()) + + for i, date in enumerate(products_dates): + product = products_per_date[date] + with product.open() as src: + # check if srcs have same size and are geographically overlapping + if i == 0: + refcount = src.count + refindexes = src.indexes + refwidth = src.width + refheight = src.height + reftransform = src.transform + refprofile = src.profile + descriptions = src.descriptions + else: + if src.count != refcount: + raise ValueError(f"All images have not the same number of bands") + if src.width != refwidth or src.height != refheight: + raise ValueError(f"All images have not the same size") + if src.transform != reftransform: + raise ValueError(f"All images are not fully" + " geographically overlapping") + + # set block size + blockxsize, blockysize = window_size + if refwidth < blockxsize: + blockxsize = utils.highest_power_of_2(refwidth) + if refheight < blockysize: + blockysize = utils.highest_power_of_2(refheight) + + # check band index and handle all bands options (when bands is an empty list) + if bands is None or len(bands) == 0: + bands = refindexes + elif min(bands) < 1 or max(bands) > refcount: + raise ValueError(f"Invalid bands, all values are not in range [1, {refcount}]") + + # update the profile to use for opening output files + refprofile.update(driver="GTiff", + blockxsize=blockysize, blockysize=blockxsize, tiled=True, + count=len(bands)) + dtype = refprofile.get("dtype") + nodata = refprofile.get("nodata") + + # create empty output files with correct metadata + for i, img in enumerate(timeseries_images): + with rasterio.open(img, mode="w", **refprofile) as dst: + if i == 0: + # with rasterio.open(timeseries_images[0], mode="w", **profile) as dst: + windows = [window for ij, window in dst.block_windows()] + for j, band in enumerate(bands, 1): + dst.set_band_description(j, descriptions[band - 1]) + + m = multiprocessing.Manager() + write_lock = m.Lock() + + kwargs = { + "total": len(windows), + "disable": os.getenv("RASTERTOOLS_NOTQDM", 'False').lower() in ['true', '1'] + } + max_workers = os.getenv("RASTERTOOLS_MAXWORKERS") + if max_workers is not None: + kwargs["max_workers"] = int(max_workers) + process_map(_interpolate, + repeat(products_dates), repeat(products_per_date), + repeat(timeseries_dates), repeat(timeseries_images), + windows, repeat(bands), + repeat(dtype), repeat(nodata), + repeat(write_lock), + **kwargs)
+ + +def _interpolate(products_dates, products_per_date, + timeseries_dates, timeseries_images, + window, bands, + dtype, nodata, + write_lock): + """Internal method that performs the interpolation for a specific window. + This method can be called safely by several processes thanks to the locks + that prevent from reading / writing files simultaneously. + """ + datas = list() + for date in products_dates: + product = products_per_date[date] + with product.open() as src: + data = src.read(bands, window=window, masked=True) + datas.append(data) + + output = algo.interpolated_timeseries(products_dates, datas, timeseries_dates, nodata) + + with write_lock: + for i, img in enumerate(timeseries_images): + with rasterio.open(img, mode="r+") as dst: + dst.write(output[i].astype(dtype), window=window) +
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/utils.html b/docs/_build/html/_modules/eolab/rastertools/utils.html new file mode 100644 index 00000000..1c3c885c --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/utils.html @@ -0,0 +1,235 @@ + + + + + + + + eolab.rastertools.utils — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.utils

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+This module defines several utility methods for:
+
+- handling path
+- transforming data
+- computing sliding windows
+- ...
+"""
+import math
+import tempfile
+from pathlib import Path
+
+import rasterio
+from osgeo import gdal
+
+
+
[docs]def to_tuple(val): + """Convert val as a tuple of two val""" + return val if type(val) == tuple else (val, val)
+ + +
[docs]def highest_power_of_2(n): + """Get the highest power of 2 that is less than n + """ + p = int(math.log(n, 2)) + return int(pow(2, p))
+ + +
[docs]def is_dir(file) -> bool: + """Check if file is a dir or not + """ + path = to_path(file) + return path.is_dir()
+ + +
[docs]def to_path(file, default=None) -> Path: + """Transform a file name to a Path + """ + path = None + if file: + path = Path(file) if isinstance(file, str) else file + else: + path = Path(default) if isinstance(default, str) else default + return path
+ + +
[docs]def get_basename(file) -> str: + """Get the basename of a Path + """ + path = to_path(file) + suffix = ''.join(path.suffixes).lower() + basename = path.name + if len(suffix) > 0: + basename = path.name[:-len(suffix)] + return basename
+ + +
[docs]def get_suffixes(file) -> str: + """Get the suffixes of a filename as a concatenated string + """ + return ''.join(to_path(file).suffixes).lower()
+ + +
[docs]def get_metadata_name(band: int, prefix: str, metadata: str): + """Get the metadata name for the statistics to generate""" + name = None + if prefix is None or prefix == "": + name = f"b{str(band)}.{metadata}" + else: + name = f"{prefix}.{metadata}" + return name
+ + +
[docs]def slices_1d(window_width, shift, stop, start=0): + """Yield 1 dimension sliding windows according to the given parameters + + Args: + window_width: window width + shift: shift to apply between two consecutive windows + stop: max value + start: min value (default 0) + + Returns: + min, max (int, int): start and end index of the sliding windows. + """ + nb_iter = math.ceil(1 + max(0, (stop - start - window_width) / shift)) + return ((start + i * shift, min(start + window_width + i * shift, stop)) + for i in range(nb_iter))
+ + +
[docs]def slices_2d(window_size, shift, stop, start=0): + """Yield 2 dimensions sliding windows according to the given parameters. + + Args: + window_size: window width and height + shift: shift to apply between two consecutive windows + stop: max value + start: min value (default 0) + + Returns: Firstly yield number of windows, then + window y_min, y_max, x_min, x_max for each windoww + """ + width, height = to_tuple(window_size) + shift_c, shift_r = to_tuple(shift) + start_c, start_r = to_tuple(start) + stop_c, stop_r = to_tuple(stop) + + window_c = list(slices_1d(width, shift_c, stop_c, start_c)) + window_r = list(slices_1d(height, shift_r, stop_r, start_r)) + + return ((r_min, r_max, c_min, c_max) + for r_min, r_max in window_r + for c_min, c_max in window_c)
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/eolab/rastertools/zonalstats.html b/docs/_build/html/_modules/eolab/rastertools/zonalstats.html new file mode 100644 index 00000000..bb600073 --- /dev/null +++ b/docs/_build/html/_modules/eolab/rastertools/zonalstats.html @@ -0,0 +1,738 @@ + + + + + + + + eolab.rastertools.zonalstats — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for eolab.rastertools.zonalstats

+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+This module defines a rastertool named zonalstats that compute several statistics
+(mean, median, std dev, etc) on one or several bands of a raster image. The statistics
+can be computed on the whole image or by zones defined by a vector file (e.g. shapefile,
+geojson).
+
+Several options are provided:
+
+* compute outliers: enable to generate an image that emphasizes the outliers pixels
+  (i.e. pixels with values greater that mean + n x stddev where n can be parametrized).
+* generate a chart: if several raster images are computed and if we can extract a date from the
+  filenames (because the raster is of a known type), generate one chart
+  per statistics (x=time, y=stats)
+
+"""
+from typing import List, Dict
+import datetime
+import logging.config
+from pathlib import Path
+import json
+import numpy as np
+import geopandas as gpd
+import sys
+
+import rasterio
+
+from eolab.rastertools import utils
+from eolab.rastertools import Rastertool, RastertoolConfigurationException
+from eolab.rastertools.processing import compute_zonal_stats, compute_zonal_stats_per_category
+from eolab.rastertools.processing import extract_zonal_outliers, plot_stats
+from eolab.rastertools.processing import vector
+from eolab.rastertools.product import RasterProduct
+
+
+_logger = logging.getLogger(__name__)
+
+
+
[docs]class Zonalstats(Rastertool): + """ + Raster tool that computes zonal statistics of a raster product. + """ + + supported_output_formats = { + 'ESRI Shapefile': 'shp', + 'GeoJSON': 'geojson', + 'CSV': 'csv', + 'GPKG': 'gpkg', + 'GML': 'gml' + } + """List of all possible output format are provided by fiona.supported_drivers.keys()""" + + valid_stats = ['count', 'valid', 'nodata', + 'min', 'max', 'mean', 'std', 'sum', 'median', "mad", 'range', + 'majority', 'minority', 'unique'] + """List of stats that can be computed. In addition to this list, "percentile_xx" is + also a valid stat where xx is the percentile value, e.g. percentile_70""" + +
[docs] def __init__(self, stats: List[str], categorical: bool = False, valid_threshold: float = 0.0, + area: bool = False, prefix: str = None, bands: List[int] = [1]): + """ Constructor + + Args: + stats ([str]): + List of stats to compute. Zonalstats.valid_stats defined the list of valid stats + except percentile which can be defined as string concatenating percentile\\_ with + the percentile value (from 0 to 100). + categorical (bool, optional, default=False): + If true and input raster is "categorical", add the counts of every unique + raster values to the stats + valid_threshold (float, optional, default=0.0): + Minimum percentage of valid pixels in a shape to compute its statistics ([0.0, 1.0]) + area (bool, optional, default=False): + If true, statistics are multiplied by the pixel area of the raster input + prefix (str, optional, default=None]): + Add a prefix to the stats keys, one prefix per band. The argument is a string + with all prefixes separated by a space. + bands ([int], optional, default=[1]): + List of bands in the input image to process. + Set None if all bands shall be processed. + """ + super().__init__() + + self._stats = stats + self._categorical = categorical + value = valid_threshold or 0.0 + if value < 0.0 or value > 1.0: + raise RastertoolConfigurationException( + f"Valid threshold must be in range [0.0, 1.0].") + if value > 1e-5 and "valid" not in stats: + raise RastertoolConfigurationException( + "Cannot apply a valid threshold when the computation " + "of the valid stat has not been requested.") + self._valid_threshold = value + self._area = area + self._prefix = prefix.split() if prefix else None + self.__check_stats() + + self._bands = bands + + self._output_format = "ESRI Shapefile" + + self._geometries = None + self._within = False + + self._sigma = None + + self._chart_file = None + self._geometry_index = 'ID' + self._display_chart = False + + self._category_file = None + self._category_file_type = None + self._category_index = None + self._category_labels = None + + self._generated_stats = list() + self._generated_stats_dates = list()
+ + @property + def generated_stats_per_date(self): + """After processing one or several files, this method enables to retrieve a dictionary + that contains the statistics for each inputfile's date: + + - keys are timestamps + - values are the statistics at the corresponding timestam + + Warning: + When the timestamp of the input raster cannot be retrieved, the dictionary does not + contain the generated statistics for this input raster. In this case, prefer calling + generated_stats to get the stats as a list (one item per input file). + """ + out = dict() + if len(self._generated_stats_dates) > 0: + out = {date: stats + for (date, stats) in zip(self.generated_stats_dates, self.generated_stats)} + return out + + @property + def generated_stats(self): + """The list of generated stats in the same order as the input files""" + return self._generated_stats + + @property + def generated_stats_dates(self): + """The list of dates when they can be extracted from the input files' names""" + return self._generated_stats_dates + + @property + def stats(self) -> List[str]: + """List of stats to compute""" + return self._stats + + @property + def categorical(self) -> bool: + """Whether to compute the counts of every unique pixel values""" + return self._categorical + + @property + def valid_threshold(self) -> float: + """Minimum percentage of valid pixels in a shape to compute its statistics""" + return self._valid_threshold + + @property + def area(self) -> bool: + """Whether to compute the statistics multiplied by the pixel area""" + return self._area + + @property + def prefix(self) -> str: + """Prefix of the features stats (one per band)""" + return self._prefix + + @property + def bands(self) -> List[int]: + """List of bands to process""" + return self._bands + + @property + def output_format(self) -> str: + """Output format for the features stats""" + return self._output_format + + @property + def geometries(self) -> str: + """The geometries where to compute zonal statistics""" + return self._geometries + + @property + def within(self) -> bool: + """Whether to compute stats for geometries within the raster (if False, stats for + all geometries intersecting the raster are computed)""" + return self._within + + @property + def sigma(self) -> float: + """Number of sigmas for identifying outliers""" + return self._sigma + + @property + def chart_file(self) -> str: + """Name of the chart file to generate""" + return self._chart_file + + @property + def geometry_index(self) -> str: + """The column name identifying the name of the geometry""" + return self._geometry_index + + @property + def display_chart(self) -> bool: + """Whether to display the chart""" + return self._display_chart + + @property + def category_file(self) -> str: + """Filename containing the categories when computing stats per + categories in the geometries""" + return self._category_file + + @property + def category_file_type(self) -> str: + """Type of the category file, either 'raster' or 'vector'""" + return self._category_file_type + + @property + def category_index(self) -> str: + """Column name identifying categories in categroy_file (only if file format + is geometries) + """ + return self._category_index + + @property + def category_labels(self) -> str: + """Dict with classes index as keys and names to display as values""" + return self._category_labels + + def __check_stats(self): + """Check that the requested stats are valid. + + Args: + stats_to_compute ([str]): + List of stats to compute + """ + for x in self._stats: + # check percentile format + if x.startswith("percentile_"): + q = float(x.replace("percentile_", '')) + # percentile must be in range [0, 100] + if q > 100.0: + raise RastertoolConfigurationException('percentiles must be <= 100') + if q < 0.0: + raise RastertoolConfigurationException('percentiles must be >= 0') + + elif x not in Zonalstats.valid_stats: + raise RastertoolConfigurationException( + f"Invalid stat {x}: must be " + f"percentile_xxx or one of {Zonalstats.valid_stats}") + +
[docs] def with_output(self, outputdir: str = ".", output_format: str = "ESRI Shapefile"): + """Set up the output. + + Args: + outputdir (str, optional, default="."): + Output dir where to store results. If none, results are not dumped to a file. + output_format (str, optional, default="ESRI Shapefile"): + Format of the output 'ESRI Shapefile', 'GeoJSON', 'CSV', 'GPKG', 'GML' + (see supported_output_formats). If None, it is set to ESRI Shapefile + + Returns: + :obj:`eolab.rastertools.Zonalstats`: the current instance so that it is + possible to chain the with... calls (fluent API) + """ + super().with_output(outputdir) + self._output_format = output_format or 'ESRI Shapefile' + # check if output_format exists + if self._output_format not in Zonalstats.supported_output_formats: + _logger.exception(RastertoolConfigurationException( + f"Unrecognized output format {output_format}. " + f"Possible values are {', '.join(Zonalstats.supported_output_formats)}")) + sys.exit(2) + return self
+ +
[docs] def with_geometries(self, geometries: str, within: bool = False): + """Set up the geometries where to compute stats. + + Args: + geometries (str): + Name of the file containing the geometries where to compute zonal stats. If not set, + stats are computed on the whole raster image + within (bool, optional, default=False): + Whether to compute stats only for geometries within the raster. If False, + statistics are computed for geometries that intersect the raster shape. + + Returns: + :obj:`eolab.rastertools.Zonalstats`: the current instance so that it is + possible to chain the with... calls (fluent API) + """ + self._geometries = geometries + self._within = within + return self
+ +
[docs] def with_outliers(self, sigma: float): + """Set up the computation of outliers + + Args: + sigma (float): + Distance to the mean value to consider a pixel as an outlier (expressed + in sigma, e.g. the value 2 means that pixels values greater than + mean value + 2 * std are outliers) + + Returns: + :obj:`eolab.rastertools.Zonalstats`: the current instance so that it is + possible to chain the with... calls (fluent API) + """ + # Manage sigma computation option that requires mean + std dev computation + if "mean" not in self._stats: + self._stats.append("mean") + if "std" not in self._stats: + self._stats.append("std") + self._sigma = sigma + return self
+ +
[docs] def with_chart(self, chart_file: str = None, geometry_index: str = 'ID', display: bool = False): + """Set up the charting capability + + Args: + chart_file (str, optional, default=None): + If not None, generate a chart with the statistics and saves it to str + geometry_index (str, optional, default='ID'): + Name of the index in the geometry file + display (bool, optional, default=False): + If true, display the chart with the statistics + + Returns: + :obj:`eolab.rastertools.Zonalstats`: the current instance so that it is + possible to chain the with... calls (fluent API) + """ + self._chart_file = chart_file + self._geometry_index = geometry_index + self._display_chart = display + return self
+ +
[docs] def with_per_category(self, category_file: str, category_index: str = 'Classe', + category_labels_json: str = None): + """Set up the zonal stats computation per categories + + Args: + category_file (str): + Name of the file containing the categories + category_index (str, optional, default='Classe'): + Name of column containing the category value (if category_file is a vector) + category_labels_json (str, optional, default=None): + Name of json file containing the dict that associates category values + to category names + + Returns: + :obj:`eolab.rastertools.Zonalstats`: the current instance so that it is + possible to chain the with... calls (fluent API) + """ + self._category_file = category_file + self._category_index = category_index + # get the category file type + if category_file: + suffix = utils.get_suffixes(category_file) + if suffix[1:] in Zonalstats.supported_output_formats.values(): + self._category_file_type = "vector" + else: + # not a vector, maybe a raster? try to open it with rasterio + try: + rasterio.open(category_file) + except IOError: + raise RastertoolConfigurationException( + f"File {category_file} cannot be read: check format and existence") + self._category_file_type = "raster" + # get the dict of category labels + if category_labels_json: + try: + with open(category_labels_json) as f: + self._category_labels = json.load(f) + except Exception as err: + raise RastertoolConfigurationException( + f"File {category_labels_json} does not contain a valid dict.") from err + + return self
+ +
[docs] def process_file(self, inputfile: str) -> List[str]: + """Compute the stats for a single input file + + Args: + inputfile (str): + Input image to process + + Returns: + [str]: List of generated statistical images (posix paths) that have been generated + """ + _logger.info(f"Processing file {inputfile}") + + # STEP 1: Prepare the input image so that it can be processed + _logger.info("Prepare the input for computation") + with RasterProduct(inputfile, vrt_outputdir=self.vrt_dir) as product: + + if product.rastertype is None and self.chart_file: + _logger.error("Unrecognized raster type of input file," + " cannot extract date for plotting") + + # open raster to get metadata + raster = product.get_raster() + + rst = rasterio.open(raster) + bound = int(rst.count) + indexes = rst.indexes + descr = rst.descriptions + + geotransform = rst.get_transform() + width = np.abs(geotransform[1]) + height = np.abs(geotransform[5]) + area_square_meter = width * height + rst.close() + + date_str = product.get_date_string('%Y%m%d-%H%M%S') + + # check band index and handle all bands options (when bands is None) + if self.bands is None or len(self.bands) == 0: + bands = indexes + else: + bands = self.bands + if min(bands) < 1 or max(bands) > bound: + raise ValueError(f"Invalid bands, all values are not in range [1, {bound}]") + + # check the prefix + if self.prefix and len(self.prefix) != len(bands): + raise ValueError("Number of prefix does not equal the number of bands.") + + # STEP 2: Prepare the geometries where to compute zonal stats + if self.geometries: + # reproject & filter input geometries to fit the raster extent + geometries = vector.reproject( + vector.filter(self.geometries, raster, self.within), raster) + else: + # if no geometry is defined, get the geometry from raster shape + geometries = vector.get_raster_shape(raster) + + # STEP 3: Compute the statistics + geom_stats = self.compute_stats(raster, bands, geometries, + descr, date_str, area_square_meter) + + self._generated_stats.append(geom_stats) + if date_str: + timestamp = datetime.datetime.strptime(date_str, '%Y%m%d-%H%M%S') + self._generated_stats_dates.append(timestamp) + + # STEP 4: Generate outputs + outputs = [] + if self.outputdir: + outdir = Path(self.outputdir) + ext = Zonalstats.supported_output_formats[self.output_format] + outputname = f"{utils.get_basename(inputfile)}-stats.{ext}" + outputfile = outdir.joinpath(outputname) + geom_stats.to_file(outputfile.as_posix(), driver=self.output_format) + outputs.append(outputfile.as_posix()) + + # if sigma is not None, generate the outliers image + if self.sigma: + _logger.info("Extract outliers") + outliersfile = outdir.joinpath( + f"{utils.get_basename(inputfile)}-stats-outliers.tif") + extract_zonal_outliers(geom_stats, raster, outliersfile.as_posix(), + prefix=self.prefix or [""] * len(bands), + bands=bands, sigma=self.sigma) + outputs.append(outliersfile.as_posix()) + + return outputs
+ +
[docs] def postprocess_files(self, inputfiles: List[str], outputfiles: List[str]) -> List[str]: + """Generate the chart if requested after computing stats for each input file + + Args: + inputfiles ([str]): Input images to process + outputfiles ([str]): List of generated files after executing the + rastertool on the input files + + Returns: + [str]: A list containing the chart file if requested + """ + additional_outputs = [] + if self.chart_file and len(self.generated_stats_per_date) > 0: + _logger.info("Generating chart") + plot_stats(self.chart_file, self.generated_stats_per_date, + self.stats, self.geometry_index, self.display_chart) + additional_outputs.append(self.chart_file) + + return additional_outputs
+ +
[docs] def compute_stats(self, raster: str, bands: List[int], + geometries: gpd.GeoDataFrame, + descr: List[str], date: str, + area_square_meter: int) -> List[List[Dict[str, float]]]: + """Compute the statistics of the input data. [Minimum, Maximum, Mean, Standard deviation] + + Args: + raster (str): + Input image to process + bands ([int]): + List of bands in the input image to process. Empty list means all bands + geometries (GeoDataFrame): + Geometries where to add statistics (geometries must be in the same + projection as the raster) + descr ([str]): + Band descriptions + date (str): + Timestamp of the input raster + area_square_meter (int): + Area represented by a pixel + + Returns: + list[list[dict]] + The dictionnary associates the name of the statistics to its value. + """ + _logger.info("Compute statistics") + # Compute zonal statistics + if self.category_file is not None: + # prepare the categories data + if self.category_file_type == "vector": + # clip categories to the raster bounds and reproject in the raster crs + class_geom = vector.reproject( + vector.clip(self.category_file, raster), + raster) + else: # filetype is raster + # vectorize the raster and reproject in the raster crs + class_geom = vector.reproject( + vector.vectorize(self.category_file, raster, self.category_index), + raster) + + # compute the statistics per category + statistics = compute_zonal_stats_per_category( + geometries, raster, + bands=bands, + stats=self.stats, + categories=class_geom, + category_index=self.category_index, + category_labels=self.category_labels) + else: + statistics = compute_zonal_stats( + geometries, raster, + bands=bands, + stats=self.stats, + categorical=self.categorical) + + # apply area + if self.area: + [d.update({key: area_square_meter * val}) + for s in statistics + for d in s for key, val in d.items() if not np.isnan(val)] + + # convert statistics to GeoDataFrame + geom_stats = self.__stats_to_geoms(statistics, geometries, bands, descr, date) + return geom_stats
+ + def __stats_to_geoms(self, statistics_data: List[List[Dict[str, float]]], + geometries: gpd.GeoDataFrame, + bands: List[int], descr: List[str], date: str) -> gpd.GeoDataFrame: + """Appends statistics to the geodataframe. + + Args: + statistics_data: + A list of list of dictionnaries. Dict associates the stat names and the stat values. + geometries (GeoDataFrame): + Geometries where to add statistics + bands ([int]): + List of bands in the input image to process. Empty list means all bands + descr ([str]): + Bands descriptions to add to global metadata + date (str): + Date of raster to add to global metadata + + Returns: + GeoDataFrame: The updated geometries with statistics saved in metadata of + the following form: b{band_number}.{metadata_name} where metadata_name is + successively the band name, the date and the statistics names (min, mean, max, median, std) + """ + prefix = self.prefix or [""] * len(bands) + for i, band in enumerate(bands): + # add general metadata to geometries + if descr and descr[i]: + geometries[utils.get_metadata_name(band, prefix[i], "name")] = descr[i] + if date: + geometries[utils.get_metadata_name(band, prefix[i], "date")] = date + + # get all statistics names since additional statistics coming from categorical + # option may have been computed + stats = self.stats.copy() + categorical_stats = set() + [categorical_stats.update(s[i].keys()) for s in statistics_data] + + if self.category_file is None: + # remove stats from the categorical stats + # and add the categorical stats to the stats + # remark: this operation seems strange but it ensures that stats are + # in the correct order + categorical_stats -= set(stats) + stats.extend(categorical_stats) + else: + # per_category mode do not compute overall stats. + # So stats is not exended but replaced + stats = categorical_stats + + for stat in stats: + cond = self.valid_threshold < 1e-5 or stat == "valid" + metadataname = utils.get_metadata_name(band, prefix[i], stat) + geometries[metadataname] = [ + s[i][stat] + if stat in s[i] and (cond or s[i]["valid"] > self.valid_threshold) else np.nan + for s in statistics_data + ] + + return geometries
+
+ +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/_modules/index.html b/docs/_build/html/_modules/index.html new file mode 100644 index 00000000..1899d2f1 --- /dev/null +++ b/docs/_build/html/_modules/index.html @@ -0,0 +1,143 @@ + + + + + + + + Overview: module code — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.__init__.rst.txt new file mode 100644 index 00000000..8004a542 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.__init__.rst.txt @@ -0,0 +1,6 @@ +Filtering.\_\_init\_\_ +====================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.adaptive_gaussian.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.adaptive_gaussian.rst.txt new file mode 100644 index 00000000..dc117974 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.adaptive_gaussian.rst.txt @@ -0,0 +1,6 @@ +Filtering.adaptive\_gaussian +============================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Filtering.adaptive_gaussian \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.bands.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.bands.rst.txt new file mode 100644 index 00000000..484c11f6 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.bands.rst.txt @@ -0,0 +1,6 @@ +Filtering.bands +=============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Filtering.bands \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.get_default_filters.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.get_default_filters.rst.txt new file mode 100644 index 00000000..8c0083d1 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.get_default_filters.rst.txt @@ -0,0 +1,6 @@ +Filtering.get\_default\_filters +=============================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.get_default_filters \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.keep_vrt.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.keep_vrt.rst.txt new file mode 100644 index 00000000..ddbe7d07 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.keep_vrt.rst.txt @@ -0,0 +1,6 @@ +Filtering.keep\_vrt +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Filtering.keep_vrt \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.local_mean.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.local_mean.rst.txt new file mode 100644 index 00000000..5f7eca0c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.local_mean.rst.txt @@ -0,0 +1,6 @@ +Filtering.local\_mean +===================== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Filtering.local_mean \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.local_sum.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.local_sum.rst.txt new file mode 100644 index 00000000..ba7caa70 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.local_sum.rst.txt @@ -0,0 +1,6 @@ +Filtering.local\_sum +==================== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Filtering.local_sum \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.median_filter.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.median_filter.rst.txt new file mode 100644 index 00000000..c17a54fd --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.median_filter.rst.txt @@ -0,0 +1,6 @@ +Filtering.median\_filter +======================== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Filtering.median_filter \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.outputdir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.outputdir.rst.txt new file mode 100644 index 00000000..173efaa7 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.outputdir.rst.txt @@ -0,0 +1,6 @@ +Filtering.outputdir +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Filtering.outputdir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.pad_mode.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.pad_mode.rst.txt new file mode 100644 index 00000000..b598ad53 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.pad_mode.rst.txt @@ -0,0 +1,6 @@ +Filtering.pad\_mode +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Filtering.pad_mode \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.postprocess_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.postprocess_files.rst.txt new file mode 100644 index 00000000..54890013 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.postprocess_files.rst.txt @@ -0,0 +1,6 @@ +Filtering.postprocess\_files +============================ + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.postprocess_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.process_file.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.process_file.rst.txt new file mode 100644 index 00000000..872b9788 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.process_file.rst.txt @@ -0,0 +1,6 @@ +Filtering.process\_file +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.process_file \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.process_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.process_files.rst.txt new file mode 100644 index 00000000..c9b80222 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.process_files.rst.txt @@ -0,0 +1,6 @@ +Filtering.process\_files +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.process_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.raster_filter.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.raster_filter.rst.txt new file mode 100644 index 00000000..5506b2ce --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.raster_filter.rst.txt @@ -0,0 +1,6 @@ +Filtering.raster\_filter +======================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Filtering.raster_filter \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.rst.txt new file mode 100644 index 00000000..0a72b826 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.rst.txt @@ -0,0 +1,65 @@ +Filtering +========= + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Filtering + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Filtering.adaptive_gaussian + + Filtering.bands + + Filtering.keep_vrt + + Filtering.local_mean + + Filtering.local_sum + + Filtering.median_filter + + Filtering.outputdir + + Filtering.pad_mode + + Filtering.raster_filter + + Filtering.vrt_dir + + Filtering.window_size + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Filtering.__init__ + + Filtering.get_default_filters + + Filtering.postprocess_files + + Filtering.process_file + + Filtering.process_files + + Filtering.with_filter_configuration + + Filtering.with_output + + Filtering.with_vrt_stored + + Filtering.with_windows + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.vrt_dir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.vrt_dir.rst.txt new file mode 100644 index 00000000..b67fadd0 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.vrt_dir.rst.txt @@ -0,0 +1,6 @@ +Filtering.vrt\_dir +================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Filtering.vrt_dir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.window_size.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.window_size.rst.txt new file mode 100644 index 00000000..47864d3d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.window_size.rst.txt @@ -0,0 +1,6 @@ +Filtering.window\_size +====================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Filtering.window_size \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_filter_configuration.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_filter_configuration.rst.txt new file mode 100644 index 00000000..b4baa870 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_filter_configuration.rst.txt @@ -0,0 +1,6 @@ +Filtering.with\_filter\_configuration +===================================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.with_filter_configuration \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_output.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_output.rst.txt new file mode 100644 index 00000000..84cdb3cf --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_output.rst.txt @@ -0,0 +1,6 @@ +Filtering.with\_output +====================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.with_output \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_vrt_stored.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_vrt_stored.rst.txt new file mode 100644 index 00000000..42a5078a --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_vrt_stored.rst.txt @@ -0,0 +1,6 @@ +Filtering.with\_vrt\_stored +=========================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.with_vrt_stored \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_windows.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_windows.rst.txt new file mode 100644 index 00000000..4c9324b6 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_windows.rst.txt @@ -0,0 +1,6 @@ +Filtering.with\_windows +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.with_windows \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.__init__.rst.txt new file mode 100644 index 00000000..c66a1e2c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.__init__.rst.txt @@ -0,0 +1,6 @@ +Hillshade.\_\_init\_\_ +====================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Hillshade.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.azimuth.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.azimuth.rst.txt new file mode 100644 index 00000000..7722c2cb --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.azimuth.rst.txt @@ -0,0 +1,6 @@ +Hillshade.azimuth +================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.azimuth \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.elevation.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.elevation.rst.txt new file mode 100644 index 00000000..a16b069d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.elevation.rst.txt @@ -0,0 +1,6 @@ +Hillshade.elevation +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.elevation \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.keep_vrt.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.keep_vrt.rst.txt new file mode 100644 index 00000000..8aeb063f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.keep_vrt.rst.txt @@ -0,0 +1,6 @@ +Hillshade.keep\_vrt +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.keep_vrt \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.outputdir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.outputdir.rst.txt new file mode 100644 index 00000000..85b06b66 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.outputdir.rst.txt @@ -0,0 +1,6 @@ +Hillshade.outputdir +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.outputdir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.pad_mode.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.pad_mode.rst.txt new file mode 100644 index 00000000..f2935825 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.pad_mode.rst.txt @@ -0,0 +1,6 @@ +Hillshade.pad\_mode +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.pad_mode \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.postprocess_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.postprocess_files.rst.txt new file mode 100644 index 00000000..efad9ece --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.postprocess_files.rst.txt @@ -0,0 +1,6 @@ +Hillshade.postprocess\_files +============================ + +.. currentmodule:: eolab.rastertools + +.. automethod:: Hillshade.postprocess_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.process_file.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.process_file.rst.txt new file mode 100644 index 00000000..52595e94 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.process_file.rst.txt @@ -0,0 +1,6 @@ +Hillshade.process\_file +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Hillshade.process_file \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.process_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.process_files.rst.txt new file mode 100644 index 00000000..5292b0b8 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.process_files.rst.txt @@ -0,0 +1,6 @@ +Hillshade.process\_files +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Hillshade.process_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.radius.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.radius.rst.txt new file mode 100644 index 00000000..ecf0c4ca --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.radius.rst.txt @@ -0,0 +1,6 @@ +Hillshade.radius +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.radius \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.resolution.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.resolution.rst.txt new file mode 100644 index 00000000..655b26c4 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.resolution.rst.txt @@ -0,0 +1,6 @@ +Hillshade.resolution +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.resolution \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.rst.txt new file mode 100644 index 00000000..4d9840e4 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.rst.txt @@ -0,0 +1,57 @@ +Hillshade +========= + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Hillshade + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Hillshade.azimuth + + Hillshade.elevation + + Hillshade.keep_vrt + + Hillshade.outputdir + + Hillshade.pad_mode + + Hillshade.radius + + Hillshade.resolution + + Hillshade.vrt_dir + + Hillshade.window_size + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Hillshade.__init__ + + Hillshade.postprocess_files + + Hillshade.process_file + + Hillshade.process_files + + Hillshade.with_output + + Hillshade.with_vrt_stored + + Hillshade.with_windows + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.vrt_dir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.vrt_dir.rst.txt new file mode 100644 index 00000000..d015a36e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.vrt_dir.rst.txt @@ -0,0 +1,6 @@ +Hillshade.vrt\_dir +================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.vrt_dir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.window_size.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.window_size.rst.txt new file mode 100644 index 00000000..a25efced --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.window_size.rst.txt @@ -0,0 +1,6 @@ +Hillshade.window\_size +====================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.window_size \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.with_output.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.with_output.rst.txt new file mode 100644 index 00000000..c0112596 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.with_output.rst.txt @@ -0,0 +1,6 @@ +Hillshade.with\_output +====================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Hillshade.with_output \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.with_vrt_stored.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.with_vrt_stored.rst.txt new file mode 100644 index 00000000..47142268 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.with_vrt_stored.rst.txt @@ -0,0 +1,6 @@ +Hillshade.with\_vrt\_stored +=========================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Hillshade.with_vrt_stored \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.with_windows.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.with_windows.rst.txt new file mode 100644 index 00000000..386874fd --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Hillshade.with_windows.rst.txt @@ -0,0 +1,6 @@ +Hillshade.with\_windows +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Hillshade.with_windows \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.__init__.rst.txt new file mode 100644 index 00000000..b6430d7b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.__init__.rst.txt @@ -0,0 +1,6 @@ +Radioindice.\_\_init\_\_ +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.bi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.bi.rst.txt new file mode 100644 index 00000000..17167651 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.bi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.bi +============== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.bi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.bi2.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.bi2.rst.txt new file mode 100644 index 00000000..a584b83f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.bi2.rst.txt @@ -0,0 +1,6 @@ +Radioindice.bi2 +=============== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.bi2 \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.evi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.evi.rst.txt new file mode 100644 index 00000000..271fe459 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.evi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.evi +=============== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.evi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.get_default_indices.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.get_default_indices.rst.txt new file mode 100644 index 00000000..1fe2e2c7 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.get_default_indices.rst.txt @@ -0,0 +1,6 @@ +Radioindice.get\_default\_indices +================================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.get_default_indices \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.indices.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.indices.rst.txt new file mode 100644 index 00000000..d4b33526 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.indices.rst.txt @@ -0,0 +1,6 @@ +Radioindice.indices +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.indices \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ipvi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ipvi.rst.txt new file mode 100644 index 00000000..0fa6f7d8 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ipvi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.ipvi +================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ipvi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.keep_vrt.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.keep_vrt.rst.txt new file mode 100644 index 00000000..0bfa3e79 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.keep_vrt.rst.txt @@ -0,0 +1,6 @@ +Radioindice.keep\_vrt +===================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.keep_vrt \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.merge.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.merge.rst.txt new file mode 100644 index 00000000..0b75863c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.merge.rst.txt @@ -0,0 +1,6 @@ +Radioindice.merge +================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.merge \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.mndwi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.mndwi.rst.txt new file mode 100644 index 00000000..9d26bae5 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.mndwi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.mndwi +================= + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.mndwi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.msavi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.msavi.rst.txt new file mode 100644 index 00000000..079154d3 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.msavi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.msavi +================= + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.msavi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.msavi2.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.msavi2.rst.txt new file mode 100644 index 00000000..e0fe03bb --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.msavi2.rst.txt @@ -0,0 +1,6 @@ +Radioindice.msavi2 +================== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.msavi2 \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndbi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndbi.rst.txt new file mode 100644 index 00000000..bc946113 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndbi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.ndbi +================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ndbi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndpi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndpi.rst.txt new file mode 100644 index 00000000..961afa94 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndpi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.ndpi +================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ndpi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndti.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndti.rst.txt new file mode 100644 index 00000000..4da67d2c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndti.rst.txt @@ -0,0 +1,6 @@ +Radioindice.ndti +================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ndti \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndvi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndvi.rst.txt new file mode 100644 index 00000000..e1f92046 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndvi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.ndvi +================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ndvi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndwi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndwi.rst.txt new file mode 100644 index 00000000..a2271789 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndwi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.ndwi +================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ndwi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndwi2.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndwi2.rst.txt new file mode 100644 index 00000000..9acd065a --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndwi2.rst.txt @@ -0,0 +1,6 @@ +Radioindice.ndwi2 +================= + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ndwi2 \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.outputdir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.outputdir.rst.txt new file mode 100644 index 00000000..e9e37e82 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.outputdir.rst.txt @@ -0,0 +1,6 @@ +Radioindice.outputdir +===================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.outputdir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.pad_mode.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.pad_mode.rst.txt new file mode 100644 index 00000000..1f12d219 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.pad_mode.rst.txt @@ -0,0 +1,6 @@ +Radioindice.pad\_mode +===================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.pad_mode \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.postprocess_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.postprocess_files.rst.txt new file mode 100644 index 00000000..cf18a586 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.postprocess_files.rst.txt @@ -0,0 +1,6 @@ +Radioindice.postprocess\_files +============================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.postprocess_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.process_file.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.process_file.rst.txt new file mode 100644 index 00000000..77767e51 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.process_file.rst.txt @@ -0,0 +1,6 @@ +Radioindice.process\_file +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.process_file \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.process_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.process_files.rst.txt new file mode 100644 index 00000000..65223d23 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.process_files.rst.txt @@ -0,0 +1,6 @@ +Radioindice.process\_files +========================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.process_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.pvi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.pvi.rst.txt new file mode 100644 index 00000000..1cb859cc --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.pvi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.pvi +=============== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.pvi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ri.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ri.rst.txt new file mode 100644 index 00000000..b543d8fd --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ri.rst.txt @@ -0,0 +1,6 @@ +Radioindice.ri +============== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ri \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.roi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.roi.rst.txt new file mode 100644 index 00000000..153596f2 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.roi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.roi +=============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.roi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.rst.txt new file mode 100644 index 00000000..db22050b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.rst.txt @@ -0,0 +1,97 @@ +Radioindice +=========== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Radioindice + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Radioindice.bi + + Radioindice.bi2 + + Radioindice.evi + + Radioindice.indices + + Radioindice.ipvi + + Radioindice.keep_vrt + + Radioindice.merge + + Radioindice.mndwi + + Radioindice.msavi + + Radioindice.msavi2 + + Radioindice.ndbi + + Radioindice.ndpi + + Radioindice.ndti + + Radioindice.ndvi + + Radioindice.ndwi + + Radioindice.ndwi2 + + Radioindice.outputdir + + Radioindice.pad_mode + + Radioindice.pvi + + Radioindice.ri + + Radioindice.roi + + Radioindice.rvi + + Radioindice.savi + + Radioindice.tndvi + + Radioindice.tsavi + + Radioindice.vrt_dir + + Radioindice.window_size + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Radioindice.__init__ + + Radioindice.get_default_indices + + Radioindice.postprocess_files + + Radioindice.process_file + + Radioindice.process_files + + Radioindice.with_output + + Radioindice.with_roi + + Radioindice.with_vrt_stored + + Radioindice.with_windows + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.rvi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.rvi.rst.txt new file mode 100644 index 00000000..e7b94d1b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.rvi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.rvi +=============== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.rvi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.savi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.savi.rst.txt new file mode 100644 index 00000000..ba1796ef --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.savi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.savi +================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.savi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.tndvi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.tndvi.rst.txt new file mode 100644 index 00000000..96bcac56 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.tndvi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.tndvi +================= + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.tndvi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.tsavi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.tsavi.rst.txt new file mode 100644 index 00000000..e18727e0 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.tsavi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.tsavi +================= + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.tsavi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.vrt_dir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.vrt_dir.rst.txt new file mode 100644 index 00000000..40f3d1d2 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.vrt_dir.rst.txt @@ -0,0 +1,6 @@ +Radioindice.vrt\_dir +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.vrt_dir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.window_size.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.window_size.rst.txt new file mode 100644 index 00000000..88069182 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.window_size.rst.txt @@ -0,0 +1,6 @@ +Radioindice.window\_size +======================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.window_size \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_output.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_output.rst.txt new file mode 100644 index 00000000..98d7e5af --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_output.rst.txt @@ -0,0 +1,6 @@ +Radioindice.with\_output +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.with_output \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_roi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_roi.rst.txt new file mode 100644 index 00000000..531d468f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_roi.rst.txt @@ -0,0 +1,6 @@ +Radioindice.with\_roi +===================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.with_roi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_vrt_stored.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_vrt_stored.rst.txt new file mode 100644 index 00000000..cd6ab654 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_vrt_stored.rst.txt @@ -0,0 +1,6 @@ +Radioindice.with\_vrt\_stored +============================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.with_vrt_stored \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_windows.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_windows.rst.txt new file mode 100644 index 00000000..ec7071ab --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_windows.rst.txt @@ -0,0 +1,6 @@ +Radioindice.with\_windows +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.with_windows \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.__init__.rst.txt new file mode 100644 index 00000000..acf685ac --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.__init__.rst.txt @@ -0,0 +1,6 @@ +Rastertool.\_\_init\_\_ +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Rastertool.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.keep_vrt.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.keep_vrt.rst.txt new file mode 100644 index 00000000..1a09990f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.keep_vrt.rst.txt @@ -0,0 +1,6 @@ +Rastertool.keep\_vrt +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Rastertool.keep_vrt \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.outputdir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.outputdir.rst.txt new file mode 100644 index 00000000..045ee3ac --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.outputdir.rst.txt @@ -0,0 +1,6 @@ +Rastertool.outputdir +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Rastertool.outputdir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.postprocess_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.postprocess_files.rst.txt new file mode 100644 index 00000000..8d882328 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.postprocess_files.rst.txt @@ -0,0 +1,6 @@ +Rastertool.postprocess\_files +============================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Rastertool.postprocess_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.process_file.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.process_file.rst.txt new file mode 100644 index 00000000..5cdd6ab7 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.process_file.rst.txt @@ -0,0 +1,6 @@ +Rastertool.process\_file +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Rastertool.process_file \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.process_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.process_files.rst.txt new file mode 100644 index 00000000..67a0841e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.process_files.rst.txt @@ -0,0 +1,6 @@ +Rastertool.process\_files +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Rastertool.process_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.rst.txt new file mode 100644 index 00000000..b193f70b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.rst.txt @@ -0,0 +1,43 @@ +Rastertool +========== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Rastertool + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Rastertool.keep_vrt + + Rastertool.outputdir + + Rastertool.vrt_dir + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Rastertool.__init__ + + Rastertool.postprocess_files + + Rastertool.process_file + + Rastertool.process_files + + Rastertool.with_output + + Rastertool.with_vrt_stored + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.vrt_dir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.vrt_dir.rst.txt new file mode 100644 index 00000000..39f3d0e9 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.vrt_dir.rst.txt @@ -0,0 +1,6 @@ +Rastertool.vrt\_dir +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Rastertool.vrt_dir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.with_output.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.with_output.rst.txt new file mode 100644 index 00000000..94bacabb --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.with_output.rst.txt @@ -0,0 +1,6 @@ +Rastertool.with\_output +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Rastertool.with_output \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.with_vrt_stored.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.with_vrt_stored.rst.txt new file mode 100644 index 00000000..1ba3357f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Rastertool.with_vrt_stored.rst.txt @@ -0,0 +1,6 @@ +Rastertool.with\_vrt\_stored +============================ + +.. currentmodule:: eolab.rastertools + +.. automethod:: Rastertool.with_vrt_stored \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.RastertoolConfigurationException.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.RastertoolConfigurationException.rst.txt new file mode 100644 index 00000000..83ad4b98 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.RastertoolConfigurationException.rst.txt @@ -0,0 +1,6 @@ +RastertoolConfigurationException +================================ + +.. currentmodule:: eolab.rastertools + +.. autoexception:: RastertoolConfigurationException \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.__init__.rst.txt new file mode 100644 index 00000000..3bd98f5b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.__init__.rst.txt @@ -0,0 +1,6 @@ +SVF.\_\_init\_\_ +================ + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.altitude.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.altitude.rst.txt new file mode 100644 index 00000000..fda5a518 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.altitude.rst.txt @@ -0,0 +1,6 @@ +SVF.altitude +============ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.altitude \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.keep_vrt.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.keep_vrt.rst.txt new file mode 100644 index 00000000..808603d8 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.keep_vrt.rst.txt @@ -0,0 +1,6 @@ +SVF.keep\_vrt +============= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.keep_vrt \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.nb_directions.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.nb_directions.rst.txt new file mode 100644 index 00000000..b9f04065 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.nb_directions.rst.txt @@ -0,0 +1,6 @@ +SVF.nb\_directions +================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.nb_directions \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.outputdir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.outputdir.rst.txt new file mode 100644 index 00000000..7e077686 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.outputdir.rst.txt @@ -0,0 +1,6 @@ +SVF.outputdir +============= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.outputdir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.pad_mode.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.pad_mode.rst.txt new file mode 100644 index 00000000..29a4c499 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.pad_mode.rst.txt @@ -0,0 +1,6 @@ +SVF.pad\_mode +============= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.pad_mode \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.postprocess_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.postprocess_files.rst.txt new file mode 100644 index 00000000..bbb9edef --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.postprocess_files.rst.txt @@ -0,0 +1,6 @@ +SVF.postprocess\_files +====================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.postprocess_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.process_file.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.process_file.rst.txt new file mode 100644 index 00000000..bce3be38 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.process_file.rst.txt @@ -0,0 +1,6 @@ +SVF.process\_file +================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.process_file \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.process_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.process_files.rst.txt new file mode 100644 index 00000000..3cba5118 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.process_files.rst.txt @@ -0,0 +1,6 @@ +SVF.process\_files +================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.process_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.radius.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.radius.rst.txt new file mode 100644 index 00000000..95697d5b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.radius.rst.txt @@ -0,0 +1,6 @@ +SVF.radius +========== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.radius \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.resolution.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.resolution.rst.txt new file mode 100644 index 00000000..60a1b6ee --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.resolution.rst.txt @@ -0,0 +1,6 @@ +SVF.resolution +============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.resolution \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.rst.txt new file mode 100644 index 00000000..908f1b22 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.rst.txt @@ -0,0 +1,59 @@ +SVF +=== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: SVF + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + SVF.altitude + + SVF.keep_vrt + + SVF.nb_directions + + SVF.outputdir + + SVF.pad_mode + + SVF.radius + + SVF.resolution + + SVF.vrt_dir + + SVF.window_size + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + SVF.__init__ + + SVF.postprocess_files + + SVF.process_file + + SVF.process_files + + SVF.with_altitude + + SVF.with_output + + SVF.with_vrt_stored + + SVF.with_windows + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.vrt_dir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.vrt_dir.rst.txt new file mode 100644 index 00000000..95526113 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.vrt_dir.rst.txt @@ -0,0 +1,6 @@ +SVF.vrt\_dir +============ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.vrt_dir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.window_size.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.window_size.rst.txt new file mode 100644 index 00000000..13c9b8d5 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.window_size.rst.txt @@ -0,0 +1,6 @@ +SVF.window\_size +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.window_size \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.with_altitude.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.with_altitude.rst.txt new file mode 100644 index 00000000..2206d06b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.with_altitude.rst.txt @@ -0,0 +1,6 @@ +SVF.with\_altitude +================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.with_altitude \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.with_output.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.with_output.rst.txt new file mode 100644 index 00000000..7152a825 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.with_output.rst.txt @@ -0,0 +1,6 @@ +SVF.with\_output +================ + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.with_output \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.with_vrt_stored.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.with_vrt_stored.rst.txt new file mode 100644 index 00000000..174ab5a8 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.with_vrt_stored.rst.txt @@ -0,0 +1,6 @@ +SVF.with\_vrt\_stored +===================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.with_vrt_stored \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.SVF.with_windows.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.SVF.with_windows.rst.txt new file mode 100644 index 00000000..8dce108f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.SVF.with_windows.rst.txt @@ -0,0 +1,6 @@ +SVF.with\_windows +================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.with_windows \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Speed.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Speed.__init__.rst.txt new file mode 100644 index 00000000..809449f2 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Speed.__init__.rst.txt @@ -0,0 +1,6 @@ +Speed.\_\_init\_\_ +================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Speed.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Speed.bands.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Speed.bands.rst.txt new file mode 100644 index 00000000..fd06b6ae --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Speed.bands.rst.txt @@ -0,0 +1,6 @@ +Speed.bands +=========== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Speed.bands \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Speed.keep_vrt.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Speed.keep_vrt.rst.txt new file mode 100644 index 00000000..d8369a35 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Speed.keep_vrt.rst.txt @@ -0,0 +1,6 @@ +Speed.keep\_vrt +=============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Speed.keep_vrt \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Speed.outputdir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Speed.outputdir.rst.txt new file mode 100644 index 00000000..fdb1a0c6 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Speed.outputdir.rst.txt @@ -0,0 +1,6 @@ +Speed.outputdir +=============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Speed.outputdir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Speed.postprocess_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Speed.postprocess_files.rst.txt new file mode 100644 index 00000000..c2a12c57 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Speed.postprocess_files.rst.txt @@ -0,0 +1,6 @@ +Speed.postprocess\_files +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Speed.postprocess_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Speed.process_file.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Speed.process_file.rst.txt new file mode 100644 index 00000000..84dff10e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Speed.process_file.rst.txt @@ -0,0 +1,6 @@ +Speed.process\_file +=================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Speed.process_file \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Speed.process_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Speed.process_files.rst.txt new file mode 100644 index 00000000..b870a470 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Speed.process_files.rst.txt @@ -0,0 +1,6 @@ +Speed.process\_files +==================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Speed.process_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Speed.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Speed.rst.txt new file mode 100644 index 00000000..a331a56f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Speed.rst.txt @@ -0,0 +1,45 @@ +Speed +===== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Speed + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Speed.bands + + Speed.keep_vrt + + Speed.outputdir + + Speed.vrt_dir + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Speed.__init__ + + Speed.postprocess_files + + Speed.process_file + + Speed.process_files + + Speed.with_output + + Speed.with_vrt_stored + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Speed.vrt_dir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Speed.vrt_dir.rst.txt new file mode 100644 index 00000000..47caca75 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Speed.vrt_dir.rst.txt @@ -0,0 +1,6 @@ +Speed.vrt\_dir +============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Speed.vrt_dir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Speed.with_output.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Speed.with_output.rst.txt new file mode 100644 index 00000000..c175bd2d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Speed.with_output.rst.txt @@ -0,0 +1,6 @@ +Speed.with\_output +================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Speed.with_output \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Speed.with_vrt_stored.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Speed.with_vrt_stored.rst.txt new file mode 100644 index 00000000..4f5478d6 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Speed.with_vrt_stored.rst.txt @@ -0,0 +1,6 @@ +Speed.with\_vrt\_stored +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Speed.with_vrt_stored \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Tiling.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.__init__.rst.txt new file mode 100644 index 00000000..03148fce --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.__init__.rst.txt @@ -0,0 +1,6 @@ +Tiling.\_\_init\_\_ +=================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Tiling.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Tiling.grid.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.grid.rst.txt new file mode 100644 index 00000000..c8787df4 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.grid.rst.txt @@ -0,0 +1,6 @@ +Tiling.grid +=========== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Tiling.grid \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Tiling.keep_vrt.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.keep_vrt.rst.txt new file mode 100644 index 00000000..9c526aae --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.keep_vrt.rst.txt @@ -0,0 +1,6 @@ +Tiling.keep\_vrt +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Tiling.keep_vrt \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Tiling.output_basename.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.output_basename.rst.txt new file mode 100644 index 00000000..aa3d011b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.output_basename.rst.txt @@ -0,0 +1,6 @@ +Tiling.output\_basename +======================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Tiling.output_basename \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Tiling.output_subdir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.output_subdir.rst.txt new file mode 100644 index 00000000..0e5c0376 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.output_subdir.rst.txt @@ -0,0 +1,6 @@ +Tiling.output\_subdir +===================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Tiling.output_subdir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Tiling.outputdir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.outputdir.rst.txt new file mode 100644 index 00000000..fe7f6e31 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.outputdir.rst.txt @@ -0,0 +1,6 @@ +Tiling.outputdir +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Tiling.outputdir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Tiling.postprocess_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.postprocess_files.rst.txt new file mode 100644 index 00000000..773060e3 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.postprocess_files.rst.txt @@ -0,0 +1,6 @@ +Tiling.postprocess\_files +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Tiling.postprocess_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Tiling.process_file.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.process_file.rst.txt new file mode 100644 index 00000000..1a5bcf30 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.process_file.rst.txt @@ -0,0 +1,6 @@ +Tiling.process\_file +==================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Tiling.process_file \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Tiling.process_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.process_files.rst.txt new file mode 100644 index 00000000..cdb717e9 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.process_files.rst.txt @@ -0,0 +1,6 @@ +Tiling.process\_files +===================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Tiling.process_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Tiling.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.rst.txt new file mode 100644 index 00000000..eb41c368 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.rst.txt @@ -0,0 +1,51 @@ +Tiling +====== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Tiling + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Tiling.grid + + Tiling.keep_vrt + + Tiling.output_basename + + Tiling.output_subdir + + Tiling.outputdir + + Tiling.vrt_dir + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Tiling.__init__ + + Tiling.postprocess_files + + Tiling.process_file + + Tiling.process_files + + Tiling.with_id_column + + Tiling.with_output + + Tiling.with_vrt_stored + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Tiling.vrt_dir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.vrt_dir.rst.txt new file mode 100644 index 00000000..70bfcf11 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.vrt_dir.rst.txt @@ -0,0 +1,6 @@ +Tiling.vrt\_dir +=============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Tiling.vrt_dir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Tiling.with_id_column.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.with_id_column.rst.txt new file mode 100644 index 00000000..3a993881 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.with_id_column.rst.txt @@ -0,0 +1,6 @@ +Tiling.with\_id\_column +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Tiling.with_id_column \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Tiling.with_output.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.with_output.rst.txt new file mode 100644 index 00000000..d60368b8 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.with_output.rst.txt @@ -0,0 +1,6 @@ +Tiling.with\_output +=================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Tiling.with_output \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Tiling.with_vrt_stored.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.with_vrt_stored.rst.txt new file mode 100644 index 00000000..962b43a2 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Tiling.with_vrt_stored.rst.txt @@ -0,0 +1,6 @@ +Tiling.with\_vrt\_stored +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Tiling.with_vrt_stored \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.__init__.rst.txt new file mode 100644 index 00000000..b4fd0553 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.__init__.rst.txt @@ -0,0 +1,6 @@ +Timeseries.\_\_init\_\_ +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Timeseries.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.bands.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.bands.rst.txt new file mode 100644 index 00000000..a2cff48d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.bands.rst.txt @@ -0,0 +1,6 @@ +Timeseries.bands +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.bands \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.end_date.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.end_date.rst.txt new file mode 100644 index 00000000..bf8c4f3e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.end_date.rst.txt @@ -0,0 +1,6 @@ +Timeseries.end\_date +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.end_date \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.keep_vrt.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.keep_vrt.rst.txt new file mode 100644 index 00000000..1421e447 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.keep_vrt.rst.txt @@ -0,0 +1,6 @@ +Timeseries.keep\_vrt +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.keep_vrt \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.outputdir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.outputdir.rst.txt new file mode 100644 index 00000000..af963f01 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.outputdir.rst.txt @@ -0,0 +1,6 @@ +Timeseries.outputdir +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.outputdir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.pad_mode.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.pad_mode.rst.txt new file mode 100644 index 00000000..5b96c018 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.pad_mode.rst.txt @@ -0,0 +1,6 @@ +Timeseries.pad\_mode +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.pad_mode \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.period.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.period.rst.txt new file mode 100644 index 00000000..892080cf --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.period.rst.txt @@ -0,0 +1,6 @@ +Timeseries.period +================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.period \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.postprocess_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.postprocess_files.rst.txt new file mode 100644 index 00000000..e0a49381 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.postprocess_files.rst.txt @@ -0,0 +1,6 @@ +Timeseries.postprocess\_files +============================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Timeseries.postprocess_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.process_file.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.process_file.rst.txt new file mode 100644 index 00000000..5d28b703 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.process_file.rst.txt @@ -0,0 +1,6 @@ +Timeseries.process\_file +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Timeseries.process_file \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.process_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.process_files.rst.txt new file mode 100644 index 00000000..95285ca8 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.process_files.rst.txt @@ -0,0 +1,6 @@ +Timeseries.process\_files +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Timeseries.process_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.rst.txt new file mode 100644 index 00000000..133c3495 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.rst.txt @@ -0,0 +1,57 @@ +Timeseries +========== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Timeseries + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Timeseries.bands + + Timeseries.end_date + + Timeseries.keep_vrt + + Timeseries.outputdir + + Timeseries.pad_mode + + Timeseries.period + + Timeseries.start_date + + Timeseries.vrt_dir + + Timeseries.window_size + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Timeseries.__init__ + + Timeseries.postprocess_files + + Timeseries.process_file + + Timeseries.process_files + + Timeseries.with_output + + Timeseries.with_vrt_stored + + Timeseries.with_windows + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.start_date.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.start_date.rst.txt new file mode 100644 index 00000000..af184ec9 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.start_date.rst.txt @@ -0,0 +1,6 @@ +Timeseries.start\_date +====================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.start_date \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.vrt_dir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.vrt_dir.rst.txt new file mode 100644 index 00000000..ff134b01 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.vrt_dir.rst.txt @@ -0,0 +1,6 @@ +Timeseries.vrt\_dir +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.vrt_dir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.window_size.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.window_size.rst.txt new file mode 100644 index 00000000..5c3c8710 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.window_size.rst.txt @@ -0,0 +1,6 @@ +Timeseries.window\_size +======================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.window_size \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.with_output.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.with_output.rst.txt new file mode 100644 index 00000000..12f7a990 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.with_output.rst.txt @@ -0,0 +1,6 @@ +Timeseries.with\_output +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Timeseries.with_output \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.with_vrt_stored.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.with_vrt_stored.rst.txt new file mode 100644 index 00000000..551c8fb5 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.with_vrt_stored.rst.txt @@ -0,0 +1,6 @@ +Timeseries.with\_vrt\_stored +============================ + +.. currentmodule:: eolab.rastertools + +.. automethod:: Timeseries.with_vrt_stored \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.with_windows.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.with_windows.rst.txt new file mode 100644 index 00000000..ae1fd0e5 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Timeseries.with_windows.rst.txt @@ -0,0 +1,6 @@ +Timeseries.with\_windows +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Timeseries.with_windows \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Windowable.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Windowable.__init__.rst.txt new file mode 100644 index 00000000..74df6bf9 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Windowable.__init__.rst.txt @@ -0,0 +1,6 @@ +Windowable.\_\_init\_\_ +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Windowable.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Windowable.pad_mode.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Windowable.pad_mode.rst.txt new file mode 100644 index 00000000..188a0f47 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Windowable.pad_mode.rst.txt @@ -0,0 +1,6 @@ +Windowable.pad\_mode +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Windowable.pad_mode \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Windowable.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Windowable.rst.txt new file mode 100644 index 00000000..2eb2da11 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Windowable.rst.txt @@ -0,0 +1,33 @@ +Windowable +========== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Windowable + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Windowable.pad_mode + + Windowable.window_size + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Windowable.__init__ + + Windowable.with_windows + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Windowable.window_size.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Windowable.window_size.rst.txt new file mode 100644 index 00000000..a2fa2caa --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Windowable.window_size.rst.txt @@ -0,0 +1,6 @@ +Windowable.window\_size +======================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Windowable.window_size \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Windowable.with_windows.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Windowable.with_windows.rst.txt new file mode 100644 index 00000000..61936aa0 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Windowable.with_windows.rst.txt @@ -0,0 +1,6 @@ +Windowable.with\_windows +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Windowable.with_windows \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.__init__.rst.txt new file mode 100644 index 00000000..6b9c343d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.__init__.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.\_\_init\_\_ +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.area.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.area.rst.txt new file mode 100644 index 00000000..335ee1b9 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.area.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.area +=============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.area \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.bands.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.bands.rst.txt new file mode 100644 index 00000000..eeafda4b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.bands.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.bands +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.bands \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.categorical.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.categorical.rst.txt new file mode 100644 index 00000000..9d265e9e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.categorical.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.categorical +====================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.categorical \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_file.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_file.rst.txt new file mode 100644 index 00000000..4cc9a691 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_file.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.category\_file +========================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.category_file \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_file_type.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_file_type.rst.txt new file mode 100644 index 00000000..d3977121 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_file_type.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.category\_file\_type +=============================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.category_file_type \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_index.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_index.rst.txt new file mode 100644 index 00000000..2824b701 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_index.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.category\_index +========================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.category_index \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_labels.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_labels.rst.txt new file mode 100644 index 00000000..e109ea0e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_labels.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.category\_labels +=========================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.category_labels \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.chart_file.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.chart_file.rst.txt new file mode 100644 index 00000000..36919b08 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.chart_file.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.chart\_file +====================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.chart_file \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.compute_stats.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.compute_stats.rst.txt new file mode 100644 index 00000000..fb463d8b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.compute_stats.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.compute\_stats +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.compute_stats \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.display_chart.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.display_chart.rst.txt new file mode 100644 index 00000000..7462af2e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.display_chart.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.display\_chart +========================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.display_chart \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.generated_stats.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.generated_stats.rst.txt new file mode 100644 index 00000000..2678b75d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.generated_stats.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.generated\_stats +=========================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.generated_stats \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.generated_stats_dates.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.generated_stats_dates.rst.txt new file mode 100644 index 00000000..d1a00612 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.generated_stats_dates.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.generated\_stats\_dates +================================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.generated_stats_dates \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.generated_stats_per_date.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.generated_stats_per_date.rst.txt new file mode 100644 index 00000000..5bd6222a --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.generated_stats_per_date.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.generated\_stats\_per\_date +====================================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.generated_stats_per_date \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.geometries.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.geometries.rst.txt new file mode 100644 index 00000000..821a4162 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.geometries.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.geometries +===================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.geometries \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.geometry_index.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.geometry_index.rst.txt new file mode 100644 index 00000000..5f5c52ad --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.geometry_index.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.geometry\_index +========================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.geometry_index \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.keep_vrt.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.keep_vrt.rst.txt new file mode 100644 index 00000000..e30442c6 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.keep_vrt.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.keep\_vrt +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.keep_vrt \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.output_format.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.output_format.rst.txt new file mode 100644 index 00000000..9aab12e4 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.output_format.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.output\_format +========================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.output_format \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.outputdir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.outputdir.rst.txt new file mode 100644 index 00000000..d8484a82 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.outputdir.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.outputdir +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.outputdir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.postprocess_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.postprocess_files.rst.txt new file mode 100644 index 00000000..e670f3d9 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.postprocess_files.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.postprocess\_files +============================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.postprocess_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.prefix.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.prefix.rst.txt new file mode 100644 index 00000000..9b0dd35e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.prefix.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.prefix +================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.prefix \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.process_file.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.process_file.rst.txt new file mode 100644 index 00000000..cca06a44 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.process_file.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.process\_file +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.process_file \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.process_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.process_files.rst.txt new file mode 100644 index 00000000..8e03291c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.process_files.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.process\_files +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.process_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.rst.txt new file mode 100644 index 00000000..5cc0fc1b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.rst.txt @@ -0,0 +1,97 @@ +Zonalstats +========== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Zonalstats + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Zonalstats.area + + Zonalstats.bands + + Zonalstats.categorical + + Zonalstats.category_file + + Zonalstats.category_file_type + + Zonalstats.category_index + + Zonalstats.category_labels + + Zonalstats.chart_file + + Zonalstats.display_chart + + Zonalstats.generated_stats + + Zonalstats.generated_stats_dates + + Zonalstats.generated_stats_per_date + + Zonalstats.geometries + + Zonalstats.geometry_index + + Zonalstats.keep_vrt + + Zonalstats.output_format + + Zonalstats.outputdir + + Zonalstats.prefix + + Zonalstats.sigma + + Zonalstats.stats + + Zonalstats.supported_output_formats + + Zonalstats.valid_stats + + Zonalstats.valid_threshold + + Zonalstats.vrt_dir + + Zonalstats.within + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Zonalstats.__init__ + + Zonalstats.compute_stats + + Zonalstats.postprocess_files + + Zonalstats.process_file + + Zonalstats.process_files + + Zonalstats.with_chart + + Zonalstats.with_geometries + + Zonalstats.with_outliers + + Zonalstats.with_output + + Zonalstats.with_per_category + + Zonalstats.with_vrt_stored + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.sigma.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.sigma.rst.txt new file mode 100644 index 00000000..959c9d8a --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.sigma.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.sigma +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.sigma \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.stats.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.stats.rst.txt new file mode 100644 index 00000000..2e32e625 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.stats.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.stats +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.stats \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.supported_output_formats.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.supported_output_formats.rst.txt new file mode 100644 index 00000000..03ec083d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.supported_output_formats.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.supported\_output\_formats +===================================== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Zonalstats.supported_output_formats \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.valid_stats.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.valid_stats.rst.txt new file mode 100644 index 00000000..b2478648 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.valid_stats.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.valid\_stats +======================= + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Zonalstats.valid_stats \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.valid_threshold.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.valid_threshold.rst.txt new file mode 100644 index 00000000..00e818f6 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.valid_threshold.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.valid\_threshold +=========================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.valid_threshold \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.vrt_dir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.vrt_dir.rst.txt new file mode 100644 index 00000000..f53842d7 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.vrt_dir.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.vrt\_dir +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.vrt_dir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_chart.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_chart.rst.txt new file mode 100644 index 00000000..4c9c2c24 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_chart.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.with\_chart +====================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.with_chart \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_geometries.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_geometries.rst.txt new file mode 100644 index 00000000..bba7e511 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_geometries.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.with\_geometries +=========================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.with_geometries \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_outliers.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_outliers.rst.txt new file mode 100644 index 00000000..bb0e976e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_outliers.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.with\_outliers +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.with_outliers \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_output.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_output.rst.txt new file mode 100644 index 00000000..35363fe9 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_output.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.with\_output +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.with_output \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_per_category.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_per_category.rst.txt new file mode 100644 index 00000000..0b791d96 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_per_category.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.with\_per\_category +============================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.with_per_category \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_vrt_stored.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_vrt_stored.rst.txt new file mode 100644 index 00000000..1445e207 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_vrt_stored.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.with\_vrt\_stored +============================ + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.with_vrt_stored \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.within.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.within.rst.txt new file mode 100644 index 00000000..f455aa4e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.within.rst.txt @@ -0,0 +1,6 @@ +Zonalstats.within +================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.within \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.create_argparser.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.create_argparser.rst.txt new file mode 100644 index 00000000..9ac1bbfa --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.create_argparser.rst.txt @@ -0,0 +1,6 @@ +create\_argparser +================= + +.. currentmodule:: eolab.rastertools.cli.filtering + +.. autofunction:: create_argparser \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.create_filter.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.create_filter.rst.txt new file mode 100644 index 00000000..d9e0c2ef --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.create_filter.rst.txt @@ -0,0 +1,6 @@ +create\_filter +============== + +.. currentmodule:: eolab.rastertools.cli.filtering + +.. autofunction:: create_filter \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.create_filtering.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.create_filtering.rst.txt new file mode 100644 index 00000000..9c06aba1 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.create_filtering.rst.txt @@ -0,0 +1,6 @@ +create\_filtering +================= + +.. currentmodule:: eolab.rastertools.cli.filtering + +.. autofunction:: create_filtering \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.filter_options.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.filter_options.rst.txt new file mode 100644 index 00000000..90634a1d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.filter_options.rst.txt @@ -0,0 +1,6 @@ +filter\_options +=============== + +.. currentmodule:: eolab.rastertools.cli.filtering + +.. autofunction:: filter_options \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.handle_result.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.handle_result.rst.txt new file mode 100644 index 00000000..06a51ce2 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.handle_result.rst.txt @@ -0,0 +1,6 @@ +handle\_result +============== + +.. currentmodule:: eolab.rastertools.cli.filtering + +.. autofunction:: handle_result \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.rst.txt new file mode 100644 index 00000000..d4502a15 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.rst.txt @@ -0,0 +1,35 @@ +eolab.rastertools.cli.filtering +=============================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.filtering +.. currentmodule:: eolab.rastertools.cli.filtering + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + create_filter + create_filtering + filter_options + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.create_filter.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.create_filter.rst.txt new file mode 100644 index 00000000..565bb40c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.create_filter.rst.txt @@ -0,0 +1,6 @@ +create\_filter +============== + +.. currentmodule:: eolab.rastertools.cli.filtering_dyn + +.. autofunction:: create_filter \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.create_filtering.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.create_filtering.rst.txt new file mode 100644 index 00000000..e505ce2e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.create_filtering.rst.txt @@ -0,0 +1,6 @@ +create\_filtering +================= + +.. currentmodule:: eolab.rastertools.cli.filtering_dyn + +.. autofunction:: create_filtering \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.filter_options.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.filter_options.rst.txt new file mode 100644 index 00000000..5832dfa7 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.filter_options.rst.txt @@ -0,0 +1,6 @@ +filter\_options +=============== + +.. currentmodule:: eolab.rastertools.cli.filtering_dyn + +.. autofunction:: filter_options \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.handle_result.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.handle_result.rst.txt new file mode 100644 index 00000000..9c82b636 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.handle_result.rst.txt @@ -0,0 +1,6 @@ +handle\_result +============== + +.. currentmodule:: eolab.rastertools.cli.filtering_dyn + +.. autofunction:: handle_result \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.rst.txt new file mode 100644 index 00000000..2e34b09b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.rst.txt @@ -0,0 +1,36 @@ +eolab.rastertools.cli.filtering\_dyn +==================================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.filtering_dyn +.. currentmodule:: eolab.rastertools.cli.filtering_dyn + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + create_filter + create_filtering + filter_options + handle_result + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.hillshade.create_argparser.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.hillshade.create_argparser.rst.txt new file mode 100644 index 00000000..75aa4d46 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.hillshade.create_argparser.rst.txt @@ -0,0 +1,6 @@ +create\_argparser +================= + +.. currentmodule:: eolab.rastertools.cli.hillshade + +.. autofunction:: create_argparser \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.hillshade.create_hillshade.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.hillshade.create_hillshade.rst.txt new file mode 100644 index 00000000..1cf6be57 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.hillshade.create_hillshade.rst.txt @@ -0,0 +1,6 @@ +create\_hillshade +================= + +.. currentmodule:: eolab.rastertools.cli.hillshade + +.. autofunction:: create_hillshade \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.hillshade.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.hillshade.rst.txt new file mode 100644 index 00000000..bd2404e6 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.hillshade.rst.txt @@ -0,0 +1,25 @@ +eolab.rastertools.cli.hillshade +=============================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.hillshade +.. currentmodule:: eolab.rastertools.cli.hillshade + + + + + + + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.create_argparser.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.create_argparser.rst.txt new file mode 100644 index 00000000..599b9ada --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.create_argparser.rst.txt @@ -0,0 +1,6 @@ +create\_argparser +================= + +.. currentmodule:: eolab.rastertools.cli.radioindice + +.. autofunction:: create_argparser \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.create_radioindice.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.create_radioindice.rst.txt new file mode 100644 index 00000000..df85073b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.create_radioindice.rst.txt @@ -0,0 +1,6 @@ +create\_radioindice +=================== + +.. currentmodule:: eolab.rastertools.cli.radioindice + +.. autofunction:: create_radioindice \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.indices_opt.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.indices_opt.rst.txt new file mode 100644 index 00000000..b1fda517 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.indices_opt.rst.txt @@ -0,0 +1,6 @@ +indices\_opt +============ + +.. currentmodule:: eolab.rastertools.cli.radioindice + +.. autofunction:: indices_opt \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.rst.txt new file mode 100644 index 00000000..f37e7edb --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.rst.txt @@ -0,0 +1,33 @@ +eolab.rastertools.cli.radioindice +================================= + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.radioindice +.. currentmodule:: eolab.rastertools.cli.radioindice + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + indices_opt + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.rst.txt new file mode 100644 index 00000000..1a1bf426 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.rst.txt @@ -0,0 +1,52 @@ +eolab.rastertools.cli +===================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli +.. currentmodule:: eolab.rastertools.cli + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + with_bands_arguments + with_outputdir_arguments + with_window_arguments + + + + + + + + + + + + + +.. rubric:: Submodules + +.. autosummary:: + :toctree: + :template: custom_module_template.rst + :recursive: + + eolab.rastertools.cli.filtering + eolab.rastertools.cli.hillshade + eolab.rastertools.cli.radioindice + eolab.rastertools.cli.speed + eolab.rastertools.cli.svf + eolab.rastertools.cli.tiling + eolab.rastertools.cli.timeseries + eolab.rastertools.cli.utils_cli + eolab.rastertools.cli.zonalstats + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.speed.create_argparser.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.speed.create_argparser.rst.txt new file mode 100644 index 00000000..0248673e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.speed.create_argparser.rst.txt @@ -0,0 +1,6 @@ +create\_argparser +================= + +.. currentmodule:: eolab.rastertools.cli.speed + +.. autofunction:: create_argparser \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.speed.create_speed.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.speed.create_speed.rst.txt new file mode 100644 index 00000000..353ee42c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.speed.create_speed.rst.txt @@ -0,0 +1,6 @@ +create\_speed +============= + +.. currentmodule:: eolab.rastertools.cli.speed + +.. autofunction:: create_speed \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.speed.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.speed.rst.txt new file mode 100644 index 00000000..23bfdb5f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.speed.rst.txt @@ -0,0 +1,25 @@ +eolab.rastertools.cli.speed +=========================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.speed +.. currentmodule:: eolab.rastertools.cli.speed + + + + + + + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.svf.create_argparser.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.svf.create_argparser.rst.txt new file mode 100644 index 00000000..9f02ff68 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.svf.create_argparser.rst.txt @@ -0,0 +1,6 @@ +create\_argparser +================= + +.. currentmodule:: eolab.rastertools.cli.svf + +.. autofunction:: create_argparser \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.svf.create_svf.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.svf.create_svf.rst.txt new file mode 100644 index 00000000..887a2234 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.svf.create_svf.rst.txt @@ -0,0 +1,6 @@ +create\_svf +=========== + +.. currentmodule:: eolab.rastertools.cli.svf + +.. autofunction:: create_svf \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.svf.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.svf.rst.txt new file mode 100644 index 00000000..861be220 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.svf.rst.txt @@ -0,0 +1,25 @@ +eolab.rastertools.cli.svf +========================= + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.svf +.. currentmodule:: eolab.rastertools.cli.svf + + + + + + + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.tiling.create_argparser.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.tiling.create_argparser.rst.txt new file mode 100644 index 00000000..b88dac88 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.tiling.create_argparser.rst.txt @@ -0,0 +1,6 @@ +create\_argparser +================= + +.. currentmodule:: eolab.rastertools.cli.tiling + +.. autofunction:: create_argparser \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.tiling.create_tiling.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.tiling.create_tiling.rst.txt new file mode 100644 index 00000000..cef8548e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.tiling.create_tiling.rst.txt @@ -0,0 +1,6 @@ +create\_tiling +============== + +.. currentmodule:: eolab.rastertools.cli.tiling + +.. autofunction:: create_tiling \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.tiling.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.tiling.rst.txt new file mode 100644 index 00000000..2746b096 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.tiling.rst.txt @@ -0,0 +1,25 @@ +eolab.rastertools.cli.tiling +============================ + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.tiling +.. currentmodule:: eolab.rastertools.cli.tiling + + + + + + + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.timeseries.create_argparser.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.timeseries.create_argparser.rst.txt new file mode 100644 index 00000000..1d836a2d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.timeseries.create_argparser.rst.txt @@ -0,0 +1,6 @@ +create\_argparser +================= + +.. currentmodule:: eolab.rastertools.cli.timeseries + +.. autofunction:: create_argparser \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.timeseries.create_timeseries.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.timeseries.create_timeseries.rst.txt new file mode 100644 index 00000000..0a03e9f2 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.timeseries.create_timeseries.rst.txt @@ -0,0 +1,6 @@ +create\_timeseries +================== + +.. currentmodule:: eolab.rastertools.cli.timeseries + +.. autofunction:: create_timeseries \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.timeseries.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.timeseries.rst.txt new file mode 100644 index 00000000..9d54af07 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.timeseries.rst.txt @@ -0,0 +1,25 @@ +eolab.rastertools.cli.timeseries +================================ + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.timeseries +.. currentmodule:: eolab.rastertools.cli.timeseries + + + + + + + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.utils_cli.apply_process.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.utils_cli.apply_process.rst.txt new file mode 100644 index 00000000..a93b5a04 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.utils_cli.apply_process.rst.txt @@ -0,0 +1,6 @@ +apply\_process +============== + +.. currentmodule:: eolab.rastertools.cli.utils_cli + +.. autofunction:: apply_process \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.utils_cli.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.utils_cli.rst.txt new file mode 100644 index 00000000..29b49f5b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.utils_cli.rst.txt @@ -0,0 +1,33 @@ +eolab.rastertools.cli.utils\_cli +================================ + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.utils_cli +.. currentmodule:: eolab.rastertools.cli.utils_cli + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + apply_process + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.with_bands_arguments.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.with_bands_arguments.rst.txt new file mode 100644 index 00000000..a7b4372f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.with_bands_arguments.rst.txt @@ -0,0 +1,6 @@ +with\_bands\_arguments +====================== + +.. currentmodule:: eolab.rastertools.cli + +.. autofunction:: with_bands_arguments \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.with_outputdir_arguments.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.with_outputdir_arguments.rst.txt new file mode 100644 index 00000000..8d573fb5 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.with_outputdir_arguments.rst.txt @@ -0,0 +1,6 @@ +with\_outputdir\_arguments +========================== + +.. currentmodule:: eolab.rastertools.cli + +.. autofunction:: with_outputdir_arguments \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.with_window_arguments.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.with_window_arguments.rst.txt new file mode 100644 index 00000000..0314028c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.with_window_arguments.rst.txt @@ -0,0 +1,6 @@ +with\_window\_arguments +======================= + +.. currentmodule:: eolab.rastertools.cli + +.. autofunction:: with_window_arguments \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.zonalstats.create_argparser.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.zonalstats.create_argparser.rst.txt new file mode 100644 index 00000000..5a144454 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.zonalstats.create_argparser.rst.txt @@ -0,0 +1,6 @@ +create\_argparser +================= + +.. currentmodule:: eolab.rastertools.cli.zonalstats + +.. autofunction:: create_argparser \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.zonalstats.create_zonalstats.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.zonalstats.create_zonalstats.rst.txt new file mode 100644 index 00000000..264d8a63 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.zonalstats.create_zonalstats.rst.txt @@ -0,0 +1,6 @@ +create\_zonalstats +================== + +.. currentmodule:: eolab.rastertools.cli.zonalstats + +.. autofunction:: create_zonalstats \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.cli.zonalstats.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.cli.zonalstats.rst.txt new file mode 100644 index 00000000..1cf16c2f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.cli.zonalstats.rst.txt @@ -0,0 +1,25 @@ +eolab.rastertools.cli.zonalstats +================================ + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.zonalstats +.. currentmodule:: eolab.rastertools.cli.zonalstats + + + + + + + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.adaptive_gaussian.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.adaptive_gaussian.rst.txt new file mode 100644 index 00000000..7720a99f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.adaptive_gaussian.rst.txt @@ -0,0 +1,6 @@ +adaptive\_gaussian +================== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: adaptive_gaussian \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.brightness_index.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.brightness_index.rst.txt new file mode 100644 index 00000000..f9c6e1a9 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.brightness_index.rst.txt @@ -0,0 +1,6 @@ +brightness\_index +================= + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: brightness_index \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.brightness_index2.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.brightness_index2.rst.txt new file mode 100644 index 00000000..75c5aa40 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.brightness_index2.rst.txt @@ -0,0 +1,6 @@ +brightness\_index2 +================== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: brightness_index2 \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.evi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.evi.rst.txt new file mode 100644 index 00000000..e1424753 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.evi.rst.txt @@ -0,0 +1,6 @@ +evi +=== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: evi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.hillshade.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.hillshade.rst.txt new file mode 100644 index 00000000..65577f0a --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.hillshade.rst.txt @@ -0,0 +1,6 @@ +hillshade +========= + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: hillshade \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.interpolated_timeseries.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.interpolated_timeseries.rst.txt new file mode 100644 index 00000000..6f744fe8 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.interpolated_timeseries.rst.txt @@ -0,0 +1,6 @@ +interpolated\_timeseries +======================== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: interpolated_timeseries \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.ipvi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.ipvi.rst.txt new file mode 100644 index 00000000..0b7e202a --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.ipvi.rst.txt @@ -0,0 +1,6 @@ +ipvi +==== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: ipvi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.local_mean.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.local_mean.rst.txt new file mode 100644 index 00000000..96e6e733 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.local_mean.rst.txt @@ -0,0 +1,6 @@ +local\_mean +=========== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: local_mean \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.local_sum.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.local_sum.rst.txt new file mode 100644 index 00000000..cfbba757 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.local_sum.rst.txt @@ -0,0 +1,6 @@ +local\_sum +========== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: local_sum \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.median.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.median.rst.txt new file mode 100644 index 00000000..f325bf10 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.median.rst.txt @@ -0,0 +1,6 @@ +median +====== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: median \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.msavi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.msavi.rst.txt new file mode 100644 index 00000000..a52c79fd --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.msavi.rst.txt @@ -0,0 +1,6 @@ +msavi +===== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: msavi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.msavi2.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.msavi2.rst.txt new file mode 100644 index 00000000..ca83060b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.msavi2.rst.txt @@ -0,0 +1,6 @@ +msavi2 +====== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: msavi2 \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.normalized_difference.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.normalized_difference.rst.txt new file mode 100644 index 00000000..6afcfa14 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.normalized_difference.rst.txt @@ -0,0 +1,6 @@ +normalized\_difference +====================== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: normalized_difference \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.pvi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.pvi.rst.txt new file mode 100644 index 00000000..1bece17d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.pvi.rst.txt @@ -0,0 +1,6 @@ +pvi +=== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: pvi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.redness_index.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.redness_index.rst.txt new file mode 100644 index 00000000..0fa92c5b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.redness_index.rst.txt @@ -0,0 +1,6 @@ +redness\_index +============== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: redness_index \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.rst.txt new file mode 100644 index 00000000..afdc88f7 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.rst.txt @@ -0,0 +1,53 @@ +eolab.rastertools.processing.algo +================================= + +.. rubric:: Description +.. automodule:: eolab.rastertools.processing.algo +.. currentmodule:: eolab.rastertools.processing.algo + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + adaptive_gaussian + brightness_index + brightness_index2 + evi + hillshade + interpolated_timeseries + ipvi + local_mean + local_sum + median + msavi + msavi2 + normalized_difference + pvi + redness_index + rvi + savi + speed + svf + tndvi + tsavi + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.rvi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.rvi.rst.txt new file mode 100644 index 00000000..4a0b64f2 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.rvi.rst.txt @@ -0,0 +1,6 @@ +rvi +=== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: rvi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.savi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.savi.rst.txt new file mode 100644 index 00000000..79c20d4c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.savi.rst.txt @@ -0,0 +1,6 @@ +savi +==== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: savi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.speed.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.speed.rst.txt new file mode 100644 index 00000000..d11c6a50 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.speed.rst.txt @@ -0,0 +1,6 @@ +speed +===== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: speed \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.svf.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.svf.rst.txt new file mode 100644 index 00000000..33ed289c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.svf.rst.txt @@ -0,0 +1,6 @@ +svf +=== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: svf \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.tndvi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.tndvi.rst.txt new file mode 100644 index 00000000..a4da13e7 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.tndvi.rst.txt @@ -0,0 +1,6 @@ +tndvi +===== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: tndvi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.tsavi.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.tsavi.rst.txt new file mode 100644 index 00000000..fd2457e4 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.algo.tsavi.rst.txt @@ -0,0 +1,6 @@ +tsavi +===== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: tsavi \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.rst.txt new file mode 100644 index 00000000..9d65dc1d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.\_\_init\_\_ +================================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RadioindiceProcessing.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.rst.txt new file mode 100644 index 00000000..628be0a5 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.algo +========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.algo \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.rst.txt new file mode 100644 index 00000000..2394d3fe --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.aliases +============================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.aliases \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.rst.txt new file mode 100644 index 00000000..1cc23a86 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.arguments +=============================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.arguments \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.rst.txt new file mode 100644 index 00000000..c1add71a --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.channels +============================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.channels \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.rst.txt new file mode 100644 index 00000000..2592bbe3 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.compress +============================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.compress \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.rst.txt new file mode 100644 index 00000000..28f3f3b4 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.compute +============================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RadioindiceProcessing.compute \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.rst.txt new file mode 100644 index 00000000..504b9730 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.configure +=============================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RadioindiceProcessing.configure \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.rst.txt new file mode 100644 index 00000000..b81a33d7 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.description +================================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.description \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.rst.txt new file mode 100644 index 00000000..28641b45 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.dtype +=========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.dtype \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.rst.txt new file mode 100644 index 00000000..89e85e3c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.help +========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.help \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.rst.txt new file mode 100644 index 00000000..f23e7018 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.in\_dtype +=============================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.in_dtype \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.rst.txt new file mode 100644 index 00000000..7c4ae734 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.name +========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.name \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.rst.txt new file mode 100644 index 00000000..1aadbfca --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.nbits +=========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.nbits \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.rst.txt new file mode 100644 index 00000000..e9024302 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.nodata +============================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.nodata \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.rst.txt new file mode 100644 index 00000000..d1027f3b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.per\_band\_algo +===================================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.per_band_algo \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.rst.txt new file mode 100644 index 00000000..a62be9ee --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.rst.txt @@ -0,0 +1,63 @@ +RadioindiceProcessing +===================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoclass:: RadioindiceProcessing + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + RadioindiceProcessing.algo + + RadioindiceProcessing.aliases + + RadioindiceProcessing.arguments + + RadioindiceProcessing.channels + + RadioindiceProcessing.compress + + RadioindiceProcessing.description + + RadioindiceProcessing.dtype + + RadioindiceProcessing.help + + RadioindiceProcessing.in_dtype + + RadioindiceProcessing.name + + RadioindiceProcessing.nbits + + RadioindiceProcessing.nodata + + RadioindiceProcessing.per_band_algo + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + RadioindiceProcessing.__init__ + + RadioindiceProcessing.compute + + RadioindiceProcessing.configure + + RadioindiceProcessing.with_arguments + + RadioindiceProcessing.with_channels + + RadioindiceProcessing.with_documentation + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.rst.txt new file mode 100644 index 00000000..8540adc4 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.with\_arguments +===================================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RadioindiceProcessing.with_arguments \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.rst.txt new file mode 100644 index 00000000..ae44881b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.with\_channels +==================================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RadioindiceProcessing.with_channels \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.rst.txt new file mode 100644 index 00000000..03fb54e8 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.rst.txt @@ -0,0 +1,6 @@ +RadioindiceProcessing.with\_documentation +========================================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RadioindiceProcessing.with_documentation \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.rst.txt new file mode 100644 index 00000000..40f6906f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.\_\_init\_\_ +========================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterFilter.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.rst.txt new file mode 100644 index 00000000..685ef3d4 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.algo +================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.algo \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.rst.txt new file mode 100644 index 00000000..c0865f4e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.aliases +==================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.aliases \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.rst.txt new file mode 100644 index 00000000..9284facf --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.arguments +====================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.arguments \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.rst.txt new file mode 100644 index 00000000..3566399d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.compress +===================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.compress \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.rst.txt new file mode 100644 index 00000000..eb4eb7a3 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.compute +==================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterFilter.compute \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.rst.txt new file mode 100644 index 00000000..22876db3 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.configure +====================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterFilter.configure \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.rst.txt new file mode 100644 index 00000000..cbee9eee --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.description +======================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.description \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.rst.txt new file mode 100644 index 00000000..ab6403da --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.dtype +================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.dtype \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.rst.txt new file mode 100644 index 00000000..d75d0b85 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.help +================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.help \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.rst.txt new file mode 100644 index 00000000..0c397258 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.in\_dtype +====================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.in_dtype \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.rst.txt new file mode 100644 index 00000000..e510969e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.name +================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.name \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.rst.txt new file mode 100644 index 00000000..aecbd4e5 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.nbits +================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.nbits \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.rst.txt new file mode 100644 index 00000000..ffa534bc --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.nodata +=================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.nodata \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.rst.txt new file mode 100644 index 00000000..7e4ecb73 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.per\_band\_algo +============================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.per_band_algo \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.rst.txt new file mode 100644 index 00000000..ba4967d9 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.rst.txt @@ -0,0 +1,59 @@ +RasterFilter +============ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoclass:: RasterFilter + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + RasterFilter.algo + + RasterFilter.aliases + + RasterFilter.arguments + + RasterFilter.compress + + RasterFilter.description + + RasterFilter.dtype + + RasterFilter.help + + RasterFilter.in_dtype + + RasterFilter.name + + RasterFilter.nbits + + RasterFilter.nodata + + RasterFilter.per_band_algo + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + RasterFilter.__init__ + + RasterFilter.compute + + RasterFilter.configure + + RasterFilter.with_arguments + + RasterFilter.with_documentation + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.rst.txt new file mode 100644 index 00000000..de08e990 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.with\_arguments +============================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterFilter.with_arguments \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.rst.txt new file mode 100644 index 00000000..aac72168 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.rst.txt @@ -0,0 +1,6 @@ +RasterFilter.with\_documentation +================================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterFilter.with_documentation \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.rst.txt new file mode 100644 index 00000000..0ff7a967 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.\_\_init\_\_ +============================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterProcessing.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.rst.txt new file mode 100644 index 00000000..9d7f23f0 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.algo +===================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.algo \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.rst.txt new file mode 100644 index 00000000..eb17feb7 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.aliases +======================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.aliases \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.rst.txt new file mode 100644 index 00000000..a438a386 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.arguments +========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.arguments \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.rst.txt new file mode 100644 index 00000000..57c2f5ff --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.compress +========================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.compress \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.rst.txt new file mode 100644 index 00000000..0dd9b99e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.compute +======================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterProcessing.compute \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.rst.txt new file mode 100644 index 00000000..f01d3746 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.configure +========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterProcessing.configure \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.rst.txt new file mode 100644 index 00000000..c1a6945e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.description +============================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.description \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.rst.txt new file mode 100644 index 00000000..b60bf642 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.dtype +====================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.dtype \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.rst.txt new file mode 100644 index 00000000..4dc75a6a --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.help +===================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.help \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.rst.txt new file mode 100644 index 00000000..ab6dc302 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.in\_dtype +========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.in_dtype \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.rst.txt new file mode 100644 index 00000000..7d481e8c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.name +===================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.name \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.rst.txt new file mode 100644 index 00000000..9af3846e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.nbits +====================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.nbits \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.rst.txt new file mode 100644 index 00000000..edbc9f7c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.nodata +======================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.nodata \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.rst.txt new file mode 100644 index 00000000..4e913887 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.per\_band\_algo +================================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.per_band_algo \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.rst.txt new file mode 100644 index 00000000..d8352b12 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.rst.txt @@ -0,0 +1,59 @@ +RasterProcessing +================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoclass:: RasterProcessing + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + RasterProcessing.algo + + RasterProcessing.aliases + + RasterProcessing.arguments + + RasterProcessing.compress + + RasterProcessing.description + + RasterProcessing.dtype + + RasterProcessing.help + + RasterProcessing.in_dtype + + RasterProcessing.name + + RasterProcessing.nbits + + RasterProcessing.nodata + + RasterProcessing.per_band_algo + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + RasterProcessing.__init__ + + RasterProcessing.compute + + RasterProcessing.configure + + RasterProcessing.with_arguments + + RasterProcessing.with_documentation + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.rst.txt new file mode 100644 index 00000000..20146616 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.with\_arguments +================================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterProcessing.with_arguments \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.rst.txt new file mode 100644 index 00000000..3d564910 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.rst.txt @@ -0,0 +1,6 @@ +RasterProcessing.with\_documentation +==================================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterProcessing.with_documentation \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.rst.txt new file mode 100644 index 00000000..0032ffba --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.rst.txt @@ -0,0 +1,35 @@ +eolab.rastertools.processing.rasterproc +======================================= + +.. rubric:: Description +.. automodule:: eolab.rastertools.processing.rasterproc +.. currentmodule:: eolab.rastertools.processing.rasterproc + + + + + + + + + + + +.. rubric:: Classes + +.. autosummary:: + :toctree: + :nosignatures: + + RadioindiceProcessing + RasterFilter + RasterProcessing + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.rst.txt new file mode 100644 index 00000000..8a00f31d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.rst.txt @@ -0,0 +1,38 @@ +eolab.rastertools.processing +============================ + +.. rubric:: Description +.. automodule:: eolab.rastertools.processing +.. currentmodule:: eolab.rastertools.processing + + + + + + + + + + + + + + + + + + + +.. rubric:: Submodules + +.. autosummary:: + :toctree: + :template: custom_module_template.rst + :recursive: + + eolab.rastertools.processing.algo + eolab.rastertools.processing.rasterproc + eolab.rastertools.processing.sliding + eolab.rastertools.processing.stats + eolab.rastertools.processing.vector + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.sliding.compute_sliding.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.sliding.compute_sliding.rst.txt new file mode 100644 index 00000000..b9324398 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.sliding.compute_sliding.rst.txt @@ -0,0 +1,6 @@ +compute\_sliding +================ + +.. currentmodule:: eolab.rastertools.processing.sliding + +.. autofunction:: compute_sliding \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.sliding.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.sliding.rst.txt new file mode 100644 index 00000000..0dd5f05f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.sliding.rst.txt @@ -0,0 +1,33 @@ +eolab.rastertools.processing.sliding +==================================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.processing.sliding +.. currentmodule:: eolab.rastertools.processing.sliding + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + compute_sliding + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.compute_zonal_stats.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.compute_zonal_stats.rst.txt new file mode 100644 index 00000000..0317ca35 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.compute_zonal_stats.rst.txt @@ -0,0 +1,6 @@ +compute\_zonal\_stats +===================== + +.. currentmodule:: eolab.rastertools.processing.stats + +.. autofunction:: compute_zonal_stats \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.rst.txt new file mode 100644 index 00000000..6aed0e7b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.rst.txt @@ -0,0 +1,6 @@ +compute\_zonal\_stats\_per\_category +==================================== + +.. currentmodule:: eolab.rastertools.processing.stats + +.. autofunction:: compute_zonal_stats_per_category \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.extract_zonal_outliers.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.extract_zonal_outliers.rst.txt new file mode 100644 index 00000000..9b25b6dd --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.extract_zonal_outliers.rst.txt @@ -0,0 +1,6 @@ +extract\_zonal\_outliers +======================== + +.. currentmodule:: eolab.rastertools.processing.stats + +.. autofunction:: extract_zonal_outliers \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.plot_stats.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.plot_stats.rst.txt new file mode 100644 index 00000000..ff08c663 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.plot_stats.rst.txt @@ -0,0 +1,6 @@ +plot\_stats +=========== + +.. currentmodule:: eolab.rastertools.processing.stats + +.. autofunction:: plot_stats \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.rst.txt new file mode 100644 index 00000000..1daf8202 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.stats.rst.txt @@ -0,0 +1,36 @@ +eolab.rastertools.processing.stats +================================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.processing.stats +.. currentmodule:: eolab.rastertools.processing.stats + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + compute_zonal_stats + compute_zonal_stats_per_category + extract_zonal_outliers + plot_stats + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.clip.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.clip.rst.txt new file mode 100644 index 00000000..60ce8abe --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.clip.rst.txt @@ -0,0 +1,6 @@ +clip +==== + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: clip \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.crop.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.crop.rst.txt new file mode 100644 index 00000000..ab63a190 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.crop.rst.txt @@ -0,0 +1,6 @@ +crop +==== + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: crop \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.dissolve.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.dissolve.rst.txt new file mode 100644 index 00000000..134bc714 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.dissolve.rst.txt @@ -0,0 +1,6 @@ +dissolve +======== + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: dissolve \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.filter.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.filter.rst.txt new file mode 100644 index 00000000..253cb07b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.filter.rst.txt @@ -0,0 +1,6 @@ +filter +====== + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: filter \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.filter_dissolve.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.filter_dissolve.rst.txt new file mode 100644 index 00000000..1575ead2 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.filter_dissolve.rst.txt @@ -0,0 +1,6 @@ +filter\_dissolve +================ + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: filter_dissolve \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.get_raster_shape.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.get_raster_shape.rst.txt new file mode 100644 index 00000000..df7bdd91 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.get_raster_shape.rst.txt @@ -0,0 +1,6 @@ +get\_raster\_shape +================== + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: get_raster_shape \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.rasterize.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.rasterize.rst.txt new file mode 100644 index 00000000..9ff9ca1f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.rasterize.rst.txt @@ -0,0 +1,6 @@ +rasterize +========= + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: rasterize \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.reproject.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.reproject.rst.txt new file mode 100644 index 00000000..dd5d043d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.reproject.rst.txt @@ -0,0 +1,6 @@ +reproject +========= + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: reproject \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.rst.txt new file mode 100644 index 00000000..e9a01b6a --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.rst.txt @@ -0,0 +1,41 @@ +eolab.rastertools.processing.vector +=================================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.processing.vector +.. currentmodule:: eolab.rastertools.processing.vector + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + clip + crop + dissolve + filter + filter_dissolve + get_raster_shape + rasterize + reproject + vectorize + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.vectorize.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.vectorize.rst.txt new file mode 100644 index 00000000..39b5c4d3 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.processing.vector.vectorize.rst.txt @@ -0,0 +1,6 @@ +vectorize +========= + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: vectorize \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.rst.txt new file mode 100644 index 00000000..56c29c3d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.\_\_init\_\_ +========================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.rst.txt new file mode 100644 index 00000000..f5fa19dd --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.bands\_files +========================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. autoproperty:: RasterProduct.bands_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.rst.txt new file mode 100644 index 00000000..72fae09c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.channels +====================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. autoproperty:: RasterProduct.channels \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.create_in_memory_vrt.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.create_in_memory_vrt.rst.txt new file mode 100644 index 00000000..9befeaa6 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.create_in_memory_vrt.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.create\_in\_memory\_vrt +===================================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.create_in_memory_vrt \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.rst.txt new file mode 100644 index 00000000..970fb4cf --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.file +================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. autoproperty:: RasterProduct.file \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.rst.txt new file mode 100644 index 00000000..6acaa715 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.free\_in\_memory\_vrts +==================================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.free_in_memory_vrts \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.rst.txt new file mode 100644 index 00000000..e933f81b --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.get\_date +======================= + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.get_date \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.rst.txt new file mode 100644 index 00000000..7e18c324 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.get\_date\_string +=============================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.get_date_string \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.rst.txt new file mode 100644 index 00000000..ad457790 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.get\_raster +========================= + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.get_raster \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.rst.txt new file mode 100644 index 00000000..280a1173 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.get\_relative\_orbit +================================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.get_relative_orbit \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.rst.txt new file mode 100644 index 00000000..144c6500 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.get\_satellite +============================ + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.get_satellite \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.rst.txt new file mode 100644 index 00000000..01f1c730 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.get\_tile +======================= + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.get_tile \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.rst.txt new file mode 100644 index 00000000..526d4626 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.is\_archive +========================= + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. autoproperty:: RasterProduct.is_archive \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.rst.txt new file mode 100644 index 00000000..9ee8bce8 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.masks\_files +========================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. autoproperty:: RasterProduct.masks_files \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.rst.txt new file mode 100644 index 00000000..c2dbeedf --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.open +================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.open \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.rst.txt new file mode 100644 index 00000000..d96804be --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.rst.txt @@ -0,0 +1,6 @@ +RasterProduct.rastertype +======================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. autoproperty:: RasterProduct.rastertype \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.rst.txt new file mode 100644 index 00000000..4b365632 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.rst.txt @@ -0,0 +1,55 @@ +RasterProduct +============= + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. autoclass:: RasterProduct + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + RasterProduct.bands_files + + RasterProduct.channels + + RasterProduct.file + + RasterProduct.is_archive + + RasterProduct.masks_files + + RasterProduct.rastertype + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + RasterProduct.__init__ + + RasterProduct.free_in_memory_vrts + + RasterProduct.get_date + + RasterProduct.get_date_string + + RasterProduct.get_raster + + RasterProduct.get_relative_orbit + + RasterProduct.get_satellite + + RasterProduct.get_tile + + RasterProduct.open + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.rst.txt new file mode 100644 index 00000000..790bec5f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.rst.txt @@ -0,0 +1,33 @@ +eolab.rastertools.product.rasterproduct +======================================= + +.. rubric:: Description +.. automodule:: eolab.rastertools.product.rasterproduct +.. currentmodule:: eolab.rastertools.product.rasterproduct + + + + + + + + + + + +.. rubric:: Classes + +.. autosummary:: + :toctree: + :nosignatures: + + RasterProduct + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.__init__.rst.txt new file mode 100644 index 00000000..53d03e51 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.__init__.rst.txt @@ -0,0 +1,6 @@ +Band.\_\_init\_\_ +================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: Band.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.description.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.description.rst.txt new file mode 100644 index 00000000..9cbb448d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.description.rst.txt @@ -0,0 +1,6 @@ +Band.description +================ + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: Band.description \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.identifier.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.identifier.rst.txt new file mode 100644 index 00000000..d29a689c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.identifier.rst.txt @@ -0,0 +1,6 @@ +Band.identifier +=============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: Band.identifier \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.rst.txt new file mode 100644 index 00000000..37620449 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.rst.txt @@ -0,0 +1,31 @@ +Band +==== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoclass:: Band + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Band.description + + Band.identifier + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Band.__init__ + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.blue.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.blue.rst.txt new file mode 100644 index 00000000..3bbb1e3c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.blue.rst.txt @@ -0,0 +1,6 @@ +BandChannel.blue +================ + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.blue \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.rst.txt new file mode 100644 index 00000000..4d233319 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.rst.txt @@ -0,0 +1,6 @@ +BandChannel.blue\_60m +===================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.blue_60m \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.green.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.green.rst.txt new file mode 100644 index 00000000..e8579a6d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.green.rst.txt @@ -0,0 +1,6 @@ +BandChannel.green +================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.green \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.mir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.mir.rst.txt new file mode 100644 index 00000000..1cea98db --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.mir.rst.txt @@ -0,0 +1,6 @@ +BandChannel.mir +=============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.mir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.rst.txt new file mode 100644 index 00000000..84bd5c36 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.rst.txt @@ -0,0 +1,6 @@ +BandChannel.mir\_60m +==================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.mir_60m \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.nir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.nir.rst.txt new file mode 100644 index 00000000..478fd2a6 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.nir.rst.txt @@ -0,0 +1,6 @@ +BandChannel.nir +=============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.nir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.rst.txt new file mode 100644 index 00000000..a0f30ccd --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.rst.txt @@ -0,0 +1,6 @@ +BandChannel.nir\_60m +==================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.nir_60m \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red.rst.txt new file mode 100644 index 00000000..8ef290b8 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red.rst.txt @@ -0,0 +1,6 @@ +BandChannel.red +=============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.red \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.rst.txt new file mode 100644 index 00000000..594aedb9 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.rst.txt @@ -0,0 +1,6 @@ +BandChannel.red\_edge1 +====================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.red_edge1 \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.rst.txt new file mode 100644 index 00000000..4738248c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.rst.txt @@ -0,0 +1,6 @@ +BandChannel.red\_edge2 +====================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.red_edge2 \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.rst.txt new file mode 100644 index 00000000..55c8d685 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.rst.txt @@ -0,0 +1,6 @@ +BandChannel.red\_edge3 +====================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.red_edge3 \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.rst.txt new file mode 100644 index 00000000..2cc7062c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.rst.txt @@ -0,0 +1,6 @@ +BandChannel.red\_edge4 +====================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.red_edge4 \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.rst.txt new file mode 100644 index 00000000..3c5c20d4 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.rst.txt @@ -0,0 +1,46 @@ +BandChannel +=========== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoclass:: BandChannel + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + BandChannel.blue + + BandChannel.green + + BandChannel.red + + BandChannel.nir + + BandChannel.mir + + BandChannel.swir + + BandChannel.red_edge1 + + BandChannel.red_edge2 + + BandChannel.red_edge3 + + BandChannel.red_edge4 + + BandChannel.blue_60m + + BandChannel.nir_60m + + BandChannel.mir_60m + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.swir.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.swir.rst.txt new file mode 100644 index 00000000..695700d1 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.swir.rst.txt @@ -0,0 +1,6 @@ +BandChannel.swir +================ + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.swir \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.__init__.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.__init__.rst.txt new file mode 100644 index 00000000..731339c1 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.__init__.rst.txt @@ -0,0 +1,6 @@ +RasterType.\_\_init\_\_ +======================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.__init__ \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.accept.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.accept.rst.txt new file mode 100644 index 00000000..debbe490 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.accept.rst.txt @@ -0,0 +1,6 @@ +RasterType.accept +================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.accept \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.add.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.add.rst.txt new file mode 100644 index 00000000..885f61ea --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.add.rst.txt @@ -0,0 +1,6 @@ +RasterType.add +============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.add \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.rst.txt new file mode 100644 index 00000000..42e931d1 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.rst.txt @@ -0,0 +1,6 @@ +RasterType.bands\_pattern +========================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.bands_pattern \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.channels.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.channels.rst.txt new file mode 100644 index 00000000..883f903c --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.channels.rst.txt @@ -0,0 +1,6 @@ +RasterType.channels +=================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.channels \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.date_format.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.date_format.rst.txt new file mode 100644 index 00000000..76af3907 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.date_format.rst.txt @@ -0,0 +1,6 @@ +RasterType.date\_format +======================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.date_format \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.find.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.find.rst.txt new file mode 100644 index 00000000..79d3f179 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.find.rst.txt @@ -0,0 +1,6 @@ +RasterType.find +=============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.find \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get.rst.txt new file mode 100644 index 00000000..8c93c574 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get.rst.txt @@ -0,0 +1,6 @@ +RasterType.get +============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.rst.txt new file mode 100644 index 00000000..6754c576 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.rst.txt @@ -0,0 +1,6 @@ +RasterType.get\_band\_description +================================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_band_description \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.rst.txt new file mode 100644 index 00000000..63312e7d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.rst.txt @@ -0,0 +1,6 @@ +RasterType.get\_band\_descriptions +================================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_band_descriptions \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.rst.txt new file mode 100644 index 00000000..d4575c12 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.rst.txt @@ -0,0 +1,6 @@ +RasterType.get\_band\_id +======================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_band_id \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.rst.txt new file mode 100644 index 00000000..83ad5d08 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.rst.txt @@ -0,0 +1,6 @@ +RasterType.get\_band\_ids +========================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_band_ids \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.rst.txt new file mode 100644 index 00000000..c14ff828 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.rst.txt @@ -0,0 +1,6 @@ +RasterType.get\_bands\_regexp +============================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_bands_regexp \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_date.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_date.rst.txt new file mode 100644 index 00000000..8a9c0b63 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_date.rst.txt @@ -0,0 +1,6 @@ +RasterType.get\_date +==================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_date \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_group.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_group.rst.txt new file mode 100644 index 00000000..6206d2ad --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_group.rst.txt @@ -0,0 +1,6 @@ +RasterType.get\_group +===================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_group \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask.rst.txt new file mode 100644 index 00000000..5694f89d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask.rst.txt @@ -0,0 +1,6 @@ +RasterType.get\_mask +==================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_mask \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.rst.txt new file mode 100644 index 00000000..936047c3 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.rst.txt @@ -0,0 +1,6 @@ +RasterType.get\_mask\_descriptions +================================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_mask_descriptions \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.rst.txt new file mode 100644 index 00000000..c0882b8e --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.rst.txt @@ -0,0 +1,6 @@ +RasterType.get\_mask\_ids +========================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_mask_ids \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.rst.txt new file mode 100644 index 00000000..74eaddfb --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.rst.txt @@ -0,0 +1,6 @@ +RasterType.get\_mask\_regexp +============================ + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_mask_regexp \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.has_channel.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.has_channel.rst.txt new file mode 100644 index 00000000..dbba5372 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.has_channel.rst.txt @@ -0,0 +1,6 @@ +RasterType.has\_channel +======================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.has_channel \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.has_channels.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.has_channels.rst.txt new file mode 100644 index 00000000..c2c81f84 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.has_channels.rst.txt @@ -0,0 +1,6 @@ +RasterType.has\_channels +======================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.has_channels \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.has_mask.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.has_mask.rst.txt new file mode 100644 index 00000000..4f7ed896 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.has_mask.rst.txt @@ -0,0 +1,6 @@ +RasterType.has\_mask +==================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.has_mask \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.rst.txt new file mode 100644 index 00000000..f26d1fe8 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.rst.txt @@ -0,0 +1,6 @@ +RasterType.maskfunc +=================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.maskfunc \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.masknodata.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.masknodata.rst.txt new file mode 100644 index 00000000..388e5dac --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.masknodata.rst.txt @@ -0,0 +1,6 @@ +RasterType.masknodata +===================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.masknodata \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.name.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.name.rst.txt new file mode 100644 index 00000000..4c1fcff2 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.name.rst.txt @@ -0,0 +1,6 @@ +RasterType.name +=============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.name \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.nodata.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.nodata.rst.txt new file mode 100644 index 00000000..b4a3f63a --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.nodata.rst.txt @@ -0,0 +1,6 @@ +RasterType.nodata +================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.nodata \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.rst.txt new file mode 100644 index 00000000..441fb234 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.rst.txt @@ -0,0 +1,6 @@ +RasterType.product\_pattern +=========================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.product_pattern \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.rst.txt new file mode 100644 index 00000000..7f92ad9d --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.rst.txt @@ -0,0 +1,6 @@ +RasterType.rastertypes +====================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: RasterType.rastertypes \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.rst.txt new file mode 100644 index 00000000..c2e64228 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.rst.txt @@ -0,0 +1,81 @@ +RasterType +========== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoclass:: RasterType + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + RasterType.bands_pattern + + RasterType.channels + + RasterType.date_format + + RasterType.maskfunc + + RasterType.masknodata + + RasterType.name + + RasterType.nodata + + RasterType.product_pattern + + RasterType.rastertypes + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + RasterType.__init__ + + RasterType.accept + + RasterType.add + + RasterType.find + + RasterType.get + + RasterType.get_band_description + + RasterType.get_band_descriptions + + RasterType.get_band_id + + RasterType.get_band_ids + + RasterType.get_bands_regexp + + RasterType.get_date + + RasterType.get_group + + RasterType.get_mask + + RasterType.get_mask_descriptions + + RasterType.get_mask_ids + + RasterType.get_mask_regexp + + RasterType.has_channel + + RasterType.has_channels + + RasterType.has_mask + + + \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.rst.txt new file mode 100644 index 00000000..0d383893 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.rst.txt @@ -0,0 +1,35 @@ +eolab.rastertools.product.rastertype +==================================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.product.rastertype +.. currentmodule:: eolab.rastertools.product.rastertype + + + + + + + + + + + +.. rubric:: Classes + +.. autosummary:: + :toctree: + :nosignatures: + + Band + BandChannel + RasterType + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.rst.txt new file mode 100644 index 00000000..541be381 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.rst.txt @@ -0,0 +1,44 @@ +eolab.rastertools.product +========================= + +.. rubric:: Description +.. automodule:: eolab.rastertools.product +.. currentmodule:: eolab.rastertools.product + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + s2_maja_mask + + + + + + + + + + + + + +.. rubric:: Submodules + +.. autosummary:: + :toctree: + :template: custom_module_template.rst + :recursive: + + eolab.rastertools.product.rasterproduct + eolab.rastertools.product.rastertype + eolab.rastertools.product.vrt + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.s2_maja_mask.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.s2_maja_mask.rst.txt new file mode 100644 index 00000000..f619fe63 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.s2_maja_mask.rst.txt @@ -0,0 +1,6 @@ +s2\_maja\_mask +============== + +.. currentmodule:: eolab.rastertools.product + +.. autofunction:: s2_maja_mask \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.vrt.add_masks_to_vrt.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.vrt.add_masks_to_vrt.rst.txt new file mode 100644 index 00000000..02f9e351 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.vrt.add_masks_to_vrt.rst.txt @@ -0,0 +1,6 @@ +add\_masks\_to\_vrt +=================== + +.. currentmodule:: eolab.rastertools.product.vrt + +.. autofunction:: add_masks_to_vrt \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.vrt.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.vrt.rst.txt new file mode 100644 index 00000000..9d7f302f --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.vrt.rst.txt @@ -0,0 +1,34 @@ +eolab.rastertools.product.vrt +============================= + +.. rubric:: Description +.. automodule:: eolab.rastertools.product.vrt +.. currentmodule:: eolab.rastertools.product.vrt + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + add_masks_to_vrt + set_band_descriptions + + + + + + + + + + + + + diff --git a/docs/_build/html/_sources/api/eolab.rastertools.product.vrt.set_band_descriptions.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.product.vrt.set_band_descriptions.rst.txt new file mode 100644 index 00000000..62dad010 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.product.vrt.set_band_descriptions.rst.txt @@ -0,0 +1,6 @@ +set\_band\_descriptions +======================= + +.. currentmodule:: eolab.rastertools.product.vrt + +.. autofunction:: set_band_descriptions \ No newline at end of file diff --git a/docs/_build/html/_sources/api/eolab.rastertools.rst.txt b/docs/_build/html/_sources/api/eolab.rastertools.rst.txt new file mode 100644 index 00000000..00ffe659 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rastertools.rst.txt @@ -0,0 +1,111 @@ +eolab.rastertools package +========================= + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + eolab.rastertools.cli + eolab.rastertools.processing + eolab.rastertools.product + +Submodules +---------- + +eolab.rastertools.filtering module +---------------------------------- + +.. automodule:: eolab.rastertools.filtering + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.hillshade module +---------------------------------- + +.. automodule:: eolab.rastertools.hillshade + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.main module +----------------------------- + +.. automodule:: eolab.rastertools.main + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.radioindice module +------------------------------------ + +.. automodule:: eolab.rastertools.radioindice + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.rastertools module +------------------------------------ + +.. automodule:: eolab.rastertools.rastertools + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.speed module +------------------------------ + +.. automodule:: eolab.rastertools.speed + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.svf module +---------------------------- + +.. automodule:: eolab.rastertools.svf + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.tiling module +------------------------------- + +.. automodule:: eolab.rastertools.tiling + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.timeseries module +----------------------------------- + +.. automodule:: eolab.rastertools.timeseries + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.utils module +------------------------------ + +.. automodule:: eolab.rastertools.utils + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.zonalstats module +----------------------------------- + +.. automodule:: eolab.rastertools.zonalstats + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: eolab.rastertools + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/_build/html/_sources/api/eolab.rst.txt b/docs/_build/html/_sources/api/eolab.rst.txt new file mode 100644 index 00000000..4382d933 --- /dev/null +++ b/docs/_build/html/_sources/api/eolab.rst.txt @@ -0,0 +1,12 @@ +eolab namespace +=============== + +.. py:module:: eolab + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + eolab.rastertools diff --git a/docs/_build/html/_sources/api/modules.rst.txt b/docs/_build/html/_sources/api/modules.rst.txt new file mode 100644 index 00000000..3bf90185 --- /dev/null +++ b/docs/_build/html/_sources/api/modules.rst.txt @@ -0,0 +1,7 @@ +eolab +===== + +.. toctree:: + :maxdepth: 4 + + eolab diff --git a/docs/_build/html/_sources/authors.rst.txt b/docs/_build/html/_sources/authors.rst.txt new file mode 100644 index 00000000..cd8e0913 --- /dev/null +++ b/docs/_build/html/_sources/authors.rst.txt @@ -0,0 +1,2 @@ +.. _authors: +.. include:: ../AUTHORS.rst diff --git a/docs/_build/html/_sources/changelog.rst.txt b/docs/_build/html/_sources/changelog.rst.txt new file mode 100644 index 00000000..871950df --- /dev/null +++ b/docs/_build/html/_sources/changelog.rst.txt @@ -0,0 +1,2 @@ +.. _changes: +.. include:: ../CHANGELOG.rst diff --git a/docs/_build/html/_sources/cli.rst.txt b/docs/_build/html/_sources/cli.rst.txt new file mode 100644 index 00000000..8f851489 --- /dev/null +++ b/docs/_build/html/_sources/cli.rst.txt @@ -0,0 +1,97 @@ +.. _cli: + +====================== +Command Line Interface +====================== + +rastertools +----------- + +The CLI **rastertools** enable to activate several subcommands, one per raster tool: + +.. code-block:: console + + $ rastertools --help + usage: rastertools [-h] [-t RASTERTYPE] [--version] [--max_workers MAX_WORKERS] [--debug] [-v] [-vv] + {filter,fi,hillshade,hs,radioindice,ri,speed,sp,svf,tiling,ti,timeseries,ts,zonalstats,zs} ... + + Collection of tools on raster data + + optional arguments: + -h, --help show this help message and exit + -t RASTERTYPE, --rastertype RASTERTYPE + JSON file defining additional raster types of input files + --version show program's version number and exit + --max_workers MAX_WORKERS + Maximum number of workers for parallel processing. If not given, it will default + to the number of processors on the machine. When all processors are not allocated + to run rastertools, it is thus recommended to set this option. + --debug Store to disk the intermediate VRT images that are generated when handling the + input files which can be complex raster product composed of several band files. + -v, --verbose set loglevel to INFO + -vv, --very-verbose set loglevel to DEBUG + + Commands: + {filter,fi,hillshade,hs,radioindice,ri,speed,sp,svf,tiling,ti,timeseries,ts,zonalstats,zs} + filter (fi) Apply a filter to a set of images + hillshade (hs) Compute hillshades of a Digital Elevation / Surface / Height Model (a raster + containing the height of the point as pixel values) + radioindice (ri) Compute radiometric indices + speed (sp) Compute speed of rasters + svf Compute Sky View Factor of a Digital Height Model + tiling (ti) Generate image tiles + timeseries (ts) Temporal gap filling of an image time series + zonalstats (zs) Compute zonal statistics + +The **rastertools** CLI generates the following sys.exit values: + +- 0: everything runs fine +- 1: processing error +- 2: wrong configuration of the raster tool (e.g. invalid parameter value given in the command line) + +**rastertools** is thus the entry point for all the following tools: + +.. toctree:: + :maxdepth: 1 + :glob: + + cli/* + +**rastertools** enables to configure additional custom rastertypes (cf. Usage) and to set-up logging +level. Most of the rastertools display their progression using a progress bar. The progress bar is +displayed when the logging level is set to INFO or DEBUG. It can also be disabled / enabled +independently to the logging level by setting an environment variable named RASTERTOOLS_NOTQDM. For +instance, setting the environment variable to 1 (resp. 0) will disable (resp. enable) the display +of the progress bar: + +.. code-block:: console + + $ export RASTERTOOLS_NOTQDM=1 + $ rastertools -v ri [...] + +Most of the **rastertools** are designed to split down rasters into small chunks of data so that +the processing can be run in parallel using several processors. The command line of the tools +defines an argument called `window_size` which corresponds to the size of the chunks. It is also +possible to specify the number of workers (i.e. processors) to use for parallel processing. The +number of workers shall not exceed the number of processors of the machine. It is necessary to +specify this option (`--max_workers`) when running rastertools on a machine where all cpus are +not allocated to the job, e.g. if you submit the processing to a job scheduler such as PBSPro. +Alternatively, you can set an environment variable like this and keep the argument +`--max_workers` unset: + +.. code-block:: console + + $ export RASTERTOOLS_MAXWORKERS=12 + $ rastertools -v hillshade [...] # it will use 12 processors + + +Docker/Singularity +------------------ + +By default the Docker / Singularity container executes: ``rastertools --help``. To run another command, type a command like: + +.. code-block:: console + + $ docker run -it -u 1000 -v $PWD/tests/tests_data:/usr/data rastertools:latest rastertools ri -r /usr/data/COMMUNE_32001.shp --ndvi /usr/data/SENTINEL2A_20180521-105702-711_L2A_T30TYP_D.zip + + $ singularity run rastertools_latest.sif rastertools ri -r tests/tests_data/COMMUNE_32001.shp --ndvi tests/tests_data/SENTINEL2A_20180521-105702-711_L2A_T30TYP_D.zip diff --git a/docs/_build/html/_sources/cli/filtering.rst.txt b/docs/_build/html/_sources/cli/filtering.rst.txt new file mode 100644 index 00000000..45354749 --- /dev/null +++ b/docs/_build/html/_sources/cli/filtering.rst.txt @@ -0,0 +1,124 @@ +filter +------ + +``filter`` (or ``fi``) subcommand applies a convolutive filter on a a raster image. + +.. code-block:: console + + $ rastertools filter --help + usage: rastertools filter [-h] {median,sum,mean,adaptive_gaussian} ... + + Apply a filter to a set of images. + + optional arguments: + -h, --help show this help message and exit + + Filters: + {median,sum,mean,adaptive_gaussian} + median Apply median filter + sum Apply local sum filter + mean Apply local mean filter + adaptive_gaussian Apply adaptive gaussian filter + +For different filters are available. They are applied as sub-command that each define the arguments +that configure the filter. Type option --help to get the definition of the arguments: + +.. code-block:: console + + $ rastertools filter adaptive_gaussian --help + usage: rastertools filter adaptive_gaussian [-h] --kernel_size KERNEL_SIZE + --sigma SIGMA [-o OUTPUT] + [-ws WINDOW_SIZE] + [-p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}] + [-b BANDS [BANDS ...]] [-a] + inputs [inputs ...] + + Execute the requested filter on the input files with the specified + parameters. The `inputs` argument can either be a single file or a `.lst` + file containing a list of input files. + + Arguments: + + inputs TEXT + + Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). You can + provide a single file with extension ".lst" (e.g. "filtering.lst") that + lists the input files to process (one input file per line in .lst). + + Options: + --sigma INTEGER Standard deviation of the Gaussian + distribution [required] + -a, --all Process all bands + -b, --bands INTEGER List of bands to process + -p, --pad [none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap] + Pad to use around the image, default : edge(see + https://numpy.org/doc/stable/reference/generated/numpy.pad.html + for more information) + -ws, --window_size INTEGER Size of tiles to distribute processing, + default: 1024 + -o, --output TEXT Output directory to store results (by + default current directory) + --kernel_size INTEGER Kernel size of the filter function, e.g. 3 + means a square of 3x3 pixels on which the + filter function is computed (default: 8) + -h, --help Show this message and exit. + + Apply an adaptive (Local gaussian of 3x3) recursive filter on the input image + + positional arguments: + inputs Input file to process (e.g. Sentinel2 L2A MAJA from + THEIA). You can provide a single file with extension + ".lst" (e.g. "filtering.lst") that lists the input + files to process (one input file per line in .lst) + + optional arguments: + -h, --help show this help message and exit + --kernel_size KERNEL_SIZE + Kernel size of the filter function, e.g. 3 means a + square of 3x3 pixels on which the filter function is + computed (default: 8) + --sigma SIGMA Standard deviation of the Gaussian distribution + (sigma) + -o OUTPUT, --output OUTPUT + Output dir where to store results (by default current + dir) + -ws WINDOW_SIZE, --window_size WINDOW_SIZE + Size of tiles to distribute processing, default: 1024 + -p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}, --pad {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap} + Pad to use around the image, default : edge (see https + ://numpy.org/doc/stable/reference/generated/numpy.pad. + html for more information) + -b BANDS [BANDS ...], --bands BANDS [BANDS ...] + List of bands to compute + -a, --all Compute all bands + + By default only first band is computed. + +Examples: + +The following examples use an input raster file generated by radioindice. This is an NDVI of a SENTINEL2 L2A THEIA image cropped to a (small) +region of interest. + +.. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg + +To apply three filters (median, mean and adaptive_gaussian) on a kernel of dimension 16x16, run these commands: + +.. code-block:: console + + $ rastertools filter median --kernel_size 16 "./SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + $ rastertools filter mean --kernel_size 16 "./SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + $ rastertools filter adaptive_gaussian --kernel_size 16 --sigma 1 "./SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + +The commands will generate respectively: + +- SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.tif + +.. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.jpg + +- SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.tif + +.. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.jpg + +- SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.tif + +.. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg \ No newline at end of file diff --git a/docs/_build/html/_sources/cli/hillshade.rst.txt b/docs/_build/html/_sources/cli/hillshade.rst.txt new file mode 100644 index 00000000..3a618223 --- /dev/null +++ b/docs/_build/html/_sources/cli/hillshade.rst.txt @@ -0,0 +1,90 @@ +.. hillshade: + +hillshade +--------- + +``hillshade`` (or ``hs``) subcommand computes the hillshades of a Digital Height Model. +The tool takes the sun position (elevation and azimuth) as input and +computes the shadows of the ground surface (buildings, trees, etc.). + +.. code-block:: console + + $ rastertools hillshade --help + usage: rastertools hillshade [-h] --elevation ELEVATION --azimuth AZIMUTH + [--radius RADIUS] --resolution RESOLUTION + [-o OUTPUT] [-ws WINDOW_SIZE] + [-p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}] + inputs [inputs ...] + + Execute the hillshade subcommand on a Digital Height Model (DHM) using the + given solar parameters (elevation, azimuth), resolution, and optional + parameters for processing the raster. + + Arguments: + + inputs TEXT + + Input file to process (i.e. geotiff corresponding to a Digital Height + Model). You can provide a single file with extension ".lst" (e.g. + "hillshade.lst") that lists the input files to process (one input file + per line in .lst) + + Options: + --elevation FLOAT Elevation of the sun in degrees, [0°, 90°] + where 90°=zenith and 0°=horizon [required] + --azimuth FLOAT Azimuth of the sun in degrees, [0°, 360°] + where 0°=north, 90°=east, 180°=south and + 270°=west [required] + --radius INTEGER Maximum distance (in pixels) around a point + to evaluate horizontal elevation angle. If + not set, it is automatically computed from + the range of altitudes in the digital model. + --resolution FLOAT Pixel resolution in meter [required] + -o, --output TEXT Output directory to store results (by + default current directory) + -ws, --window_size INTEGER Size of tiles to distribute processing, + default: 1024 + -p, --pad [none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap] + Pad to use around the image, default : edge (see + https://numpy.org/doc/stable/reference/generated/numpy.pad.html + for more information) + -h, --help Show this message and exit. + + +.. warning:: + This command line does not accept all input raster products as other raster tools (radioindice, zonalstats). + It is mandatory to use a raster file (typically a geotif) in a format that can be read by rasterio: rasterio.open(xxx)). + +Example: + +Let's take as input a Digital Height Model of Toulouse generated from a PLEIADES stereo (0.5m resolution): + +.. image:: ../_static/dsm.jpg + +The following commands will compute the hillshades of this Digital Height Model at 3 differents solar +hours (8:00AM, noon, 6:00PM) of 21st June: + +.. code-block:: console + + $ rastertools hillshade --elevation 27.2 --azimuth 82.64 --resolution 0.5 toulouse-mnh.tif + $ rastertools hillshade --elevation 69.83 --azimuth 180 --resolution 0.5 toulouse-mnh.tif + $ rastertools hillshade --elevation 25.82 --azimuth 278.58 --resolution 0.5 toulouse-mnh.tif + +The generated images are rendered with QGis: +- first layer contains the hillshade (value 0 is masked) +- second layer contains the Digital Height Model rendered in grayscale (white to black) + +Here are the captures: + +- 8 AM + +.. image:: ../_static/dsm-hillshade1.jpg + +- Noon + +.. image:: ../_static/dsm-hillshade2.jpg + +- 6 PM + +.. image:: ../_static/dsm-hillshade3.jpg + diff --git a/docs/_build/html/_sources/cli/radioindice.rst.txt b/docs/_build/html/_sources/cli/radioindice.rst.txt new file mode 100644 index 00000000..56daaade --- /dev/null +++ b/docs/_build/html/_sources/cli/radioindice.rst.txt @@ -0,0 +1,114 @@ +.. _radioindice: + +radioindice +----------- + +``radioindice`` (or ``ri``) subcommand computes radiometric indices such as ndvi or ndwi. + +.. code-block:: console + + $ rastertools radioindice --help + usage: rastertools radioindice [-h] [-o OUTPUT] [-m] [-r ROI] + [-i INDICES [INDICES ...]] [--ndvi] [--tndvi] + [--rvi] [--pvi] [--savi] [--tsavi] [--msavi] + [--msavi2] [--ipvi] [--evi] [--ndwi] [--ndwi2] + [--mndwi] [--ndpi] [--ndti] [--ndbi] [--ri] + [--bi] [--bi2] [-nd band1 band2] + [-ws WINDOW_SIZE] + inputs [inputs ...] + + Compute the requested radio indices on raster data. + + This command computes various vegetation and environmental indices on + satellite or raster data based on the provided input images and options. The + tool can compute specific indices, merge the results into one image, compute + normalized differences between bands, and apply processing using a region of + interest (ROI) and specified tile/window size. + + Arguments: + + inputs TEXT + + Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). You can + provide a single file with extension ".lst" (e.g. "radioindice.lst") + that lists the input files to process (one input file per line in .lst). + + Options: + -o, --output TEXT Output directory to store results (by + default current directory) + -m, --merge Merge all indices in the same image (i.e. + one band per indice) + -r, --roi TEXT Region of interest in the input image + (vector) + -ws, --window_size INTEGER Size of tiles to distribute processing, + default: 1024 + -i, --indices TEXT List of indices to compute. Possible indices + are: bi, bi2, evi, ipvi, mndwi, msavi, + msavi2, ndbi, ndpi, ndti, ndvi, ndwi, ndwi2, + pvi, ri, rvi, savi, tndvi, tsavi + --bi2 Compute bi2 indice + --bi Compute bi indice + --ri Compute ri indice + --ndbi Compute ndbi indice + --ndti Compute ndti indice + --ndpi Compute ndpi indice + --mndwi Compute mndwi indice + --ndwi2 Compute ndwi2 indice + --ndwi Compute ndwi indice + --evi Compute evi indice + --ipvi Compute ipvi indice + --msavi2 Compute msavi2 indice + --msavi Compute msavi indice + --tsavi Compute tsavi indice + --savi Compute savi indice + --pvi Compute pvi indice + --rvi Compute rvi indice + --tndvi Compute tndvi indice + --ndvi Compute ndvi indice + -nd, --normalized_difference band1 band2 + Compute the normalized difference of two + bands defineda s parameter of this option, + e.g. "-nd red nir" will compute (red- + nir)/(red+nir). See + eolab.rastertools.product.rastertype. + BandChannel for the list of + bands names. Several nd options can be set + to compute several normalized differences. + -h, --help Show this message and exit. + + If no indice option is explicitly set, NDVI, NDWI and NDWI2 are computed. + +.. warning:: + ``radioindice`` only accepts input files that match one of the configured raster types, either a built-in raster type + or a custom raster type defined with option -t of ``rastertools``. See section "Raster types". + +Examples : + +The first command computes the NDVI of a Sentinel-2 L2A product. The computation is performed on a region of interest defined +by a shapefile. The NDVI is then computed on a subset of the input product. + +Let's have a look of the Sentinel-2 L2A product in false color (Green, Red, NIR). The region of interest is highlighted with +a black line. + +.. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-grn.jpg + +.. code-block:: console + + $ rastertools radioindice -r "./COMMUNE_32001.shp" --ndvi ./SENTINEL2A_20180521-105702-711_L2A_T30TYP_D.zip + +The generated NDVI image is: + +.. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi_cropped.jpg + +The second command computes two indices (NDVI and NDWI) of the same input image. No region of interest is configured. + +.. code-block:: console + + $ rastertools radioindice -i ndvi ndwi -m ./SENTINEL2A_20180521-105702-711_L2A_T30TYP_D.zip + +The generated image has two bands (because option -m is activated): first one is the ndvi, second one is the ndwi. If -m option +is not activated, two images would be generated, one image per indice. + +Here is a capture of the first band (ndvi): + +.. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg diff --git a/docs/_build/html/_sources/cli/speed.rst.txt b/docs/_build/html/_sources/cli/speed.rst.txt new file mode 100644 index 00000000..964b68d2 --- /dev/null +++ b/docs/_build/html/_sources/cli/speed.rst.txt @@ -0,0 +1,56 @@ +.. speed: + +speed +----- + +``speed`` (or ``sp``) computes the time derivative of the radiometry of a series of raster products of the same type. + +.. code-block:: console + + $ rastertools speed --help + usage: rastertools speed [-h] [-b BANDS [BANDS ...]] [-a] [-o OUTPUT] + inputs [inputs ...] + + Compute the speed of radiometric values for multiple raster images. + + This command calculates the speed of radiometric values for raster data, + optionally processing specific bands or all bands from the input images. The + results are saved to a specified output directory. + + Arguments: + + inputs TEXT + + Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). You can + provide a single file with extension ".lst" (e.g. "speed.lst") that + lists the input files to process (one input file per line in .lst). + + Options: + -b, --bands INTEGER List of bands to process + -a, --all Process all bands + -o, --output TEXT Output directory to store results (by default current + directory) + -h, --help Show this message and exit. + + +.. warning:: + At least two input rasters must be given. The rasters must match one of the configured raster types, + either a built-in raster type or a custom raster type defined with option -t of ``rastertools``. + See section "Raster types". + +Example: + +.. code-block:: console + + $ rastertools speed ./SENTINEL2A_20180521-105702-711_L2A_T30TYP_D-ndvi.zip ./SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif + +This command generates an image with one band that represents :math:`\\frac{ndvi_2 - ndvi_1}{date_2 - data_1}` where: + +- index 1 corresponds to the first image in the command line: date_1=2018/05/21 10:57:02 +- index 2 corresponds to the second image in the command line: date_2=2018/10/23 10:51:07 + +Here is a capture of the output image: + +.. image:: ../_static/speed_ndvi.jpg + +Notice the presence of a nodata zone that comes from the SENTINEL2B product which has a cloud mask. diff --git a/docs/_build/html/_sources/cli/svf.rst.txt b/docs/_build/html/_sources/cli/svf.rst.txt new file mode 100644 index 00000000..6c7ef9fe --- /dev/null +++ b/docs/_build/html/_sources/cli/svf.rst.txt @@ -0,0 +1,122 @@ +.. svf: + +svf +--- + +``svf`` computes the SVF of a Digital Height Model. + +SVF stands for Sky View Factor. It is a geophysical parameter that measures the portion of the sky +visible from a certain point. The portion of the sky visible above the surface is especially relevant +in energy balance studies and computation of diffuse solar insolation. + +Sky-view factor is defined as the proportion of visible sky (:math:`\Omega`) above a certain +observation point as seen from a two-dimensional representation. + +The light that falls from the sky onto a certain part of the surface is reduced by the obstacles +that form the horizon. These obstacles can be described in all directions by the vertical +elevation angle above the horizontal plane. + +A good SVF approximation can therefore be performed with the estimate of this angle +in several directions. After the vertical elevation angle is determined in the chosen +number of directions n, the SVF is determined as a sum of all portions of the sky within +each direction: :math:`\sum \frac {\cos \gamma_i}{n}`, where :math:`\gamma_i` is the +vertical angle of the horizon in the`direction i. + +The angle :math:`\gamma` is extracted from the Digital Elevation Model: +:math:`\tan \frac{Height}{Distance}`:: + + _____ + x| | ^ + x | | | Height (from Digital Elevation Model) + x __ | | | + ____p_______| |___| |__v____________ + <--------------> + Distance + +Where p is the current pixel where the SVF is computed. + +In a direction, the algorithm computes all angles and keeps the largest one. To avoid testing +too many points, the "radius" parameter defines the max distance of the pixel to test. + +.. code-block:: console + + $ rastertools svf --help + usage: rastertools svf [-h] --radius RADIUS --directions DIRECTIONS + --resolution RESOLUTION [--altitude ALTITUDE] + [-o OUTPUT] [-ws WINDOW_SIZE] + [-p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}] + inputs [inputs ...] + + Compute the Sky View Factor (SVF) of a Digital Height Model (DHM). + + The Sky View Factor (SVF) is a measure of the visibility of the sky from a + point in a Digital Height Model (DHM). It is calculated by evaluating the + horizontal elevation angle from a given point in multiple directions (as + specified by the user), and is influenced by the topography and surrounding + terrain features. + + Arguments: + + inputs TEXT + + Input file to process (i.e. geotiff corresponding to a Digital Height + Model). You can provide a single file with extension ".lst" (e.g. + "svf.lst") that lists the input files to process (one input file + per line in .lst) + + Options: + --radius INTEGER Maximum distance (in pixels) around a point + to evaluate horizontal elevation angle + [required] + --directions INTEGER Number of directions on which to compute the + horizon elevation angle [required] + --resolution FLOAT Pixel resolution in meter [required] + --altitude INTEGER Reference altitude to use for computing the + SVF. If this option is not specified, SVF is + computed for every point at the altitude of + the point + -o, --output TEXT Output directory to store results (by + default current directory) + -ws, --window_size INTEGER Size of tiles to distribute processing, + default: 1024 + -p, --pad [none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap] + Pad to use around the image, default : edge(see + https://numpy.org/doc/stable/reference/generated/numpy.pad.html + for more information) + -h, --help Show this message and exit. + + +.. warning:: + This command line does not accept all input raster products as other raster tools (radioindice, zonalstats). + It is mandatory to use a raster file (typically a geotif) in a format that can be read by rasterio: rasterio.open(xxx)). + +Example: + +Let's take as input a Digital Height Model of Toulouse generated from a PLEIADES stereo (0.5m resolution): + +.. image:: ../_static/dsm.jpg + +The first command line computes the Sky View Factor using 16 directions and a radius of 50 pixels (25 meters). +The SVF is computed at the altitude of every point of the Digital Height Model, i.e. the SVF is computed on top +of buildings (for the highest building, SVF is thus 1). + +.. code-block:: console + + $ rastertools svf --radius 50 --directions 16 --resolution 0.5 tests\tests_data\toulouse-mnh.tif + +This command generates the following SVF: + +.. image:: ../_static/dsm-svf.jpg + +It is also possible to compute the SVF at a specified height, for instance on ground (0m altitude for a Digital Height Model). + +.. code-block:: console + + $ rastertools svf --radius 50 --directions 16 --resolution 0.5 tests\tests_data\toulouse-mnh.tif + +The SVF is the following: + +.. image:: ../_static/dsm-svf0.jpg + +As expected, the SVF at altitude 0m are equal to 0 for pixels inside buildings, and are the same as in the previous image +for pixels outside the buildings. \ No newline at end of file diff --git a/docs/_build/html/_sources/cli/tiling.rst.txt b/docs/_build/html/_sources/cli/tiling.rst.txt new file mode 100644 index 00000000..e0021c93 --- /dev/null +++ b/docs/_build/html/_sources/cli/tiling.rst.txt @@ -0,0 +1,73 @@ +.. tiling: + +tiling +------ + +``tiling`` (or ``ti``) tiles an input raster following the geometries defined in a vector +file. + +.. code-block:: console + + $ rastertools tiling --help + usage: rastertools tiling [-h] -g GRID_FILE [--id_col ID_COLUMN] + [--id ID [ID ...]] [-o OUTPUT] [-n OUTPUT_NAME] + [-d SUBDIR_NAME] + inputs [inputs ...] + Generate tiles of an input raster image following the geometries defined by + a given grid. + + The tiling command divides a raster image into smaller tiles based on a grid + defined in a vector-based spatial data file. Each tile corresponds to a + specific area within the grid, and tiles can be saved using a customizable + naming convention and optionally placed in subdirectories based on their + tile ID. + + Arguments: + + inputs TEXT + + Raster files to process. You can provide a single file with extension + ".lst" (e.g. "tiling.lst") that lists the input files to process (one + input file per line in .lst) + + Options: + -g, --grid TEXT vector-based spatial data file containing the grid to use + to generate the tiles [required] + --id_col TEXT Name of the column in the grid file used to number the + tiles. When ids are defined, this argument is requiredto + identify which column corresponds to the define ids + --id INTEGER Tiles ids of the grid to export as new tile, default all + -o, --output TEXT Output directory to store results (by default current + directory) + -n, --name TEXT Basename for the output raster tiles, + default:"{}_tile{}". The basename must be defined as a + formatted string where tile index is at position 1 and + original filename is at position 0. For instance, + tile{1}.tif will generate the filename tile75.tif for the + tile id = 75 + -d, --dir TEXT When each tile must be generated in a + different subdirectory, it defines the naming convention + for the subdirectory. It is a formatted string with one + positional parameter corresponding to the tile index. For + instance, tile{} will generate the subdirectory name + tile75/for the tile id = 75. By default, subdirectory is + not defined and output files will be generated directly + in the output directory + -h, --help Show this message and exit. + +In the next examples, we will be working on a grid of 4 cells (ids 1, 2, 3 and 4): *grid.geojson* and the image: *image.tif*. +The grid and the image only overlap on the cells 1 and 2. + +* example 1:: + + rastertools -v ti -g grid.geojson image.tif + +This command will return 2 files in the current directory named *image_tile1.tif* et *image_tile2.tif* +corresponding to the cells 1 and 2. The command will return an error for cells 3 and 4 because they do not overlap the raster image. + +* exemple 2:: + + rastertools -v ti -g grid.geojson image.tif --id 2 4 --name output_{1}.tif + +This command will return 1 file in the current directory named *output_2.tif* and will return an error for cell 4 because this cell +does not overlap the raster image. diff --git a/docs/_build/html/_sources/cli/timeseries.rst.txt b/docs/_build/html/_sources/cli/timeseries.rst.txt new file mode 100644 index 00000000..510ead6f --- /dev/null +++ b/docs/_build/html/_sources/cli/timeseries.rst.txt @@ -0,0 +1,71 @@ +.. timeseries: + +timeseries +---------- + +``timeseries`` (or ``ts``) generates a series of rasters at given dates from a set of input rasters +of the same type. When input rasters contain gaps (due for instance to clouds), gaps are filled in +the generated rasters. + +To generate the timeseries, this tool uses linear interpolation of every pixels in the input rasters. + +If some of the requested dates are before (resp. after) the dates of the input rasters, the +corresponding generated raster will contain the raster values of the first (resp. last) input raster +and may thus contain the same gaps as the input raster. + +.. code-block:: console + + $ rastertools timeseries --help + + usage: rastertools timeseries [-h] [-b BANDS [BANDS ...]] [-a] [-o OUTPUT] + [-s START_DATE] [-e END_DATE] [-p TIME_PERIOD] + [-ws WINDOW_SIZE] + inputs [inputs ...] + + Generate a timeseries of images (without gaps) from a set of input images. + Data not present in the input images (e.g., missing images for specific + dates or masked data) are interpolated (with linear interpolation) so that + all gaps in the timeseries are filled. + + This command is useful for generating continuous timeseries data, even when + some input images are missing or contain masked values. + + Arguments: + + inputs TEXT + + Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). You can + provide a single file with extension ".lst" (e.g. "speed.lst") that + lists the input files to process (one input file per line in .lst). + + Options: + -b, --bands LIST List of bands to process + -a, --all Process all bands + -o, --output TEXT Output directory to store results (by default + current directory) + -s, --start_date TEXT Start date of the timeseries to generate in the + following format: yyyy-MM-dd + -e, --end_date TEXT End date of the timeseries to generate in the + following format: yyyy-MM-dd + -p, --time_period INTEGER Time period (number of days) between two + consecutive images in the timeseries to generate + e.g. 10 = generate one image every 10 days + -ws, --window_size INTEGER Size of tiles to distribute processing, default: + 1024 + -h, --help Show this message and exit. + + +.. warning:: + At least two input rasters must be given. The rasters must match one of the configured raster types, + either a built-in raster type or a custom raster type defined with option -t of ``rastertools``. + See section "Raster types". The raster type must define where to get the date of the product + in the filename. + +Example: + +.. code-block:: console + + $ rastertools timeseries ./SENTINEL2A_20180521-105702-711_L2A_T30TYP_D-ndvi.zip ./SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif -s 2018-05-21 -e 2018-10-25 -p 10 -ws 512 + +This command generates rasters from 2018-05-21 until 2018-10-25 with a timeperiod between +two consecutive images of 10 days (2018-05-21, 2018-05-31, 2018-06-10, ...). diff --git a/docs/_build/html/_sources/cli/zonalstats.rst.txt b/docs/_build/html/_sources/cli/zonalstats.rst.txt new file mode 100644 index 00000000..a0812dbd --- /dev/null +++ b/docs/_build/html/_sources/cli/zonalstats.rst.txt @@ -0,0 +1,152 @@ +.. zonalstats: + +zonalstats +---------- + +``zonalstats`` (or ``zs``) computes zonal statistics of an input raster. The zones are defined by +a vector file (shapefile, geojson, etc.). If no vector file is provided, the statistics are +computed on the whole image. + +Statistics inside a geometry can be computed for different categories also defined by a vector +file. For instance, is is possible to compute the average height of buildings and vegetation of +cities using: + +- a Digital Height Model (input raster file) +- a shapefile with the boundaries of cities (-g argument) +- a shapefile with the buildings / vegetation classification (--category_file) + +.. code-block:: console + + $ rastertools zonalstats --help + usage: rastertools zonalstats [-h] [-o OUTPUT] [-f OUTPUT_FORMAT] + [-g GEOMETRIES] [-w] [--stats STATS [STATS ...]] + [--categorical] + [--valid_threshold VALID_THRESHOLD] [--area] + [--prefix PREFIX] [-b BANDS [BANDS ...]] [-a] + [--sigma SIGMA] [-c CHARTFILE] [-d] + [-gi GEOM_INDEX] [--category_file CATEGORY_FILE] + [--category_index CATEGORY_INDEX] + [--category_names CATEGORY_NAMES] + inputs [inputs ...] + + Compute zonal statistics of a raster image. + + Available statistics are: min, max, range, mean, std, percentile_x (x in [0, + 100]), median, mad, count, valid, nodata, sum, majority, minority, unique. + + By default, only the first band is computed unless specified otherwise. + + Arguments: + + inputs TEXT + + Raster files to process. You can provide a single filewith extension + ".lst" (e.g. "zonalstats.lst") that lists the input files to process + (one input file per line in .lst) + + Options: + -o, --output TEXT Output directory to store results (by default + current directory) + -f, --format TEXT Output format of the results when input + geometries are provided (by default ESRI + Shapefile). Possible values are ESRI Shapefile, + GeoJSON, CSV, GPKG, GML + -g, --geometry TEXT List of geometries where to compute statistics + (vector like a shapefile or geojson) + -w, --within When activated, statistics are computed for the + geometries that are within the raster shape. The + default behaviour otherwise is to compute + statistics for all geometries that intersect the + raster shape. + --stats TEXT List of stats to compute. Possible stats are: + min max range mean std percentile_x (x in [0, + 100]) median mad count valid nodata sum majority + minority unique + --categorical If the input raster is categorical (i.e. raster + values represent discrete classes) compute the + counts of every unique pixel values. + --valid_threshold FLOAT Minimum percentage of valid pixels in a shape to + compute its statistics. + --area Whether to multiply all stats by the area of a + cell of the input raster. + --prefix TEXT Add a prefix to the keys (default: None). One + prefix per band (e.g. 'band1 band2') + -b, --bands INTEGER List of bands to process + -a, --all Process all bands + --sigma TEXT Distance to the mean value (in sigma) in order + to produce a raster that highlights outliers. + -c, --chart TEXT Generate a chart per stat and per geometry + (x=timestamp of the input products / y=stat + value) and store it in the file defined by this + argument + -d, --display Display the chart + -gi, --geometry-index TEXT Name of the geometry index used for the chart + (default='ID') + --category_file TEXT File (raster or geometries) containing discrete + classes classifying the ROI. + --category_index TEXT Column name identifying categories in + categroy_file (only if file format is + geometries) + --category_names TEXT JSON files containing a dict with classes index + as keys and names to display classes as values. + -h, --help Show this message and exit. + + +When -g option is set with a valid geometries file, ``zonalstats`` generate a new vector file with the following metadata: + +- [prefix].name : name of the band (if available in the input raster) +- [prefix].date : date of the input raster (if the raster has one of the configured raster types, either a built-in raster + type or an additional custom raster type) +- [prefix].[stat] : values of the statistics +- [prefix].[pixel] : count of pixels having value = [pixel] when the categorical option is activated +- [prefix].[category][stat] : values of the statistics for the category [category] when the category_names option is activated. + +With : + +- [prefix] : prefix defined in the command line. If not set in the command line: b[band_number] +- [stat] : name of the statistics, e.g. mean, std + +If no vector file is set in the command line, the statistics are stored in a new vector file that contains a single entry +whose geometry is the raster shape (without the zones of nodata). + +Examples: + +The following examples use an input raster file generated by radioindice. This is an NDVI of a SENTINEL2 L2A THEIA image that +covers most of the cities we are interested in. + +.. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-geoms.jpg + +The first command generates statistics of ndvi values for several cities + +.. code-block:: console + + $ rastertools zs -f GeoJSON -g COMMUNE_32.geojson --stats min max mean std SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif + +This generates a new vector file that contains for each entity the stats values. + +.. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats.jpg + +Notice that some cities are partially covered by the input raster and their statistics are thus probably not fully relevant. +To disable the computation for these cities, use option --within. + +.. code-block:: console + + $ rastertools zs -f GeoJSON -g COMMUNE_32.geojson --within --stats min max mean std SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif + +The new vector file is now: + +.. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats2.jpg + +Let's use another raster file that corresponds to a land cover map named OSO. In this map, every pixel has +a value that represents its class (for instance: 1=dense urban area). + +The following command line enables to count the pixels of every classes: + +.. code-block:: console + + $ rastertools zs -f GeoJSON --categorical OCS_2017_CESBIO.tif + +The generated vector file contains one geometry (a green square that corresponds to the shape of the +input raster) with the number of pixels for each category: + +.. image:: ../_static/oso-stats.jpg diff --git a/docs/_build/html/_sources/index.rst.txt b/docs/_build/html/_sources/index.rst.txt new file mode 100644 index 00000000..15864c41 --- /dev/null +++ b/docs/_build/html/_sources/index.rst.txt @@ -0,0 +1,118 @@ +============ +Rastertools +============ + +This project consists in a command line named **rastertools** that enables to run several processing on raster files, typically +Sentinel2 raster images: + +- compute radiometric indices (e.g. ndvi). +- compute the time derivative of the radiometry of two raster images. +- generate a timeseries of rasters from a set of input rasters; a linear interpolation and a gap + filling are performed. +- compute statistics such as min, max, mean, etc. Statistics can be computed on the whole raster image + or can be computed on several geometries defined with a vector file - e.g. geojson or shapefile. +- split input image raster in tiles following the geometries defined in a vector file. +- apply a filter (median, local sum, local mean, adaptive gaussian) +- compute the Sky View Factor and the Hillshades of input rasters that represent a Digital Surface/Elevation/Height Model. + +The aim of **rastertools** is also to make the use of the following raster products transparent: + +- Sentinel-2 L1C PEPS (available here: https://peps.cnes.fr/rocket/#/search) +- Sentinel-2 L2A PEPS (available here: https://peps.cnes.fr/rocket/#/search) +- Sentinel-2 L2A THEIA (available here: https://theia.cnes.fr/atdistrib/rocket/#/search?collection=SENTINEL2) +- Sentinel-2 L3A THEIA (available here: https://theia.cnes.fr/atdistrib/rocket/#/search?collection=SENTINEL2) +- SPOT 6/7 Ortho GEOSUD (available here: http://ids.equipex-geosud.fr/web/guest/catalog) + +**rastertools** accept any of this raster product as input files. No need to unpack the archive to get +the raster files containing the different bands, to merge the bands, extract the region of interest and +so on: **rastertools** does it. + +**rastertools** also accepts additional custom raster types. The new raster types shall be defined in a +JSON file and provided as an argument of the rastertools CLI (cf. Usage) + +**rastertools** has a public API that enables to activate all the tools and extend their capabilities (e.g. +add a new radiometric indice). + + +Contents +======== + +**Install** + +* :doc:`install` + +.. toctree:: + :maxdepth: 1 + :hidden: + :caption: Installation + + install + + +**Usage** + +* :doc:`cli` +* :doc:`usage` +* :doc:`rasterproduct` + +.. toctree:: + :maxdepth: 1 + :hidden: + :caption: Usage + + cli + usage + rasterproduct + +**Development** + +* :doc:`private_api` + +.. toctree:: + :maxdepth: 1 + :hidden: + :caption: Development + + private_api + +**About** + +* :doc:`license` +* :doc:`authors` +* :doc:`changelog` + +.. toctree:: + :maxdepth: 1 + :hidden: + :caption: About + + license + authors + changelog + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + +.. _theia: https://theia.cnes.fr/atdistrib/rocket/#/search?collection=SENTINEL2 +.. _peps: https://peps.cnes.fr/rocket/#/search +.. _geosud: http://ids.equipex-geosud.fr/web/guest/catalog +.. _toctree: http://www.sphinx-doc.org/en/master/usage/restructuredtext/directives.html +.. _reStructuredText: http://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html +.. _references: http://www.sphinx-doc.org/en/stable/markup/inline.html +.. _Python domain syntax: http://sphinx-doc.org/domains.html#the-python-domain +.. _Sphinx: http://www.sphinx-doc.org/ +.. _Python: http://docs.python.org/ +.. _Numpy: http://docs.scipy.org/doc/numpy +.. _SciPy: http://docs.scipy.org/doc/scipy/reference/ +.. _matplotlib: https://matplotlib.org/contents.html# +.. _Pandas: http://pandas.pydata.org/pandas-docs/stable +.. _Scikit-Learn: http://scikit-learn.org/stable +.. _autodoc: http://www.sphinx-doc.org/en/stable/ext/autodoc.html +.. _Google style: https://github.com/google/styleguide/blob/gh-pages/pyguide.md#38-comments-and-docstrings +.. _NumPy style: https://numpydoc.readthedocs.io/en/latest/format.html +.. _classical style: http://www.sphinx-doc.org/en/stable/domains.html#info-field-lists diff --git a/docs/_build/html/_sources/install.rst.txt b/docs/_build/html/_sources/install.rst.txt new file mode 100644 index 00000000..7fa17df3 --- /dev/null +++ b/docs/_build/html/_sources/install.rst.txt @@ -0,0 +1,45 @@ +Conda +----- + +First, create a conda environment via: + +.. code-block:: console + + $ conda env create -f environment.yml + $ conda env update -f env_update.yml + +The following libraries will be installed in the conda environment named ``rastertools`` : + +- pyscaffold +- geopandas +- scipy +- gdal +- rasterio +- matplotlib +- tqdm + +Secondly, run commands: + +.. code-block:: console + + $ conda activate rastertools + $ pip install -e . + +``rastertools`` will be installed in the conda environment. Then, the CLI ``rastertools`` can be used and the API :obj:`eolab.rastertools` +can be called in a python script. + +Docker et Singularity +--------------------- + +``rastertools`` can be used in a Docker container that is built from the Dockerfile available in the root directory of the project. +To create the docker image, run: + +.. code-block:: console + + $ docker build -t rastertools:latest . + +To create the singularity image from the docker image, run: + +.. code-block:: console + + $ singularity build rastertools_latest.sif docker://rastertools:latest diff --git a/docs/_build/html/_sources/license.rst.txt b/docs/_build/html/_sources/license.rst.txt new file mode 100644 index 00000000..64375288 --- /dev/null +++ b/docs/_build/html/_sources/license.rst.txt @@ -0,0 +1,7 @@ +.. _license: + +======= +License +======= + +.. literalinclude:: ../LICENSE.txt diff --git a/docs/_build/html/_sources/private_api.rst.txt b/docs/_build/html/_sources/private_api.rst.txt new file mode 100644 index 00000000..ac02ea6d --- /dev/null +++ b/docs/_build/html/_sources/private_api.rst.txt @@ -0,0 +1,16 @@ +.. currentmodule:: eolab.rastertools + +=========== +Private API +=========== + +This section describes the private API of rastertools. + +.. autosummary:: + :toctree: api/ + :template: custom_module_template.rst + :recursive: + + cli + processing + product diff --git a/docs/_build/html/_sources/rasterproduct.rst.txt b/docs/_build/html/_sources/rasterproduct.rst.txt new file mode 100644 index 00000000..a8e44b94 --- /dev/null +++ b/docs/_build/html/_sources/rasterproduct.rst.txt @@ -0,0 +1,75 @@ +.. _rasterproduct: + +============ +Raster types +============ + +Some of the **rastertools** can only handle input raster files of a recognized raster type. + +This concerns ``radioindice``, ``speed`` and also ``zonalstats`` when this latter is asked to plot the statistics. +In these 3 cases, the tool needs to know the available raster bands (``radioindice``) or to extract the +timestamp of the raster product (``speed``, ``zonalstats``): the tools use the description of the raster type +to retrieve this information. + +The other tools are more flexible and also accept input rasters of unknown type provided that the input raster +can be read by rasterio. + +.. note:: + Tools like ``radioindice`` and ``zonalstats`` generate output filenames that follow the naming convention defined + in the rastertype of the input raster products. For instance, an NDVI generated from a Sentinel-2 L1C product + will be named so that the NDVI output file will be recognized as a Sentinel-2 L1C product. The timestamp of the + NDVI can thus be extracted by ``speed`` or ``zonalstats`` if they are chained after ``radioindice``. + +Built-in raster types +--------------------- + +**rastertools** has several built-in raster types: + +.. list-table:: Built-in raster types + :widths: 20 20 15 15 15 15 + :header-rows: 1 + + * - Name + - Naming convention + - Pattern to identify raster bands + - Date format + - Mask function + - Nodata + * - Sentinel-2 L2A THEIA + - ^SENTINEL2._(?P[0-9\-]{15}).*_L2A_T(?P.*)_.*$ + - ^SENTINEL2.*_(?P{})\.(tif|TIF|vrt|VRT)$ + - %Y%m%d-%H%M%S + - eolab.rastertools.product.vrt.s2_maja_mask + - -10000 + * - Sentinel-2 L3A THEIA + - ^SENTINEL2X_(?P[0-9\-]{15}).*_L3A_T(?P.*)_.*$ + - ^SENTINEL2.*_(?P{})\.(tif|TIF|vrt|VRT)$ + - %Y%m%d-%H%M%S + - No mask + - -10000 + * - Sentinel-2 L1C PEPS + - ^S2._MSIL1C_(?P[0-9T]*)_N\d*_R(?P\d*)_T(?P.*)_.*$ + - ^.*_[0-9T]*_(?P{})\.jp2$ + - %Y%m%dT%H%M%S + - No mask + - 0 + * - Sentinel-2 L2A PEPS + - ^S2._MSIL2A_(?P[0-9T]*)_N\d*_R(?P\d*)_T(?P.*)_.*$ + - ^.*_[0-9T]*_(?P{})\.jp2$ + - %Y%m%dT%H%M%S + - No mask + - 0 + * - SPOT6/7 + - ^SPOT._[0-9]{4}_.*_GEOSUD_MS_.*$ + - ^.*IMG_SPOT._MS_.*\.(tif|TIF)$ + - No timestamp in product name + - No mask + - -10000 + +Add custom raster types +----------------------- + +**rastertools** CLI has a special argument ``-t`` that allows to define custom raster types. This argument must +be set with the path to a JSON file that contains the new raster types definitions. + +The structure of the JSON file is described in :obj:`eolab.rastertools.add_custom_rastertypes` diff --git a/docs/_build/html/_sources/usage.rst.txt b/docs/_build/html/_sources/usage.rst.txt new file mode 100644 index 00000000..c19f7bde --- /dev/null +++ b/docs/_build/html/_sources/usage.rst.txt @@ -0,0 +1,178 @@ +.. _usage: + +.. currentmodule:: eolab.rastertools + +============= +API Reference +============= + +rastertools +----------- + +Rastertools can be activated by calling the API :obj:`eolab.rastertools.run_tool`. + +.. autofunction:: run_tool + +Example of use in python code:: + + from eolab.rastertools import run_tool + run_tool(args="radioindice --help".split()) + +Alternatively, every raster tools can be activated with their own API: + +.. autosummary:: + :toctree: api/ + + Filtering + Hillshade + Radioindice + Speed + SVF + Tiling + Timeseries + Zonalstats + +All these objects provide: + +- a fluent API to configure the processing. The methods are all named with the following pattern "with_" and + return the current instance so that the methods can be chained. +- methods to process a single file or a set of files (see :obj:`eolab.rastertools.Rastertool.process_file` + and :obj:`eolab.rastertools.Rastertool.process_files`) + +Example of use:: + + from eolab.rastertools import Radioindice + proc = Radioindice(Radioindice.ndvi) + outputs = proc.with_output(".", merge=False) + .with_roi("./roi.geojson") + .process_file("./SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip") + print(outputs) + +Raster products +--------------- + +Rastertools provides a useful API to open raster products that are provided as an archive or a directory containing +several images. + +The API is very simple to use:: + + from eolab.rastertools.product import RasterProduct + import rasterio + + with RasterProduct("tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip") as rp: + with rasterio.Env(GDAL_VRT_ENABLE_PYTHON=True): + with rp.open(roi="tests/tests_data/COMMUNE_32001.shp") as dataset: + data = dataset.read([1, 2, 3], masked=True) + +Adding custom raster types +-------------------------- + +To add custom raster types, use the method :obj:`eolab.rastertools.add_custom_rastertypes`. + +.. autofunction:: add_custom_rastertypes + +Example of use:: + + from eolab.rastertools import add_custom_rastertypes + + my_rastertypes = { + "rastertypes": [ + { + "name": "RGB_TIF", + "product_pattern": "^RGB_TIF_(?P[0-9_]*)_test\\.(tif|TIF)$", + "bands": [ + { + "channel": "red", + "description": "red" + }, + { + "channel": "green", + "description": "green" + }, + { + "channel": "blue", + "description": "blue" + }, + { + "channel": "nir", + "description": "nir" + } + ], + "date_format": "%Y%m%d_%H%M%S", + "nodata": 0 + }, + { + "name": "RGB_TIF_ARCHIVE", + "product_pattern": "^RGB_TIF_(?P[0-9\\_]*).*$", + "bands_pattern": "^TIF_(?P{}).*\\.(tif|TIF)$", + "bands": [ + { + "channel": "red", + "identifier": "r", + "description": "red" + }, + { + "channel": "green", + "identifier": "g", + "description": "green" + }, + { + "channel": "blue", + "identifier": "b", + "description": "blue" + }, + { + "channel": "nir", + "identifier": "n", + "description": "nir" + } + ], + "date_format": "%Y%m%d_%H%M%S", + "nodata": 0 + } + ] + } + + add_custom_rastertypes(json) + + # now any rastertools can handle products of the two new rastertypes + ... + +Design rules of raster tools +---------------------------- + +Every raster tool object inherits from base class :obj:`eolab.rastertools.Rastertool`. +If the process supports windowing, the raster tool can also inherit from :obj:`eolab.rastertools.Windowable`. + +.. autosummary:: + :toctree: api/ + + Rastertool + Windowable + +A rastertool raises a :obj:`eolab.rastertools.RastertoolConfigurationException` when invalid +input parameter is provided. + +.. autosummary:: + :toctree: api/ + + RastertoolConfigurationException + +Moreover, a rastertool can raise any type of Exception during its execution. The best practice is +thus to catch exceptions that can raise as follows:: + + from eolab.rastertools import Radioindice, RastertoolConfigurationException + + proc = Radioindice(Radioindice.ndvi) + try: + outputs = proc.with_output("unknown_dir", merge=False) + .process_file("./SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip") + except RastertoolConfigurationException as rce: + # do something + print(f"Invalid configuration of radioindice processing: {rce}") + except Exception as err: + # do something + print(f"An unexpected error occurs while processing file: {err}") + +In this example, a RastertoolConfigurationException is raises because the specified output dir does not +exist. diff --git "a/docs/_build/html/_static/Image coll\303\251e (2).png" "b/docs/_build/html/_static/Image coll\303\251e (2).png" new file mode 100644 index 00000000..542d2ef1 Binary files /dev/null and "b/docs/_build/html/_static/Image coll\303\251e (2).png" differ diff --git "a/docs/_build/html/_static/Image coll\303\251e.png" "b/docs/_build/html/_static/Image coll\303\251e.png" new file mode 100644 index 00000000..b47c2b59 Binary files /dev/null and "b/docs/_build/html/_static/Image coll\303\251e.png" differ diff --git a/docs/_build/html/_static/Logo-Eolab-Anglais.png b/docs/_build/html/_static/Logo-Eolab-Anglais.png new file mode 100644 index 00000000..fd0509fb Binary files /dev/null and b/docs/_build/html/_static/Logo-Eolab-Anglais.png differ diff --git a/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-grn.jpg b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-grn.jpg new file mode 100644 index 00000000..2600c62b Binary files /dev/null and b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-grn.jpg differ diff --git a/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg new file mode 100644 index 00000000..b35d861f Binary files /dev/null and b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg differ diff --git a/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-geoms.jpg b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-geoms.jpg new file mode 100644 index 00000000..f5cbc2dd Binary files /dev/null and b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-geoms.jpg differ diff --git a/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.jpg b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.jpg new file mode 100644 index 00000000..fb6601e5 Binary files /dev/null and b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.jpg differ diff --git a/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.jpg b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.jpg new file mode 100644 index 00000000..30c63903 Binary files /dev/null and b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.jpg differ diff --git a/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats.jpg b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats.jpg new file mode 100644 index 00000000..c3ac4627 Binary files /dev/null and b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats.jpg differ diff --git a/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats2.jpg b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats2.jpg new file mode 100644 index 00000000..5d746565 Binary files /dev/null and b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats2.jpg differ diff --git a/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.jpg b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.jpg new file mode 100644 index 00000000..fb6601e5 Binary files /dev/null and b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.jpg differ diff --git a/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.png b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.png new file mode 100644 index 00000000..542d2ef1 Binary files /dev/null and b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.png differ diff --git a/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg new file mode 100644 index 00000000..220fe911 Binary files /dev/null and b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg differ diff --git a/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi_cropped.jpg b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi_cropped.jpg new file mode 100644 index 00000000..592f0ad3 Binary files /dev/null and b/docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi_cropped.jpg differ diff --git a/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js b/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/docs/_build/html/_static/basic.css b/docs/_build/html/_static/basic.css new file mode 100644 index 00000000..cfc60b86 --- /dev/null +++ b/docs/_build/html/_static/basic.css @@ -0,0 +1,921 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/docs/_build/html/_static/css/badge_only.css b/docs/_build/html/_static/css/badge_only.css new file mode 100644 index 00000000..88ba55b9 --- /dev/null +++ b/docs/_build/html/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px} \ No newline at end of file diff --git a/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff b/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 b/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff b/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 b/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot b/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg b/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/docs/_build/html/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf b/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff b/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 b/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/docs/_build/html/_static/css/fonts/lato-bold-italic.woff b/docs/_build/html/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-bold-italic.woff differ diff --git a/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 b/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/docs/_build/html/_static/css/fonts/lato-bold.woff b/docs/_build/html/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-bold.woff differ diff --git a/docs/_build/html/_static/css/fonts/lato-bold.woff2 b/docs/_build/html/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-bold.woff2 differ diff --git a/docs/_build/html/_static/css/fonts/lato-normal-italic.woff b/docs/_build/html/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-normal-italic.woff differ diff --git a/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 b/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/docs/_build/html/_static/css/fonts/lato-normal.woff b/docs/_build/html/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-normal.woff differ diff --git a/docs/_build/html/_static/css/fonts/lato-normal.woff2 b/docs/_build/html/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/docs/_build/html/_static/css/fonts/lato-normal.woff2 differ diff --git a/docs/_build/html/_static/css/theme.css b/docs/_build/html/_static/css/theme.css new file mode 100644 index 00000000..0f14f106 --- /dev/null +++ b/docs/_build/html/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search .wy-dropdown>aactive,.wy-side-nav-search .wy-dropdown>afocus,.wy-side-nav-search>a:hover,.wy-side-nav-search>aactive,.wy-side-nav-search>afocus{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon,.wy-side-nav-search>a.icon{display:block}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.switch-menus{position:relative;display:block;margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-side-nav-search>div.switch-menus>div.language-switch,.wy-side-nav-search>div.switch-menus>div.version-switch{display:inline-block;padding:.2em}.wy-side-nav-search>div.switch-menus>div.language-switch select,.wy-side-nav-search>div.switch-menus>div.version-switch select{display:inline-block;margin-right:-2rem;padding-right:2rem;max-width:240px;text-align-last:center;background:none;border:none;border-radius:0;box-shadow:none;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-size:1em;font-weight:400;color:hsla(0,0%,100%,.3);cursor:pointer;appearance:none;-webkit-appearance:none;-moz-appearance:none}.wy-side-nav-search>div.switch-menus>div.language-switch select:active,.wy-side-nav-search>div.switch-menus>div.language-switch select:focus,.wy-side-nav-search>div.switch-menus>div.language-switch select:hover,.wy-side-nav-search>div.switch-menus>div.version-switch select:active,.wy-side-nav-search>div.switch-menus>div.version-switch select:focus,.wy-side-nav-search>div.switch-menus>div.version-switch select:hover{background:hsla(0,0%,100%,.1);color:hsla(0,0%,100%,.5)}.wy-side-nav-search>div.switch-menus>div.language-switch select option,.wy-side-nav-search>div.switch-menus>div.version-switch select option{color:#000}.wy-side-nav-search>div.switch-menus>div.language-switch:has(>select):after,.wy-side-nav-search>div.switch-menus>div.version-switch:has(>select):after{display:inline-block;width:1.5em;height:100%;padding:.1em;content:"\f0d7";font-size:1em;line-height:1.2em;font-family:FontAwesome;text-align:center;pointer-events:none;box-sizing:border-box}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions .rst-other-versions .rtd-current-item{font-weight:700}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}#flyout-search-form{padding:6px}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/docs/_build/html/_static/doctools.js b/docs/_build/html/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/docs/_build/html/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/docs/_build/html/_static/documentation_options.js b/docs/_build/html/_static/documentation_options.js new file mode 100644 index 00000000..e49ed18d --- /dev/null +++ b/docs/_build/html/_static/documentation_options.js @@ -0,0 +1,14 @@ +var DOCUMENTATION_OPTIONS = { + URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), + VERSION: '0.1.0', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/docs/_build/html/_static/dsm-hillshade1.jpg b/docs/_build/html/_static/dsm-hillshade1.jpg new file mode 100644 index 00000000..9cddea48 Binary files /dev/null and b/docs/_build/html/_static/dsm-hillshade1.jpg differ diff --git a/docs/_build/html/_static/dsm-hillshade2.jpg b/docs/_build/html/_static/dsm-hillshade2.jpg new file mode 100644 index 00000000..dfa5f86b Binary files /dev/null and b/docs/_build/html/_static/dsm-hillshade2.jpg differ diff --git a/docs/_build/html/_static/dsm-hillshade3.jpg b/docs/_build/html/_static/dsm-hillshade3.jpg new file mode 100644 index 00000000..2f818e57 Binary files /dev/null and b/docs/_build/html/_static/dsm-hillshade3.jpg differ diff --git a/docs/_build/html/_static/dsm-svf.jpg b/docs/_build/html/_static/dsm-svf.jpg new file mode 100644 index 00000000..2c1a199f Binary files /dev/null and b/docs/_build/html/_static/dsm-svf.jpg differ diff --git a/docs/_build/html/_static/dsm-svf0.jpg b/docs/_build/html/_static/dsm-svf0.jpg new file mode 100644 index 00000000..6e8ce7e1 Binary files /dev/null and b/docs/_build/html/_static/dsm-svf0.jpg differ diff --git a/docs/_build/html/_static/dsm.jpg b/docs/_build/html/_static/dsm.jpg new file mode 100644 index 00000000..6adb8e21 Binary files /dev/null and b/docs/_build/html/_static/dsm.jpg differ diff --git a/docs/_build/html/_static/file.png b/docs/_build/html/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/docs/_build/html/_static/file.png differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.eot b/docs/_build/html/_static/fonts/Lato/lato-bold.eot new file mode 100644 index 00000000..3361183a Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bold.eot differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.ttf b/docs/_build/html/_static/fonts/Lato/lato-bold.ttf new file mode 100644 index 00000000..29f691d5 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bold.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.woff b/docs/_build/html/_static/fonts/Lato/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bold.woff differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 b/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bold.woff2 differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot new file mode 100644 index 00000000..3d415493 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf new file mode 100644 index 00000000..f402040b Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.eot b/docs/_build/html/_static/fonts/Lato/lato-italic.eot new file mode 100644 index 00000000..3f826421 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-italic.eot differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.ttf b/docs/_build/html/_static/fonts/Lato/lato-italic.ttf new file mode 100644 index 00000000..b4bfc9b2 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-italic.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.woff b/docs/_build/html/_static/fonts/Lato/lato-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-italic.woff differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 b/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-italic.woff2 differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.eot b/docs/_build/html/_static/fonts/Lato/lato-regular.eot new file mode 100644 index 00000000..11e3f2a5 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-regular.eot differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.ttf b/docs/_build/html/_static/fonts/Lato/lato-regular.ttf new file mode 100644 index 00000000..74decd9e Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-regular.ttf differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.woff b/docs/_build/html/_static/fonts/Lato/lato-regular.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-regular.woff differ diff --git a/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 b/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/docs/_build/html/_static/fonts/Lato/lato-regular.woff2 differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot new file mode 100644 index 00000000..79dc8efe Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf new file mode 100644 index 00000000..df5d1df2 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot new file mode 100644 index 00000000..2f7ca78a Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf new file mode 100644 index 00000000..eb52a790 Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff differ diff --git a/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 differ diff --git a/docs/_build/html/_static/jquery.js b/docs/_build/html/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/docs/_build/html/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t +
Languages
+ ${config.projects.translations + .map( + (translation) => ` +
+ ${translation.language.code} +
+ `, + ) + .join("\n")} + + `; + return languagesHTML; + } + + function renderVersions(config) { + if (!config.versions.active.length) { + return ""; + } + const versionsHTML = ` +
+
Versions
+ ${config.versions.active + .map( + (version) => ` +
+ ${version.slug} +
+ `, + ) + .join("\n")} +
+ `; + return versionsHTML; + } + + function renderDownloads(config) { + if (!Object.keys(config.versions.current.downloads).length) { + return ""; + } + const downloadsNameDisplay = { + pdf: "PDF", + epub: "Epub", + htmlzip: "HTML", + }; + + const downloadsHTML = ` +
+
Downloads
+ ${Object.entries(config.versions.current.downloads) + .map( + ([name, url]) => ` +
+ ${downloadsNameDisplay[name]} +
+ `, + ) + .join("\n")} +
+ `; + return downloadsHTML; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const flyout = ` +
+ + Read the Docs + v: ${config.versions.current.slug} + + +
+
+ ${renderLanguages(config)} + ${renderVersions(config)} + ${renderDownloads(config)} +
+
On Read the Docs
+
+ Project Home +
+
+ Builds +
+
+ Downloads +
+
+
+
Search
+
+
+ +
+
+
+
+ + Hosted by Read the Docs + +
+
+ `; + + // Inject the generated flyout into the body HTML element. + document.body.insertAdjacentHTML("beforeend", flyout); + + // Trigger the Read the Docs Addons Search modal when clicking on the "Search docs" input from inside the flyout. + document + .querySelector("#flyout-search-form") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); + }) +} + +if (themeLanguageSelector || themeVersionSelector) { + function onSelectorSwitch(event) { + const option = event.target.selectedIndex; + const item = event.target.options[option]; + window.location.href = item.dataset.url; + } + + document.addEventListener("readthedocs-addons-data-ready", function (event) { + const config = event.detail.data(); + + const versionSwitch = document.querySelector( + "div.switch-menus > div.version-switch", + ); + if (themeVersionSelector) { + let versions = config.versions.active; + if (config.versions.current.hidden || config.versions.current.type === "external") { + versions.unshift(config.versions.current); + } + const versionSelect = ` + + `; + + versionSwitch.innerHTML = versionSelect; + versionSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + + const languageSwitch = document.querySelector( + "div.switch-menus > div.language-switch", + ); + + if (themeLanguageSelector) { + if (config.projects.translations.length) { + // Add the current language to the options on the selector + let languages = config.projects.translations.concat( + config.projects.current, + ); + languages = languages.sort((a, b) => + a.language.name.localeCompare(b.language.name), + ); + + const languageSelect = ` + + `; + + languageSwitch.innerHTML = languageSelect; + languageSwitch.firstElementChild.addEventListener("change", onSelectorSwitch); + } + else { + languageSwitch.remove(); + } + } + }); +} + +document.addEventListener("readthedocs-addons-data-ready", function (event) { + // Trigger the Read the Docs Addons Search modal when clicking on "Search docs" input from the topnav. + document + .querySelector("[role='search'] input") + .addEventListener("focusin", () => { + const event = new CustomEvent("readthedocs-search-show"); + document.dispatchEvent(event); + }); +}); \ No newline at end of file diff --git a/docs/_build/html/_static/language_data.js b/docs/_build/html/_static/language_data.js new file mode 100644 index 00000000..250f5665 --- /dev/null +++ b/docs/_build/html/_static/language_data.js @@ -0,0 +1,199 @@ +/* + * language_data.js + * ~~~~~~~~~~~~~~~~ + * + * This script contains the language-specific data used by searchtools.js, + * namely the list of stopwords, stemmer, scorer and splitter. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; + + +/* Non-minified version is copied as a separate JS file, is available */ + +/** + * Porter Stemmer + */ +var Stemmer = function() { + + var step2list = { + ational: 'ate', + tional: 'tion', + enci: 'ence', + anci: 'ance', + izer: 'ize', + bli: 'ble', + alli: 'al', + entli: 'ent', + eli: 'e', + ousli: 'ous', + ization: 'ize', + ation: 'ate', + ator: 'ate', + alism: 'al', + iveness: 'ive', + fulness: 'ful', + ousness: 'ous', + aliti: 'al', + iviti: 'ive', + biliti: 'ble', + logi: 'log' + }; + + var step3list = { + icate: 'ic', + ative: '', + alize: 'al', + iciti: 'ic', + ical: 'ic', + ful: '', + ness: '' + }; + + var c = "[^aeiou]"; // consonant + var v = "[aeiouy]"; // vowel + var C = c + "[^aeiouy]*"; // consonant sequence + var V = v + "[aeiou]*"; // vowel sequence + + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs/_build/html/_static/minus.png b/docs/_build/html/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/docs/_build/html/_static/minus.png differ diff --git a/docs/_build/html/_static/oso-stats.jpg b/docs/_build/html/_static/oso-stats.jpg new file mode 100644 index 00000000..18b01d96 Binary files /dev/null and b/docs/_build/html/_static/oso-stats.jpg differ diff --git a/docs/_build/html/_static/plus.png b/docs/_build/html/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/docs/_build/html/_static/plus.png differ diff --git a/docs/_build/html/_static/pygments.css b/docs/_build/html/_static/pygments.css new file mode 100644 index 00000000..0d49244e --- /dev/null +++ b/docs/_build/html/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #eeffcc; } +.highlight .c { color: #408090; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #007020; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #408090; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #408090; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #007020 } /* Comment.Preproc */ +.highlight .cpf { color: #408090; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #408090; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #408090; background-color: #fff0f0 } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #FF0000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #00A000 } /* Generic.Inserted */ +.highlight .go { color: #333333 } /* Generic.Output */ +.highlight .gp { color: #c65d09; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #007020; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #007020; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #007020; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #007020 } /* Keyword.Pseudo */ +.highlight .kr { color: #007020; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #902000 } /* Keyword.Type */ +.highlight .m { color: #208050 } /* Literal.Number */ +.highlight .s { color: #4070a0 } /* Literal.String */ +.highlight .na { color: #4070a0 } /* Name.Attribute */ +.highlight .nb { color: #007020 } /* Name.Builtin */ +.highlight .nc { color: #0e84b5; font-weight: bold } /* Name.Class */ +.highlight .no { color: #60add5 } /* Name.Constant */ +.highlight .nd { color: #555555; font-weight: bold } /* Name.Decorator */ +.highlight .ni { color: #d55537; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #007020 } /* Name.Exception */ +.highlight .nf { color: #06287e } /* Name.Function */ +.highlight .nl { color: #002070; font-weight: bold } /* Name.Label */ +.highlight .nn { color: #0e84b5; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #062873; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #bb60d5 } /* Name.Variable */ +.highlight .ow { color: #007020; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #208050 } /* Literal.Number.Bin */ +.highlight .mf { color: #208050 } /* Literal.Number.Float */ +.highlight .mh { color: #208050 } /* Literal.Number.Hex */ +.highlight .mi { color: #208050 } /* Literal.Number.Integer */ +.highlight .mo { color: #208050 } /* Literal.Number.Oct */ +.highlight .sa { color: #4070a0 } /* Literal.String.Affix */ +.highlight .sb { color: #4070a0 } /* Literal.String.Backtick */ +.highlight .sc { color: #4070a0 } /* Literal.String.Char */ +.highlight .dl { color: #4070a0 } /* Literal.String.Delimiter */ +.highlight .sd { color: #4070a0; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #4070a0 } /* Literal.String.Double */ +.highlight .se { color: #4070a0; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #4070a0 } /* Literal.String.Heredoc */ +.highlight .si { color: #70a0d0; font-style: italic } /* Literal.String.Interpol */ +.highlight .sx { color: #c65d09 } /* Literal.String.Other */ +.highlight .sr { color: #235388 } /* Literal.String.Regex */ +.highlight .s1 { color: #4070a0 } /* Literal.String.Single */ +.highlight .ss { color: #517918 } /* Literal.String.Symbol */ +.highlight .bp { color: #007020 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #06287e } /* Name.Function.Magic */ +.highlight .vc { color: #bb60d5 } /* Name.Variable.Class */ +.highlight .vg { color: #bb60d5 } /* Name.Variable.Global */ +.highlight .vi { color: #bb60d5 } /* Name.Variable.Instance */ +.highlight .vm { color: #bb60d5 } /* Name.Variable.Magic */ +.highlight .il { color: #208050 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/docs/_build/html/_static/searchtools.js b/docs/_build/html/_static/searchtools.js new file mode 100644 index 00000000..97d56a74 --- /dev/null +++ b/docs/_build/html/_static/searchtools.js @@ -0,0 +1,566 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = docUrlRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = docUrlRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/docs/_build/html/_static/speed_ndvi.jpg b/docs/_build/html/_static/speed_ndvi.jpg new file mode 100644 index 00000000..6e0def5e Binary files /dev/null and b/docs/_build/html/_static/speed_ndvi.jpg differ diff --git a/docs/_build/html/_static/sphinx_highlight.js b/docs/_build/html/_static/sphinx_highlight.js new file mode 100644 index 00000000..aae669d7 --- /dev/null +++ b/docs/_build/html/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/docs/_build/html/_static/style.css b/docs/_build/html/_static/style.css new file mode 100644 index 00000000..9a4c108a --- /dev/null +++ b/docs/_build/html/_static/style.css @@ -0,0 +1,24 @@ +@import url("theme.css"); + +.wy-side-nav-search>a img.logo, +.wy-side-nav-search .wy-dropdown>a img.logo { + width: 12rem +} + +.wy-side-nav-search { + background-color: #eee; +} + +.wy-side-nav-search>div.version { + display: none; +} +/* +table.colwidths-given { + table-layout: fixed; + width: 100%; +} +table.docutils td { + white-space: unset; + word-wrap: break-word; +} +*/ \ No newline at end of file diff --git a/docs/_build/html/api/eolab.html b/docs/_build/html/api/eolab.html new file mode 100644 index 00000000..abc9f2ac --- /dev/null +++ b/docs/_build/html/api/eolab.html @@ -0,0 +1,480 @@ + + + + + + + + + eolab namespace — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab namespace

+
+

Subpackages

+
+ +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.__init__.html b/docs/_build/html/api/eolab.rastertools.Filtering.__init__.html new file mode 100644 index 00000000..117d1f3d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.__init__.html @@ -0,0 +1,185 @@ + + + + + + + + + Filtering.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering.__init__

+
+
+Filtering.__init__(raster_filter: RasterFilter, kernel_size: int, bands: List[int] = [1])[source]
+

Constructor

+
+
Parameters:
+
    +
  • raster_filter (eolab.rastertools.processing.RasterFilter) – The instance of RasterFilter to apply

  • +
  • kernel_size (int) – Size of the kernel on which the filter is applied

  • +
  • bands ([int], optional, default=[1]) – List of bands in the input image to process. +Set None if all bands shall be processed.

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.adaptive_gaussian.html b/docs/_build/html/api/eolab.rastertools.Filtering.adaptive_gaussian.html new file mode 100644 index 00000000..68a7a946 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.adaptive_gaussian.html @@ -0,0 +1,181 @@ + + + + + + + + + Filtering.adaptive_gaussian — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering.adaptive_gaussian

+
+
+Filtering.adaptive_gaussian = adaptive_gaussian
+

RasterFilter that applies an adaptive gaussian filter to the kernel. The parameter sigma defines the standard deviation +of the Gaussian distribution.

+
+
Returns:
+

Numpy array containing the input data filtered by the Gaussian filter.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.bands.html b/docs/_build/html/api/eolab.rastertools.Filtering.bands.html new file mode 100644 index 00000000..48496fb2 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.bands.html @@ -0,0 +1,175 @@ + + + + + + + + + Filtering.bands — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.get_default_filters.html b/docs/_build/html/api/eolab.rastertools.Filtering.get_default_filters.html new file mode 100644 index 00000000..499d5a34 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.get_default_filters.html @@ -0,0 +1,181 @@ + + + + + + + + + Filtering.get_default_filters — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering.get_default_filters

+
+
+static Filtering.get_default_filters()[source]
+

Get the list of predefined raster filters

+
+
Returns:
+

[eolab.rastertools.processing.RasterFilter] List of the predefined +raster filters ([Median, Local sum, Local mean, Adaptive gaussian])

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.html b/docs/_build/html/api/eolab.rastertools.Filtering.html new file mode 100644 index 00000000..85e7d24a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.html @@ -0,0 +1,291 @@ + + + + + + + + + Filtering — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering

+
+
+class eolab.rastertools.Filtering(raster_filter: RasterFilter, kernel_size: int, bands: List[int] = [1])[source]
+

Bases: Rastertool, Windowable

+

Raster tool that applies a filter on a raster image.

+

Predefined filters are available:

+
    +
  • Median filter

  • +
  • Local sum

  • +
  • Local mean

  • +
  • Adaptive gaussian filter.

  • +
+

A filter is applied on a kernel of a configurable size. To set the kernel size, you need +to call:

+
tool = Filtering(Filtering.median_filter, kernel_size=16)
+
+
+

Custom additional filters can be easily added by instanciating a RasterFilter (see +eolab.rastertools.processing.RasterFilter).

+

The parameters that customize the filter algo can be passed by following this procedure:

+
def myalgo(input_data, **kwargs):
+    # kwargs contain the values of the algo parameters
+    kernel_size = kwargs.get('kernel_size', 8)
+    myparam = kwargs.get('myparam', 1)
+    # ... do someting ...
+
+my_filter = RasterFilter(
+    "myfilter", algo=myalgo
+).with_documentation(
+    help="Apply my filter",
+    description="Apply my filter"
+).with_arguments({
+    "myparam": {
+        # configure the command line interface for this param, this can be skipped
+        "default": 8,
+        "required": True,
+        "type": int,
+        "help": "my configuration param for myalgo"
+    }
+})
+
+# create the raster tool
+tool = Filtering(my_filter, kernel_size=16)
+my_filter.with_output(".")
+my_filter.with_window(1024, "edge")
+# set the configuration parameter of the algo
+my_filter.with_filter_configuration({"myparam": 1024})
+# run the tool
+tool.process_file("./mytif.tif")
+
+
+

Attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filtering.adaptive_gaussian

RasterFilter that applies an adaptive gaussian filter to the kernel.

Filtering.bands

List of bands to process

Filtering.keep_vrt

Whether intermediate VRT images shall be kept

Filtering.local_mean

Computes the local means of the input data.

Filtering.local_sum

Computes the local sums of the input data.

Filtering.median_filter

Applies a Median Filter to the input data using scipy.ndimage.median_filter.

Filtering.outputdir

Path of the output directory where are stored the results

Filtering.pad_mode

//numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty].

Filtering.raster_filter

Name of the filter to apply to the raster

Filtering.vrt_dir

Dir where to store intermediate VRT images

Filtering.window_size

Size of the windows to split the image in small parts

+

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filtering.__init__(raster_filter, kernel_size)

Constructor

Filtering.get_default_filters()

Get the list of predefined raster filters

Filtering.postprocess_files(inputfiles, ...)

Run a postprocess when all input files have been processed.

Filtering.process_file(inputfile)

Apply the filter to the input file

Filtering.process_files(inputfiles)

Run the rastertool to a set of input files.

Filtering.with_filter_configuration(argsdict)

Configure the filter with its specific arguments' values

Filtering.with_output([outputdir])

Set up the output.

Filtering.with_vrt_stored(keep_vrt)

Configure if the intermediate VRT images that are generated when handling the input files (which can be complex raster product composed of several band files) shall be stored to disk or not - for debug purpose for instance.

Filtering.with_windows([window_size, pad_mode])

Configure the window generation for processing image

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.keep_vrt.html b/docs/_build/html/api/eolab.rastertools.Filtering.keep_vrt.html new file mode 100644 index 00000000..b4232358 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.keep_vrt.html @@ -0,0 +1,175 @@ + + + + + + + + + Filtering.keep_vrt — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.local_mean.html b/docs/_build/html/api/eolab.rastertools.Filtering.local_mean.html new file mode 100644 index 00000000..605abc52 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.local_mean.html @@ -0,0 +1,181 @@ + + + + + + + + + Filtering.local_mean — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering.local_mean

+
+
+Filtering.local_mean = mean
+

Computes the local means of the input data. +Each element is the mean of the pixels contained in the sliding window determined by kernel_size.

+
+
Returns:
+

Numpy array of the size of input_data containing the computed local means

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.local_sum.html b/docs/_build/html/api/eolab.rastertools.Filtering.local_sum.html new file mode 100644 index 00000000..74caef12 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.local_sum.html @@ -0,0 +1,181 @@ + + + + + + + + + Filtering.local_sum — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering.local_sum

+
+
+Filtering.local_sum = sum
+

Computes the local sums of the input data. +Each element is the sum of the pixels contained in the sliding window determined by kernel_size.

+
+
Returns:
+

Numpy array of the size of input_data containing the computed local sums

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.median_filter.html b/docs/_build/html/api/eolab.rastertools.Filtering.median_filter.html new file mode 100644 index 00000000..6852b271 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.median_filter.html @@ -0,0 +1,182 @@ + + + + + + + + + Filtering.median_filter — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering.median_filter

+
+
+Filtering.median_filter = median
+

Applies a Median Filter to the input data using +scipy.ndimage.median_filter. +The filter computes the median contained in the sliding window determined by kernel_size.

+
+
Returns:
+

Numpy array containing the input data filtered by the median filter

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.outputdir.html b/docs/_build/html/api/eolab.rastertools.Filtering.outputdir.html new file mode 100644 index 00000000..87103808 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.outputdir.html @@ -0,0 +1,175 @@ + + + + + + + + + Filtering.outputdir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.pad_mode.html b/docs/_build/html/api/eolab.rastertools.Filtering.pad_mode.html new file mode 100644 index 00000000..fff0546e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.pad_mode.html @@ -0,0 +1,181 @@ + + + + + + + + + Filtering.pad_mode — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering.pad_mode

+
+
+property Filtering.pad_mode: str
+

//numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image +The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty].

+
+
Type:
+

Mode used to `pad <https

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.postprocess_files.html b/docs/_build/html/api/eolab.rastertools.Filtering.postprocess_files.html new file mode 100644 index 00000000..4e82e31b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.postprocess_files.html @@ -0,0 +1,196 @@ + + + + + + + + + Filtering.postprocess_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering.postprocess_files

+
+
+Filtering.postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str]
+

Run a postprocess when all input files have been processed. This step may consist +in transforming the outputs or mixing them to generate additional ones.

+
+

Note

+

This implementation does nothing. Override this method in the subclass +to achieve special processing that needs the whole list of inputfiles +and/or the output files generated when processing every single file (to mix +them for instance).

+
+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files

  • +
+
+
+
+
Returns

[str]: Additional output files (by default empty list)

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.process_file.html b/docs/_build/html/api/eolab.rastertools.Filtering.process_file.html new file mode 100644 index 00000000..7f6aeae0 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.process_file.html @@ -0,0 +1,183 @@ + + + + + + + + + Filtering.process_file — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering.process_file

+
+
+Filtering.process_file(inputfile: str) List[str][source]
+

Apply the filter to the input file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

([str]) A list of one element containing the path of the generated filtered image.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.process_files.html b/docs/_build/html/api/eolab.rastertools.Filtering.process_files.html new file mode 100644 index 00000000..0eecacf7 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.process_files.html @@ -0,0 +1,189 @@ + + + + + + + + + Filtering.process_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering.process_files

+
+
+Filtering.process_files(inputfiles: List[str])
+

Run the rastertool to a set of input files. By default, this implementation +recursively calls “process_file” on each input file and then calls “postprocess_files”.

+
+

Note

+

It is not meant to be overriden by subclasses. Prefer overriding process_file +and postproces_files instead.

+
+
+
Parameters:
+

inputfiles ([str]) – Input images to process

+
+
Returns:
+

([str]) The list of the generated files

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.raster_filter.html b/docs/_build/html/api/eolab.rastertools.Filtering.raster_filter.html new file mode 100644 index 00000000..7b86a86e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.raster_filter.html @@ -0,0 +1,175 @@ + + + + + + + + + Filtering.raster_filter — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.vrt_dir.html b/docs/_build/html/api/eolab.rastertools.Filtering.vrt_dir.html new file mode 100644 index 00000000..da71c5ea --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.vrt_dir.html @@ -0,0 +1,175 @@ + + + + + + + + + Filtering.vrt_dir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.window_size.html b/docs/_build/html/api/eolab.rastertools.Filtering.window_size.html new file mode 100644 index 00000000..36510a4d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.window_size.html @@ -0,0 +1,175 @@ + + + + + + + + + Filtering.window_size — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.with_filter_configuration.html b/docs/_build/html/api/eolab.rastertools.Filtering.with_filter_configuration.html new file mode 100644 index 00000000..9b3baea8 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.with_filter_configuration.html @@ -0,0 +1,188 @@ + + + + + + + + + Filtering.with_filter_configuration — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering.with_filter_configuration

+
+
+Filtering.with_filter_configuration(argsdict: Dict)[source]
+

Configure the filter with its specific arguments’ values

+
+
Parameters:
+

argsdict (dict) – Dictionary of filter’s arguments names and values. Shall contain at least +the kernel size (key=”kernel”)

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Filtering

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.with_output.html b/docs/_build/html/api/eolab.rastertools.Filtering.with_output.html new file mode 100644 index 00000000..24ed24de --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.with_output.html @@ -0,0 +1,187 @@ + + + + + + + + + Filtering.with_output — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering.with_output

+
+
+Filtering.with_output(outputdir: str = '.')
+

Set up the output.

+
+
Parameters:
+

outputdir (str, optional, default=".") – Output dir where to store results. If none, it is set to current dir

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.with_vrt_stored.html b/docs/_build/html/api/eolab.rastertools.Filtering.with_vrt_stored.html new file mode 100644 index 00000000..f8ca8390 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.with_vrt_stored.html @@ -0,0 +1,189 @@ + + + + + + + + + Filtering.with_vrt_stored — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering.with_vrt_stored

+
+
+Filtering.with_vrt_stored(keep_vrt: bool)
+

Configure if the intermediate VRT images that are generated when handling +the input files (which can be complex raster product composed of several band files) +shall be stored to disk or not - for debug purpose for instance.

+
+
Parameters:
+

keep_vrt (bool) – Whether intermediate VRT images shall be stored or not

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Filtering.with_windows.html b/docs/_build/html/api/eolab.rastertools.Filtering.with_windows.html new file mode 100644 index 00000000..c1a22c39 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Filtering.with_windows.html @@ -0,0 +1,192 @@ + + + + + + + + + Filtering.with_windows — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Filtering.with_windows

+
+
+Filtering.with_windows(window_size: int = 1024, pad_mode: str = 'edge')
+

Configure the window generation for processing image

+
+
Parameters:
+
    +
  • window_size (int, optional, default=1024) – Size of windows for splitting the processed image in small parts +so that processing can be distributed on several cpus.

  • +
  • pad_mode (str, optional, default="edge") – Mode for padding data around the windows that are on the edge of the image. +See https://numpy.org/doc/stable/reference/generated/numpy.pad.html

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.__init__.html b/docs/_build/html/api/eolab.rastertools.Hillshade.__init__.html new file mode 100644 index 00000000..d3a8e91b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.__init__.html @@ -0,0 +1,183 @@ + + + + + + + + + Hillshade.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.__init__

+
+
+Hillshade.__init__(elevation: float, azimuth: float, resolution: float, radius: int | None = None)[source]
+

Constructor for the Hillshade class.

+
+
Parameters:
+
    +
  • elevation (float) – Elevation of the sun (in degrees), 0 is vertical top (zenith).

  • +
  • azimuth (float) – Azimuth of the sun (in degrees), measured clockwise from north.

  • +
  • resolution (float) – Resolution of a raster pixel (in meters).

  • +
  • radius (int, optional) – Maximum distance from the current point (in pixels) to consider +for evaluating the hillshade. If None, the radius is calculated +based on the data range.

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.azimuth.html b/docs/_build/html/api/eolab.rastertools.Hillshade.azimuth.html new file mode 100644 index 00000000..502692a7 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.azimuth.html @@ -0,0 +1,171 @@ + + + + + + + + + Hillshade.azimuth — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.azimuth

+
+
+property Hillshade.azimuth
+

Return the azimuth of the sun (in degrees)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.elevation.html b/docs/_build/html/api/eolab.rastertools.Hillshade.elevation.html new file mode 100644 index 00000000..2b600481 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.elevation.html @@ -0,0 +1,171 @@ + + + + + + + + + Hillshade.elevation — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.elevation

+
+
+property Hillshade.elevation
+

Return the elevation of the sun (in degrees)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.html b/docs/_build/html/api/eolab.rastertools.Hillshade.html new file mode 100644 index 00000000..d6c4347a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.html @@ -0,0 +1,250 @@ + + + + + + + + + Hillshade — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade

+
+
+class eolab.rastertools.Hillshade(elevation: float, azimuth: float, resolution: float, radius: int | None = None)[source]
+

Bases: Rastertool, Windowable

+

Raster tool that computes the hillshades of a Digital Elevation / Surface / Height Model +corresponding to a given solar position.

+

The input image is a raster that contains the height of the points as pixel values.

+

At a given position p, the Hillshade tool check if the point is in the hillshade generated by +any other points in the direction of the sun. To achieve this goal, the algorithm computes the +angle \(\gamma\): \(\tan \frac{Height}{Distance}\):

+
                    _____
+                  x|     |  ^
+              x    |     |  | Height (from Digital Model)
+         x   __    |     |  |
+____p_______|  |___|     |__v____________
+    <-------------->
+        Distance
+
+
+

The point is in the hillshade of another one if \(\gamma < elevation_{sun}\). +To avoid testing too many points, the “radius” parameter defines the max distance of the pixel +to test. The radius can be set by the user or automatically computed by the Hillshade tool. In +this latter case, the radius is \(\frac{\Delta h}{\tan{elevation_{sun}}}\) where +\(\Delta h\) is \(max - min\) of the pixel values in the input raster.

+

The output image is a mask where pixels corresponding to hillshades equal to 1.

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Hillshade.azimuth

Return the azimuth of the sun (in degrees)

Hillshade.elevation

Return the elevation of the sun (in degrees)

Hillshade.keep_vrt

Whether intermediate VRT images shall be kept

Hillshade.outputdir

Path of the output directory where are stored the results

Hillshade.pad_mode

//numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty].

Hillshade.radius

Return the maximum distance from current point (in pixels) for evaluating the maximum elevation angle

Hillshade.resolution

Return the resolution of a raster pixel (in meter)

Hillshade.vrt_dir

Dir where to store intermediate VRT images

Hillshade.window_size

Size of the windows to split the image in small parts

+

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + +

Hillshade.__init__(elevation, azimuth, ...)

Constructor for the Hillshade class.

Hillshade.postprocess_files(inputfiles, ...)

Run a postprocess when all input files have been processed.

Hillshade.process_file(inputfile)

Compute hillshade for the input file.

Hillshade.process_files(inputfiles)

Run the rastertool to a set of input files.

Hillshade.with_output([outputdir])

Set up the output.

Hillshade.with_vrt_stored(keep_vrt)

Configure if the intermediate VRT images that are generated when handling the input files (which can be complex raster product composed of several band files) shall be stored to disk or not - for debug purpose for instance.

Hillshade.with_windows([window_size, pad_mode])

Configure the window generation for processing image

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.keep_vrt.html b/docs/_build/html/api/eolab.rastertools.Hillshade.keep_vrt.html new file mode 100644 index 00000000..b96ac93d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.keep_vrt.html @@ -0,0 +1,171 @@ + + + + + + + + + Hillshade.keep_vrt — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.keep_vrt

+
+
+property Hillshade.keep_vrt: bool
+

Whether intermediate VRT images shall be kept

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.outputdir.html b/docs/_build/html/api/eolab.rastertools.Hillshade.outputdir.html new file mode 100644 index 00000000..3becb1de --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.outputdir.html @@ -0,0 +1,171 @@ + + + + + + + + + Hillshade.outputdir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.outputdir

+
+
+property Hillshade.outputdir: str
+

Path of the output directory where are stored the results

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.pad_mode.html b/docs/_build/html/api/eolab.rastertools.Hillshade.pad_mode.html new file mode 100644 index 00000000..d6f56b7e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.pad_mode.html @@ -0,0 +1,177 @@ + + + + + + + + + Hillshade.pad_mode — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.pad_mode

+
+
+property Hillshade.pad_mode: str
+

//numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image +The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty].

+
+
Type:
+

Mode used to `pad <https

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.postprocess_files.html b/docs/_build/html/api/eolab.rastertools.Hillshade.postprocess_files.html new file mode 100644 index 00000000..76664f92 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.postprocess_files.html @@ -0,0 +1,192 @@ + + + + + + + + + Hillshade.postprocess_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.postprocess_files

+
+
+Hillshade.postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str]
+

Run a postprocess when all input files have been processed. This step may consist +in transforming the outputs or mixing them to generate additional ones.

+
+

Note

+

This implementation does nothing. Override this method in the subclass +to achieve special processing that needs the whole list of inputfiles +and/or the output files generated when processing every single file (to mix +them for instance).

+
+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files

  • +
+
+
+
+
Returns

[str]: Additional output files (by default empty list)

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.process_file.html b/docs/_build/html/api/eolab.rastertools.Hillshade.process_file.html new file mode 100644 index 00000000..3df2c06f --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.process_file.html @@ -0,0 +1,185 @@ + + + + + + + + + Hillshade.process_file — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.process_file

+
+
+Hillshade.process_file(inputfile: str) List[str][source]
+

Compute hillshade for the input file.

+
+
Parameters:
+

inputfile (str) – Input image file path to process.

+
+
Returns:
+

A list containing the file path of the generated hillshade image.

+
+
Return type:
+

List[str]

+
+
Raises:
+

ValueError – If the input file contains more than one band or if the radius exceeds constraints.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.process_files.html b/docs/_build/html/api/eolab.rastertools.Hillshade.process_files.html new file mode 100644 index 00000000..2f679272 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.process_files.html @@ -0,0 +1,185 @@ + + + + + + + + + Hillshade.process_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.process_files

+
+
+Hillshade.process_files(inputfiles: List[str])
+

Run the rastertool to a set of input files. By default, this implementation +recursively calls “process_file” on each input file and then calls “postprocess_files”.

+
+

Note

+

It is not meant to be overriden by subclasses. Prefer overriding process_file +and postproces_files instead.

+
+
+
Parameters:
+

inputfiles ([str]) – Input images to process

+
+
Returns:
+

([str]) The list of the generated files

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.radius.html b/docs/_build/html/api/eolab.rastertools.Hillshade.radius.html new file mode 100644 index 00000000..2dc4c1cd --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.radius.html @@ -0,0 +1,172 @@ + + + + + + + + + Hillshade.radius — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.radius

+
+
+property Hillshade.radius
+

Return the maximum distance from current point (in pixels) +for evaluating the maximum elevation angle

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.resolution.html b/docs/_build/html/api/eolab.rastertools.Hillshade.resolution.html new file mode 100644 index 00000000..2cbb6e7a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.resolution.html @@ -0,0 +1,171 @@ + + + + + + + + + Hillshade.resolution — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.resolution

+
+
+property Hillshade.resolution
+

Return the resolution of a raster pixel (in meter)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.vrt_dir.html b/docs/_build/html/api/eolab.rastertools.Hillshade.vrt_dir.html new file mode 100644 index 00000000..90c7fb14 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.vrt_dir.html @@ -0,0 +1,171 @@ + + + + + + + + + Hillshade.vrt_dir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.vrt_dir

+
+
+property Hillshade.vrt_dir: str
+

Dir where to store intermediate VRT images

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.window_size.html b/docs/_build/html/api/eolab.rastertools.Hillshade.window_size.html new file mode 100644 index 00000000..f6a7b503 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.window_size.html @@ -0,0 +1,171 @@ + + + + + + + + + Hillshade.window_size — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.window_size

+
+
+property Hillshade.window_size: int
+

Size of the windows to split the image in small parts

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.with_output.html b/docs/_build/html/api/eolab.rastertools.Hillshade.with_output.html new file mode 100644 index 00000000..509c1529 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.with_output.html @@ -0,0 +1,183 @@ + + + + + + + + + Hillshade.with_output — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.with_output

+
+
+Hillshade.with_output(outputdir: str = '.')
+

Set up the output.

+
+
Parameters:
+

outputdir (str, optional, default=".") – Output dir where to store results. If none, it is set to current dir

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.with_vrt_stored.html b/docs/_build/html/api/eolab.rastertools.Hillshade.with_vrt_stored.html new file mode 100644 index 00000000..e56d3d4a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.with_vrt_stored.html @@ -0,0 +1,185 @@ + + + + + + + + + Hillshade.with_vrt_stored — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.with_vrt_stored

+
+
+Hillshade.with_vrt_stored(keep_vrt: bool)
+

Configure if the intermediate VRT images that are generated when handling +the input files (which can be complex raster product composed of several band files) +shall be stored to disk or not - for debug purpose for instance.

+
+
Parameters:
+

keep_vrt (bool) – Whether intermediate VRT images shall be stored or not

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Hillshade.with_windows.html b/docs/_build/html/api/eolab.rastertools.Hillshade.with_windows.html new file mode 100644 index 00000000..4a41e579 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Hillshade.with_windows.html @@ -0,0 +1,188 @@ + + + + + + + + + Hillshade.with_windows — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Hillshade.with_windows

+
+
+Hillshade.with_windows(window_size: int = 1024, pad_mode: str = 'edge')
+

Configure the window generation for processing image

+
+
Parameters:
+
    +
  • window_size (int, optional, default=1024) – Size of windows for splitting the processed image in small parts +so that processing can be distributed on several cpus.

  • +
  • pad_mode (str, optional, default="edge") – Mode for padding data around the windows that are on the edge of the image. +See https://numpy.org/doc/stable/reference/generated/numpy.pad.html

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.__init__.html b/docs/_build/html/api/eolab.rastertools.Radioindice.__init__.html new file mode 100644 index 00000000..61600abc --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.__init__.html @@ -0,0 +1,196 @@ + + + + + + + + + Radioindice.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.__init__

+
+
+Radioindice.__init__(indices: List[RadioindiceProcessing])[source]
+

Constructor

+
+
Parameters:
+

indices ([eolab.rastertools.processing.RadioindiceProcessing]) – List of indices to compute (class Indice)

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.bi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.bi.html new file mode 100644 index 00000000..261c834c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.bi.html @@ -0,0 +1,194 @@ + + + + + + + + + Radioindice.bi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.bi

+
+
+Radioindice.bi = bi
+

Brightness index (red, green channels)

+
+\[bi = \frac{red^2 + green^2}{2}\]
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.bi2.html b/docs/_build/html/api/eolab.rastertools.Radioindice.bi2.html new file mode 100644 index 00000000..b47abc6e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.bi2.html @@ -0,0 +1,194 @@ + + + + + + + + + Radioindice.bi2 — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.bi2

+
+
+Radioindice.bi2 = bi2
+

Brightness index (nir, red, green channels)

+
+\[bi2 = \frac{nir^2 + red^2 + green^2}{3}\]
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.evi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.evi.html new file mode 100644 index 00000000..e2f1d34c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.evi.html @@ -0,0 +1,194 @@ + + + + + + + + + Radioindice.evi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.evi

+
+
+Radioindice.evi = evi
+

Enhanced vegetation index (red, nir, blue channels)

+
+\[evi = \frac{2.5 * (nir - red)}{nir + 6.0 * red - 7.5 * blue + 1.0}\]
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.get_default_indices.html b/docs/_build/html/api/eolab.rastertools.Radioindice.get_default_indices.html new file mode 100644 index 00000000..a2047baf --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.get_default_indices.html @@ -0,0 +1,200 @@ + + + + + + + + + Radioindice.get_default_indices — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.get_default_indices

+
+
+static Radioindice.get_default_indices()[source]
+

Get the list of predefined radiometric indices

+
+
Returns:
+

list of +predefined radioindice.

+
+
Return type:
+

[eolab.rastertools.processing.RadioindiceProcessing]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.html b/docs/_build/html/api/eolab.rastertools.Radioindice.html new file mode 100644 index 00000000..4bdc5307 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.html @@ -0,0 +1,319 @@ + + + + + + + + + Radioindice — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice

+
+
+class eolab.rastertools.Radioindice(indices: List[RadioindiceProcessing])[source]
+

Bases: Rastertool, Windowable

+

Raster tool that computes radiometric indices of a raster product.

+

If several indices are requested, the tool can generate one output image with one +band per indice (merge=True), or it can generate several images, one image per indice +(merge=False).

+

The computation can be realized on a subset of the input image (a Region Of Interest) +defined by a vector file (e.g. shapefile, geojson).

+

The radiometric indice is an instance of +eolab.rastertools.processing.RadioindiceProcessing +which defines the list of channels it needs to compute the indice. The input raster product +must be of a recognized raster type so that it is possible to match every channels required by +the indice with an existing band in the raster product.

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Radioindice.bi

Brightness index (red, green channels)

Radioindice.bi2

Brightness index (nir, red, green channels)

Radioindice.evi

Enhanced vegetation index (red, nir, blue channels)

Radioindice.indices

List of radiometric indices to compute

Radioindice.ipvi

Infrared Percentage Vegetation Index (red, nir channels)

Radioindice.keep_vrt

Whether intermediate VRT images shall be kept

Radioindice.merge

If true, all indices are in the same output image (one band per indice).

Radioindice.mndwi

Modified Normalized Difference Water Index (green, mir channels)

Radioindice.msavi

Modified Soil Adjusted Vegetation Index (red, nir channels)

Radioindice.msavi2

Modified Soil Adjusted Vegetation Index (red, nir channels)

Radioindice.ndbi

Normalized Difference Built Up Index (nir, mir channels)

Radioindice.ndpi

Normalized Difference Pond Index (green, mir channels)

Radioindice.ndti

Normalized Difference Turbidity Index (green, red channels)

Radioindice.ndvi

Normalized Difference Vegetation Index (red, nir channels)

Radioindice.ndwi

Normalized Difference Water Index (mir, nir channels)

Radioindice.ndwi2

Normalized Difference Water Index (nir, green channels)

Radioindice.outputdir

Path of the output directory where are stored the results

Radioindice.pad_mode

//numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty].

Radioindice.pvi

Perpendicular Vegetation Index (red, nir channels)

Radioindice.ri

Redness index (red, green channels)

Radioindice.roi

Filename of the vector data defining the ROI

Radioindice.rvi

Ratio Vegetation Index (red, nir channels)

Radioindice.savi

Soil Adjusted Vegetation Index (red, nir channels)

Radioindice.tndvi

Transformed Normalized Difference Vegetation Index (red, nir channels)

Radioindice.tsavi

Transformed Soil Adjusted Vegetation Index (red, nir channels)

Radioindice.vrt_dir

Dir where to store intermediate VRT images

Radioindice.window_size

Size of the windows to split the image in small parts

+

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Radioindice.__init__(indices)

Constructor

Radioindice.get_default_indices()

Get the list of predefined radiometric indices

Radioindice.postprocess_files(inputfiles, ...)

Run a postprocess when all input files have been processed.

Radioindice.process_file(inputfile)

Compute the indices for a single file

Radioindice.process_files(inputfiles)

Run the rastertool to a set of input files.

Radioindice.with_output([outputdir, merge])

Set up the output.

Radioindice.with_roi(roi)

Set up the region of interest

Radioindice.with_vrt_stored(keep_vrt)

Configure if the intermediate VRT images that are generated when handling the input files (which can be complex raster product composed of several band files) shall be stored to disk or not - for debug purpose for instance.

Radioindice.with_windows([window_size, pad_mode])

Configure the window generation for processing image

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.indices.html b/docs/_build/html/api/eolab.rastertools.Radioindice.indices.html new file mode 100644 index 00000000..2ef1f8e6 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.indices.html @@ -0,0 +1,191 @@ + + + + + + + + + Radioindice.indices — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.indices

+
+
+property Radioindice.indices: List[RadioindiceProcessing]
+

List of radiometric indices to compute

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.ipvi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.ipvi.html new file mode 100644 index 00000000..ccbd11a7 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.ipvi.html @@ -0,0 +1,197 @@ + + + + + + + + + Radioindice.ipvi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.ipvi

+
+
+Radioindice.ipvi = ipvi
+

Infrared Percentage Vegetation Index (red, nir channels)

+
+\[ipvi = \frac{nir}{nir + red}\]
+

References

+

Crippen, R. E. 1990. Calculating the Vegetation Index Faster, Remote Sensing of +Environment, vol 34., pp. 71-73.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.keep_vrt.html b/docs/_build/html/api/eolab.rastertools.Radioindice.keep_vrt.html new file mode 100644 index 00000000..b5427a0d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.keep_vrt.html @@ -0,0 +1,191 @@ + + + + + + + + + Radioindice.keep_vrt — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.keep_vrt

+
+
+property Radioindice.keep_vrt: bool
+

Whether intermediate VRT images shall be kept

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.merge.html b/docs/_build/html/api/eolab.rastertools.Radioindice.merge.html new file mode 100644 index 00000000..6fbf662b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.merge.html @@ -0,0 +1,192 @@ + + + + + + + + + Radioindice.merge — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.merge

+
+
+property Radioindice.merge: bool
+

If true, all indices are in the same output image (one band per indice). +Otherwise, each indice is in its own output image.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.mndwi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.mndwi.html new file mode 100644 index 00000000..626c47e3 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.mndwi.html @@ -0,0 +1,198 @@ + + + + + + + + + Radioindice.mndwi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.mndwi

+
+
+Radioindice.mndwi = mndwi
+

Modified Normalized Difference Water Index (green, mir channels)

+
+\[mndwi = \frac{green - mir}{green + mir}\]
+

References

+

Xu, H. Q., 2006. Modification of normalised difference water index (NDWI) to enhance +open water features in remotely sensed imagery. International Journal of Remote Sensing +27, 3025-3033

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.msavi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.msavi.html new file mode 100644 index 00000000..0d7a5a32 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.msavi.html @@ -0,0 +1,204 @@ + + + + + + + + + Radioindice.msavi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.msavi

+
+
+Radioindice.msavi = msavi
+

Modified Soil Adjusted Vegetation Index (red, nir channels)

+
+\begin{eqnarray} + wdvi & = & nir - 0.4 * red \\ + ndvi & = & \frac{nir - red}{nir + red} \\ + L & = & 1 - 2 * 0.4 * ndvi * wdvi \\ + msavi & = & \frac{(nir - red) * (1 + L)}{nir + red + L} +\end{eqnarray}

References

+

Qi J., Chehbouni A., Huete A.R., Kerr Y.H., 1994. Modified Soil Adjusted Vegetation +Index (MSAVI). Remote Sens Environ 48:119-126

+

Qi J., Kerr Y., Chehbouni A., 1994. External factor consideration in vegetation index +development. Proc. of Physical Measurements and Signatures in Remote Sensing, +ISPRS, 723-730.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.msavi2.html b/docs/_build/html/api/eolab.rastertools.Radioindice.msavi2.html new file mode 100644 index 00000000..6c228002 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.msavi2.html @@ -0,0 +1,196 @@ + + + + + + + + + Radioindice.msavi2 — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.msavi2

+
+
+Radioindice.msavi2 = msavi2
+

Modified Soil Adjusted Vegetation Index (red, nir channels)

+
+\begin{eqnarray} + val & = & (2 * nir + 1)^2 - 8 * (nir - red) \\ + msavi2 & = & (2 * nir + 1 - \sqrt{val}) / 2 +\end{eqnarray}
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.ndbi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.ndbi.html new file mode 100644 index 00000000..bdfba7d2 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.ndbi.html @@ -0,0 +1,194 @@ + + + + + + + + + Radioindice.ndbi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.ndbi

+
+
+Radioindice.ndbi = ndbi
+

Normalized Difference Built Up Index (nir, mir channels)

+
+\[ndbi = \frac{mir - nir}{mir + nir}\]
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.ndpi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.ndpi.html new file mode 100644 index 00000000..1b48a243 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.ndpi.html @@ -0,0 +1,198 @@ + + + + + + + + + Radioindice.ndpi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.ndpi

+
+
+Radioindice.ndpi = ndpi
+

Normalized Difference Pond Index (green, mir channels)

+
+\[ndpi = \frac{mir - green}{mir + green}\]
+

References

+

J-P. Lacaux, Y. M. Tourre, C. Vignolle, J-A. Ndione, and M. Lafaye, “Classification +of Ponds from High-Spatial Resolution Remote Sensing: Application to Rift Valley Fever +Epidemics in Senegal,” Remote Sensing of Environment 106 66–74, Elsevier Publishers: 2007

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.ndti.html b/docs/_build/html/api/eolab.rastertools.Radioindice.ndti.html new file mode 100644 index 00000000..bd57ab8b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.ndti.html @@ -0,0 +1,198 @@ + + + + + + + + + Radioindice.ndti — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.ndti

+
+
+Radioindice.ndti = ndti
+

Normalized Difference Turbidity Index (green, red channels)

+
+\[ndti = \frac{red - green}{red + green}\]
+

References

+

J-P. Lacaux, Y. M. Tourre, C. Vignolle, J-A. Ndione, and M. Lafaye, “Classification +of Ponds from High-Spatial Resolution Remote Sensing: Application to Rift Valley Fever +Epidemics in Senegal,” Remote Sensing of Environment 106 66–74, Elsevier Publishers: 2007

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.ndvi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.ndvi.html new file mode 100644 index 00000000..fd5cce36 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.ndvi.html @@ -0,0 +1,199 @@ + + + + + + + + + Radioindice.ndvi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.ndvi

+
+
+Radioindice.ndvi = ndvi
+

Normalized Difference Vegetation Index (red, nir channels)

+
+\[ndvi = \frac{nir - red}{nir + red}\]
+

References

+

Rouse J.W., Haas R.H., Schell J.A., Deering D.W., 1973. Monitoring vegetation systems in +the great plains with ERTS. Third ERTS Symposium, NASA SP-351. 1:309-317

+

Tucker C.J., 1979. Red and photographic infrared linear combinations for monitoring +vegetation. Remote Sens Environ 8:127-150

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.ndwi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.ndwi.html new file mode 100644 index 00000000..d03e4a07 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.ndwi.html @@ -0,0 +1,197 @@ + + + + + + + + + Radioindice.ndwi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.ndwi

+
+
+Radioindice.ndwi = ndwi
+

Normalized Difference Water Index (mir, nir channels)

+
+\[ndwi = \frac{nir - mir}{nir + mir}\]
+

References

+

Gao, B. C., 1996. NDWI - A normalized difference water index for remote sensing +of vegetation liquid water from space. Remote Sensing of Environment 58, 257-266.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.ndwi2.html b/docs/_build/html/api/eolab.rastertools.Radioindice.ndwi2.html new file mode 100644 index 00000000..ad7f6a3d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.ndwi2.html @@ -0,0 +1,194 @@ + + + + + + + + + Radioindice.ndwi2 — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.ndwi2

+
+
+Radioindice.ndwi2 = ndwi2
+

Normalized Difference Water Index (nir, green channels)

+
+\[ndwi2 = \frac{green - nir}{green + nir}\]
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.outputdir.html b/docs/_build/html/api/eolab.rastertools.Radioindice.outputdir.html new file mode 100644 index 00000000..99986aff --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.outputdir.html @@ -0,0 +1,191 @@ + + + + + + + + + Radioindice.outputdir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.outputdir

+
+
+property Radioindice.outputdir: str
+

Path of the output directory where are stored the results

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.pad_mode.html b/docs/_build/html/api/eolab.rastertools.Radioindice.pad_mode.html new file mode 100644 index 00000000..18307fe6 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.pad_mode.html @@ -0,0 +1,197 @@ + + + + + + + + + Radioindice.pad_mode — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.pad_mode

+
+
+property Radioindice.pad_mode: str
+

//numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image +The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty].

+
+
Type:
+

Mode used to `pad <https

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.postprocess_files.html b/docs/_build/html/api/eolab.rastertools.Radioindice.postprocess_files.html new file mode 100644 index 00000000..5481815b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.postprocess_files.html @@ -0,0 +1,212 @@ + + + + + + + + + Radioindice.postprocess_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.postprocess_files

+
+
+Radioindice.postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str]
+

Run a postprocess when all input files have been processed. This step may consist +in transforming the outputs or mixing them to generate additional ones.

+
+

Note

+

This implementation does nothing. Override this method in the subclass +to achieve special processing that needs the whole list of inputfiles +and/or the output files generated when processing every single file (to mix +them for instance).

+
+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files

  • +
+
+
+
+
Returns

[str]: Additional output files (by default empty list)

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.process_file.html b/docs/_build/html/api/eolab.rastertools.Radioindice.process_file.html new file mode 100644 index 00000000..39482425 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.process_file.html @@ -0,0 +1,202 @@ + + + + + + + + + Radioindice.process_file — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.process_file

+
+
+Radioindice.process_file(inputfile: str) List[str][source]
+

Compute the indices for a single file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

List of indice images (posix paths) that have been generated

+
+
Return type:
+

[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.process_files.html b/docs/_build/html/api/eolab.rastertools.Radioindice.process_files.html new file mode 100644 index 00000000..8695a9cb --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.process_files.html @@ -0,0 +1,205 @@ + + + + + + + + + Radioindice.process_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.process_files

+
+
+Radioindice.process_files(inputfiles: List[str])
+

Run the rastertool to a set of input files. By default, this implementation +recursively calls “process_file” on each input file and then calls “postprocess_files”.

+
+

Note

+

It is not meant to be overriden by subclasses. Prefer overriding process_file +and postproces_files instead.

+
+
+
Parameters:
+

inputfiles ([str]) – Input images to process

+
+
Returns:
+

([str]) The list of the generated files

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.pvi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.pvi.html new file mode 100644 index 00000000..4127cef0 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.pvi.html @@ -0,0 +1,197 @@ + + + + + + + + + Radioindice.pvi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.pvi

+
+
+Radioindice.pvi = pvi
+

Perpendicular Vegetation Index (red, nir channels)

+
+\[pvi = (nir - 0.90893 * red - 7.46216) * 0.74\]
+

References

+

Richardson A.J., Wiegand C.L., 1977. Distinguishing vegetation from soil background +information. Photogramm Eng Rem S 43-1541-1552

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.ri.html b/docs/_build/html/api/eolab.rastertools.Radioindice.ri.html new file mode 100644 index 00000000..5d9b1229 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.ri.html @@ -0,0 +1,194 @@ + + + + + + + + + Radioindice.ri — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.ri

+
+
+Radioindice.ri = ri
+

Redness index (red, green channels)

+
+\[ri = \frac{red^2}{green^3}\]
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.roi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.roi.html new file mode 100644 index 00000000..d501f7bb --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.roi.html @@ -0,0 +1,191 @@ + + + + + + + + + Radioindice.roi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.roi

+
+
+property Radioindice.roi: str
+

Filename of the vector data defining the ROI

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.rvi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.rvi.html new file mode 100644 index 00000000..3b3faa5e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.rvi.html @@ -0,0 +1,197 @@ + + + + + + + + + Radioindice.rvi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.rvi

+
+
+Radioindice.rvi = rvi
+

Ratio Vegetation Index (red, nir channels)

+
+\[rvi = \frac{nir}{red}\]
+

References

+

Jordan C.F., 1969. Derivation of leaf area index from quality of light on the forest +floor. Ecology 50:663-666

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.savi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.savi.html new file mode 100644 index 00000000..26e6734d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.savi.html @@ -0,0 +1,196 @@ + + + + + + + + + Radioindice.savi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.savi

+
+
+Radioindice.savi = savi
+

Soil Adjusted Vegetation Index (red, nir channels)

+
+\[savi = \frac{(nir - red) * (1. + 0.5)}{nir + red + 0.5}\]
+

References

+

Huete A.R., 1988. A soil-adjusted vegetation index (SAVI). Remote Sens Environ 25:295-309

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.tndvi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.tndvi.html new file mode 100644 index 00000000..d6d843e5 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.tndvi.html @@ -0,0 +1,201 @@ + + + + + + + + + Radioindice.tndvi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.tndvi

+
+
+Radioindice.tndvi = tndvi
+

Transformed Normalized Difference Vegetation Index (red, nir channels)

+
+\begin{eqnarray} + ndvi & = & \frac{nir - red}{nir + red} \\ + tndvi & = & \sqrt{ndvi + 0.5} +\end{eqnarray}

References

+

Deering D.W., Rouse J.W., Haas R.H., and Schell J.A., 1975. Measuring forage production +of grazing units from Landsat MSS data. Pages 1169-1178 In: Cook J.J. (Ed.), Proceedings +of the Tenth International Symposium on Remote Sensing of Environment (Ann Arbor, 1975), +Vol. 2, Ann Arbor, Michigan, USA.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.tsavi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.tsavi.html new file mode 100644 index 00000000..2bdf9615 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.tsavi.html @@ -0,0 +1,198 @@ + + + + + + + + + Radioindice.tsavi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.tsavi

+
+
+Radioindice.tsavi = tsavi
+

Transformed Soil Adjusted Vegetation Index (red, nir channels)

+
+\[tsavi = \frac{0.7 * (nir - 0.7 * red - 0.9)}{0.7 * nir + red + 0.08 * (1 + 0.7^2)}\]
+

References

+

Baret F., Guyot G., Major D., 1989. TSAVI: a vegetation index which minimizes soil +brightness effects on LAI or APAR estimation. 12th Canadian Symposium on Remote +Sensing and IGARSS 1990, Vancouver, Canada, 07/10-14.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.vrt_dir.html b/docs/_build/html/api/eolab.rastertools.Radioindice.vrt_dir.html new file mode 100644 index 00000000..bbf34e7c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.vrt_dir.html @@ -0,0 +1,191 @@ + + + + + + + + + Radioindice.vrt_dir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.vrt_dir

+
+
+property Radioindice.vrt_dir: str
+

Dir where to store intermediate VRT images

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.window_size.html b/docs/_build/html/api/eolab.rastertools.Radioindice.window_size.html new file mode 100644 index 00000000..8f0793f8 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.window_size.html @@ -0,0 +1,191 @@ + + + + + + + + + Radioindice.window_size — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.window_size

+
+
+property Radioindice.window_size: int
+

Size of the windows to split the image in small parts

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.with_output.html b/docs/_build/html/api/eolab.rastertools.Radioindice.with_output.html new file mode 100644 index 00000000..9a23e841 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.with_output.html @@ -0,0 +1,206 @@ + + + + + + + + + Radioindice.with_output — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.with_output

+
+
+Radioindice.with_output(outputdir: str = '.', merge: bool = False)[source]
+

Set up the output.

+
+
Parameters:
+
    +
  • outputdir (str, optional, default=".") – Output dir where to store results. If none, it is set to current dir

  • +
  • merge (bool, optional, default=False) – Whether to merge all indices in the same image (i.e. one band per indice)

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Radioindice

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.with_roi.html b/docs/_build/html/api/eolab.rastertools.Radioindice.with_roi.html new file mode 100644 index 00000000..0ec24784 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.with_roi.html @@ -0,0 +1,204 @@ + + + + + + + + + Radioindice.with_roi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.with_roi

+
+
+Radioindice.with_roi(roi: str)[source]
+

Set up the region of interest

+
+
Parameters:
+

roi (str) – Filename of the vector data defining the ROI +(output images will be cropped to the geometry)

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Radioindice

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.with_vrt_stored.html b/docs/_build/html/api/eolab.rastertools.Radioindice.with_vrt_stored.html new file mode 100644 index 00000000..3fb35b0d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.with_vrt_stored.html @@ -0,0 +1,205 @@ + + + + + + + + + Radioindice.with_vrt_stored — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.with_vrt_stored

+
+
+Radioindice.with_vrt_stored(keep_vrt: bool)
+

Configure if the intermediate VRT images that are generated when handling +the input files (which can be complex raster product composed of several band files) +shall be stored to disk or not - for debug purpose for instance.

+
+
Parameters:
+

keep_vrt (bool) – Whether intermediate VRT images shall be stored or not

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Radioindice.with_windows.html b/docs/_build/html/api/eolab.rastertools.Radioindice.with_windows.html new file mode 100644 index 00000000..1e283b9b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Radioindice.with_windows.html @@ -0,0 +1,208 @@ + + + + + + + + + Radioindice.with_windows — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Radioindice.with_windows

+
+
+Radioindice.with_windows(window_size: int = 1024, pad_mode: str = 'edge')
+

Configure the window generation for processing image

+
+
Parameters:
+
    +
  • window_size (int, optional, default=1024) – Size of windows for splitting the processed image in small parts +so that processing can be distributed on several cpus.

  • +
  • pad_mode (str, optional, default="edge") – Mode for padding data around the windows that are on the edge of the image. +See https://numpy.org/doc/stable/reference/generated/numpy.pad.html

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Rastertool.__init__.html b/docs/_build/html/api/eolab.rastertools.Rastertool.__init__.html new file mode 100644 index 00000000..90e2599c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Rastertool.__init__.html @@ -0,0 +1,159 @@ + + + + + + + + + Rastertool.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Rastertool.__init__

+
+
+Rastertool.__init__()[source]
+

Constructor

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Rastertool.html b/docs/_build/html/api/eolab.rastertools.Rastertool.html new file mode 100644 index 00000000..9140db1e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Rastertool.html @@ -0,0 +1,202 @@ + + + + + + + + + Rastertool — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Rastertool

+
+
+class eolab.rastertools.Rastertool[source]
+

Bases: ABC

+

Base class for every raster tool which contains the common configuration:

+
    +
  • the output dir where to store the results (by default, current dir)

  • +
  • whether to save to disk the intermediate VRT images that can be created when +handling the input raster products (that can be an archive of several band files for +example). This parameter is mainly for debug purpose and is False by default.

  • +
+

Attributes

+ + + + + + + + + + + + +

Rastertool.keep_vrt

Whether intermediate VRT images shall be kept

Rastertool.outputdir

Path of the output directory where are stored the results

Rastertool.vrt_dir

Dir where to store intermediate VRT images

+

Methods

+ + + + + + + + + + + + + + + + + + + + + +

Rastertool.__init__()

Constructor

Rastertool.postprocess_files(inputfiles, ...)

Run a postprocess when all input files have been processed.

Rastertool.process_file(inputfile)

Run the rastertool to a single input file.

Rastertool.process_files(inputfiles)

Run the rastertool to a set of input files.

Rastertool.with_output([outputdir])

Set up the output.

Rastertool.with_vrt_stored(keep_vrt)

Configure if the intermediate VRT images that are generated when handling the input files (which can be complex raster product composed of several band files) shall be stored to disk or not - for debug purpose for instance.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Rastertool.keep_vrt.html b/docs/_build/html/api/eolab.rastertools.Rastertool.keep_vrt.html new file mode 100644 index 00000000..9513fb3a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Rastertool.keep_vrt.html @@ -0,0 +1,159 @@ + + + + + + + + + Rastertool.keep_vrt — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Rastertool.keep_vrt

+
+
+property Rastertool.keep_vrt: bool
+

Whether intermediate VRT images shall be kept

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Rastertool.outputdir.html b/docs/_build/html/api/eolab.rastertools.Rastertool.outputdir.html new file mode 100644 index 00000000..35760623 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Rastertool.outputdir.html @@ -0,0 +1,159 @@ + + + + + + + + + Rastertool.outputdir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Rastertool.outputdir

+
+
+property Rastertool.outputdir: str
+

Path of the output directory where are stored the results

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Rastertool.postprocess_files.html b/docs/_build/html/api/eolab.rastertools.Rastertool.postprocess_files.html new file mode 100644 index 00000000..ddc607f6 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Rastertool.postprocess_files.html @@ -0,0 +1,180 @@ + + + + + + + + + Rastertool.postprocess_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Rastertool.postprocess_files

+
+
+Rastertool.postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str][source]
+

Run a postprocess when all input files have been processed. This step may consist +in transforming the outputs or mixing them to generate additional ones.

+
+

Note

+

This implementation does nothing. Override this method in the subclass +to achieve special processing that needs the whole list of inputfiles +and/or the output files generated when processing every single file (to mix +them for instance).

+
+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files

  • +
+
+
+
+
Returns

[str]: Additional output files (by default empty list)

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Rastertool.process_file.html b/docs/_build/html/api/eolab.rastertools.Rastertool.process_file.html new file mode 100644 index 00000000..0398cb1c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Rastertool.process_file.html @@ -0,0 +1,175 @@ + + + + + + + + + Rastertool.process_file — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Rastertool.process_file

+
+
+Rastertool.process_file(inputfile: str) List[str][source]
+

Run the rastertool to a single input file.

+
+

Note

+

This implementation does nothing. Override this method in the subclass +to achieve special processing of an inputfile.

+
+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

List of generated files (by default empty list)

+
+
Return type:
+

[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Rastertool.process_files.html b/docs/_build/html/api/eolab.rastertools.Rastertool.process_files.html new file mode 100644 index 00000000..39b9d627 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Rastertool.process_files.html @@ -0,0 +1,173 @@ + + + + + + + + + Rastertool.process_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Rastertool.process_files

+
+
+Rastertool.process_files(inputfiles: List[str])[source]
+

Run the rastertool to a set of input files. By default, this implementation +recursively calls “process_file” on each input file and then calls “postprocess_files”.

+
+

Note

+

It is not meant to be overriden by subclasses. Prefer overriding process_file +and postproces_files instead.

+
+
+
Parameters:
+

inputfiles ([str]) – Input images to process

+
+
Returns:
+

([str]) The list of the generated files

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Rastertool.vrt_dir.html b/docs/_build/html/api/eolab.rastertools.Rastertool.vrt_dir.html new file mode 100644 index 00000000..412550ab --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Rastertool.vrt_dir.html @@ -0,0 +1,159 @@ + + + + + + + + + Rastertool.vrt_dir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Rastertool.vrt_dir

+
+
+property Rastertool.vrt_dir: str
+

Dir where to store intermediate VRT images

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Rastertool.with_output.html b/docs/_build/html/api/eolab.rastertools.Rastertool.with_output.html new file mode 100644 index 00000000..3a47114c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Rastertool.with_output.html @@ -0,0 +1,171 @@ + + + + + + + + + Rastertool.with_output — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Rastertool.with_output

+
+
+Rastertool.with_output(outputdir: str = '.')[source]
+

Set up the output.

+
+
Parameters:
+

outputdir (str, optional, default=".") – Output dir where to store results. If none, it is set to current dir

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Rastertool.with_vrt_stored.html b/docs/_build/html/api/eolab.rastertools.Rastertool.with_vrt_stored.html new file mode 100644 index 00000000..1564b4d4 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Rastertool.with_vrt_stored.html @@ -0,0 +1,173 @@ + + + + + + + + + Rastertool.with_vrt_stored — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Rastertool.with_vrt_stored

+
+
+Rastertool.with_vrt_stored(keep_vrt: bool)[source]
+

Configure if the intermediate VRT images that are generated when handling +the input files (which can be complex raster product composed of several band files) +shall be stored to disk or not - for debug purpose for instance.

+
+
Parameters:
+

keep_vrt (bool) – Whether intermediate VRT images shall be stored or not

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.RastertoolConfigurationException.html b/docs/_build/html/api/eolab.rastertools.RastertoolConfigurationException.html new file mode 100644 index 00000000..24d0e678 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.RastertoolConfigurationException.html @@ -0,0 +1,150 @@ + + + + + + + + + RastertoolConfigurationException — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

RastertoolConfigurationException

+
+
+exception eolab.rastertools.RastertoolConfigurationException[source]
+

This class defines an exception that is raised when the configuration of the raster tool +is invalid (wrong input parameter)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.__init__.html b/docs/_build/html/api/eolab.rastertools.SVF.__init__.html new file mode 100644 index 00000000..3933a1c0 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.__init__.html @@ -0,0 +1,182 @@ + + + + + + + + + SVF.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.__init__

+
+
+SVF.__init__(nb_directions: int, radius: int, resolution: float)[source]
+

Constructor

+
+
Parameters:
+
    +
  • nb_directions (int) – Number of directions to compute the SVF

  • +
  • radius (int) – Max distance from current point (in pixels) to consider +for evaluating the max elevation angle

  • +
  • resolution (float) – Resolution of the input Digital Height Model (in meter)

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.altitude.html b/docs/_build/html/api/eolab.rastertools.SVF.altitude.html new file mode 100644 index 00000000..3712622e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.altitude.html @@ -0,0 +1,173 @@ + + + + + + + + + SVF.altitude — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.altitude

+
+
+property SVF.altitude
+

The altitude at which SVF is computed. If None, the SVF is computed +at the altitude of the point.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.html b/docs/_build/html/api/eolab.rastertools.SVF.html new file mode 100644 index 00000000..8578b732 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.html @@ -0,0 +1,265 @@ + + + + + + + + + SVF — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF

+
+
+class eolab.rastertools.SVF(nb_directions: int, radius: int, resolution: float)[source]
+

Bases: Rastertool, Windowable

+

Raster tool that computes the Sky View Factor (SVF) of a +Digital Elevation / Surface / Height Model.

+

Kokalj, Žiga & all 2013:

+

SVF is a geophysical parameter that measures the portion of the sky visible from a certain +point. The portion of the sky visible above the surface is especially relevant in energy balance +studies and computation of diffuse solar insolation.

+

Sky-view factor is defined as the proportion of visible sky (\(\Omega\)) above a certain +observation point as seen from a two-dimensional representation.

+

The light that falls from the sky onto a certain part of the surface is reduced by the obstacles +that form the horizon. These obstacles can be described in all directions by the vertical +elevation angle above the horizontal plane.

+

A good SVF approximation can therefore be performed with the estimate of this angle +in several directions. After the vertical elevation angle is determined in the chosen +number of directions n, the SVF is determined as a sum of all portions of the sky within +each direction: \(\sum \frac {\cos \gamma_i}{n}\), where \(\gamma_i\) is the +vertical angle of the horizon in the`direction i.

+

The angle \(\gamma\) is extracted from the Digital Model: +\(\tan \frac{Height}{Distance}\):

+
                    _____
+                  x|     |  ^
+              x    |     |  | Height (from Digital Model)
+         x   __    |     |  |
+____p_______|  |___|     |__v____________
+    <-------------->
+        Distance
+
+
+

Where p is the current pixel where the SVF is computed.

+

In a direction, the algorithm computes all angles and keeps the largest one. To avoid testing +too many points, the “radius” parameter defines the max distance of the pixel to test.

+

The output image of SVF rastertool is a raster image with the SVF value computed at every pixels +of the input Digital Height Model.

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

SVF.altitude

The altitude at which SVF is computed.

SVF.keep_vrt

Whether intermediate VRT images shall be kept

SVF.nb_directions

Number of directions to compute the SVF

SVF.outputdir

Path of the output directory where are stored the results

SVF.pad_mode

//numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty].

SVF.radius

Max distance from current point (in pixels) to consider for evaluating the max elevation angle

SVF.resolution

Resolution of the input Digital Height Model (in meter)

SVF.vrt_dir

Dir where to store intermediate VRT images

SVF.window_size

Size of the windows to split the image in small parts

+

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

SVF.__init__(nb_directions, radius, resolution)

Constructor

SVF.postprocess_files(inputfiles, outputfiles)

Run a postprocess when all input files have been processed.

SVF.process_file(inputfile)

Compute SVF for the input file

SVF.process_files(inputfiles)

Run the rastertool to a set of input files.

SVF.with_altitude(altitude)

Configure the altitude at which the Sky View Factor shall be computed.

SVF.with_output([outputdir])

Set up the output.

SVF.with_vrt_stored(keep_vrt)

Configure if the intermediate VRT images that are generated when handling the input files (which can be complex raster product composed of several band files) shall be stored to disk or not - for debug purpose for instance.

SVF.with_windows([window_size, pad_mode])

Configure the window generation for processing image

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.keep_vrt.html b/docs/_build/html/api/eolab.rastertools.SVF.keep_vrt.html new file mode 100644 index 00000000..6b1c2ea5 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.keep_vrt.html @@ -0,0 +1,172 @@ + + + + + + + + + SVF.keep_vrt — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.keep_vrt

+
+
+property SVF.keep_vrt: bool
+

Whether intermediate VRT images shall be kept

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.nb_directions.html b/docs/_build/html/api/eolab.rastertools.SVF.nb_directions.html new file mode 100644 index 00000000..ecc5cd48 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.nb_directions.html @@ -0,0 +1,172 @@ + + + + + + + + + SVF.nb_directions — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.nb_directions

+
+
+property SVF.nb_directions
+

Number of directions to compute the SVF

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.outputdir.html b/docs/_build/html/api/eolab.rastertools.SVF.outputdir.html new file mode 100644 index 00000000..54a63ea6 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.outputdir.html @@ -0,0 +1,172 @@ + + + + + + + + + SVF.outputdir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.outputdir

+
+
+property SVF.outputdir: str
+

Path of the output directory where are stored the results

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.pad_mode.html b/docs/_build/html/api/eolab.rastertools.SVF.pad_mode.html new file mode 100644 index 00000000..f87aed47 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.pad_mode.html @@ -0,0 +1,178 @@ + + + + + + + + + SVF.pad_mode — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.pad_mode

+
+
+property SVF.pad_mode: str
+

//numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image +The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty].

+
+
Type:
+

Mode used to `pad <https

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.postprocess_files.html b/docs/_build/html/api/eolab.rastertools.SVF.postprocess_files.html new file mode 100644 index 00000000..96bbf24f --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.postprocess_files.html @@ -0,0 +1,193 @@ + + + + + + + + + SVF.postprocess_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.postprocess_files

+
+
+SVF.postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str]
+

Run a postprocess when all input files have been processed. This step may consist +in transforming the outputs or mixing them to generate additional ones.

+
+

Note

+

This implementation does nothing. Override this method in the subclass +to achieve special processing that needs the whole list of inputfiles +and/or the output files generated when processing every single file (to mix +them for instance).

+
+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files

  • +
+
+
+
+
Returns

[str]: Additional output files (by default empty list)

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.process_file.html b/docs/_build/html/api/eolab.rastertools.SVF.process_file.html new file mode 100644 index 00000000..61dbd6ab --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.process_file.html @@ -0,0 +1,183 @@ + + + + + + + + + SVF.process_file — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.process_file

+
+
+SVF.process_file(inputfile: str)[source]
+

Compute SVF for the input file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

A list containing a single element: the generated Sky View Factor image.

+
+
Return type:
+

[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.process_files.html b/docs/_build/html/api/eolab.rastertools.SVF.process_files.html new file mode 100644 index 00000000..f65cb5f1 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.process_files.html @@ -0,0 +1,186 @@ + + + + + + + + + SVF.process_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.process_files

+
+
+SVF.process_files(inputfiles: List[str])
+

Run the rastertool to a set of input files. By default, this implementation +recursively calls “process_file” on each input file and then calls “postprocess_files”.

+
+

Note

+

It is not meant to be overriden by subclasses. Prefer overriding process_file +and postproces_files instead.

+
+
+
Parameters:
+

inputfiles ([str]) – Input images to process

+
+
Returns:
+

([str]) The list of the generated files

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.radius.html b/docs/_build/html/api/eolab.rastertools.SVF.radius.html new file mode 100644 index 00000000..9f7d86c5 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.radius.html @@ -0,0 +1,173 @@ + + + + + + + + + SVF.radius — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.radius

+
+
+property SVF.radius
+

Max distance from current point (in pixels) to consider +for evaluating the max elevation angle

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.resolution.html b/docs/_build/html/api/eolab.rastertools.SVF.resolution.html new file mode 100644 index 00000000..1eb496ab --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.resolution.html @@ -0,0 +1,172 @@ + + + + + + + + + SVF.resolution — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.resolution

+
+
+property SVF.resolution
+

Resolution of the input Digital Height Model (in meter)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.vrt_dir.html b/docs/_build/html/api/eolab.rastertools.SVF.vrt_dir.html new file mode 100644 index 00000000..e737519c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.vrt_dir.html @@ -0,0 +1,172 @@ + + + + + + + + + SVF.vrt_dir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.vrt_dir

+
+
+property SVF.vrt_dir: str
+

Dir where to store intermediate VRT images

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.window_size.html b/docs/_build/html/api/eolab.rastertools.SVF.window_size.html new file mode 100644 index 00000000..97a8e65e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.window_size.html @@ -0,0 +1,172 @@ + + + + + + + + + SVF.window_size — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.window_size

+
+
+property SVF.window_size: int
+

Size of the windows to split the image in small parts

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.with_altitude.html b/docs/_build/html/api/eolab.rastertools.SVF.with_altitude.html new file mode 100644 index 00000000..596fe841 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.with_altitude.html @@ -0,0 +1,181 @@ + + + + + + + + + SVF.with_altitude — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.with_altitude

+
+
+SVF.with_altitude(altitude: float)[source]
+

Configure the altitude at which the Sky View Factor shall be computed. +If not set, the SVF is computed for each pixel at the pixel altitude.

+
+
Parameters:
+

altitude (float) – Altitude at which SVF shall be computed

+
+
Returns:
+

The current instance so that it is possible to chain the with… calls (fluent API)

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.with_output.html b/docs/_build/html/api/eolab.rastertools.SVF.with_output.html new file mode 100644 index 00000000..c4f5f07a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.with_output.html @@ -0,0 +1,184 @@ + + + + + + + + + SVF.with_output — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.with_output

+
+
+SVF.with_output(outputdir: str = '.')
+

Set up the output.

+
+
Parameters:
+

outputdir (str, optional, default=".") – Output dir where to store results. If none, it is set to current dir

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.with_vrt_stored.html b/docs/_build/html/api/eolab.rastertools.SVF.with_vrt_stored.html new file mode 100644 index 00000000..0d1d5da0 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.with_vrt_stored.html @@ -0,0 +1,186 @@ + + + + + + + + + SVF.with_vrt_stored — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.with_vrt_stored

+
+
+SVF.with_vrt_stored(keep_vrt: bool)
+

Configure if the intermediate VRT images that are generated when handling +the input files (which can be complex raster product composed of several band files) +shall be stored to disk or not - for debug purpose for instance.

+
+
Parameters:
+

keep_vrt (bool) – Whether intermediate VRT images shall be stored or not

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.SVF.with_windows.html b/docs/_build/html/api/eolab.rastertools.SVF.with_windows.html new file mode 100644 index 00000000..c0ba9211 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.SVF.with_windows.html @@ -0,0 +1,189 @@ + + + + + + + + + SVF.with_windows — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

SVF.with_windows

+
+
+SVF.with_windows(window_size: int = 1024, pad_mode: str = 'edge')
+

Configure the window generation for processing image

+
+
Parameters:
+
    +
  • window_size (int, optional, default=1024) – Size of windows for splitting the processed image in small parts +so that processing can be distributed on several cpus.

  • +
  • pad_mode (str, optional, default="edge") – Mode for padding data around the windows that are on the edge of the image. +See https://numpy.org/doc/stable/reference/generated/numpy.pad.html

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Speed.__init__.html b/docs/_build/html/api/eolab.rastertools.Speed.__init__.html new file mode 100644 index 00000000..dfe471ab --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Speed.__init__.html @@ -0,0 +1,171 @@ + + + + + + + + + Speed.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Speed.__init__

+
+
+Speed.__init__(bands: List[int] = [1])[source]
+

Constructor

+
+
Parameters:
+

bands ([int], optional, default=[1]) – List of bands in the input image to process. +Set None if all bands shall be processed.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Speed.bands.html b/docs/_build/html/api/eolab.rastertools.Speed.bands.html new file mode 100644 index 00000000..044767b0 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Speed.bands.html @@ -0,0 +1,165 @@ + + + + + + + + + Speed.bands — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Speed.bands

+
+
+property Speed.bands: List[int]
+

List of bands to process

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Speed.html b/docs/_build/html/api/eolab.rastertools.Speed.html new file mode 100644 index 00000000..bc9dd5ff --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Speed.html @@ -0,0 +1,208 @@ + + + + + + + + + Speed — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Speed

+
+
+class eolab.rastertools.Speed(bands: List[int] = [1])[source]
+

Bases: Rastertool

+

Raster tool that computes the time derivative (speed) of raster images.

+

For images of the same and known type, the tool extract the timestamp metadata +from the names of the images. It can then compute the time derivatives of every +bands.

+

Attributes

+ + + + + + + + + + + + + + + +

Speed.bands

List of bands to process

Speed.keep_vrt

Whether intermediate VRT images shall be kept

Speed.outputdir

Path of the output directory where are stored the results

Speed.vrt_dir

Dir where to store intermediate VRT images

+

Methods

+ + + + + + + + + + + + + + + + + + + + + +

Speed.__init__([bands])

Constructor

Speed.postprocess_files(inputfiles, outputfiles)

Compute the temporal derivative of input files' radiometry

Speed.process_file(inputfile)

Run the rastertool to a single input file.

Speed.process_files(inputfiles)

Run the rastertool to a set of input files.

Speed.with_output([outputdir])

Set up the output.

Speed.with_vrt_stored(keep_vrt)

Configure if the intermediate VRT images that are generated when handling the input files (which can be complex raster product composed of several band files) shall be stored to disk or not - for debug purpose for instance.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Speed.keep_vrt.html b/docs/_build/html/api/eolab.rastertools.Speed.keep_vrt.html new file mode 100644 index 00000000..d8404287 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Speed.keep_vrt.html @@ -0,0 +1,165 @@ + + + + + + + + + Speed.keep_vrt — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Speed.keep_vrt

+
+
+property Speed.keep_vrt: bool
+

Whether intermediate VRT images shall be kept

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Speed.outputdir.html b/docs/_build/html/api/eolab.rastertools.Speed.outputdir.html new file mode 100644 index 00000000..df6e8391 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Speed.outputdir.html @@ -0,0 +1,165 @@ + + + + + + + + + Speed.outputdir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Speed.outputdir

+
+
+property Speed.outputdir: str
+

Path of the output directory where are stored the results

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Speed.postprocess_files.html b/docs/_build/html/api/eolab.rastertools.Speed.postprocess_files.html new file mode 100644 index 00000000..5d5c483b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Speed.postprocess_files.html @@ -0,0 +1,180 @@ + + + + + + + + + Speed.postprocess_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Speed.postprocess_files

+
+
+Speed.postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str][source]
+

Compute the temporal derivative of input files’ radiometry

+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files individually

  • +
+
+
Returns:
+

List of speed images that have been generated

+
+
Return type:
+

[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Speed.process_file.html b/docs/_build/html/api/eolab.rastertools.Speed.process_file.html new file mode 100644 index 00000000..2a942130 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Speed.process_file.html @@ -0,0 +1,181 @@ + + + + + + + + + Speed.process_file — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Speed.process_file

+
+
+Speed.process_file(inputfile: str) List[str]
+

Run the rastertool to a single input file.

+
+

Note

+

This implementation does nothing. Override this method in the subclass +to achieve special processing of an inputfile.

+
+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

List of generated files (by default empty list)

+
+
Return type:
+

[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Speed.process_files.html b/docs/_build/html/api/eolab.rastertools.Speed.process_files.html new file mode 100644 index 00000000..5c7eb2e9 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Speed.process_files.html @@ -0,0 +1,179 @@ + + + + + + + + + Speed.process_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Speed.process_files

+
+
+Speed.process_files(inputfiles: List[str])
+

Run the rastertool to a set of input files. By default, this implementation +recursively calls “process_file” on each input file and then calls “postprocess_files”.

+
+

Note

+

It is not meant to be overriden by subclasses. Prefer overriding process_file +and postproces_files instead.

+
+
+
Parameters:
+

inputfiles ([str]) – Input images to process

+
+
Returns:
+

([str]) The list of the generated files

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Speed.vrt_dir.html b/docs/_build/html/api/eolab.rastertools.Speed.vrt_dir.html new file mode 100644 index 00000000..6e580007 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Speed.vrt_dir.html @@ -0,0 +1,165 @@ + + + + + + + + + Speed.vrt_dir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Speed.vrt_dir

+
+
+property Speed.vrt_dir: str
+

Dir where to store intermediate VRT images

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Speed.with_output.html b/docs/_build/html/api/eolab.rastertools.Speed.with_output.html new file mode 100644 index 00000000..9c1256de --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Speed.with_output.html @@ -0,0 +1,177 @@ + + + + + + + + + Speed.with_output — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Speed.with_output

+
+
+Speed.with_output(outputdir: str = '.')
+

Set up the output.

+
+
Parameters:
+

outputdir (str, optional, default=".") – Output dir where to store results. If none, it is set to current dir

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Speed.with_vrt_stored.html b/docs/_build/html/api/eolab.rastertools.Speed.with_vrt_stored.html new file mode 100644 index 00000000..f266896b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Speed.with_vrt_stored.html @@ -0,0 +1,179 @@ + + + + + + + + + Speed.with_vrt_stored — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Speed.with_vrt_stored

+
+
+Speed.with_vrt_stored(keep_vrt: bool)
+

Configure if the intermediate VRT images that are generated when handling +the input files (which can be complex raster product composed of several band files) +shall be stored to disk or not - for debug purpose for instance.

+
+
Parameters:
+

keep_vrt (bool) – Whether intermediate VRT images shall be stored or not

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Tiling.__init__.html b/docs/_build/html/api/eolab.rastertools.Tiling.__init__.html new file mode 100644 index 00000000..cea93f75 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Tiling.__init__.html @@ -0,0 +1,173 @@ + + + + + + + + + Tiling.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tiling.__init__

+
+
+Tiling.__init__(geometry_file: str)[source]
+

Constructor

+
+
Parameters:
+

geometry_file (str) – File name of the geometry file used to tile raster images

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Tiling.grid.html b/docs/_build/html/api/eolab.rastertools.Tiling.grid.html new file mode 100644 index 00000000..ae88ec85 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Tiling.grid.html @@ -0,0 +1,168 @@ + + + + + + + + + Tiling.grid — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tiling.grid

+
+
+property Tiling.grid
+

Get the grid that defines the geometries for tiling raster images

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Tiling.html b/docs/_build/html/api/eolab.rastertools.Tiling.html new file mode 100644 index 00000000..e0c52e49 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Tiling.html @@ -0,0 +1,232 @@ + + + + + + + + + Tiling — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tiling

+
+
+class eolab.rastertools.Tiling(geometry_file: str)[source]
+

Bases: Rastertool

+

Raster tool that tiles a raster following the geometries of a grid.

+

The tool takes as input two files: a raster image and a grid file (shapefile, geojson …). +The grid file defines the geometries of the tiles.

+

Different options can be configured:

+
    +
  • output dir: select the dir where tiles will be stored to disk

  • +
  • output basename: naming rule of tiles. By default, the basename is the name of +the original file followed by “_tile” followed by the tile index. In the +formatted string, tile index is at position 1 and original filename is at +position 0. For instance, a naming rule such as “tile{1}.tif” will generate +the tile name “tile75.tif” for the tile id = 75.

  • +
  • output subdir: naming rule for subdirs when every tile must be generated in a +different subdir.

  • +
+

It is also possible to select the tiles to generate. The seleted tiles are the ones +which match the expected values of a given grid’s property.

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + +

Tiling.grid

Get the grid that defines the geometries for tiling raster images

Tiling.keep_vrt

Whether intermediate VRT images shall be kept

Tiling.output_basename

Base name for naming output

Tiling.output_subdir

Naming convention of the subdir where to store outputs.

Tiling.outputdir

Path of the output directory where are stored the results

Tiling.vrt_dir

Dir where to store intermediate VRT images

+

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + +

Tiling.__init__(geometry_file)

Constructor

Tiling.postprocess_files(inputfiles, outputfiles)

Run a postprocess when all input files have been processed.

Tiling.process_file(inputfile)

Tile the input file following the geometry file

Tiling.process_files(inputfiles)

Run the rastertool to a set of input files.

Tiling.with_id_column(id_column, ids)

Set up a filter on the geometries for which tiles shall be generated.

Tiling.with_output([outputdir, ...])

Set up the output.

Tiling.with_vrt_stored(keep_vrt)

Configure if the intermediate VRT images that are generated when handling the input files (which can be complex raster product composed of several band files) shall be stored to disk or not - for debug purpose for instance.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Tiling.keep_vrt.html b/docs/_build/html/api/eolab.rastertools.Tiling.keep_vrt.html new file mode 100644 index 00000000..d8670249 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Tiling.keep_vrt.html @@ -0,0 +1,168 @@ + + + + + + + + + Tiling.keep_vrt — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tiling.keep_vrt

+
+
+property Tiling.keep_vrt: bool
+

Whether intermediate VRT images shall be kept

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Tiling.output_basename.html b/docs/_build/html/api/eolab.rastertools.Tiling.output_basename.html new file mode 100644 index 00000000..54083e01 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Tiling.output_basename.html @@ -0,0 +1,168 @@ + + + + + + + + + Tiling.output_basename — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tiling.output_basename

+
+
+property Tiling.output_basename: str
+

Base name for naming output

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Tiling.output_subdir.html b/docs/_build/html/api/eolab.rastertools.Tiling.output_subdir.html new file mode 100644 index 00000000..128e3f33 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Tiling.output_subdir.html @@ -0,0 +1,169 @@ + + + + + + + + + Tiling.output_subdir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tiling.output_subdir

+
+
+property Tiling.output_subdir
+

Naming convention of the subdir where to store outputs. None if +no tiles shall not be generated in subdirs (but directly in the output dir)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Tiling.outputdir.html b/docs/_build/html/api/eolab.rastertools.Tiling.outputdir.html new file mode 100644 index 00000000..4af2df35 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Tiling.outputdir.html @@ -0,0 +1,168 @@ + + + + + + + + + Tiling.outputdir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tiling.outputdir

+
+
+property Tiling.outputdir: str
+

Path of the output directory where are stored the results

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Tiling.postprocess_files.html b/docs/_build/html/api/eolab.rastertools.Tiling.postprocess_files.html new file mode 100644 index 00000000..07edef45 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Tiling.postprocess_files.html @@ -0,0 +1,189 @@ + + + + + + + + + Tiling.postprocess_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tiling.postprocess_files

+
+
+Tiling.postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str]
+

Run a postprocess when all input files have been processed. This step may consist +in transforming the outputs or mixing them to generate additional ones.

+
+

Note

+

This implementation does nothing. Override this method in the subclass +to achieve special processing that needs the whole list of inputfiles +and/or the output files generated when processing every single file (to mix +them for instance).

+
+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files

  • +
+
+
+
+
Returns

[str]: Additional output files (by default empty list)

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Tiling.process_file.html b/docs/_build/html/api/eolab.rastertools.Tiling.process_file.html new file mode 100644 index 00000000..d0af3332 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Tiling.process_file.html @@ -0,0 +1,179 @@ + + + + + + + + + Tiling.process_file — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tiling.process_file

+
+
+Tiling.process_file(inputfile: str)[source]
+

Tile the input file following the geometry file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

The list of generates tiles.

+
+
Return type:
+

[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Tiling.process_files.html b/docs/_build/html/api/eolab.rastertools.Tiling.process_files.html new file mode 100644 index 00000000..bdec2516 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Tiling.process_files.html @@ -0,0 +1,182 @@ + + + + + + + + + Tiling.process_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tiling.process_files

+
+
+Tiling.process_files(inputfiles: List[str])
+

Run the rastertool to a set of input files. By default, this implementation +recursively calls “process_file” on each input file and then calls “postprocess_files”.

+
+

Note

+

It is not meant to be overriden by subclasses. Prefer overriding process_file +and postproces_files instead.

+
+
+
Parameters:
+

inputfiles ([str]) – Input images to process

+
+
Returns:
+

([str]) The list of the generated files

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Tiling.vrt_dir.html b/docs/_build/html/api/eolab.rastertools.Tiling.vrt_dir.html new file mode 100644 index 00000000..b0be2f60 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Tiling.vrt_dir.html @@ -0,0 +1,168 @@ + + + + + + + + + Tiling.vrt_dir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tiling.vrt_dir

+
+
+property Tiling.vrt_dir: str
+

Dir where to store intermediate VRT images

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Tiling.with_id_column.html b/docs/_build/html/api/eolab.rastertools.Tiling.with_id_column.html new file mode 100644 index 00000000..dfa3c08f --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Tiling.with_id_column.html @@ -0,0 +1,183 @@ + + + + + + + + + Tiling.with_id_column — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tiling.with_id_column

+
+
+Tiling.with_id_column(id_column: str, ids: List[int])[source]
+

Set up a filter on the geometries for which tiles shall be generated.

+
+
Parameters:
+
    +
  • id_column (str) – Name of the column in the vector file that contains the ids to filter.

  • +
  • ids – List of ids values for which tiles shall be generated.

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Tiling

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Tiling.with_output.html b/docs/_build/html/api/eolab.rastertools.Tiling.with_output.html new file mode 100644 index 00000000..a98d4e36 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Tiling.with_output.html @@ -0,0 +1,193 @@ + + + + + + + + + Tiling.with_output — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tiling.with_output

+
+
+Tiling.with_output(outputdir: str = '.', output_basename: str = '{}_tile{}', output_subdir: str | None = None)[source]
+

Set up the output.

+
+
Parameters:
+
    +
  • outputdir (str, optional, default=".") – Output dir where to store results.

  • +
  • output_basename (str, optional, default="{}_tile{}") – Basename for the output file as a formatted string. By default, the +basename is the name of the original file followed by “_tile” followed +by the tile index. In the formatted string, tile index is at position 1 +and original filename is at position 0. For instance, tile{1}.tif will +generate the following name tile75.tif for the tile id = 75

  • +
  • output_subdir (str, optional, default=None) – When each tile must be generated in a different subdir, output_subdir +defines the naming convention for the subdir. It is a formatted string +with one positional parameter corresponding to the tile index. +For instance, tile{} will generate the following subdir name: tile75/ +for the tile id = 75. If None, output files will be generated directly +in the outputdir.

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Tiling

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Tiling.with_vrt_stored.html b/docs/_build/html/api/eolab.rastertools.Tiling.with_vrt_stored.html new file mode 100644 index 00000000..1c68f190 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Tiling.with_vrt_stored.html @@ -0,0 +1,182 @@ + + + + + + + + + Tiling.with_vrt_stored — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Tiling.with_vrt_stored

+
+
+Tiling.with_vrt_stored(keep_vrt: bool)
+

Configure if the intermediate VRT images that are generated when handling +the input files (which can be complex raster product composed of several band files) +shall be stored to disk or not - for debug purpose for instance.

+
+
Parameters:
+

keep_vrt (bool) – Whether intermediate VRT images shall be stored or not

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.__init__.html b/docs/_build/html/api/eolab.rastertools.Timeseries.__init__.html new file mode 100644 index 00000000..c006336c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.__init__.html @@ -0,0 +1,182 @@ + + + + + + + + + Timeseries.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Timeseries.__init__

+
+
+Timeseries.__init__(start_date: datetime, end_date: datetime, period: int, bands: List[int] = [1])[source]
+

Constructor

+
+
Parameters:
+
    +
  • start_date (datetime) – Start date of the timeseries to generate

  • +
  • end_date (datetime) – End date of the timeseries to generate

  • +
  • period (int) – Time period (in days) between two consecutive dates in the timeseries

  • +
  • bands ([int], optional, default=[1]) – List of bands in the input image to process. +Set None if all bands shall be processed.

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.bands.html b/docs/_build/html/api/eolab.rastertools.Timeseries.bands.html new file mode 100644 index 00000000..1b95b811 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.bands.html @@ -0,0 +1,171 @@ + + + + + + + + + Timeseries.bands — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.end_date.html b/docs/_build/html/api/eolab.rastertools.Timeseries.end_date.html new file mode 100644 index 00000000..9d89332a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.end_date.html @@ -0,0 +1,171 @@ + + + + + + + + + Timeseries.end_date — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.html b/docs/_build/html/api/eolab.rastertools.Timeseries.html new file mode 100644 index 00000000..5768cfe9 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.html @@ -0,0 +1,230 @@ + + + + + + + + + Timeseries — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Timeseries

+
+
+class eolab.rastertools.Timeseries(start_date: datetime, end_date: datetime, period: int, bands: List[int] = [1])[source]
+

Bases: Rastertool, Windowable

+

Raster tool that generates the time series of raster images. The timeseries is +generated with a linear interpolation thus enabling to fill gaps.

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Timeseries.bands

List of bands to process

Timeseries.end_date

End date of the timeseries to generate

Timeseries.keep_vrt

Whether intermediate VRT images shall be kept

Timeseries.outputdir

Path of the output directory where are stored the results

Timeseries.pad_mode

//numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty].

Timeseries.period

Period (in days) of the timeseries to generate

Timeseries.start_date

Start date of the timeseries to generate

Timeseries.vrt_dir

Dir where to store intermediate VRT images

Timeseries.window_size

Size of the windows to split the image in small parts

+

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + +

Timeseries.__init__(start_date, end_date, period)

Constructor

Timeseries.postprocess_files(inputfiles, ...)

Generates the timeseries from a list of inputfiles.

Timeseries.process_file(inputfile)

Run the rastertool to a single input file.

Timeseries.process_files(inputfiles)

Run the rastertool to a set of input files.

Timeseries.with_output([outputdir])

Set up the output.

Timeseries.with_vrt_stored(keep_vrt)

Configure if the intermediate VRT images that are generated when handling the input files (which can be complex raster product composed of several band files) shall be stored to disk or not - for debug purpose for instance.

Timeseries.with_windows([window_size, pad_mode])

Configure the window generation for processing image

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.keep_vrt.html b/docs/_build/html/api/eolab.rastertools.Timeseries.keep_vrt.html new file mode 100644 index 00000000..c84e85c3 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.keep_vrt.html @@ -0,0 +1,171 @@ + + + + + + + + + Timeseries.keep_vrt — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Timeseries.keep_vrt

+
+
+property Timeseries.keep_vrt: bool
+

Whether intermediate VRT images shall be kept

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.outputdir.html b/docs/_build/html/api/eolab.rastertools.Timeseries.outputdir.html new file mode 100644 index 00000000..55c380d6 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.outputdir.html @@ -0,0 +1,171 @@ + + + + + + + + + Timeseries.outputdir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Timeseries.outputdir

+
+
+property Timeseries.outputdir: str
+

Path of the output directory where are stored the results

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.pad_mode.html b/docs/_build/html/api/eolab.rastertools.Timeseries.pad_mode.html new file mode 100644 index 00000000..f10a6d06 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.pad_mode.html @@ -0,0 +1,177 @@ + + + + + + + + + Timeseries.pad_mode — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Timeseries.pad_mode

+
+
+property Timeseries.pad_mode: str
+

//numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image +The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty].

+
+
Type:
+

Mode used to `pad <https

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.period.html b/docs/_build/html/api/eolab.rastertools.Timeseries.period.html new file mode 100644 index 00000000..9eeb6aa6 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.period.html @@ -0,0 +1,171 @@ + + + + + + + + + Timeseries.period — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.postprocess_files.html b/docs/_build/html/api/eolab.rastertools.Timeseries.postprocess_files.html new file mode 100644 index 00000000..d1fcfe37 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.postprocess_files.html @@ -0,0 +1,186 @@ + + + + + + + + + Timeseries.postprocess_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Timeseries.postprocess_files

+
+
+Timeseries.postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str][source]
+

Generates the timeseries from a list of inputfiles.

+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files individually

  • +
+
+
Returns:
+

List of images that have been generated

+
+
Return type:
+

[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.process_file.html b/docs/_build/html/api/eolab.rastertools.Timeseries.process_file.html new file mode 100644 index 00000000..2e42ba96 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.process_file.html @@ -0,0 +1,187 @@ + + + + + + + + + Timeseries.process_file — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Timeseries.process_file

+
+
+Timeseries.process_file(inputfile: str) List[str]
+

Run the rastertool to a single input file.

+
+

Note

+

This implementation does nothing. Override this method in the subclass +to achieve special processing of an inputfile.

+
+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

List of generated files (by default empty list)

+
+
Return type:
+

[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.process_files.html b/docs/_build/html/api/eolab.rastertools.Timeseries.process_files.html new file mode 100644 index 00000000..d4fc156c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.process_files.html @@ -0,0 +1,185 @@ + + + + + + + + + Timeseries.process_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Timeseries.process_files

+
+
+Timeseries.process_files(inputfiles: List[str])
+

Run the rastertool to a set of input files. By default, this implementation +recursively calls “process_file” on each input file and then calls “postprocess_files”.

+
+

Note

+

It is not meant to be overriden by subclasses. Prefer overriding process_file +and postproces_files instead.

+
+
+
Parameters:
+

inputfiles ([str]) – Input images to process

+
+
Returns:
+

([str]) The list of the generated files

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.start_date.html b/docs/_build/html/api/eolab.rastertools.Timeseries.start_date.html new file mode 100644 index 00000000..feea59b1 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.start_date.html @@ -0,0 +1,171 @@ + + + + + + + + + Timeseries.start_date — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Timeseries.start_date

+
+
+property Timeseries.start_date
+

Start date of the timeseries to generate

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.vrt_dir.html b/docs/_build/html/api/eolab.rastertools.Timeseries.vrt_dir.html new file mode 100644 index 00000000..ec926777 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.vrt_dir.html @@ -0,0 +1,171 @@ + + + + + + + + + Timeseries.vrt_dir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.window_size.html b/docs/_build/html/api/eolab.rastertools.Timeseries.window_size.html new file mode 100644 index 00000000..3282f4af --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.window_size.html @@ -0,0 +1,171 @@ + + + + + + + + + Timeseries.window_size — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Timeseries.window_size

+
+
+property Timeseries.window_size: int
+

Size of the windows to split the image in small parts

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.with_output.html b/docs/_build/html/api/eolab.rastertools.Timeseries.with_output.html new file mode 100644 index 00000000..26443d55 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.with_output.html @@ -0,0 +1,183 @@ + + + + + + + + + Timeseries.with_output — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Timeseries.with_output

+
+
+Timeseries.with_output(outputdir: str = '.')
+

Set up the output.

+
+
Parameters:
+

outputdir (str, optional, default=".") – Output dir where to store results. If none, it is set to current dir

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.with_vrt_stored.html b/docs/_build/html/api/eolab.rastertools.Timeseries.with_vrt_stored.html new file mode 100644 index 00000000..b46672bc --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.with_vrt_stored.html @@ -0,0 +1,185 @@ + + + + + + + + + Timeseries.with_vrt_stored — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Timeseries.with_vrt_stored

+
+
+Timeseries.with_vrt_stored(keep_vrt: bool)
+

Configure if the intermediate VRT images that are generated when handling +the input files (which can be complex raster product composed of several band files) +shall be stored to disk or not - for debug purpose for instance.

+
+
Parameters:
+

keep_vrt (bool) – Whether intermediate VRT images shall be stored or not

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Timeseries.with_windows.html b/docs/_build/html/api/eolab.rastertools.Timeseries.with_windows.html new file mode 100644 index 00000000..d357ad87 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Timeseries.with_windows.html @@ -0,0 +1,188 @@ + + + + + + + + + Timeseries.with_windows — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Timeseries.with_windows

+
+
+Timeseries.with_windows(window_size: int = 1024, pad_mode: str = 'edge')
+

Configure the window generation for processing image

+
+
Parameters:
+
    +
  • window_size (int, optional, default=1024) – Size of windows for splitting the processed image in small parts +so that processing can be distributed on several cpus.

  • +
  • pad_mode (str, optional, default="edge") – Mode for padding data around the windows that are on the edge of the image. +See https://numpy.org/doc/stable/reference/generated/numpy.pad.html

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Windowable.__init__.html b/docs/_build/html/api/eolab.rastertools.Windowable.__init__.html new file mode 100644 index 00000000..5b1d5364 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Windowable.__init__.html @@ -0,0 +1,153 @@ + + + + + + + + + Windowable.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Windowable.__init__

+
+
+Windowable.__init__()
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Windowable.html b/docs/_build/html/api/eolab.rastertools.Windowable.html new file mode 100644 index 00000000..21f4807a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Windowable.html @@ -0,0 +1,181 @@ + + + + + + + + + Windowable — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Windowable

+
+
+class eolab.rastertools.Windowable[source]
+

Bases: object

+

Decorator of a eolab.rastertools.Rastertool that adds configuration +parameters to set the windowable capability of the tool:

+
    +
  • the window size

  • +
  • the mode for padding the window when at the edge of the image

  • +
+

Attributes

+ + + + + + + + + +

Windowable.pad_mode

//numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty].

Windowable.window_size

Size of the windows to split the image in small parts

+

Methods

+ + + + + + + + + +

Windowable.__init__()

Windowable.with_windows([window_size, pad_mode])

Configure the window generation for processing image

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Windowable.pad_mode.html b/docs/_build/html/api/eolab.rastertools.Windowable.pad_mode.html new file mode 100644 index 00000000..15549efc --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Windowable.pad_mode.html @@ -0,0 +1,160 @@ + + + + + + + + + Windowable.pad_mode — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Windowable.pad_mode

+
+
+property Windowable.pad_mode: str
+

//numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image +The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty].

+
+
Type:
+

Mode used to `pad <https

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Windowable.window_size.html b/docs/_build/html/api/eolab.rastertools.Windowable.window_size.html new file mode 100644 index 00000000..72e2b379 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Windowable.window_size.html @@ -0,0 +1,154 @@ + + + + + + + + + Windowable.window_size — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Windowable.window_size

+
+
+property Windowable.window_size: int
+

Size of the windows to split the image in small parts

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Windowable.with_windows.html b/docs/_build/html/api/eolab.rastertools.Windowable.with_windows.html new file mode 100644 index 00000000..532645c4 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Windowable.with_windows.html @@ -0,0 +1,171 @@ + + + + + + + + + Windowable.with_windows — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Windowable.with_windows

+
+
+Windowable.with_windows(window_size: int = 1024, pad_mode: str = 'edge')[source]
+

Configure the window generation for processing image

+
+
Parameters:
+
    +
  • window_size (int, optional, default=1024) – Size of windows for splitting the processed image in small parts +so that processing can be distributed on several cpus.

  • +
  • pad_mode (str, optional, default="edge") – Mode for padding data around the windows that are on the edge of the image. +See https://numpy.org/doc/stable/reference/generated/numpy.pad.html

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.__init__.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.__init__.html new file mode 100644 index 00000000..b72afcab --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.__init__.html @@ -0,0 +1,208 @@ + + + + + + + + + Zonalstats.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.__init__

+
+
+Zonalstats.__init__(stats: List[str], categorical: bool = False, valid_threshold: float = 0.0, area: bool = False, prefix: str | None = None, bands: List[int] = [1])[source]
+

Constructor

+
+
Parameters:
+
    +
  • stats ([str]) – List of stats to compute. Zonalstats.valid_stats defined the list of valid stats +except percentile which can be defined as string concatenating percentile_ with +the percentile value (from 0 to 100).

  • +
  • categorical (bool, optional, default=False) – If true and input raster is “categorical”, add the counts of every unique +raster values to the stats

  • +
  • valid_threshold (float, optional, default=0.0) – Minimum percentage of valid pixels in a shape to compute its statistics ([0.0, 1.0])

  • +
  • area (bool, optional, default=False) – If true, statistics are multiplied by the pixel area of the raster input

  • +
  • prefix (str, optional, default=None]) – Add a prefix to the stats keys, one prefix per band. The argument is a string +with all prefixes separated by a space.

  • +
  • bands ([int], optional, default=[1]) – List of bands in the input image to process. +Set None if all bands shall be processed.

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.area.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.area.html new file mode 100644 index 00000000..1721db5e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.area.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.area — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.area

+
+
+property Zonalstats.area: bool
+

Whether to compute the statistics multiplied by the pixel area

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.bands.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.bands.html new file mode 100644 index 00000000..159d85e4 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.bands.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.bands — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.bands

+
+
+property Zonalstats.bands: List[int]
+

List of bands to process

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.categorical.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.categorical.html new file mode 100644 index 00000000..067c3514 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.categorical.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.categorical — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.categorical

+
+
+property Zonalstats.categorical: bool
+

Whether to compute the counts of every unique pixel values

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.category_file.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.category_file.html new file mode 100644 index 00000000..a620685f --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.category_file.html @@ -0,0 +1,192 @@ + + + + + + + + + Zonalstats.category_file — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.category_file

+
+
+property Zonalstats.category_file: str
+

Filename containing the categories when computing stats per +categories in the geometries

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.category_file_type.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.category_file_type.html new file mode 100644 index 00000000..1f70c07d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.category_file_type.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.category_file_type — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.category_file_type

+
+
+property Zonalstats.category_file_type: str
+

Type of the category file, either ‘raster’ or ‘vector’

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.category_index.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.category_index.html new file mode 100644 index 00000000..0e19efe5 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.category_index.html @@ -0,0 +1,192 @@ + + + + + + + + + Zonalstats.category_index — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.category_index

+
+
+property Zonalstats.category_index: str
+

Column name identifying categories in categroy_file (only if file format +is geometries)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.category_labels.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.category_labels.html new file mode 100644 index 00000000..26768b77 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.category_labels.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.category_labels — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.category_labels

+
+
+property Zonalstats.category_labels: str
+

Dict with classes index as keys and names to display as values

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.chart_file.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.chart_file.html new file mode 100644 index 00000000..de61f968 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.chart_file.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.chart_file — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.chart_file

+
+
+property Zonalstats.chart_file: str
+

Name of the chart file to generate

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.compute_stats.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.compute_stats.html new file mode 100644 index 00000000..05adff1d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.compute_stats.html @@ -0,0 +1,207 @@ + + + + + + + + + Zonalstats.compute_stats — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.compute_stats

+
+
+Zonalstats.compute_stats(raster: str, bands: List[int], geometries: GeoDataFrame, descr: List[str], date: str, area_square_meter: int) List[List[Dict[str, float]]][source]
+

Compute the statistics of the input data. [Minimum, Maximum, Mean, Standard deviation]

+
+
Parameters:
+
    +
  • raster (str) – Input image to process

  • +
  • bands ([int]) – List of bands in the input image to process. Empty list means all bands

  • +
  • geometries (GeoDataFrame) – Geometries where to add statistics (geometries must be in the same +projection as the raster)

  • +
  • descr ([str]) – Band descriptions

  • +
  • date (str) – Timestamp of the input raster

  • +
  • area_square_meter (int) – Area represented by a pixel

  • +
+
+
+

Returns: +list[list[dict]] +The dictionnary associates the name of the statistics to its value.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.display_chart.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.display_chart.html new file mode 100644 index 00000000..dd009f7d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.display_chart.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.display_chart — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.display_chart

+
+
+property Zonalstats.display_chart: bool
+

Whether to display the chart

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.generated_stats.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.generated_stats.html new file mode 100644 index 00000000..85cc3a2a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.generated_stats.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.generated_stats — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.generated_stats

+
+
+property Zonalstats.generated_stats
+

The list of generated stats in the same order as the input files

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.generated_stats_dates.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.generated_stats_dates.html new file mode 100644 index 00000000..8a658bb4 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.generated_stats_dates.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.generated_stats_dates — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.generated_stats_dates

+
+
+property Zonalstats.generated_stats_dates
+

The list of dates when they can be extracted from the input files’ names

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.generated_stats_per_date.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.generated_stats_per_date.html new file mode 100644 index 00000000..152c18b4 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.generated_stats_per_date.html @@ -0,0 +1,202 @@ + + + + + + + + + Zonalstats.generated_stats_per_date — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.generated_stats_per_date

+
+
+property Zonalstats.generated_stats_per_date
+

After processing one or several files, this method enables to retrieve a dictionary +that contains the statistics for each inputfile’s date:

+
    +
  • keys are timestamps

  • +
  • values are the statistics at the corresponding timestam

  • +
+
+

Warning

+

When the timestamp of the input raster cannot be retrieved, the dictionary does not +contain the generated statistics for this input raster. In this case, prefer calling +generated_stats to get the stats as a list (one item per input file).

+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.geometries.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.geometries.html new file mode 100644 index 00000000..15e3f7fb --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.geometries.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.geometries — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.geometries

+
+
+property Zonalstats.geometries: str
+

The geometries where to compute zonal statistics

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.geometry_index.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.geometry_index.html new file mode 100644 index 00000000..830ece4f --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.geometry_index.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.geometry_index — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.geometry_index

+
+
+property Zonalstats.geometry_index: str
+

The column name identifying the name of the geometry

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.html new file mode 100644 index 00000000..3eac3c2b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.html @@ -0,0 +1,309 @@ + + + + + + + + + Zonalstats — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats

+
+
+class eolab.rastertools.Zonalstats(stats: List[str], categorical: bool = False, valid_threshold: float = 0.0, area: bool = False, prefix: str | None = None, bands: List[int] = [1])[source]
+

Bases: Rastertool

+

Raster tool that computes zonal statistics of a raster product.

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Zonalstats.area

Whether to compute the statistics multiplied by the pixel area

Zonalstats.bands

List of bands to process

Zonalstats.categorical

Whether to compute the counts of every unique pixel values

Zonalstats.category_file

Filename containing the categories when computing stats per categories in the geometries

Zonalstats.category_file_type

Type of the category file, either 'raster' or 'vector'

Zonalstats.category_index

Column name identifying categories in categroy_file (only if file format is geometries)

Zonalstats.category_labels

Dict with classes index as keys and names to display as values

Zonalstats.chart_file

Name of the chart file to generate

Zonalstats.display_chart

Whether to display the chart

Zonalstats.generated_stats

The list of generated stats in the same order as the input files

Zonalstats.generated_stats_dates

The list of dates when they can be extracted from the input files' names

Zonalstats.generated_stats_per_date

After processing one or several files, this method enables to retrieve a dictionary that contains the statistics for each inputfile's date:

Zonalstats.geometries

The geometries where to compute zonal statistics

Zonalstats.geometry_index

The column name identifying the name of the geometry

Zonalstats.keep_vrt

Whether intermediate VRT images shall be kept

Zonalstats.output_format

Output format for the features stats

Zonalstats.outputdir

Path of the output directory where are stored the results

Zonalstats.prefix

Prefix of the features stats (one per band)

Zonalstats.sigma

Number of sigmas for identifying outliers

Zonalstats.stats

List of stats to compute

Zonalstats.supported_output_formats

List of all possible output format are provided by fiona.supported_drivers.keys()

Zonalstats.valid_stats

List of stats that can be computed.

Zonalstats.valid_threshold

Minimum percentage of valid pixels in a shape to compute its statistics

Zonalstats.vrt_dir

Dir where to store intermediate VRT images

Zonalstats.within

Whether to compute stats for geometries within the raster (if False, stats for all geometries intersecting the raster are computed)

+

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Zonalstats.__init__(stats[, categorical, ...])

Constructor

Zonalstats.compute_stats(raster, bands, ...)

Compute the statistics of the input data.

Zonalstats.postprocess_files(inputfiles, ...)

Generate the chart if requested after computing stats for each input file

Zonalstats.process_file(inputfile)

Compute the stats for a single input file

Zonalstats.process_files(inputfiles)

Run the rastertool to a set of input files.

Zonalstats.with_chart([chart_file, ...])

Set up the charting capability

Zonalstats.with_geometries(geometries[, within])

Set up the geometries where to compute stats.

Zonalstats.with_outliers(sigma)

Set up the computation of outliers

Zonalstats.with_output([outputdir, ...])

Set up the output.

Zonalstats.with_per_category(category_file)

Set up the zonal stats computation per categories

Zonalstats.with_vrt_stored(keep_vrt)

Configure if the intermediate VRT images that are generated when handling the input files (which can be complex raster product composed of several band files) shall be stored to disk or not - for debug purpose for instance.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.keep_vrt.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.keep_vrt.html new file mode 100644 index 00000000..0e92ba83 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.keep_vrt.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.keep_vrt — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.keep_vrt

+
+
+property Zonalstats.keep_vrt: bool
+

Whether intermediate VRT images shall be kept

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.output_format.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.output_format.html new file mode 100644 index 00000000..2d1c17dc --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.output_format.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.output_format — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.output_format

+
+
+property Zonalstats.output_format: str
+

Output format for the features stats

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.outputdir.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.outputdir.html new file mode 100644 index 00000000..b929a300 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.outputdir.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.outputdir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.outputdir

+
+
+property Zonalstats.outputdir: str
+

Path of the output directory where are stored the results

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.postprocess_files.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.postprocess_files.html new file mode 100644 index 00000000..54050ba1 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.postprocess_files.html @@ -0,0 +1,206 @@ + + + + + + + + + Zonalstats.postprocess_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.postprocess_files

+
+
+Zonalstats.postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str][source]
+

Generate the chart if requested after computing stats for each input file

+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files

  • +
+
+
Returns:
+

A list containing the chart file if requested

+
+
Return type:
+

[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.prefix.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.prefix.html new file mode 100644 index 00000000..666dfd09 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.prefix.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.prefix — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.prefix

+
+
+property Zonalstats.prefix: str
+

Prefix of the features stats (one per band)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.process_file.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.process_file.html new file mode 100644 index 00000000..c5f355b1 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.process_file.html @@ -0,0 +1,202 @@ + + + + + + + + + Zonalstats.process_file — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.process_file

+
+
+Zonalstats.process_file(inputfile: str) List[str][source]
+

Compute the stats for a single input file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

List of generated statistical images (posix paths) that have been generated

+
+
Return type:
+

[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.process_files.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.process_files.html new file mode 100644 index 00000000..3186342a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.process_files.html @@ -0,0 +1,205 @@ + + + + + + + + + Zonalstats.process_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.process_files

+
+
+Zonalstats.process_files(inputfiles: List[str])
+

Run the rastertool to a set of input files. By default, this implementation +recursively calls “process_file” on each input file and then calls “postprocess_files”.

+
+

Note

+

It is not meant to be overriden by subclasses. Prefer overriding process_file +and postproces_files instead.

+
+
+
Parameters:
+

inputfiles ([str]) – Input images to process

+
+
Returns:
+

([str]) The list of the generated files

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.sigma.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.sigma.html new file mode 100644 index 00000000..34d77f78 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.sigma.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.sigma — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.sigma

+
+
+property Zonalstats.sigma: float
+

Number of sigmas for identifying outliers

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.stats.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.stats.html new file mode 100644 index 00000000..8dd8429f --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.stats.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.stats — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.stats

+
+
+property Zonalstats.stats: List[str]
+

List of stats to compute

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.supported_output_formats.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.supported_output_formats.html new file mode 100644 index 00000000..60426ab0 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.supported_output_formats.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.supported_output_formats — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.supported_output_formats

+
+
+Zonalstats.supported_output_formats = {'CSV': 'csv', 'ESRI Shapefile': 'shp', 'GML': 'gml', 'GPKG': 'gpkg', 'GeoJSON': 'geojson'}
+

List of all possible output format are provided by fiona.supported_drivers.keys()

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.valid_stats.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.valid_stats.html new file mode 100644 index 00000000..46dfa34e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.valid_stats.html @@ -0,0 +1,192 @@ + + + + + + + + + Zonalstats.valid_stats — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.valid_stats

+
+
+Zonalstats.valid_stats = ['count', 'valid', 'nodata', 'min', 'max', 'mean', 'std', 'sum', 'median', 'mad', 'range', 'majority', 'minority', 'unique']
+

List of stats that can be computed. In addition to this list, “percentile_xx” is +also a valid stat where xx is the percentile value, e.g. percentile_70

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.valid_threshold.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.valid_threshold.html new file mode 100644 index 00000000..e88c73e6 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.valid_threshold.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.valid_threshold — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.valid_threshold

+
+
+property Zonalstats.valid_threshold: float
+

Minimum percentage of valid pixels in a shape to compute its statistics

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.vrt_dir.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.vrt_dir.html new file mode 100644 index 00000000..b0c9b98e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.vrt_dir.html @@ -0,0 +1,191 @@ + + + + + + + + + Zonalstats.vrt_dir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.vrt_dir

+
+
+property Zonalstats.vrt_dir: str
+

Dir where to store intermediate VRT images

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.with_chart.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.with_chart.html new file mode 100644 index 00000000..6475ec07 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.with_chart.html @@ -0,0 +1,207 @@ + + + + + + + + + Zonalstats.with_chart — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.with_chart

+
+
+Zonalstats.with_chart(chart_file: str | None = None, geometry_index: str = 'ID', display: bool = False)[source]
+

Set up the charting capability

+
+
Parameters:
+
    +
  • chart_file (str, optional, default=None) – If not None, generate a chart with the statistics and saves it to str

  • +
  • geometry_index (str, optional, default='ID') – Name of the index in the geometry file

  • +
  • display (bool, optional, default=False) – If true, display the chart with the statistics

  • +
+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.with_geometries.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.with_geometries.html new file mode 100644 index 00000000..9e704154 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.with_geometries.html @@ -0,0 +1,208 @@ + + + + + + + + + Zonalstats.with_geometries — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.with_geometries

+
+
+Zonalstats.with_geometries(geometries: str, within: bool = False)[source]
+

Set up the geometries where to compute stats.

+
+
Parameters:
+
    +
  • geometries (str) – Name of the file containing the geometries where to compute zonal stats. If not set, +stats are computed on the whole raster image

  • +
  • within (bool, optional, default=False) – Whether to compute stats only for geometries within the raster. If False, +statistics are computed for geometries that intersect the raster shape.

  • +
+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.with_outliers.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.with_outliers.html new file mode 100644 index 00000000..368646c2 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.with_outliers.html @@ -0,0 +1,205 @@ + + + + + + + + + Zonalstats.with_outliers — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.with_outliers

+
+
+Zonalstats.with_outliers(sigma: float)[source]
+

Set up the computation of outliers

+
+
Parameters:
+

sigma (float) – Distance to the mean value to consider a pixel as an outlier (expressed +in sigma, e.g. the value 2 means that pixels values greater than +mean value + 2 * std are outliers)

+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.with_output.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.with_output.html new file mode 100644 index 00000000..32acb581 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.with_output.html @@ -0,0 +1,207 @@ + + + + + + + + + Zonalstats.with_output — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.with_output

+
+
+Zonalstats.with_output(outputdir: str = '.', output_format: str = 'ESRI Shapefile')[source]
+

Set up the output.

+
+
Parameters:
+
    +
  • outputdir (str, optional, default=".") – Output dir where to store results. If none, results are not dumped to a file.

  • +
  • output_format (str, optional, default="ESRI Shapefile") – Format of the output ‘ESRI Shapefile’, ‘GeoJSON’, ‘CSV’, ‘GPKG’, ‘GML’ +(see supported_output_formats). If None, it is set to ESRI Shapefile

  • +
+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.with_per_category.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.with_per_category.html new file mode 100644 index 00000000..8306d4c3 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.with_per_category.html @@ -0,0 +1,208 @@ + + + + + + + + + Zonalstats.with_per_category — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.with_per_category

+
+
+Zonalstats.with_per_category(category_file: str, category_index: str = 'Classe', category_labels_json: str | None = None)[source]
+

Set up the zonal stats computation per categories

+
+
Parameters:
+
    +
  • category_file (str) – Name of the file containing the categories

  • +
  • category_index (str, optional, default='Classe') – Name of column containing the category value (if category_file is a vector)

  • +
  • category_labels_json (str, optional, default=None) – Name of json file containing the dict that associates category values +to category names

  • +
+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.with_vrt_stored.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.with_vrt_stored.html new file mode 100644 index 00000000..03cb9aa7 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.with_vrt_stored.html @@ -0,0 +1,205 @@ + + + + + + + + + Zonalstats.with_vrt_stored — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.with_vrt_stored

+
+
+Zonalstats.with_vrt_stored(keep_vrt: bool)
+

Configure if the intermediate VRT images that are generated when handling +the input files (which can be complex raster product composed of several band files) +shall be stored to disk or not - for debug purpose for instance.

+
+
Parameters:
+

keep_vrt (bool) – Whether intermediate VRT images shall be stored or not

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.Zonalstats.within.html b/docs/_build/html/api/eolab.rastertools.Zonalstats.within.html new file mode 100644 index 00000000..82e54a49 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.Zonalstats.within.html @@ -0,0 +1,192 @@ + + + + + + + + + Zonalstats.within — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Zonalstats.within

+
+
+property Zonalstats.within: bool
+

Whether to compute stats for geometries within the raster (if False, stats for +all geometries intersecting the raster are computed)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.filtering.create_argparser.html b/docs/_build/html/api/eolab.rastertools.cli.filtering.create_argparser.html new file mode 100644 index 00000000..1dc3a0c7 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.filtering.create_argparser.html @@ -0,0 +1,153 @@ + + + + + + + + + create_argparser — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_argparser

+
+
+eolab.rastertools.cli.filtering.create_argparser(rastertools_parsers)[source]
+

Adds the filtering subcommand to the given rastertools subparser

+
+
Parameters:
+

rastertools_parsers

The rastertools subparsers to which this subcommand shall be added.

+

This argument provides from a code like this:

+
import argparse
+main_parser = argparse.ArgumentParser()
+rastertools_parsers = main_parser.add_subparsers()
+filtering.create_argparser(rastertools_parsers)
+
+
+

+
+
Returns:
+

The rastertools subparsers updated with this subcommand

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.filtering.create_filter.html b/docs/_build/html/api/eolab.rastertools.cli.filtering.create_filter.html new file mode 100644 index 00000000..0477d8d8 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.filtering.create_filter.html @@ -0,0 +1,136 @@ + + + + + + + + + create_filter — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_filter

+
+
+eolab.rastertools.cli.filtering.create_filter(filter_name: str)[source]
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.filtering.create_filtering.html b/docs/_build/html/api/eolab.rastertools.cli.filtering.create_filtering.html new file mode 100644 index 00000000..070c8a8e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.filtering.create_filtering.html @@ -0,0 +1,159 @@ + + + + + + + + + create_filtering — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_filtering

+
+
+eolab.rastertools.cli.filtering.create_filtering(output: str, window_size: int, pad: str, argsdict: dict, filter: str, bands: list, kernel_size: int, all_bands: bool) Filtering[source]
+

This function initializes a Filtering tool instance and configures it with specified settings.

+

It selects the filter type, kernel size, output settings, and processing bands. If all_bands is set +to True, the filter will apply to all bands in the raster; otherwise, it applies only to specified bands.

+
+
Parameters:
+
    +
  • output (str) – The path for the filtered output file.

  • +
  • window_size (int) – Size of the processing window used by the filter.

  • +
  • pad (str) – Padding method used for windowing (default : ‘edge’).

  • +
  • argsdict (dict) – Dictionary of additional filter configuration arguments.

  • +
  • filter (str) – The filter type to apply (must be a valid name in Filtering filters).

  • +
  • bands (list) – List of bands to process. If empty and all_bands is False, defaults to [1].

  • +
  • kernel_size (int) – Size of the kernel used by the filter.

  • +
  • all_bands (bool) – Whether to apply the filter to all bands (True) or specific bands (False).

  • +
+
+
Returns:
+

A configured Filtering instance ready for execution.

+
+
Return type:
+

eolab.rastertools.Filtering

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.filtering.filter_options.html b/docs/_build/html/api/eolab.rastertools.cli.filtering.filter_options.html new file mode 100644 index 00000000..60ce6c39 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.filtering.filter_options.html @@ -0,0 +1,136 @@ + + + + + + + + + filter_options — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

filter_options

+
+
+eolab.rastertools.cli.filtering.filter_options(options: list)[source]
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.filtering.handle_result.html b/docs/_build/html/api/eolab.rastertools.cli.filtering.handle_result.html new file mode 100644 index 00000000..5449ce71 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.filtering.handle_result.html @@ -0,0 +1,160 @@ + + + + + + + + + handle_result — rastertools 0.6.1.post1.dev19+gebce3d0.d20241113 documentation + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.filtering.html b/docs/_build/html/api/eolab.rastertools.cli.filtering.html new file mode 100644 index 00000000..60cb7b23 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.filtering.html @@ -0,0 +1,146 @@ + + + + + + + + + eolab.rastertools.cli.filtering — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.cli.filtering

+

Description

+

CLI definition for the filtering tool

+

Functions

+ + + + + + + + + + + + +

create_filter

create_filtering

This function initializes a Filtering tool instance and configures it with specified settings.

filter_options

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.create_filter.html b/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.create_filter.html new file mode 100644 index 00000000..282c6c78 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.create_filter.html @@ -0,0 +1,162 @@ + + + + + + + + + create_filter — rastertools 0.6.1.post1.dev19+gebce3d0.d20241113 documentation + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.create_filtering.html b/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.create_filtering.html new file mode 100644 index 00000000..232249fa --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.create_filtering.html @@ -0,0 +1,185 @@ + + + + + + + + + create_filtering — rastertools 0.6.1.post1.dev19+gebce3d0.d20241113 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_filtering

+
+
+eolab.rastertools.cli.filtering_dyn.create_filtering(output: str, window_size: int, pad: str, argsdict: dict, filter: str, bands: list, kernel_size: int, all_bands: bool) Filtering[source]
+

This function initializes a Filtering tool instance and configures it with specified settings.

+

It selects the filter type, kernel size, output settings, and processing bands. If all_bands is set +to True, the filter will apply to all bands in the raster; otherwise, it applies only to specified bands.

+
+
Parameters:
+
    +
  • output (str) – The path for the filtered output file.

  • +
  • window_size (int) – Size of the processing window used by the filter.

  • +
  • pad (str) – Padding method used for windowing (e.g., ‘reflect’, ‘constant’, etc.).

  • +
  • argsdict (dict) – Dictionary of additional filter configuration arguments.

  • +
  • filter (str) – The filter type to apply (must be a valid name in Filtering filters).

  • +
  • bands (list) – List of bands to process. If empty and all_bands is False, defaults to [1].

  • +
  • kernel_size (int) – Size of the kernel used by the filter.

  • +
  • all_bands (bool) – Whether to apply the filter to all bands (True) or specific bands (False).

  • +
+
+
Returns:
+

A configured Filtering instance ready for execution.

+
+
Return type:
+

eolab.rastertools.Filtering

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.filter_options.html b/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.filter_options.html new file mode 100644 index 00000000..cfd6331b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.filter_options.html @@ -0,0 +1,162 @@ + + + + + + + + + filter_options — rastertools 0.6.1.post1.dev19+gebce3d0.d20241113 documentation + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.handle_result.html b/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.handle_result.html new file mode 100644 index 00000000..a5b8f48d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.handle_result.html @@ -0,0 +1,162 @@ + + + + + + + + + handle_result — rastertools 0.6.1.post1.dev19+gebce3d0.d20241113 documentation + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.html b/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.html new file mode 100644 index 00000000..b7be8238 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.html @@ -0,0 +1,175 @@ + + + + + + + + + eolab.rastertools.cli.filtering_dyn — rastertools 0.6.1.post1.dev19+gebce3d0.d20241113 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.cli.filtering_dyn

+

Description

+

CLI definition for the filtering tool

+

Functions

+ + + + + + + + + + + + + + + +

create_filter

create_filtering

This function initializes a Filtering tool instance and configures it with specified settings.

filter_options

handle_result

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.hillshade.create_argparser.html b/docs/_build/html/api/eolab.rastertools.cli.hillshade.create_argparser.html new file mode 100644 index 00000000..95f71019 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.hillshade.create_argparser.html @@ -0,0 +1,153 @@ + + + + + + + + + create_argparser — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_argparser

+
+
+eolab.rastertools.cli.hillshade.create_argparser(rastertools_parsers)[source]
+

Adds the hillshade subcommand to the given rastertools subparser

+
+
Parameters:
+

rastertools_parsers

The rastertools subparsers to which this subcommand shall be added.

+

This argument provides from a code like this:

+
import argparse
+main_parser = argparse.ArgumentParser()
+rastertools_parsers = main_parser.add_subparsers()
+hillshade.create_argparser(rastertools_parsers)
+
+
+

+
+
Returns:
+

The rastertools subparsers updated with this subcommand

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.hillshade.create_hillshade.html b/docs/_build/html/api/eolab.rastertools.cli.hillshade.create_hillshade.html new file mode 100644 index 00000000..a57b25d2 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.hillshade.create_hillshade.html @@ -0,0 +1,148 @@ + + + + + + + + + create_hillshade — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_hillshade

+
+
+eolab.rastertools.cli.hillshade.create_hillshade(args) Hillshade[source]
+

Create and configure a new rastertool “Hillshade” according to argparse args

+
+
Parameters:
+

args – args extracted from command line

+
+
Returns:
+

The configured rastertool to run

+
+
Return type:
+

eolab.rastertools.Hillshade

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.hillshade.html b/docs/_build/html/api/eolab.rastertools.cli.hillshade.html new file mode 100644 index 00000000..0fb3b787 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.hillshade.html @@ -0,0 +1,132 @@ + + + + + + + + + eolab.rastertools.cli.hillshade — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.cli.hillshade

+

Description

+

CLI definition for the hillshade tool

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.html b/docs/_build/html/api/eolab.rastertools.cli.html new file mode 100644 index 00000000..f087dca0 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.html @@ -0,0 +1,178 @@ + + + + + + + + + eolab.rastertools.cli — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.cli

+

Description

+

Module that defines the subcommands of rastertools. +This module’s API is not intended for external use.

+

Functions

+ + + + + + + + + + + + +

with_bands_arguments

Add arguments to set the list of bands to process

with_outputdir_arguments

Add arguments to set the output dir

with_window_arguments

Add arguments to set the windowing parameters of the raster tool

+

Submodules

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

eolab.rastertools.cli.filtering

CLI definition for the filtering tool

eolab.rastertools.cli.hillshade

CLI definition for the hillshade tool

eolab.rastertools.cli.radioindice

CLI definition for the radioindice tool

eolab.rastertools.cli.speed

CLI definition for the speed tool

eolab.rastertools.cli.svf

CLI definition for the SVF (Sky View Factor) tool

eolab.rastertools.cli.tiling

CLI definition for the tiling tool

eolab.rastertools.cli.timeseries

CLI definition for the timeseries tool

eolab.rastertools.cli.utils_cli

eolab.rastertools.cli.zonalstats

CLI definition for the zonalstats tool

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.radioindice.create_argparser.html b/docs/_build/html/api/eolab.rastertools.cli.radioindice.create_argparser.html new file mode 100644 index 00000000..52e2247d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.radioindice.create_argparser.html @@ -0,0 +1,153 @@ + + + + + + + + + create_argparser — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_argparser

+
+
+eolab.rastertools.cli.radioindice.create_argparser(rastertools_parsers)[source]
+

Adds the radioindice subcommand to the given rastertools subparser

+
+
Parameters:
+

rastertools_parsers

The rastertools subparsers to which this subcommand shall be added.

+

This argument provides from a code like this:

+
import argparse
+main_parser = argparse.ArgumentParser()
+rastertools_parsers = main_parser.add_subparsers()
+radioindice.create_argparser(rastertools_parsers)
+
+
+

+
+
Returns:
+

The rastertools subparsers updated with this subcommand

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.radioindice.create_radioindice.html b/docs/_build/html/api/eolab.rastertools.cli.radioindice.create_radioindice.html new file mode 100644 index 00000000..c4aabf46 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.radioindice.create_radioindice.html @@ -0,0 +1,148 @@ + + + + + + + + + create_radioindice — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_radioindice

+
+
+eolab.rastertools.cli.radioindice.create_radioindice(args) Radioindice[source]
+

Create and configure a new rastertool “Radioindice” according to argparse args

+
+
Parameters:
+

args – args extracted from command line

+
+
Returns:
+

The configured rastertool to run

+
+
Return type:
+

eolab.rastertools.Radioindice

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.radioindice.html b/docs/_build/html/api/eolab.rastertools.cli.radioindice.html new file mode 100644 index 00000000..2c7bbe34 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.radioindice.html @@ -0,0 +1,140 @@ + + + + + + + + + eolab.rastertools.cli.radioindice — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.cli.radioindice

+

Description

+

CLI definition for the radioindice tool

+

Functions

+ + + + + + +

indices_opt

Create options for all the possible indices

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.radioindice.indices_opt.html b/docs/_build/html/api/eolab.rastertools.cli.radioindice.indices_opt.html new file mode 100644 index 00000000..18ee1207 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.radioindice.indices_opt.html @@ -0,0 +1,137 @@ + + + + + + + + + indices_opt — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

indices_opt

+
+
+eolab.rastertools.cli.radioindice.indices_opt(function)[source]
+

Create options for all the possible indices

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.speed.create_argparser.html b/docs/_build/html/api/eolab.rastertools.cli.speed.create_argparser.html new file mode 100644 index 00000000..7ce4cd51 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.speed.create_argparser.html @@ -0,0 +1,153 @@ + + + + + + + + + create_argparser — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_argparser

+
+
+eolab.rastertools.cli.speed.create_argparser(rastertools_parsers)[source]
+

Adds the speed subcommand to the given rastertools subparser

+
+
Parameters:
+

rastertools_parsers

The rastertools subparsers to which this subcommand shall be added.

+

This argument provides from a code like this:

+
import argparse
+main_parser = argparse.ArgumentParser()
+rastertools_parsers = main_parser.add_subparsers()
+speed.create_argparser(rastertools_parsers)
+
+
+

+
+
Returns:
+

The rastertools subparsers updated with this subcommand

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.speed.create_speed.html b/docs/_build/html/api/eolab.rastertools.cli.speed.create_speed.html new file mode 100644 index 00000000..ad1f9aed --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.speed.create_speed.html @@ -0,0 +1,148 @@ + + + + + + + + + create_speed — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_speed

+
+
+eolab.rastertools.cli.speed.create_speed(args) Speed[source]
+

Create and configure a new rastertool “Speed” according to argparse args

+
+
Parameters:
+

args – args extracted from command line

+
+
Returns:
+

The configured rastertool to run

+
+
Return type:
+

eolab.rastertools.Speed

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.speed.html b/docs/_build/html/api/eolab.rastertools.cli.speed.html new file mode 100644 index 00000000..bd5b51b4 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.speed.html @@ -0,0 +1,132 @@ + + + + + + + + + eolab.rastertools.cli.speed — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.cli.speed

+

Description

+

CLI definition for the speed tool

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.svf.create_argparser.html b/docs/_build/html/api/eolab.rastertools.cli.svf.create_argparser.html new file mode 100644 index 00000000..d2750a3c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.svf.create_argparser.html @@ -0,0 +1,153 @@ + + + + + + + + + create_argparser — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_argparser

+
+
+eolab.rastertools.cli.svf.create_argparser(rastertools_parsers)[source]
+

Adds the SVF subcommand to the given rastertools subparser

+
+
Parameters:
+

rastertools_parsers

The rastertools subparsers to which this subcommand shall be added.

+

This argument provides from a code like this:

+
import argparse
+main_parser = argparse.ArgumentParser()
+rastertools_parsers = main_parser.add_subparsers()
+svf.create_argparser(rastertools_parsers)
+
+
+

+
+
Returns:
+

The rastertools subparsers updated with this subcommand

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.svf.create_svf.html b/docs/_build/html/api/eolab.rastertools.cli.svf.create_svf.html new file mode 100644 index 00000000..3a531979 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.svf.create_svf.html @@ -0,0 +1,148 @@ + + + + + + + + + create_svf — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_svf

+
+
+eolab.rastertools.cli.svf.create_svf(args) SVF[source]
+

Create and configure a new rastertool “SVF” according to argparse args

+
+
Parameters:
+

args – args extracted from command line

+
+
Returns:
+

The configured rastertool to run

+
+
Return type:
+

eolab.rastertools.SVF

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.svf.html b/docs/_build/html/api/eolab.rastertools.cli.svf.html new file mode 100644 index 00000000..b634341b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.svf.html @@ -0,0 +1,132 @@ + + + + + + + + + eolab.rastertools.cli.svf — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.cli.svf

+

Description

+

CLI definition for the SVF (Sky View Factor) tool

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.tiling.create_argparser.html b/docs/_build/html/api/eolab.rastertools.cli.tiling.create_argparser.html new file mode 100644 index 00000000..0277f7bc --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.tiling.create_argparser.html @@ -0,0 +1,153 @@ + + + + + + + + + create_argparser — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_argparser

+
+
+eolab.rastertools.cli.tiling.create_argparser(rastertools_parsers)[source]
+

Adds the tiling subcommand to the given rastertools subparser

+
+
Parameters:
+

rastertools_parsers

The rastertools subparsers to which this subcommand shall be added.

+

This argument provides from a code like this:

+
import argparse
+main_parser = argparse.ArgumentParser()
+rastertools_parsers = main_parser.add_subparsers()
+tiling.create_argparser(rastertools_parsers)
+
+
+

+
+
Returns:
+

The rastertools subparsers updated with this subcommand

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.tiling.create_tiling.html b/docs/_build/html/api/eolab.rastertools.cli.tiling.create_tiling.html new file mode 100644 index 00000000..205e9b16 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.tiling.create_tiling.html @@ -0,0 +1,148 @@ + + + + + + + + + create_tiling — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_tiling

+
+
+eolab.rastertools.cli.tiling.create_tiling(args) Tiling[source]
+

Create and configure a new rastertool “Tiling” according to argparse args

+
+
Parameters:
+

args – args extracted from command line

+
+
Returns:
+

The configured rastertool to run

+
+
Return type:
+

eolab.rastertools.Tiling

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.tiling.html b/docs/_build/html/api/eolab.rastertools.cli.tiling.html new file mode 100644 index 00000000..7e66ec8a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.tiling.html @@ -0,0 +1,132 @@ + + + + + + + + + eolab.rastertools.cli.tiling — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.cli.tiling

+

Description

+

CLI definition for the tiling tool

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.timeseries.create_argparser.html b/docs/_build/html/api/eolab.rastertools.cli.timeseries.create_argparser.html new file mode 100644 index 00000000..663df16b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.timeseries.create_argparser.html @@ -0,0 +1,153 @@ + + + + + + + + + create_argparser — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_argparser

+
+
+eolab.rastertools.cli.timeseries.create_argparser(rastertools_parsers)[source]
+

Adds the timeseries subcommand to the given rastertools subparser

+
+
Parameters:
+

rastertools_parsers

The rastertools subparsers to which this subcommand shall be added.

+

This argument provides from a code like this:

+
import argparse
+main_parser = argparse.ArgumentParser()
+rastertools_parsers = main_parser.add_subparsers()
+timeseries.create_argparser(rastertools_parsers)
+
+
+

+
+
Returns:
+

The rastertools subparsers updated with this subcommand

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.timeseries.create_timeseries.html b/docs/_build/html/api/eolab.rastertools.cli.timeseries.create_timeseries.html new file mode 100644 index 00000000..345be238 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.timeseries.create_timeseries.html @@ -0,0 +1,148 @@ + + + + + + + + + create_timeseries — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_timeseries

+
+
+eolab.rastertools.cli.timeseries.create_timeseries(args) Timeseries[source]
+

Create and configure a new rastertool “Timeseries” according to argparse args

+
+
Parameters:
+

args – args extracted from command line

+
+
Returns:
+

The configured rastertool to run

+
+
Return type:
+

eolab.rastertools.Timeseries

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.timeseries.html b/docs/_build/html/api/eolab.rastertools.cli.timeseries.html new file mode 100644 index 00000000..dacfcd66 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.timeseries.html @@ -0,0 +1,132 @@ + + + + + + + + + eolab.rastertools.cli.timeseries — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.cli.timeseries

+

Description

+

CLI definition for the timeseries tool

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.utils_cli.apply_process.html b/docs/_build/html/api/eolab.rastertools.cli.utils_cli.apply_process.html new file mode 100644 index 00000000..ceb68fc1 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.utils_cli.apply_process.html @@ -0,0 +1,158 @@ + + + + + + + + + apply_process — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

apply_process

+
+
+eolab.rastertools.cli.utils_cli.apply_process(ctx, tool, inputs: list)[source]
+

Apply the chosen process to a set of input files.

+

This function extracts input files from a provided list or direct paths, configures the specified tool, +and processes the files through the given tool. Additionally, it handles debug settings (such as storing +intermediate VRT files) and manages any exceptions during the process. If an error occurs, the function +logs the exception and terminates the process with an appropriate exit code.

+
+
Parameters:
+
    +
  • ctx (click.Context) – The context object that contains configuration options.

  • +
  • tool (Filtering or Hillshade or any raster processing tool) – The configured tool instance that will apply the process to the input files. The tool should have +been properly set up with parameters.

  • +
  • inputs (list or str) – A list of input file paths or a path to a .lst file containing a list of input file paths. +This argument specifies the files that the tool will process.

  • +
+
+
Raises:
+
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.utils_cli.html b/docs/_build/html/api/eolab.rastertools.cli.utils_cli.html new file mode 100644 index 00000000..65faede4 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.utils_cli.html @@ -0,0 +1,139 @@ + + + + + + + + + eolab.rastertools.cli.utils_cli — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.cli.utils_cli

+

Description

+

Functions

+ + + + + + +

apply_process

Apply the chosen process to a set of input files.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.with_bands_arguments.html b/docs/_build/html/api/eolab.rastertools.cli.with_bands_arguments.html new file mode 100644 index 00000000..4bb1abb8 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.with_bands_arguments.html @@ -0,0 +1,141 @@ + + + + + + + + + with_bands_arguments — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

with_bands_arguments

+
+
+eolab.rastertools.cli.with_bands_arguments(parser)[source]
+

Add arguments to set the list of bands to process

+
+
Parameters:
+

parser – the argument parser to configure

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.with_outputdir_arguments.html b/docs/_build/html/api/eolab.rastertools.cli.with_outputdir_arguments.html new file mode 100644 index 00000000..6a0a9b63 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.with_outputdir_arguments.html @@ -0,0 +1,141 @@ + + + + + + + + + with_outputdir_arguments — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

with_outputdir_arguments

+
+
+eolab.rastertools.cli.with_outputdir_arguments(parser)[source]
+

Add arguments to set the output dir

+
+
Parameters:
+

parser – the argument parser to configure

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.with_window_arguments.html b/docs/_build/html/api/eolab.rastertools.cli.with_window_arguments.html new file mode 100644 index 00000000..a7c443cc --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.with_window_arguments.html @@ -0,0 +1,144 @@ + + + + + + + + + with_window_arguments — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

with_window_arguments

+
+
+eolab.rastertools.cli.with_window_arguments(parser, pad: bool = True)[source]
+

Add arguments to set the windowing parameters of the raster tool

+
+
Parameters:
+
    +
  • parser – the argument parser to configure

  • +
  • pad – whether to add an argument for the padding

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.zonalstats.create_argparser.html b/docs/_build/html/api/eolab.rastertools.cli.zonalstats.create_argparser.html new file mode 100644 index 00000000..46cc396b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.zonalstats.create_argparser.html @@ -0,0 +1,153 @@ + + + + + + + + + create_argparser — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_argparser

+
+
+eolab.rastertools.cli.zonalstats.create_argparser(rastertools_parsers)[source]
+

Adds the zonalstats subcommand to the given rastertools subparser

+
+
Parameters:
+

rastertools_parsers

The rastertools subparsers to which this subcommand shall be added.

+

This argument provides from a code like this:

+
import argparse
+main_parser = argparse.ArgumentParser()
+rastertools_parsers = main_parser.add_subparsers()
+zonalstats.create_argparser(rastertools_parsers)
+
+
+

+
+
Returns:
+

The rastertools subparsers updated with this subcommand

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.zonalstats.create_zonalstats.html b/docs/_build/html/api/eolab.rastertools.cli.zonalstats.create_zonalstats.html new file mode 100644 index 00000000..cacc5a42 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.zonalstats.create_zonalstats.html @@ -0,0 +1,148 @@ + + + + + + + + + create_zonalstats — rastertools 0.6.1.post1.dev0+gbedb844.d20241022 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

create_zonalstats

+
+
+eolab.rastertools.cli.zonalstats.create_zonalstats(args) Zonalstats[source]
+

Create and configure a new rastertool “Zonalstats” according to argparse args

+
+
Parameters:
+

args – args extracted from command line

+
+
Returns:
+

The configured rastertool to run

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.cli.zonalstats.html b/docs/_build/html/api/eolab.rastertools.cli.zonalstats.html new file mode 100644 index 00000000..36f76424 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.cli.zonalstats.html @@ -0,0 +1,132 @@ + + + + + + + + + eolab.rastertools.cli.zonalstats — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.cli.zonalstats

+

Description

+

CLI definition for the zonalstats tool

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.html b/docs/_build/html/api/eolab.rastertools.html new file mode 100644 index 00000000..f83dfe6c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.html @@ -0,0 +1,3675 @@ + + + + + + + + + eolab.rastertools package — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools package

+
+

Subpackages

+
+ +
+
+
+

Submodules

+
+
+

eolab.rastertools.filtering module

+

This module defines a rastertool named Filtering that can apply different kind +of filters on raster images.

+
+
+class eolab.rastertools.filtering.Filtering(raster_filter: RasterFilter, kernel_size: int, bands: List[int] = [1])[source]
+

Bases: Rastertool, Windowable

+

Raster tool that applies a filter on a raster image.

+

Predefined filters are available:

+
    +
  • Median filter

  • +
  • Local sum

  • +
  • Local mean

  • +
  • Adaptive gaussian filter.

  • +
+

A filter is applied on a kernel of a configurable size. To set the kernel size, you need +to call:

+
tool = Filtering(Filtering.median_filter, kernel_size=16)
+
+
+

Custom additional filters can be easily added by instanciating a RasterFilter (see +eolab.rastertools.processing.RasterFilter).

+

The parameters that customize the filter algo can be passed by following this procedure:

+
def myalgo(input_data, **kwargs):
+    # kwargs contain the values of the algo parameters
+    kernel_size = kwargs.get('kernel_size', 8)
+    myparam = kwargs.get('myparam', 1)
+    # ... do someting ...
+
+my_filter = RasterFilter(
+    "myfilter", algo=myalgo
+).with_documentation(
+    help="Apply my filter",
+    description="Apply my filter"
+).with_arguments({
+    "myparam": {
+        # configure the command line interface for this param, this can be skipped
+        "default": 8,
+        "required": True,
+        "type": int,
+        "help": "my configuration param for myalgo"
+    }
+})
+
+# create the raster tool
+tool = Filtering(my_filter, kernel_size=16)
+my_filter.with_output(".")
+my_filter.with_window(1024, "edge")
+# set the configuration parameter of the algo
+my_filter.with_filter_configuration({"myparam": 1024})
+# run the tool
+tool.process_file("./mytif.tif")
+
+
+
+
+adaptive_gaussian = adaptive_gaussian
+

RasterFilter that applies an adaptive gaussian filter to the kernel. The parameter sigma defines the standard deviation +of the Gaussian distribution.

+
+
Returns:
+

Numpy array containing the input data filtered by the Gaussian filter.

+
+
+
+ +
+
+property bands: List[int]
+

List of bands to process

+
+ +
+
+static get_default_filters()[source]
+

Get the list of predefined raster filters

+
+
Returns:
+

[eolab.rastertools.processing.RasterFilter] List of the predefined +raster filters ([Median, Local sum, Local mean, Adaptive gaussian])

+
+
+
+ +
+
+local_mean = mean
+

Computes the local means of the input data. +Each element is the mean of the pixels contained in the sliding window determined by kernel_size.

+
+
Returns:
+

Numpy array of the size of input_data containing the computed local means

+
+
+
+ +
+
+local_sum = sum
+

Computes the local sums of the input data. +Each element is the sum of the pixels contained in the sliding window determined by kernel_size.

+
+
Returns:
+

Numpy array of the size of input_data containing the computed local sums

+
+
+
+ +
+
+median_filter = median
+

Applies a Median Filter to the input data using +scipy.ndimage.median_filter. +The filter computes the median contained in the sliding window determined by kernel_size.

+
+
Returns:
+

Numpy array containing the input data filtered by the median filter

+
+
+
+ +
+
+process_file(inputfile: str) List[str][source]
+

Apply the filter to the input file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

([str]) A list of one element containing the path of the generated filtered image.

+
+
+
+ +
+
+property raster_filter: RasterFilter
+

Name of the filter to apply to the raster

+
+ +
+
+with_filter_configuration(argsdict: Dict)[source]
+

Configure the filter with its specific arguments’ values

+
+
Parameters:
+

argsdict (dict) – Dictionary of filter’s arguments names and values. Shall contain at least +the kernel size (key=”kernel”)

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Filtering

+
+
+
+ +
+ +
+
+

eolab.rastertools.hillshade module

+

This module defines a rastertool named Hillshade which computes the hillshade +of a Digital Height Model corresponding to a given solar position (elevation and azimuth).

+
+
+class eolab.rastertools.hillshade.Hillshade(elevation: float, azimuth: float, resolution: float, radius: int | None = None)[source]
+

Bases: Rastertool, Windowable

+

Raster tool that computes the hillshades of a Digital Elevation / Surface / Height Model +corresponding to a given solar position.

+

The input image is a raster that contains the height of the points as pixel values.

+

At a given position p, the Hillshade tool check if the point is in the hillshade generated by +any other points in the direction of the sun. To achieve this goal, the algorithm computes the +angle \(\gamma\): \(\tan \frac{Height}{Distance}\):

+
                    _____
+                  x|     |  ^
+              x    |     |  | Height (from Digital Model)
+         x   __    |     |  |
+____p_______|  |___|     |__v____________
+    <-------------->
+        Distance
+
+
+

The point is in the hillshade of another one if \(\gamma < elevation_{sun}\). +To avoid testing too many points, the “radius” parameter defines the max distance of the pixel +to test. The radius can be set by the user or automatically computed by the Hillshade tool. In +this latter case, the radius is \(\frac{\Delta h}{\tan{elevation_{sun}}}\) where +\(\Delta h\) is \(max - min\) of the pixel values in the input raster.

+

The output image is a mask where pixels corresponding to hillshades equal to 1.

+
+
+property azimuth
+

Return the azimuth of the sun (in degrees)

+
+ +
+
+property elevation
+

Return the elevation of the sun (in degrees)

+
+ +
+
+process_file(inputfile: str) List[str][source]
+

Compute hillshade for the input file.

+
+
Parameters:
+

inputfile (str) – Input image file path to process.

+
+
Returns:
+

A list containing the file path of the generated hillshade image.

+
+
Return type:
+

List[str]

+
+
Raises:
+

ValueError – If the input file contains more than one band or if the radius exceeds constraints.

+
+
+
+ +
+
+property radius
+

Return the maximum distance from current point (in pixels) +for evaluating the maximum elevation angle

+
+ +
+
+property resolution
+

Return the resolution of a raster pixel (in meter)

+
+ +
+ +
+
+

eolab.rastertools.main module

+

This module contains the rastertools command line interface. The command line +has several subcommands such as radioindice and zonalstats.

+

Usage examples:

+
rastertools radioindice --help
+rastertools zonalstats --help
+
+
+
+
+eolab.rastertools.main.add_custom_rastertypes(rastertypes)[source]
+

Add definition of new raster types. The json string shall have the following format:

+
{
+  "rastertypes": [
+    {
+      "name": "RGB_TIF",
+      "product_pattern": "^RGB_TIF_(?P<date>[0-9_]*)\.(tif|TIF)$",
+      "bands": [
+        {
+          "channel": "red",
+          "description": "red"
+        },
+        {
+          "channel": "green",
+          "description": "green"
+        },
+        {
+          "channel": "blue",
+          "description": "blue"
+        },
+        {
+          "channel": "nir",
+          "description": "nir"
+        }
+      ],
+      "date_format": "%Y%m%d_%H%M%S",
+      "nodata": 0
+    },
+    {
+      "name": "RGB_TIF_ARCHIVE",
+      "product_pattern": "^RGB_TIF_(?P<date>[0-9\_]*).*$",
+      "bands_pattern": "^TIF_(?P<bands>{}).*\.(tif|TIF)$",
+      "bands": [
+        {
+          "channel": "red",
+          "identifier": "r",
+          "description": "red"
+        },
+        {
+          "channel": "green",
+          "identifier": "g",
+          "description": "green"
+        },
+        {
+          "channel": "blue",
+          "identifier": "b",
+          "description": "blue"
+        },
+        {
+          "channel": "nir",
+          "identifier": "n",
+          "description": "nir"
+        }
+      ],
+      "date_format": "%Y%m%d_%H%M%S",
+      "nodata": 0
+    }
+  ]
+}
+
+
+
    +
  • name : unique name of raster type

  • +
  • product_pattern: regexp to identify raster product matching the raster type. Regexp can +contain catching groups that identifies metadata: date (groupe name=date), relative +orbit number (relorbit), tile number (tile), any other group (free name of the group).

  • +
  • bands_pattern (optional) : when the raster product of this type is an archive +(zip, tar, tar.gz, etc.), the pattern enables to identify the files of the different +raster bands. The raster product can contain one raster file per band or one multi-bands +raster file. In the first case, the pattern must contain a group that identify +the band to which the file corresponds. This group must be defined as follows (?P<bands>{}) +in which the variable part {} will be replaced by the identifier of the band (see below).

  • +
  • date_format (optional): date format in the product name. By default: %Y%m%d-%H%M%S

  • +
  • nodata (optional): no data value of raster bands. By default: -10000

  • +
  • masknnodata (optional): nodata value in the mask band

  • +
  • For every bands:

    +
      +
    • channel: channel of the band. Must be one of: blue, green, red, nir, mir, swir, +red_edge1, red_edge2, red_edge3, red_edge4, blue_60m, nir_60m and mir_60m.

    • +
    • identifier (optional): string that identifies the band in the filenames of a raster +product that it is an archive. This identifier is inserted in the group bands of +the bands_pattern.

    • +
    • description (optional): band description that will be reused in the generated products.

    • +
    +
  • +
  • For every masks:

    +
      +
    • identifier (optional): string that identifies the mask band in the filenames of a raster +product that it is an archive. This identifier is inserted in the group bands of +the bands_pattern.

    • +
    • description (optional): mask band description that will be reused in the generated products.

    • +
    • maskfunc (optional): fully qualified name of the python function that converts the mask +band values to a binary mask (0 = masked; 1 = unmasked)

    • +
    +
  • +
+
+
Parameters:
+

rastertypes – JSON string that contains the new raster types definition

+
+
+
+ +
+
+eolab.rastertools.main.run(*args, **kwargs)[source]
+

Entry point for console_scripts

+
+ +
+
+

eolab.rastertools.radioindice module

+

This module defines a command line named radioindice that computes radiometric +indices on raster images: ndvi, ndwi, etc..

+
+
+class eolab.rastertools.radioindice.Radioindice(indices: List[RadioindiceProcessing])[source]
+

Bases: Rastertool, Windowable

+

Raster tool that computes radiometric indices of a raster product.

+

If several indices are requested, the tool can generate one output image with one +band per indice (merge=True), or it can generate several images, one image per indice +(merge=False).

+

The computation can be realized on a subset of the input image (a Region Of Interest) +defined by a vector file (e.g. shapefile, geojson).

+

The radiometric indice is an instance of +eolab.rastertools.processing.RadioindiceProcessing +which defines the list of channels it needs to compute the indice. The input raster product +must be of a recognized raster type so that it is possible to match every channels required by +the indice with an existing band in the raster product.

+
+
+bi = bi
+

Brightness index (red, green channels)

+
+\[bi = \frac{red^2 + green^2}{2}\]
+
+ +
+
+bi2 = bi2
+

Brightness index (nir, red, green channels)

+
+\[bi2 = \frac{nir^2 + red^2 + green^2}{3}\]
+
+ +
+
+evi = evi
+

Enhanced vegetation index (red, nir, blue channels)

+
+\[evi = \frac{2.5 * (nir - red)}{nir + 6.0 * red - 7.5 * blue + 1.0}\]
+
+ +
+
+static get_default_indices()[source]
+

Get the list of predefined radiometric indices

+
+
Returns:
+

list of +predefined radioindice.

+
+
Return type:
+

[eolab.rastertools.processing.RadioindiceProcessing]

+
+
+
+ +
+
+property indices: List[RadioindiceProcessing]
+

List of radiometric indices to compute

+
+ +
+
+ipvi = ipvi
+

Infrared Percentage Vegetation Index (red, nir channels)

+
+\[ipvi = \frac{nir}{nir + red}\]
+

References

+

Crippen, R. E. 1990. Calculating the Vegetation Index Faster, Remote Sensing of +Environment, vol 34., pp. 71-73.

+
+ +
+
+property merge: bool
+

If true, all indices are in the same output image (one band per indice). +Otherwise, each indice is in its own output image.

+
+ +
+
+mndwi = mndwi
+

Modified Normalized Difference Water Index (green, mir channels)

+
+\[mndwi = \frac{green - mir}{green + mir}\]
+

References

+

Xu, H. Q., 2006. Modification of normalised difference water index (NDWI) to enhance +open water features in remotely sensed imagery. International Journal of Remote Sensing +27, 3025-3033

+
+ +
+
+msavi = msavi
+

Modified Soil Adjusted Vegetation Index (red, nir channels)

+
+\begin{eqnarray} + wdvi & = & nir - 0.4 * red \\ + ndvi & = & \frac{nir - red}{nir + red} \\ + L & = & 1 - 2 * 0.4 * ndvi * wdvi \\ + msavi & = & \frac{(nir - red) * (1 + L)}{nir + red + L} +\end{eqnarray}

References

+

Qi J., Chehbouni A., Huete A.R., Kerr Y.H., 1994. Modified Soil Adjusted Vegetation +Index (MSAVI). Remote Sens Environ 48:119-126

+

Qi J., Kerr Y., Chehbouni A., 1994. External factor consideration in vegetation index +development. Proc. of Physical Measurements and Signatures in Remote Sensing, +ISPRS, 723-730.

+
+ +
+
+msavi2 = msavi2
+

Modified Soil Adjusted Vegetation Index (red, nir channels)

+
+\begin{eqnarray} + val & = & (2 * nir + 1)^2 - 8 * (nir - red) \\ + msavi2 & = & (2 * nir + 1 - \sqrt{val}) / 2 +\end{eqnarray}
+ +
+
+ndbi = ndbi
+

Normalized Difference Built Up Index (nir, mir channels)

+
+\[ndbi = \frac{mir - nir}{mir + nir}\]
+
+ +
+
+ndpi = ndpi
+

Normalized Difference Pond Index (green, mir channels)

+
+\[ndpi = \frac{mir - green}{mir + green}\]
+

References

+

J-P. Lacaux, Y. M. Tourre, C. Vignolle, J-A. Ndione, and M. Lafaye, “Classification +of Ponds from High-Spatial Resolution Remote Sensing: Application to Rift Valley Fever +Epidemics in Senegal,” Remote Sensing of Environment 106 66–74, Elsevier Publishers: 2007

+
+ +
+
+ndti = ndti
+

Normalized Difference Turbidity Index (green, red channels)

+
+\[ndti = \frac{red - green}{red + green}\]
+

References

+

J-P. Lacaux, Y. M. Tourre, C. Vignolle, J-A. Ndione, and M. Lafaye, “Classification +of Ponds from High-Spatial Resolution Remote Sensing: Application to Rift Valley Fever +Epidemics in Senegal,” Remote Sensing of Environment 106 66–74, Elsevier Publishers: 2007

+
+ +
+
+ndvi = ndvi
+

Normalized Difference Vegetation Index (red, nir channels)

+
+\[ndvi = \frac{nir - red}{nir + red}\]
+

References

+

Rouse J.W., Haas R.H., Schell J.A., Deering D.W., 1973. Monitoring vegetation systems in +the great plains with ERTS. Third ERTS Symposium, NASA SP-351. 1:309-317

+

Tucker C.J., 1979. Red and photographic infrared linear combinations for monitoring +vegetation. Remote Sens Environ 8:127-150

+
+ +
+
+ndwi = ndwi
+

Normalized Difference Water Index (mir, nir channels)

+
+\[ndwi = \frac{nir - mir}{nir + mir}\]
+

References

+

Gao, B. C., 1996. NDWI - A normalized difference water index for remote sensing +of vegetation liquid water from space. Remote Sensing of Environment 58, 257-266.

+
+ +
+
+ndwi2 = ndwi2
+

Normalized Difference Water Index (nir, green channels)

+
+\[ndwi2 = \frac{green - nir}{green + nir}\]
+
+ +
+
+process_file(inputfile: str) List[str][source]
+

Compute the indices for a single file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

List of indice images (posix paths) that have been generated

+
+
Return type:
+

[str]

+
+
+
+ +
+
+pvi = pvi
+

Perpendicular Vegetation Index (red, nir channels)

+
+\[pvi = (nir - 0.90893 * red - 7.46216) * 0.74\]
+

References

+

Richardson A.J., Wiegand C.L., 1977. Distinguishing vegetation from soil background +information. Photogramm Eng Rem S 43-1541-1552

+
+ +
+
+ri = ri
+

Redness index (red, green channels)

+
+\[ri = \frac{red^2}{green^3}\]
+
+ +
+
+property roi: str
+

Filename of the vector data defining the ROI

+
+ +
+
+rvi = rvi
+

Ratio Vegetation Index (red, nir channels)

+
+\[rvi = \frac{nir}{red}\]
+

References

+

Jordan C.F., 1969. Derivation of leaf area index from quality of light on the forest +floor. Ecology 50:663-666

+
+ +
+
+savi = savi
+

Soil Adjusted Vegetation Index (red, nir channels)

+
+\[savi = \frac{(nir - red) * (1. + 0.5)}{nir + red + 0.5}\]
+

References

+

Huete A.R., 1988. A soil-adjusted vegetation index (SAVI). Remote Sens Environ 25:295-309

+
+ +
+
+tndvi = tndvi
+

Transformed Normalized Difference Vegetation Index (red, nir channels)

+
+\begin{eqnarray} + ndvi & = & \frac{nir - red}{nir + red} \\ + tndvi & = & \sqrt{ndvi + 0.5} +\end{eqnarray}

References

+

Deering D.W., Rouse J.W., Haas R.H., and Schell J.A., 1975. Measuring forage production +of grazing units from Landsat MSS data. Pages 1169-1178 In: Cook J.J. (Ed.), Proceedings +of the Tenth International Symposium on Remote Sensing of Environment (Ann Arbor, 1975), +Vol. 2, Ann Arbor, Michigan, USA.

+
+ +
+
+tsavi = tsavi
+

Transformed Soil Adjusted Vegetation Index (red, nir channels)

+
+\[tsavi = \frac{0.7 * (nir - 0.7 * red - 0.9)}{0.7 * nir + red + 0.08 * (1 + 0.7^2)}\]
+

References

+

Baret F., Guyot G., Major D., 1989. TSAVI: a vegetation index which minimizes soil +brightness effects on LAI or APAR estimation. 12th Canadian Symposium on Remote +Sensing and IGARSS 1990, Vancouver, Canada, 07/10-14.

+
+ +
+
+with_output(outputdir: str = '.', merge: bool = False)[source]
+

Set up the output.

+
+
Parameters:
+
    +
  • outputdir (str, optional, default=".") – Output dir where to store results. If none, it is set to current dir

  • +
  • merge (bool, optional, default=False) – Whether to merge all indices in the same image (i.e. one band per indice)

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Radioindice

+
+
+
+ +
+
+with_roi(roi: str)[source]
+

Set up the region of interest

+
+
Parameters:
+

roi (str) – Filename of the vector data defining the ROI +(output images will be cropped to the geometry)

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Radioindice

+
+
+
+ +
+ +
+
+eolab.rastertools.radioindice.compute_indices(input_image: str, image_channels: List[BandChannel], indice_image: str, indices: List[RadioindiceProcessing], window_size: tuple = (1024, 1024))[source]
+

Compute the indices on the input image and produce a multiple bands +image (one band per indice)

+

The possible indices are the following : +ndvi, tndvi, rvi, pvi, savi, tsavi, msavi, msavi2, ipvi, evi, ndwi, ndwi2, mndwi, ndpi, ndti, ndbi, ri, bi, bi2

+
+
Parameters:
+
    +
  • input_image (str) – Path of the raster to compute

  • +
  • image_channels ([eolab.rastertools.product.BandChannel]) – Ordered list of bands in the raster

  • +
  • indice_image (str) – Path of the output raster image

  • +
  • indices ([eolab.rastertools.processing.RadioindiceProcessing]) – List of indices to compute

  • +
  • window_size (tuple(int, int), optional, default=(1024, 1024)) – Size of windows for splitting the processed image in small parts

  • +
+
+
+
+ +
+
+

eolab.rastertools.rastertools module

+

This module defines the base class for every Rastertool, namely eolab.rastertools.Rastertool.

+

It also defines a specific Exception class that shall be raised when invalid rastertool’s +configuration parameters are setup.

+

Finally, it defines additional decorator classes that factorize some rastertool configuration +features. For example, the class eolab.rastertools.Windowable enables to configure a +rastertool with windowable capabilities (i.e. capability to split the raster input file in small +parts in order to distribute the processing over several cpus).

+
+
+class eolab.rastertools.rastertools.Rastertool[source]
+

Bases: ABC

+

Base class for every raster tool which contains the common configuration:

+
    +
  • the output dir where to store the results (by default, current dir)

  • +
  • whether to save to disk the intermediate VRT images that can be created when +handling the input raster products (that can be an archive of several band files for +example). This parameter is mainly for debug purpose and is False by default.

  • +
+
+
+property keep_vrt: bool
+

Whether intermediate VRT images shall be kept

+
+ +
+
+property outputdir: str
+

Path of the output directory where are stored the results

+
+ +
+
+postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str][source]
+

Run a postprocess when all input files have been processed. This step may consist +in transforming the outputs or mixing them to generate additional ones.

+
+

Note

+

This implementation does nothing. Override this method in the subclass +to achieve special processing that needs the whole list of inputfiles +and/or the output files generated when processing every single file (to mix +them for instance).

+
+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files

  • +
+
+
+
+
Returns

[str]: Additional output files (by default empty list)

+
+
+
+ +
+
+process_file(inputfile: str) List[str][source]
+

Run the rastertool to a single input file.

+
+

Note

+

This implementation does nothing. Override this method in the subclass +to achieve special processing of an inputfile.

+
+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

List of generated files (by default empty list)

+
+
Return type:
+

[str]

+
+
+
+ +
+
+process_files(inputfiles: List[str])[source]
+

Run the rastertool to a set of input files. By default, this implementation +recursively calls “process_file” on each input file and then calls “postprocess_files”.

+
+

Note

+

It is not meant to be overriden by subclasses. Prefer overriding process_file +and postproces_files instead.

+
+
+
Parameters:
+

inputfiles ([str]) – Input images to process

+
+
Returns:
+

([str]) The list of the generated files

+
+
+
+ +
+
+property vrt_dir: str
+

Dir where to store intermediate VRT images

+
+ +
+
+with_output(outputdir: str = '.')[source]
+

Set up the output.

+
+
Parameters:
+

outputdir (str, optional, default=".") – Output dir where to store results. If none, it is set to current dir

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+
+with_vrt_stored(keep_vrt: bool)[source]
+

Configure if the intermediate VRT images that are generated when handling +the input files (which can be complex raster product composed of several band files) +shall be stored to disk or not - for debug purpose for instance.

+
+
Parameters:
+

keep_vrt (bool) – Whether intermediate VRT images shall be stored or not

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ +
+
+exception eolab.rastertools.rastertools.RastertoolConfigurationException[source]
+

Bases: Exception

+

This class defines an exception that is raised when the configuration of the raster tool +is invalid (wrong input parameter)

+
+ +
+
+class eolab.rastertools.rastertools.Windowable[source]
+

Bases: object

+

Decorator of a eolab.rastertools.Rastertool that adds configuration +parameters to set the windowable capability of the tool:

+
    +
  • the window size

  • +
  • the mode for padding the window when at the edge of the image

  • +
+
+
+property pad_mode: str
+

//numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image +The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty].

+
+
Type:
+

Mode used to `pad <https

+
+
+
+ +
+
+property window_size: int
+

Size of the windows to split the image in small parts

+
+ +
+
+with_windows(window_size: int = 1024, pad_mode: str = 'edge')[source]
+

Configure the window generation for processing image

+
+
Parameters:
+
    +
  • window_size (int, optional, default=1024) – Size of windows for splitting the processed image in small parts +so that processing can be distributed on several cpus.

  • +
  • pad_mode (str, optional, default="edge") – Mode for padding data around the windows that are on the edge of the image. +See https://numpy.org/doc/stable/reference/generated/numpy.pad.html

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ +
+
+

eolab.rastertools.speed module

+

This module defines a rastertool named speed that computes the time derivative (speed) +of the radiometry of the input rasters.

+
+
+class eolab.rastertools.speed.Speed(bands: List[int] = [1])[source]
+

Bases: Rastertool

+

Raster tool that computes the time derivative (speed) of raster images.

+

For images of the same and known type, the tool extract the timestamp metadata +from the names of the images. It can then compute the time derivatives of every +bands.

+
+
+property bands: List[int]
+

List of bands to process

+
+ +
+
+postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str][source]
+

Compute the temporal derivative of input files’ radiometry

+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files individually

  • +
+
+
Returns:
+

List of speed images that have been generated

+
+
Return type:
+

[str]

+
+
+
+ +
+ +
+
+eolab.rastertools.speed.compute_speed(date0: datetime, date1: datetime, product0: RasterProduct, product1: RasterProduct, speed_image: str, bands: List[int] | None = None)[source]
+

Compute the evolution of the raster band during a time interval

+
+
Parameters:
+
    +
  • date0 (datetime.datetime) – Date of the first dataset

  • +
  • date1 (datetime.datetime) – Date of the second dataset

  • +
  • product0 (eolab.rastertools.product.RasterProduct) – Path of the first raster image

  • +
  • product1 (eolab.rastertools.product.RasterProduct) – Path of the second raster image

  • +
  • speed_image (str) – Path of the output image

  • +
  • bands ([int], optional, default=None) – List of bands to process. None if all bands shall be processed

  • +
+
+
+
+ +
+
+

eolab.rastertools.svf module

+

This module defines a rastertool named SVF (Sky View Factor) which computes the SVF +of a Digital Height Model.

+
+
+class eolab.rastertools.svf.SVF(nb_directions: int, radius: int, resolution: float)[source]
+

Bases: Rastertool, Windowable

+

Raster tool that computes the Sky View Factor (SVF) of a +Digital Elevation / Surface / Height Model.

+

Kokalj, Žiga & all 2013:

+

SVF is a geophysical parameter that measures the portion of the sky visible from a certain +point. The portion of the sky visible above the surface is especially relevant in energy balance +studies and computation of diffuse solar insolation.

+

Sky-view factor is defined as the proportion of visible sky (\(\Omega\)) above a certain +observation point as seen from a two-dimensional representation.

+

The light that falls from the sky onto a certain part of the surface is reduced by the obstacles +that form the horizon. These obstacles can be described in all directions by the vertical +elevation angle above the horizontal plane.

+

A good SVF approximation can therefore be performed with the estimate of this angle +in several directions. After the vertical elevation angle is determined in the chosen +number of directions n, the SVF is determined as a sum of all portions of the sky within +each direction: \(\sum \frac {\cos \gamma_i}{n}\), where \(\gamma_i\) is the +vertical angle of the horizon in the`direction i.

+

The angle \(\gamma\) is extracted from the Digital Model: +\(\tan \frac{Height}{Distance}\):

+
                    _____
+                  x|     |  ^
+              x    |     |  | Height (from Digital Model)
+         x   __    |     |  |
+____p_______|  |___|     |__v____________
+    <-------------->
+        Distance
+
+
+

Where p is the current pixel where the SVF is computed.

+

In a direction, the algorithm computes all angles and keeps the largest one. To avoid testing +too many points, the “radius” parameter defines the max distance of the pixel to test.

+

The output image of SVF rastertool is a raster image with the SVF value computed at every pixels +of the input Digital Height Model.

+
+
+property altitude
+

The altitude at which SVF is computed. If None, the SVF is computed +at the altitude of the point.

+
+ +
+
+property nb_directions
+

Number of directions to compute the SVF

+
+ +
+
+process_file(inputfile: str)[source]
+

Compute SVF for the input file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

A list containing a single element: the generated Sky View Factor image.

+
+
Return type:
+

[str]

+
+
+
+ +
+
+property radius
+

Max distance from current point (in pixels) to consider +for evaluating the max elevation angle

+
+ +
+
+property resolution
+

Resolution of the input Digital Height Model (in meter)

+
+ +
+
+with_altitude(altitude: float)[source]
+

Configure the altitude at which the Sky View Factor shall be computed. +If not set, the SVF is computed for each pixel at the pixel altitude.

+
+
Parameters:
+

altitude (float) – Altitude at which SVF shall be computed

+
+
Returns:
+

The current instance so that it is possible to chain the with… calls (fluent API)

+
+
+
+ +
+ +
+
+

eolab.rastertools.tiling module

+

This module defines a rastertool named Tiling that generates tiles a raster images based on +a reference grid.

+
+
+class eolab.rastertools.tiling.Tiling(geometry_file: str)[source]
+

Bases: Rastertool

+

Raster tool that tiles a raster following the geometries of a grid.

+

The tool takes as input two files: a raster image and a grid file (shapefile, geojson …). +The grid file defines the geometries of the tiles.

+

Different options can be configured:

+
    +
  • output dir: select the dir where tiles will be stored to disk

  • +
  • output basename: naming rule of tiles. By default, the basename is the name of +the original file followed by “_tile” followed by the tile index. In the +formatted string, tile index is at position 1 and original filename is at +position 0. For instance, a naming rule such as “tile{1}.tif” will generate +the tile name “tile75.tif” for the tile id = 75.

  • +
  • output subdir: naming rule for subdirs when every tile must be generated in a +different subdir.

  • +
+

It is also possible to select the tiles to generate. The seleted tiles are the ones +which match the expected values of a given grid’s property.

+
+
+property grid
+

Get the grid that defines the geometries for tiling raster images

+
+ +
+
+property output_basename: str
+

Base name for naming output

+
+ +
+
+property output_subdir
+

Naming convention of the subdir where to store outputs. None if +no tiles shall not be generated in subdirs (but directly in the output dir)

+
+ +
+
+process_file(inputfile: str)[source]
+

Tile the input file following the geometry file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

The list of generates tiles.

+
+
Return type:
+

[str]

+
+
+
+ +
+
+with_id_column(id_column: str, ids: List[int])[source]
+

Set up a filter on the geometries for which tiles shall be generated.

+
+
Parameters:
+
    +
  • id_column (str) – Name of the column in the vector file that contains the ids to filter.

  • +
  • ids – List of ids values for which tiles shall be generated.

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Tiling

+
+
+
+ +
+
+with_output(outputdir: str = '.', output_basename: str = '{}_tile{}', output_subdir: str | None = None)[source]
+

Set up the output.

+
+
Parameters:
+
    +
  • outputdir (str, optional, default=".") – Output dir where to store results.

  • +
  • output_basename (str, optional, default="{}_tile{}") – Basename for the output file as a formatted string. By default, the +basename is the name of the original file followed by “_tile” followed +by the tile index. In the formatted string, tile index is at position 1 +and original filename is at position 0. For instance, tile{1}.tif will +generate the following name tile75.tif for the tile id = 75

  • +
  • output_subdir (str, optional, default=None) – When each tile must be generated in a different subdir, output_subdir +defines the naming convention for the subdir. It is a formatted string +with one positional parameter corresponding to the tile index. +For instance, tile{} will generate the following subdir name: tile75/ +for the tile id = 75. If None, output files will be generated directly +in the outputdir.

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Tiling

+
+
+
+ +
+ +
+
+

eolab.rastertools.timeseries module

+

This module defines a rastertool named timeseries that generate a timeseries +of rasters at different dates from a list of rasters that may contain gaps (due +to clouds for instance). The timeseries is generated with a linear interpolation +thus enabling to fill gaps.

+
+
+class eolab.rastertools.timeseries.Timeseries(start_date: datetime, end_date: datetime, period: int, bands: List[int] = [1])[source]
+

Bases: Rastertool, Windowable

+

Raster tool that generates the time series of raster images. The timeseries is +generated with a linear interpolation thus enabling to fill gaps.

+
+
+property bands: List[int]
+

List of bands to process

+
+ +
+
+property end_date
+

End date of the timeseries to generate

+
+ +
+
+property period
+

Period (in days) of the timeseries to generate

+
+ +
+
+postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str][source]
+

Generates the timeseries from a list of inputfiles.

+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files individually

  • +
+
+
Returns:
+

List of images that have been generated

+
+
Return type:
+

[str]

+
+
+
+ +
+
+property start_date
+

Start date of the timeseries to generate

+
+ +
+ +
+
+eolab.rastertools.timeseries.compute_timeseries(products_per_date: Dict[float, RasterProduct], timeseries_dates: List[float], timeseries_images: List[str], bands: List[int] | None = None, window_size: tuple = (1024, 1024))[source]
+

Generate the timeseries

+
+
Parameters:
+
    +
  • products_per_date (dict[float, eolab.rastertools.product.RasterProduct]) – List of input images indexed by their timestamp

  • +
  • ([float] (timeseries_dates) – List of dates (timestamps) in the requested timeseries

  • +
  • timeseries_images ([str]) – Paths of the output images (one per requested date)

  • +
  • bands ([int], optional, default=None) – List of bands to process. None if all bands shall be processed

  • +
  • window_size (tuple(int, int), optional, default=(1024, 1024)) – Size of windows for splitting the process in small parts

  • +
+
+
+
+ +
+
+

eolab.rastertools.utils module

+

This module defines several utility methods for:

+
    +
  • handling path

  • +
  • transforming data

  • +
  • computing sliding windows

  • +
  • +
+
+
+eolab.rastertools.utils.get_basename(file) str[source]
+

Get the basename of a Path

+
+ +
+
+eolab.rastertools.utils.get_metadata_name(band: int, prefix: str, metadata: str)[source]
+

Get the metadata name for the statistics to generate

+
+ +
+
+eolab.rastertools.utils.get_suffixes(file) str[source]
+

Get the suffixes of a filename as a concatenated string

+
+ +
+
+eolab.rastertools.utils.highest_power_of_2(n)[source]
+

Get the highest power of 2 that is less than n

+
+ +
+
+eolab.rastertools.utils.is_dir(file) bool[source]
+

Check if file is a dir or not

+
+ +
+
+eolab.rastertools.utils.slices_1d(window_width, shift, stop, start=0)[source]
+

Yield 1 dimension sliding windows according to the given parameters

+
+
Parameters:
+
    +
  • window_width – window width

  • +
  • shift – shift to apply between two consecutive windows

  • +
  • stop – max value

  • +
  • start – min value (default 0)

  • +
+
+
Returns:
+

start and end index of the sliding windows.

+
+
Return type:
+

min, max (int, int)

+
+
+
+ +
+
+eolab.rastertools.utils.slices_2d(window_size, shift, stop, start=0)[source]
+

Yield 2 dimensions sliding windows according to the given parameters.

+
+
Parameters:
+
    +
  • window_size – window width and height

  • +
  • shift – shift to apply between two consecutive windows

  • +
  • stop – max value

  • +
  • start – min value (default 0)

  • +
+
+
+
+
Returns: Firstly yield number of windows, then

window y_min, y_max, x_min, x_max for each windoww

+
+
+
+ +
+
+eolab.rastertools.utils.to_path(file, default=None) Path[source]
+

Transform a file name to a Path

+
+ +
+
+eolab.rastertools.utils.to_tuple(val)[source]
+

Convert val as a tuple of two val

+
+ +
+
+

eolab.rastertools.zonalstats module

+

This module defines a rastertool named zonalstats that compute several statistics +(mean, median, std dev, etc) on one or several bands of a raster image. The statistics +can be computed on the whole image or by zones defined by a vector file (e.g. shapefile, +geojson).

+

Several options are provided:

+
    +
  • compute outliers: enable to generate an image that emphasizes the outliers pixels +(i.e. pixels with values greater that mean + n x stddev where n can be parametrized).

  • +
  • generate a chart: if several raster images are computed and if we can extract a date from the +filenames (because the raster is of a known type), generate one chart +per statistics (x=time, y=stats)

  • +
+
+
+class eolab.rastertools.zonalstats.Zonalstats(stats: List[str], categorical: bool = False, valid_threshold: float = 0.0, area: bool = False, prefix: str | None = None, bands: List[int] = [1])[source]
+

Bases: Rastertool

+

Raster tool that computes zonal statistics of a raster product.

+
+
+property area: bool
+

Whether to compute the statistics multiplied by the pixel area

+
+ +
+
+property bands: List[int]
+

List of bands to process

+
+ +
+
+property categorical: bool
+

Whether to compute the counts of every unique pixel values

+
+ +
+
+property category_file: str
+

Filename containing the categories when computing stats per +categories in the geometries

+
+ +
+
+property category_file_type: str
+

Type of the category file, either ‘raster’ or ‘vector’

+
+ +
+
+property category_index: str
+

Column name identifying categories in categroy_file (only if file format +is geometries)

+
+ +
+
+property category_labels: str
+

Dict with classes index as keys and names to display as values

+
+ +
+
+property chart_file: str
+

Name of the chart file to generate

+
+ +
+
+compute_stats(raster: str, bands: List[int], geometries: GeoDataFrame, descr: List[str], date: str, area_square_meter: int) List[List[Dict[str, float]]][source]
+

Compute the statistics of the input data. [Minimum, Maximum, Mean, Standard deviation]

+
+
Parameters:
+
    +
  • raster (str) – Input image to process

  • +
  • bands ([int]) – List of bands in the input image to process. Empty list means all bands

  • +
  • geometries (GeoDataFrame) – Geometries where to add statistics (geometries must be in the same +projection as the raster)

  • +
  • descr ([str]) – Band descriptions

  • +
  • date (str) – Timestamp of the input raster

  • +
  • area_square_meter (int) – Area represented by a pixel

  • +
+
+
+

Returns: +list[list[dict]] +The dictionnary associates the name of the statistics to its value.

+
+ +
+
+property display_chart: bool
+

Whether to display the chart

+
+ +
+
+property generated_stats
+

The list of generated stats in the same order as the input files

+
+ +
+
+property generated_stats_dates
+

The list of dates when they can be extracted from the input files’ names

+
+ +
+
+property generated_stats_per_date
+

After processing one or several files, this method enables to retrieve a dictionary +that contains the statistics for each inputfile’s date:

+
    +
  • keys are timestamps

  • +
  • values are the statistics at the corresponding timestam

  • +
+
+

Warning

+

When the timestamp of the input raster cannot be retrieved, the dictionary does not +contain the generated statistics for this input raster. In this case, prefer calling +generated_stats to get the stats as a list (one item per input file).

+
+
+ +
+
+property geometries: str
+

The geometries where to compute zonal statistics

+
+ +
+
+property geometry_index: str
+

The column name identifying the name of the geometry

+
+ +
+
+property output_format: str
+

Output format for the features stats

+
+ +
+
+postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str][source]
+

Generate the chart if requested after computing stats for each input file

+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files

  • +
+
+
Returns:
+

A list containing the chart file if requested

+
+
Return type:
+

[str]

+
+
+
+ +
+
+property prefix: str
+

Prefix of the features stats (one per band)

+
+ +
+
+process_file(inputfile: str) List[str][source]
+

Compute the stats for a single input file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

List of generated statistical images (posix paths) that have been generated

+
+
Return type:
+

[str]

+
+
+
+ +
+
+property sigma: float
+

Number of sigmas for identifying outliers

+
+ +
+
+property stats: List[str]
+

List of stats to compute

+
+ +
+
+supported_output_formats = {'CSV': 'csv', 'ESRI Shapefile': 'shp', 'GML': 'gml', 'GPKG': 'gpkg', 'GeoJSON': 'geojson'}
+

List of all possible output format are provided by fiona.supported_drivers.keys()

+
+ +
+
+valid_stats = ['count', 'valid', 'nodata', 'min', 'max', 'mean', 'std', 'sum', 'median', 'mad', 'range', 'majority', 'minority', 'unique']
+

List of stats that can be computed. In addition to this list, “percentile_xx” is +also a valid stat where xx is the percentile value, e.g. percentile_70

+
+ +
+
+property valid_threshold: float
+

Minimum percentage of valid pixels in a shape to compute its statistics

+
+ +
+
+with_chart(chart_file: str | None = None, geometry_index: str = 'ID', display: bool = False)[source]
+

Set up the charting capability

+
+
Parameters:
+
    +
  • chart_file (str, optional, default=None) – If not None, generate a chart with the statistics and saves it to str

  • +
  • geometry_index (str, optional, default='ID') – Name of the index in the geometry file

  • +
  • display (bool, optional, default=False) – If true, display the chart with the statistics

  • +
+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+
+with_geometries(geometries: str, within: bool = False)[source]
+

Set up the geometries where to compute stats.

+
+
Parameters:
+
    +
  • geometries (str) – Name of the file containing the geometries where to compute zonal stats. If not set, +stats are computed on the whole raster image

  • +
  • within (bool, optional, default=False) – Whether to compute stats only for geometries within the raster. If False, +statistics are computed for geometries that intersect the raster shape.

  • +
+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+
+with_outliers(sigma: float)[source]
+

Set up the computation of outliers

+
+
Parameters:
+

sigma (float) – Distance to the mean value to consider a pixel as an outlier (expressed +in sigma, e.g. the value 2 means that pixels values greater than +mean value + 2 * std are outliers)

+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+
+with_output(outputdir: str = '.', output_format: str = 'ESRI Shapefile')[source]
+

Set up the output.

+
+
Parameters:
+
    +
  • outputdir (str, optional, default=".") – Output dir where to store results. If none, results are not dumped to a file.

  • +
  • output_format (str, optional, default="ESRI Shapefile") – Format of the output ‘ESRI Shapefile’, ‘GeoJSON’, ‘CSV’, ‘GPKG’, ‘GML’ +(see supported_output_formats). If None, it is set to ESRI Shapefile

  • +
+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+
+with_per_category(category_file: str, category_index: str = 'Classe', category_labels_json: str | None = None)[source]
+

Set up the zonal stats computation per categories

+
+
Parameters:
+
    +
  • category_file (str) – Name of the file containing the categories

  • +
  • category_index (str, optional, default='Classe') – Name of column containing the category value (if category_file is a vector)

  • +
  • category_labels_json (str, optional, default=None) – Name of json file containing the dict that associates category values +to category names

  • +
+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+
+property within: bool
+

Whether to compute stats for geometries within the raster (if False, stats for +all geometries intersecting the raster are computed)

+
+ +
+ +
+
+

Module contents

+

This module contains the eolab’s rastertools CLI and API

+
+
+class eolab.rastertools.Filtering(raster_filter: RasterFilter, kernel_size: int, bands: List[int] = [1])[source]
+

Bases: Rastertool, Windowable

+

Raster tool that applies a filter on a raster image.

+

Predefined filters are available:

+
    +
  • Median filter

  • +
  • Local sum

  • +
  • Local mean

  • +
  • Adaptive gaussian filter.

  • +
+

A filter is applied on a kernel of a configurable size. To set the kernel size, you need +to call:

+
tool = Filtering(Filtering.median_filter, kernel_size=16)
+
+
+

Custom additional filters can be easily added by instanciating a RasterFilter (see +eolab.rastertools.processing.RasterFilter).

+

The parameters that customize the filter algo can be passed by following this procedure:

+
def myalgo(input_data, **kwargs):
+    # kwargs contain the values of the algo parameters
+    kernel_size = kwargs.get('kernel_size', 8)
+    myparam = kwargs.get('myparam', 1)
+    # ... do someting ...
+
+my_filter = RasterFilter(
+    "myfilter", algo=myalgo
+).with_documentation(
+    help="Apply my filter",
+    description="Apply my filter"
+).with_arguments({
+    "myparam": {
+        # configure the command line interface for this param, this can be skipped
+        "default": 8,
+        "required": True,
+        "type": int,
+        "help": "my configuration param for myalgo"
+    }
+})
+
+# create the raster tool
+tool = Filtering(my_filter, kernel_size=16)
+my_filter.with_output(".")
+my_filter.with_window(1024, "edge")
+# set the configuration parameter of the algo
+my_filter.with_filter_configuration({"myparam": 1024})
+# run the tool
+tool.process_file("./mytif.tif")
+
+
+
+
+adaptive_gaussian = adaptive_gaussian
+

RasterFilter that applies an adaptive gaussian filter to the kernel. The parameter sigma defines the standard deviation +of the Gaussian distribution.

+
+
Returns:
+

Numpy array containing the input data filtered by the Gaussian filter.

+
+
+
+ +
+
+property bands: List[int]
+

List of bands to process

+
+ +
+
+static get_default_filters()[source]
+

Get the list of predefined raster filters

+
+
Returns:
+

[eolab.rastertools.processing.RasterFilter] List of the predefined +raster filters ([Median, Local sum, Local mean, Adaptive gaussian])

+
+
+
+ +
+
+local_mean = mean
+

Computes the local means of the input data. +Each element is the mean of the pixels contained in the sliding window determined by kernel_size.

+
+
Returns:
+

Numpy array of the size of input_data containing the computed local means

+
+
+
+ +
+
+local_sum = sum
+

Computes the local sums of the input data. +Each element is the sum of the pixels contained in the sliding window determined by kernel_size.

+
+
Returns:
+

Numpy array of the size of input_data containing the computed local sums

+
+
+
+ +
+
+median_filter = median
+

Applies a Median Filter to the input data using +scipy.ndimage.median_filter. +The filter computes the median contained in the sliding window determined by kernel_size.

+
+
Returns:
+

Numpy array containing the input data filtered by the median filter

+
+
+
+ +
+
+process_file(inputfile: str) List[str][source]
+

Apply the filter to the input file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

([str]) A list of one element containing the path of the generated filtered image.

+
+
+
+ +
+
+property raster_filter: RasterFilter
+

Name of the filter to apply to the raster

+
+ +
+
+with_filter_configuration(argsdict: Dict)[source]
+

Configure the filter with its specific arguments’ values

+
+
Parameters:
+

argsdict (dict) – Dictionary of filter’s arguments names and values. Shall contain at least +the kernel size (key=”kernel”)

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Filtering

+
+
+
+ +
+ +
+
+class eolab.rastertools.Hillshade(elevation: float, azimuth: float, resolution: float, radius: int | None = None)[source]
+

Bases: Rastertool, Windowable

+

Raster tool that computes the hillshades of a Digital Elevation / Surface / Height Model +corresponding to a given solar position.

+

The input image is a raster that contains the height of the points as pixel values.

+

At a given position p, the Hillshade tool check if the point is in the hillshade generated by +any other points in the direction of the sun. To achieve this goal, the algorithm computes the +angle \(\gamma\): \(\tan \frac{Height}{Distance}\):

+
                    _____
+                  x|     |  ^
+              x    |     |  | Height (from Digital Model)
+         x   __    |     |  |
+____p_______|  |___|     |__v____________
+    <-------------->
+        Distance
+
+
+

The point is in the hillshade of another one if \(\gamma < elevation_{sun}\). +To avoid testing too many points, the “radius” parameter defines the max distance of the pixel +to test. The radius can be set by the user or automatically computed by the Hillshade tool. In +this latter case, the radius is \(\frac{\Delta h}{\tan{elevation_{sun}}}\) where +\(\Delta h\) is \(max - min\) of the pixel values in the input raster.

+

The output image is a mask where pixels corresponding to hillshades equal to 1.

+
+
+property azimuth
+

Return the azimuth of the sun (in degrees)

+
+ +
+
+property elevation
+

Return the elevation of the sun (in degrees)

+
+ +
+
+process_file(inputfile: str) List[str][source]
+

Compute hillshade for the input file.

+
+
Parameters:
+

inputfile (str) – Input image file path to process.

+
+
Returns:
+

A list containing the file path of the generated hillshade image.

+
+
Return type:
+

List[str]

+
+
Raises:
+

ValueError – If the input file contains more than one band or if the radius exceeds constraints.

+
+
+
+ +
+
+property radius
+

Return the maximum distance from current point (in pixels) +for evaluating the maximum elevation angle

+
+ +
+
+property resolution
+

Return the resolution of a raster pixel (in meter)

+
+ +
+ +
+
+class eolab.rastertools.Radioindice(indices: List[RadioindiceProcessing])[source]
+

Bases: Rastertool, Windowable

+

Raster tool that computes radiometric indices of a raster product.

+

If several indices are requested, the tool can generate one output image with one +band per indice (merge=True), or it can generate several images, one image per indice +(merge=False).

+

The computation can be realized on a subset of the input image (a Region Of Interest) +defined by a vector file (e.g. shapefile, geojson).

+

The radiometric indice is an instance of +eolab.rastertools.processing.RadioindiceProcessing +which defines the list of channels it needs to compute the indice. The input raster product +must be of a recognized raster type so that it is possible to match every channels required by +the indice with an existing band in the raster product.

+
+
+bi = bi
+

Brightness index (red, green channels)

+
+\[bi = \frac{red^2 + green^2}{2}\]
+
+ +
+
+bi2 = bi2
+

Brightness index (nir, red, green channels)

+
+\[bi2 = \frac{nir^2 + red^2 + green^2}{3}\]
+
+ +
+
+evi = evi
+

Enhanced vegetation index (red, nir, blue channels)

+
+\[evi = \frac{2.5 * (nir - red)}{nir + 6.0 * red - 7.5 * blue + 1.0}\]
+
+ +
+
+static get_default_indices()[source]
+

Get the list of predefined radiometric indices

+
+
Returns:
+

list of +predefined radioindice.

+
+
Return type:
+

[eolab.rastertools.processing.RadioindiceProcessing]

+
+
+
+ +
+
+property indices: List[RadioindiceProcessing]
+

List of radiometric indices to compute

+
+ +
+
+ipvi = ipvi
+

Infrared Percentage Vegetation Index (red, nir channels)

+
+\[ipvi = \frac{nir}{nir + red}\]
+

References

+

Crippen, R. E. 1990. Calculating the Vegetation Index Faster, Remote Sensing of +Environment, vol 34., pp. 71-73.

+
+ +
+
+property merge: bool
+

If true, all indices are in the same output image (one band per indice). +Otherwise, each indice is in its own output image.

+
+ +
+
+mndwi = mndwi
+

Modified Normalized Difference Water Index (green, mir channels)

+
+\[mndwi = \frac{green - mir}{green + mir}\]
+

References

+

Xu, H. Q., 2006. Modification of normalised difference water index (NDWI) to enhance +open water features in remotely sensed imagery. International Journal of Remote Sensing +27, 3025-3033

+
+ +
+
+msavi = msavi
+

Modified Soil Adjusted Vegetation Index (red, nir channels)

+
+\begin{eqnarray} + wdvi & = & nir - 0.4 * red \\ + ndvi & = & \frac{nir - red}{nir + red} \\ + L & = & 1 - 2 * 0.4 * ndvi * wdvi \\ + msavi & = & \frac{(nir - red) * (1 + L)}{nir + red + L} +\end{eqnarray}

References

+

Qi J., Chehbouni A., Huete A.R., Kerr Y.H., 1994. Modified Soil Adjusted Vegetation +Index (MSAVI). Remote Sens Environ 48:119-126

+

Qi J., Kerr Y., Chehbouni A., 1994. External factor consideration in vegetation index +development. Proc. of Physical Measurements and Signatures in Remote Sensing, +ISPRS, 723-730.

+
+ +
+
+msavi2 = msavi2
+

Modified Soil Adjusted Vegetation Index (red, nir channels)

+
+\begin{eqnarray} + val & = & (2 * nir + 1)^2 - 8 * (nir - red) \\ + msavi2 & = & (2 * nir + 1 - \sqrt{val}) / 2 +\end{eqnarray}
+ +
+
+ndbi = ndbi
+

Normalized Difference Built Up Index (nir, mir channels)

+
+\[ndbi = \frac{mir - nir}{mir + nir}\]
+
+ +
+
+ndpi = ndpi
+

Normalized Difference Pond Index (green, mir channels)

+
+\[ndpi = \frac{mir - green}{mir + green}\]
+

References

+

J-P. Lacaux, Y. M. Tourre, C. Vignolle, J-A. Ndione, and M. Lafaye, “Classification +of Ponds from High-Spatial Resolution Remote Sensing: Application to Rift Valley Fever +Epidemics in Senegal,” Remote Sensing of Environment 106 66–74, Elsevier Publishers: 2007

+
+ +
+
+ndti = ndti
+

Normalized Difference Turbidity Index (green, red channels)

+
+\[ndti = \frac{red - green}{red + green}\]
+

References

+

J-P. Lacaux, Y. M. Tourre, C. Vignolle, J-A. Ndione, and M. Lafaye, “Classification +of Ponds from High-Spatial Resolution Remote Sensing: Application to Rift Valley Fever +Epidemics in Senegal,” Remote Sensing of Environment 106 66–74, Elsevier Publishers: 2007

+
+ +
+
+ndvi = ndvi
+

Normalized Difference Vegetation Index (red, nir channels)

+
+\[ndvi = \frac{nir - red}{nir + red}\]
+

References

+

Rouse J.W., Haas R.H., Schell J.A., Deering D.W., 1973. Monitoring vegetation systems in +the great plains with ERTS. Third ERTS Symposium, NASA SP-351. 1:309-317

+

Tucker C.J., 1979. Red and photographic infrared linear combinations for monitoring +vegetation. Remote Sens Environ 8:127-150

+
+ +
+
+ndwi = ndwi
+

Normalized Difference Water Index (mir, nir channels)

+
+\[ndwi = \frac{nir - mir}{nir + mir}\]
+

References

+

Gao, B. C., 1996. NDWI - A normalized difference water index for remote sensing +of vegetation liquid water from space. Remote Sensing of Environment 58, 257-266.

+
+ +
+
+ndwi2 = ndwi2
+

Normalized Difference Water Index (nir, green channels)

+
+\[ndwi2 = \frac{green - nir}{green + nir}\]
+
+ +
+
+process_file(inputfile: str) List[str][source]
+

Compute the indices for a single file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

List of indice images (posix paths) that have been generated

+
+
Return type:
+

[str]

+
+
+
+ +
+
+pvi = pvi
+

Perpendicular Vegetation Index (red, nir channels)

+
+\[pvi = (nir - 0.90893 * red - 7.46216) * 0.74\]
+

References

+

Richardson A.J., Wiegand C.L., 1977. Distinguishing vegetation from soil background +information. Photogramm Eng Rem S 43-1541-1552

+
+ +
+
+ri = ri
+

Redness index (red, green channels)

+
+\[ri = \frac{red^2}{green^3}\]
+
+ +
+
+property roi: str
+

Filename of the vector data defining the ROI

+
+ +
+
+rvi = rvi
+

Ratio Vegetation Index (red, nir channels)

+
+\[rvi = \frac{nir}{red}\]
+

References

+

Jordan C.F., 1969. Derivation of leaf area index from quality of light on the forest +floor. Ecology 50:663-666

+
+ +
+
+savi = savi
+

Soil Adjusted Vegetation Index (red, nir channels)

+
+\[savi = \frac{(nir - red) * (1. + 0.5)}{nir + red + 0.5}\]
+

References

+

Huete A.R., 1988. A soil-adjusted vegetation index (SAVI). Remote Sens Environ 25:295-309

+
+ +
+
+tndvi = tndvi
+

Transformed Normalized Difference Vegetation Index (red, nir channels)

+
+\begin{eqnarray} + ndvi & = & \frac{nir - red}{nir + red} \\ + tndvi & = & \sqrt{ndvi + 0.5} +\end{eqnarray}

References

+

Deering D.W., Rouse J.W., Haas R.H., and Schell J.A., 1975. Measuring forage production +of grazing units from Landsat MSS data. Pages 1169-1178 In: Cook J.J. (Ed.), Proceedings +of the Tenth International Symposium on Remote Sensing of Environment (Ann Arbor, 1975), +Vol. 2, Ann Arbor, Michigan, USA.

+
+ +
+
+tsavi = tsavi
+

Transformed Soil Adjusted Vegetation Index (red, nir channels)

+
+\[tsavi = \frac{0.7 * (nir - 0.7 * red - 0.9)}{0.7 * nir + red + 0.08 * (1 + 0.7^2)}\]
+

References

+

Baret F., Guyot G., Major D., 1989. TSAVI: a vegetation index which minimizes soil +brightness effects on LAI or APAR estimation. 12th Canadian Symposium on Remote +Sensing and IGARSS 1990, Vancouver, Canada, 07/10-14.

+
+ +
+
+with_output(outputdir: str = '.', merge: bool = False)[source]
+

Set up the output.

+
+
Parameters:
+
    +
  • outputdir (str, optional, default=".") – Output dir where to store results. If none, it is set to current dir

  • +
  • merge (bool, optional, default=False) – Whether to merge all indices in the same image (i.e. one band per indice)

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Radioindice

+
+
+
+ +
+
+with_roi(roi: str)[source]
+

Set up the region of interest

+
+
Parameters:
+

roi (str) – Filename of the vector data defining the ROI +(output images will be cropped to the geometry)

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Radioindice

+
+
+
+ +
+ +
+
+class eolab.rastertools.Rastertool[source]
+

Bases: ABC

+

Base class for every raster tool which contains the common configuration:

+
    +
  • the output dir where to store the results (by default, current dir)

  • +
  • whether to save to disk the intermediate VRT images that can be created when +handling the input raster products (that can be an archive of several band files for +example). This parameter is mainly for debug purpose and is False by default.

  • +
+
+
+property keep_vrt: bool
+

Whether intermediate VRT images shall be kept

+
+ +
+
+property outputdir: str
+

Path of the output directory where are stored the results

+
+ +
+
+postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str][source]
+

Run a postprocess when all input files have been processed. This step may consist +in transforming the outputs or mixing them to generate additional ones.

+
+

Note

+

This implementation does nothing. Override this method in the subclass +to achieve special processing that needs the whole list of inputfiles +and/or the output files generated when processing every single file (to mix +them for instance).

+
+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files

  • +
+
+
+
+
Returns

[str]: Additional output files (by default empty list)

+
+
+
+ +
+
+process_file(inputfile: str) List[str][source]
+

Run the rastertool to a single input file.

+
+

Note

+

This implementation does nothing. Override this method in the subclass +to achieve special processing of an inputfile.

+
+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

List of generated files (by default empty list)

+
+
Return type:
+

[str]

+
+
+
+ +
+
+process_files(inputfiles: List[str])[source]
+

Run the rastertool to a set of input files. By default, this implementation +recursively calls “process_file” on each input file and then calls “postprocess_files”.

+
+

Note

+

It is not meant to be overriden by subclasses. Prefer overriding process_file +and postproces_files instead.

+
+
+
Parameters:
+

inputfiles ([str]) – Input images to process

+
+
Returns:
+

([str]) The list of the generated files

+
+
+
+ +
+
+property vrt_dir: str
+

Dir where to store intermediate VRT images

+
+ +
+
+with_output(outputdir: str = '.')[source]
+

Set up the output.

+
+
Parameters:
+

outputdir (str, optional, default=".") – Output dir where to store results. If none, it is set to current dir

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+
+with_vrt_stored(keep_vrt: bool)[source]
+

Configure if the intermediate VRT images that are generated when handling +the input files (which can be complex raster product composed of several band files) +shall be stored to disk or not - for debug purpose for instance.

+
+
Parameters:
+

keep_vrt (bool) – Whether intermediate VRT images shall be stored or not

+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ +
+
+exception eolab.rastertools.RastertoolConfigurationException[source]
+

Bases: Exception

+

This class defines an exception that is raised when the configuration of the raster tool +is invalid (wrong input parameter)

+
+ +
+
+class eolab.rastertools.SVF(nb_directions: int, radius: int, resolution: float)[source]
+

Bases: Rastertool, Windowable

+

Raster tool that computes the Sky View Factor (SVF) of a +Digital Elevation / Surface / Height Model.

+

Kokalj, Žiga & all 2013:

+

SVF is a geophysical parameter that measures the portion of the sky visible from a certain +point. The portion of the sky visible above the surface is especially relevant in energy balance +studies and computation of diffuse solar insolation.

+

Sky-view factor is defined as the proportion of visible sky (\(\Omega\)) above a certain +observation point as seen from a two-dimensional representation.

+

The light that falls from the sky onto a certain part of the surface is reduced by the obstacles +that form the horizon. These obstacles can be described in all directions by the vertical +elevation angle above the horizontal plane.

+

A good SVF approximation can therefore be performed with the estimate of this angle +in several directions. After the vertical elevation angle is determined in the chosen +number of directions n, the SVF is determined as a sum of all portions of the sky within +each direction: \(\sum \frac {\cos \gamma_i}{n}\), where \(\gamma_i\) is the +vertical angle of the horizon in the`direction i.

+

The angle \(\gamma\) is extracted from the Digital Model: +\(\tan \frac{Height}{Distance}\):

+
                    _____
+                  x|     |  ^
+              x    |     |  | Height (from Digital Model)
+         x   __    |     |  |
+____p_______|  |___|     |__v____________
+    <-------------->
+        Distance
+
+
+

Where p is the current pixel where the SVF is computed.

+

In a direction, the algorithm computes all angles and keeps the largest one. To avoid testing +too many points, the “radius” parameter defines the max distance of the pixel to test.

+

The output image of SVF rastertool is a raster image with the SVF value computed at every pixels +of the input Digital Height Model.

+
+
+property altitude
+

The altitude at which SVF is computed. If None, the SVF is computed +at the altitude of the point.

+
+ +
+
+property nb_directions
+

Number of directions to compute the SVF

+
+ +
+
+process_file(inputfile: str)[source]
+

Compute SVF for the input file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

A list containing a single element: the generated Sky View Factor image.

+
+
Return type:
+

[str]

+
+
+
+ +
+
+property radius
+

Max distance from current point (in pixels) to consider +for evaluating the max elevation angle

+
+ +
+
+property resolution
+

Resolution of the input Digital Height Model (in meter)

+
+ +
+
+with_altitude(altitude: float)[source]
+

Configure the altitude at which the Sky View Factor shall be computed. +If not set, the SVF is computed for each pixel at the pixel altitude.

+
+
Parameters:
+

altitude (float) – Altitude at which SVF shall be computed

+
+
Returns:
+

The current instance so that it is possible to chain the with… calls (fluent API)

+
+
+
+ +
+ +
+
+class eolab.rastertools.Speed(bands: List[int] = [1])[source]
+

Bases: Rastertool

+

Raster tool that computes the time derivative (speed) of raster images.

+

For images of the same and known type, the tool extract the timestamp metadata +from the names of the images. It can then compute the time derivatives of every +bands.

+
+
+property bands: List[int]
+

List of bands to process

+
+ +
+
+postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str][source]
+

Compute the temporal derivative of input files’ radiometry

+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files individually

  • +
+
+
Returns:
+

List of speed images that have been generated

+
+
Return type:
+

[str]

+
+
+
+ +
+ +
+
+class eolab.rastertools.Tiling(geometry_file: str)[source]
+

Bases: Rastertool

+

Raster tool that tiles a raster following the geometries of a grid.

+

The tool takes as input two files: a raster image and a grid file (shapefile, geojson …). +The grid file defines the geometries of the tiles.

+

Different options can be configured:

+
    +
  • output dir: select the dir where tiles will be stored to disk

  • +
  • output basename: naming rule of tiles. By default, the basename is the name of +the original file followed by “_tile” followed by the tile index. In the +formatted string, tile index is at position 1 and original filename is at +position 0. For instance, a naming rule such as “tile{1}.tif” will generate +the tile name “tile75.tif” for the tile id = 75.

  • +
  • output subdir: naming rule for subdirs when every tile must be generated in a +different subdir.

  • +
+

It is also possible to select the tiles to generate. The seleted tiles are the ones +which match the expected values of a given grid’s property.

+
+
+property grid
+

Get the grid that defines the geometries for tiling raster images

+
+ +
+
+property output_basename: str
+

Base name for naming output

+
+ +
+
+property output_subdir
+

Naming convention of the subdir where to store outputs. None if +no tiles shall not be generated in subdirs (but directly in the output dir)

+
+ +
+
+process_file(inputfile: str)[source]
+

Tile the input file following the geometry file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

The list of generates tiles.

+
+
Return type:
+

[str]

+
+
+
+ +
+
+with_id_column(id_column: str, ids: List[int])[source]
+

Set up a filter on the geometries for which tiles shall be generated.

+
+
Parameters:
+
    +
  • id_column (str) – Name of the column in the vector file that contains the ids to filter.

  • +
  • ids – List of ids values for which tiles shall be generated.

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Tiling

+
+
+
+ +
+
+with_output(outputdir: str = '.', output_basename: str = '{}_tile{}', output_subdir: str | None = None)[source]
+

Set up the output.

+
+
Parameters:
+
    +
  • outputdir (str, optional, default=".") – Output dir where to store results.

  • +
  • output_basename (str, optional, default="{}_tile{}") – Basename for the output file as a formatted string. By default, the +basename is the name of the original file followed by “_tile” followed +by the tile index. In the formatted string, tile index is at position 1 +and original filename is at position 0. For instance, tile{1}.tif will +generate the following name tile75.tif for the tile id = 75

  • +
  • output_subdir (str, optional, default=None) – When each tile must be generated in a different subdir, output_subdir +defines the naming convention for the subdir. It is a formatted string +with one positional parameter corresponding to the tile index. +For instance, tile{} will generate the following subdir name: tile75/ +for the tile id = 75. If None, output files will be generated directly +in the outputdir.

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Tiling

+
+
+
+ +
+ +
+
+class eolab.rastertools.Timeseries(start_date: datetime, end_date: datetime, period: int, bands: List[int] = [1])[source]
+

Bases: Rastertool, Windowable

+

Raster tool that generates the time series of raster images. The timeseries is +generated with a linear interpolation thus enabling to fill gaps.

+
+
+property bands: List[int]
+

List of bands to process

+
+ +
+
+property end_date
+

End date of the timeseries to generate

+
+ +
+
+property period
+

Period (in days) of the timeseries to generate

+
+ +
+
+postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str][source]
+

Generates the timeseries from a list of inputfiles.

+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files individually

  • +
+
+
Returns:
+

List of images that have been generated

+
+
Return type:
+

[str]

+
+
+
+ +
+
+property start_date
+

Start date of the timeseries to generate

+
+ +
+ +
+
+class eolab.rastertools.Windowable[source]
+

Bases: object

+

Decorator of a eolab.rastertools.Rastertool that adds configuration +parameters to set the windowable capability of the tool:

+
    +
  • the window size

  • +
  • the mode for padding the window when at the edge of the image

  • +
+
+
+property pad_mode: str
+

//numpy.org/doc/stable/reference/generated/numpy.pad.html>`_ the image when the window is on the edge of the image +The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty].

+
+
Type:
+

Mode used to `pad <https

+
+
+
+ +
+
+property window_size: int
+

Size of the windows to split the image in small parts

+
+ +
+
+with_windows(window_size: int = 1024, pad_mode: str = 'edge')[source]
+

Configure the window generation for processing image

+
+
Parameters:
+
    +
  • window_size (int, optional, default=1024) – Size of windows for splitting the processed image in small parts +so that processing can be distributed on several cpus.

  • +
  • pad_mode (str, optional, default="edge") – Mode for padding data around the windows that are on the edge of the image. +See https://numpy.org/doc/stable/reference/generated/numpy.pad.html

  • +
+
+
Returns:
+

The current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Rastertool

+
+
+
+ +
+ +
+
+class eolab.rastertools.Zonalstats(stats: List[str], categorical: bool = False, valid_threshold: float = 0.0, area: bool = False, prefix: str | None = None, bands: List[int] = [1])[source]
+

Bases: Rastertool

+

Raster tool that computes zonal statistics of a raster product.

+
+
+property area: bool
+

Whether to compute the statistics multiplied by the pixel area

+
+ +
+
+property bands: List[int]
+

List of bands to process

+
+ +
+
+property categorical: bool
+

Whether to compute the counts of every unique pixel values

+
+ +
+
+property category_file: str
+

Filename containing the categories when computing stats per +categories in the geometries

+
+ +
+
+property category_file_type: str
+

Type of the category file, either ‘raster’ or ‘vector’

+
+ +
+
+property category_index: str
+

Column name identifying categories in categroy_file (only if file format +is geometries)

+
+ +
+
+property category_labels: str
+

Dict with classes index as keys and names to display as values

+
+ +
+
+property chart_file: str
+

Name of the chart file to generate

+
+ +
+
+compute_stats(raster: str, bands: List[int], geometries: GeoDataFrame, descr: List[str], date: str, area_square_meter: int) List[List[Dict[str, float]]][source]
+

Compute the statistics of the input data. [Minimum, Maximum, Mean, Standard deviation]

+
+
Parameters:
+
    +
  • raster (str) – Input image to process

  • +
  • bands ([int]) – List of bands in the input image to process. Empty list means all bands

  • +
  • geometries (GeoDataFrame) – Geometries where to add statistics (geometries must be in the same +projection as the raster)

  • +
  • descr ([str]) – Band descriptions

  • +
  • date (str) – Timestamp of the input raster

  • +
  • area_square_meter (int) – Area represented by a pixel

  • +
+
+
+

Returns: +list[list[dict]] +The dictionnary associates the name of the statistics to its value.

+
+ +
+
+property display_chart: bool
+

Whether to display the chart

+
+ +
+
+property generated_stats
+

The list of generated stats in the same order as the input files

+
+ +
+
+property generated_stats_dates
+

The list of dates when they can be extracted from the input files’ names

+
+ +
+
+property generated_stats_per_date
+

After processing one or several files, this method enables to retrieve a dictionary +that contains the statistics for each inputfile’s date:

+
    +
  • keys are timestamps

  • +
  • values are the statistics at the corresponding timestam

  • +
+
+

Warning

+

When the timestamp of the input raster cannot be retrieved, the dictionary does not +contain the generated statistics for this input raster. In this case, prefer calling +generated_stats to get the stats as a list (one item per input file).

+
+
+ +
+
+property geometries: str
+

The geometries where to compute zonal statistics

+
+ +
+
+property geometry_index: str
+

The column name identifying the name of the geometry

+
+ +
+
+property output_format: str
+

Output format for the features stats

+
+ +
+
+postprocess_files(inputfiles: List[str], outputfiles: List[str]) List[str][source]
+

Generate the chart if requested after computing stats for each input file

+
+
Parameters:
+
    +
  • inputfiles ([str]) – Input images to process

  • +
  • outputfiles ([str]) – List of generated files after executing the +rastertool on the input files

  • +
+
+
Returns:
+

A list containing the chart file if requested

+
+
Return type:
+

[str]

+
+
+
+ +
+
+property prefix: str
+

Prefix of the features stats (one per band)

+
+ +
+
+process_file(inputfile: str) List[str][source]
+

Compute the stats for a single input file

+
+
Parameters:
+

inputfile (str) – Input image to process

+
+
Returns:
+

List of generated statistical images (posix paths) that have been generated

+
+
Return type:
+

[str]

+
+
+
+ +
+
+property sigma: float
+

Number of sigmas for identifying outliers

+
+ +
+
+property stats: List[str]
+

List of stats to compute

+
+ +
+
+supported_output_formats = {'CSV': 'csv', 'ESRI Shapefile': 'shp', 'GML': 'gml', 'GPKG': 'gpkg', 'GeoJSON': 'geojson'}
+

List of all possible output format are provided by fiona.supported_drivers.keys()

+
+ +
+
+valid_stats = ['count', 'valid', 'nodata', 'min', 'max', 'mean', 'std', 'sum', 'median', 'mad', 'range', 'majority', 'minority', 'unique']
+

List of stats that can be computed. In addition to this list, “percentile_xx” is +also a valid stat where xx is the percentile value, e.g. percentile_70

+
+ +
+
+property valid_threshold: float
+

Minimum percentage of valid pixels in a shape to compute its statistics

+
+ +
+
+with_chart(chart_file: str | None = None, geometry_index: str = 'ID', display: bool = False)[source]
+

Set up the charting capability

+
+
Parameters:
+
    +
  • chart_file (str, optional, default=None) – If not None, generate a chart with the statistics and saves it to str

  • +
  • geometry_index (str, optional, default='ID') – Name of the index in the geometry file

  • +
  • display (bool, optional, default=False) – If true, display the chart with the statistics

  • +
+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+
+with_geometries(geometries: str, within: bool = False)[source]
+

Set up the geometries where to compute stats.

+
+
Parameters:
+
    +
  • geometries (str) – Name of the file containing the geometries where to compute zonal stats. If not set, +stats are computed on the whole raster image

  • +
  • within (bool, optional, default=False) – Whether to compute stats only for geometries within the raster. If False, +statistics are computed for geometries that intersect the raster shape.

  • +
+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+
+with_outliers(sigma: float)[source]
+

Set up the computation of outliers

+
+
Parameters:
+

sigma (float) – Distance to the mean value to consider a pixel as an outlier (expressed +in sigma, e.g. the value 2 means that pixels values greater than +mean value + 2 * std are outliers)

+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+
+with_output(outputdir: str = '.', output_format: str = 'ESRI Shapefile')[source]
+

Set up the output.

+
+
Parameters:
+
    +
  • outputdir (str, optional, default=".") – Output dir where to store results. If none, results are not dumped to a file.

  • +
  • output_format (str, optional, default="ESRI Shapefile") – Format of the output ‘ESRI Shapefile’, ‘GeoJSON’, ‘CSV’, ‘GPKG’, ‘GML’ +(see supported_output_formats). If None, it is set to ESRI Shapefile

  • +
+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+
+with_per_category(category_file: str, category_index: str = 'Classe', category_labels_json: str | None = None)[source]
+

Set up the zonal stats computation per categories

+
+
Parameters:
+
    +
  • category_file (str) – Name of the file containing the categories

  • +
  • category_index (str, optional, default='Classe') – Name of column containing the category value (if category_file is a vector)

  • +
  • category_labels_json (str, optional, default=None) – Name of json file containing the dict that associates category values +to category names

  • +
+
+
Returns:
+

the current instance so that it is +possible to chain the with… calls (fluent API)

+
+
Return type:
+

eolab.rastertools.Zonalstats

+
+
+
+ +
+
+property within: bool
+

Whether to compute stats for geometries within the raster (if False, stats for +all geometries intersecting the raster are computed)

+
+ +
+ +
+
+eolab.rastertools.add_custom_rastertypes(rastertypes)[source]
+

Add definition of new raster types. The json string shall have the following format:

+
{
+  "rastertypes": [
+    {
+      "name": "RGB_TIF",
+      "product_pattern": "^RGB_TIF_(?P<date>[0-9_]*)\.(tif|TIF)$",
+      "bands": [
+        {
+          "channel": "red",
+          "description": "red"
+        },
+        {
+          "channel": "green",
+          "description": "green"
+        },
+        {
+          "channel": "blue",
+          "description": "blue"
+        },
+        {
+          "channel": "nir",
+          "description": "nir"
+        }
+      ],
+      "date_format": "%Y%m%d_%H%M%S",
+      "nodata": 0
+    },
+    {
+      "name": "RGB_TIF_ARCHIVE",
+      "product_pattern": "^RGB_TIF_(?P<date>[0-9\_]*).*$",
+      "bands_pattern": "^TIF_(?P<bands>{}).*\.(tif|TIF)$",
+      "bands": [
+        {
+          "channel": "red",
+          "identifier": "r",
+          "description": "red"
+        },
+        {
+          "channel": "green",
+          "identifier": "g",
+          "description": "green"
+        },
+        {
+          "channel": "blue",
+          "identifier": "b",
+          "description": "blue"
+        },
+        {
+          "channel": "nir",
+          "identifier": "n",
+          "description": "nir"
+        }
+      ],
+      "date_format": "%Y%m%d_%H%M%S",
+      "nodata": 0
+    }
+  ]
+}
+
+
+
    +
  • name : unique name of raster type

  • +
  • product_pattern: regexp to identify raster product matching the raster type. Regexp can +contain catching groups that identifies metadata: date (groupe name=date), relative +orbit number (relorbit), tile number (tile), any other group (free name of the group).

  • +
  • bands_pattern (optional) : when the raster product of this type is an archive +(zip, tar, tar.gz, etc.), the pattern enables to identify the files of the different +raster bands. The raster product can contain one raster file per band or one multi-bands +raster file. In the first case, the pattern must contain a group that identify +the band to which the file corresponds. This group must be defined as follows (?P<bands>{}) +in which the variable part {} will be replaced by the identifier of the band (see below).

  • +
  • date_format (optional): date format in the product name. By default: %Y%m%d-%H%M%S

  • +
  • nodata (optional): no data value of raster bands. By default: -10000

  • +
  • masknnodata (optional): nodata value in the mask band

  • +
  • For every bands:

    +
      +
    • channel: channel of the band. Must be one of: blue, green, red, nir, mir, swir, +red_edge1, red_edge2, red_edge3, red_edge4, blue_60m, nir_60m and mir_60m.

    • +
    • identifier (optional): string that identifies the band in the filenames of a raster +product that it is an archive. This identifier is inserted in the group bands of +the bands_pattern.

    • +
    • description (optional): band description that will be reused in the generated products.

    • +
    +
  • +
  • For every masks:

    +
      +
    • identifier (optional): string that identifies the mask band in the filenames of a raster +product that it is an archive. This identifier is inserted in the group bands of +the bands_pattern.

    • +
    • description (optional): mask band description that will be reused in the generated products.

    • +
    • maskfunc (optional): fully qualified name of the python function that converts the mask +band values to a binary mask (0 = masked; 1 = unmasked)

    • +
    +
  • +
+
+
Parameters:
+

rastertypes – JSON string that contains the new raster types definition

+
+
+
+ +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.adaptive_gaussian.html b/docs/_build/html/api/eolab.rastertools.processing.algo.adaptive_gaussian.html new file mode 100644 index 00000000..60433fd4 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.adaptive_gaussian.html @@ -0,0 +1,158 @@ + + + + + + + + + adaptive_gaussian — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

adaptive_gaussian

+
+
+eolab.rastertools.processing.algo.adaptive_gaussian(input_data: ndarray, kernel_size: int = 8, sigma: int = 1) ndarray[source]
+

Applies an Adaptive Gaussian Filter to the input data that smoothes the input while preserving edges.

+
+
Parameters:
+
    +
  • input_data (np.ndarray) – A 3D numpy array of shape (1, number_of_lines, number_of_columns) +containing the Digital Height Model (DHM). +The function only accepts arrays with one band.

  • +
  • kernel_size (int) – The size of the kernel used for the adaptive filtering. Default is 8.

  • +
  • sigma (int) – The standard deviation of the Gaussian distribution, which controls the level of smoothing. +Default is 1.

  • +
+
+
Returns:
+

A numpy array of the same shape as input_data, containing the filtered data.

+
+
Return type:
+

np.ndarray

+
+
Raises:
+

ValueError – If input_data does not have 3 dimensions or if the first dimension is not of size 1.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.brightness_index.html b/docs/_build/html/api/eolab.rastertools.processing.algo.brightness_index.html new file mode 100644 index 00000000..b01e3288 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.brightness_index.html @@ -0,0 +1,150 @@ + + + + + + + + + brightness_index — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

brightness_index

+
+
+eolab.rastertools.processing.algo.brightness_index(bands: ndarray) ndarray[source]
+

Compute the Brightness Index of the input data.

+

The function considers the first 2 bands of the input data to be Red and Green.

+
+\[BI = \sqrt{ \frac{RED^2 + GREEN^2} {2} }\]
+
+
Parameters:
+

input_data (np.ndarray) – Numpy array of 3 dimensions (number of bands, number of lines, number of columns) +with number of bands > 1.

+
+
Returns:
+

Numpy array of the size (number of lines, number of columns) containing the computed Brightness Index.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.brightness_index2.html b/docs/_build/html/api/eolab.rastertools.processing.algo.brightness_index2.html new file mode 100644 index 00000000..18879d8a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.brightness_index2.html @@ -0,0 +1,150 @@ + + + + + + + + + brightness_index2 — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

brightness_index2

+
+
+eolab.rastertools.processing.algo.brightness_index2(bands: ndarray) ndarray[source]
+

Compute the Brightness Index of the input data.

+

The function considers the first 3 bands of the input data to be Red, Green, Blue.

+
+\[BI = \sqrt{ \frac{RED^2 + BLUE^2 + GREEN^2} {2} }\]
+
+
Parameters:
+

input_data (np.ndarray) – Numpy array of 3 dimensions (number of bands, number of lines, number of columns) +with number of bands > 2.

+
+
Returns:
+

Numpy array of the size (number of lines, number of columns) containing the computed Brightness Index.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.evi.html b/docs/_build/html/api/eolab.rastertools.processing.algo.evi.html new file mode 100644 index 00000000..a081f55a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.evi.html @@ -0,0 +1,160 @@ + + + + + + + + + evi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

evi

+
+
+eolab.rastertools.processing.algo.evi(bands: ndarray) ndarray[source]
+

Compute the Enhanced vegetation index of the input data. +The coefficient ranges from -1 to 1 in each pixel.

+

The function considers the bands of the input data in the following order : +Red, NIR (Near Infra-Red), Blue.

+
+
Parameters:
+

input_data (np.ndarray) – Numpy array of 3 dimensions (number of bands, number of lines, number of columns) +with number of bands > 2.

+
+
Returns:
+

Numpy array of the size (number of lines, number of columns) containing the computed EVI.

+
+
+
+\[EVI = \frac{G (NIR - RED)} {NIR + C1 * RED - C2 * BLUE + L}\]
+
+
With :
    +
  • $L$ : Canopy background adjustment term, it reduces the influence of soil brightness.

  • +
  • $C1$, $C2$ : Coefficients that correct the influence of aerosol.

  • +
  • $G$ : A gain factor. The greater is G, the more the EVI is sensitive to vegetation changes.

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.hillshade.html b/docs/_build/html/api/eolab.rastertools.processing.algo.hillshade.html new file mode 100644 index 00000000..9f78ede3 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.hillshade.html @@ -0,0 +1,165 @@ + + + + + + + + + hillshade — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

hillshade

+
+
+eolab.rastertools.processing.algo.hillshade(input_data: ndarray, elevation: float = 0.0, azimuth: float = 0.0, radius: int = 8, resolution: float = 0.5) ndarray[source]
+

Computes a mask of cast shadows in a Digital Height Model (DHM).

+

This function calculates the shadows based on the specified elevation and azimuth angles, +and returns a mask indicating where shadows are cast.

+
+
Parameters:
+
    +
  • input_data (np.ndarray) – A 3D numpy array of shape (1, number_of_lines, number_of_columns) containing the Digital Height Model (DHM). +The function only accepts arrays with one band.

  • +
  • elevation (float) – The angle (in degrees) between the horizon and the line of sight from an observer to the satellite.

  • +
  • azimuth (float) – The angle (in degrees) between true north and the projection of the satellite’s position onto the horizontal plane, +measured in a clockwise direction.

  • +
  • radius (int) – The radius around each pixel to consider when calculating shadows.

  • +
  • resolution (float) – The spatial resolution of the input data, used for scaling calculations.

  • +
+
+
Returns:
+

+
A boolean numpy array of the same size as input_data, indicating the mask of cast shadows,

where True represents shadowed areas and False represents illuminated areas.

+
+
+

+
+
Return type:
+

np.ndarray

+
+
Raises:
+

ValueError – If the input_data does not have 3 dimensions or if the first dimension is not of size 1.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.html b/docs/_build/html/api/eolab.rastertools.processing.algo.html new file mode 100644 index 00000000..d8a40973 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.html @@ -0,0 +1,200 @@ + + + + + + + + + eolab.rastertools.processing.algo — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.processing.algo

+

Description

+

Algorithms on raster data

+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

adaptive_gaussian

Applies an Adaptive Gaussian Filter to the input data that smoothes the input while preserving edges.

brightness_index

Compute the Brightness Index of the input data.

brightness_index2

Compute the Brightness Index of the input data.

evi

Compute the Enhanced vegetation index of the input data.

hillshade

Computes a mask of cast shadows in a Digital Height Model (DHM).

interpolated_timeseries

Interpolate a timeseries of data.

ipvi

Compute the Infrared Percentage Vegetation Index of the input data.

local_mean

Computes the local means of the input data using a sliding window defined by the kernel size.

local_sum

Computes the local sums of the input data using a sliding window defined by the kernel size.

median

Applies a Median Filter to the input data using scipy.ndimage.median_filter.

msavi

Compute the Modified Soil Adjusted Vegetation Index of the input data.

msavi2

Compute the Modified Soil Adjusted Vegetation Index of the input data.

normalized_difference

Compute the Normalized Difference Vegetation Index The coefficient ranges from -1 to 1 in each pixel.

pvi

Compute the Perpendicular Vegetation Index The coefficient ranges from -1 to 1 in each pixel.

redness_index

Compute the Redness Index of the input data.

rvi

Compute the Ratio Vegetation Index The coefficient is positive in each pixel.

savi

Compute the Soil Adjusted Vegetation Index The coefficient ranges from -1 to 1 in each pixel.

speed

Compute the speed of the input data based on the difference between two time points.

svf

Computes the Sky View Factor (SVF), which represents the fraction of the visible sky from each point in a Digital Height Model (DHM).

tndvi

Compute the Transformed Normalized Difference Vegetation Index The coefficient is positive in each pixel.

tsavi

Compute the Transformed Soil Adjusted Vegetation Index The coefficient ranges from -1 to 1 in each pixel.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.interpolated_timeseries.html b/docs/_build/html/api/eolab.rastertools.processing.algo.interpolated_timeseries.html new file mode 100644 index 00000000..7a6b1767 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.interpolated_timeseries.html @@ -0,0 +1,165 @@ + + + + + + + + + interpolated_timeseries — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

interpolated_timeseries

+
+
+eolab.rastertools.processing.algo.interpolated_timeseries(dates: MaskedArray, series: MaskedArray, output_dates: array, nodata) ndarray[source]
+

Interpolate a timeseries of data. Dates and series must be sorted in ascending order.

+
+
Parameters:
+
    +
  • dates (numpy.ma.masked_array) – A masked array of timestamps (dates) corresponding to +the input series. Should be in ascending order.

  • +
  • series (numpy.ma.masked_array) – A list of 3D masked arrays, each with shape +(bands, height, width), containing the raster data +for each timestamp in dates.

  • +
  • output_dates (numpy.array) – A 1D array of timestamps for which to generate the interpolated +rasters.

  • +
  • nodata (float) – Value to use for pixels where input data is NaN or missing.

  • +
+
+
Returns:
+

+
A 4D numpy array of shape (time, bands, height, width), containing

the interpolated raster data for each output date. If there are no valid +data points for a specific pixel, the corresponding pixel will be filled with nodata.

+
+
+

+
+
Return type:
+

numpy.ndarray

+
+
Raises:
+

ValueError – If series is empty, or if dates and series dimensions do not match.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.ipvi.html b/docs/_build/html/api/eolab.rastertools.processing.algo.ipvi.html new file mode 100644 index 00000000..f7e8dfd8 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.ipvi.html @@ -0,0 +1,155 @@ + + + + + + + + + ipvi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

ipvi

+
+
+eolab.rastertools.processing.algo.ipvi(bands: ndarray) ndarray[source]
+

Compute the Infrared Percentage Vegetation Index of the input data. +The coefficient ranges from 0 to 1 in each pixel.

+

The function considers the bands of the input data in the following order : +Red, NIR (Near Infra-Red).

+
+\[IPVI = \frac{NIR}{NIR + RED}\]
+
+
Parameters:
+

input_data (np.ndarray) – Numpy array of 3 dimensions (number of bands, number of lines, number of columns) +with number of bands > 1.

+
+
Returns:
+

Numpy array of size (number of lines, number of columns) containing the computed IPVI.

+
+
+

References

+

Crippen, R. E. 1990. Calculating the Vegetation Index Faster, Remote Sensing of +Environment, vol 34., pp. 71-73.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.local_mean.html b/docs/_build/html/api/eolab.rastertools.processing.algo.local_mean.html new file mode 100644 index 00000000..9f779bf8 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.local_mean.html @@ -0,0 +1,157 @@ + + + + + + + + + local_mean — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

local_mean

+
+
+eolab.rastertools.processing.algo.local_mean(input_data: ndarray, kernel_size: int = 8) ndarray[source]
+

Computes the local means of the input data using a sliding window defined by the kernel size. +Each element in the output is the mean of the pixels within the specified kernel size window.

+
+
Parameters:
+
    +
  • input_data (np.ndarray) – A 3D numpy array of shape (1, number_of_lines, number_of_columns) +containing the Digital Height Model (DHM). +The function only accepts arrays with one band.

  • +
  • kernel_size (int) – The size of the sliding window used to compute the local mean.

  • +
+
+
Returns:
+

A numpy array of the same size as input_data containing the computed local means.

+
+
Return type:
+

np.ndarray

+
+
Raises:
+

ValueError – If input_data does not have 3 dimensions or if the first dimension is not of size 1.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.local_sum.html b/docs/_build/html/api/eolab.rastertools.processing.algo.local_sum.html new file mode 100644 index 00000000..7e4ab44b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.local_sum.html @@ -0,0 +1,157 @@ + + + + + + + + + local_sum — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

local_sum

+
+
+eolab.rastertools.processing.algo.local_sum(input_data: ndarray, kernel_size: int = 8) ndarray[source]
+

Computes the local sums of the input data using a sliding window defined by the kernel size. +Each element in the output is the sum of the pixels within the specified kernel size window.

+
+
Parameters:
+
    +
  • input_data (np.ndarray) – A 3D numpy array of shape (1, number_of_lines, number_of_columns) +containing the Digital Height Model (DHM). +The function only accepts arrays with one band.

  • +
  • kernel_size (int) – The size of the sliding window used to compute the local sum.

  • +
+
+
Returns:
+

A numpy array of the same size as input_data containing the computed local sums.

+
+
Return type:
+

np.ndarray

+
+
Raises:
+

ValueError – If input_data does not have 3 dimensions or if the first dimension is not of size 1.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.median.html b/docs/_build/html/api/eolab.rastertools.processing.algo.median.html new file mode 100644 index 00000000..b2d3f9f5 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.median.html @@ -0,0 +1,157 @@ + + + + + + + + + median — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

median

+
+
+eolab.rastertools.processing.algo.median(input_data: ndarray, kernel_size: int) ndarray[source]
+

Applies a Median Filter to the input data using scipy.ndimage.median_filter. +The filter computes the median of the values contained within a sliding window determined by the kernel size.

+
+
Parameters:
+
    +
  • input_data (np.ndarray) – A 3D numpy array of shape (1, number_of_lines, number_of_columns) +containing the Digital Height Model (DHM). The function only accepts arrays with one band.

  • +
  • kernel_size (int) – The size of the sliding window (kernel) used to compute the median.

  • +
+
+
Returns:
+

A numpy array of the same shape as input_data, containing the filtered data with the median values computed in the specified kernel.

+
+
Return type:
+

np.ndarray

+
+
Raises:
+

ValueError – If input_data does not have 3 dimensions or if the first dimension is not of size 1, + or if kernel_size is not a positive odd integer.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.msavi.html b/docs/_build/html/api/eolab.rastertools.processing.algo.msavi.html new file mode 100644 index 00000000..78ddaeac --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.msavi.html @@ -0,0 +1,161 @@ + + + + + + + + + msavi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

msavi

+
+
+eolab.rastertools.processing.algo.msavi(bands: ndarray) ndarray[source]
+

Compute the Modified Soil Adjusted Vegetation Index of the input data. +The coefficient ranges from -1 to 1 in each pixel.

+

grdtbrbr The function considers the bands of the input data in the following order : +Red, NIR (Near Infra-Red).

+
+\[\begin{split}MSAVI = \frac{(NIR - RED) (1 + L)} {NIR + RED + L} \\\end{split}\]
+

With : \(L = 1 - 2 * 0.4 * NDVI * WDVI\)

+
+
Parameters:
+

input_data (np.ndarray) – A 3D numpy array of shape (number of bands, number of lines, number of columns) where number of bands > 1.

+
+
Returns:
+

A 2D numpy array of shape (number of lines, number of columns) containing the computed MSAVI values.

+
+
Return type:
+

np.ndarray

+
+
+

References

+

Qi J., Chehbouni A., Huete A.R., Kerr Y.H., 1994. Modified Soil Adjusted Vegetation +Index (MSAVI). Remote Sens Environ 48:119-126

+

Qi J., Kerr Y., Chehbouni A., 1994. External factor consideration in vegetation index +development. Proc. of Physical Measurements and Signatures in Remote Sensing, +ISPRS, 723-730.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.msavi2.html b/docs/_build/html/api/eolab.rastertools.processing.algo.msavi2.html new file mode 100644 index 00000000..a99630f8 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.msavi2.html @@ -0,0 +1,152 @@ + + + + + + + + + msavi2 — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

msavi2

+
+
+eolab.rastertools.processing.algo.msavi2(bands: ndarray) ndarray[source]
+

Compute the Modified Soil Adjusted Vegetation Index of the input data. +The coefficient ranges from -1 to 1 in each pixel.

+

The function considers the bands of the input data in the following order : +Red, NIR (Near Infra-Red).

+
+\[MSAVI2 = (2 * NIR + 1)^2 - 8 (NIR - RED)\]
+
+
Parameters:
+

input_data (np.ndarray) – Numpy array of 3 dimensions (number of bands, number of lines, number of columns) +with number of bands > 1.

+
+
Returns:
+

Numpy array of the size (number of lines, number of columns) containing the computed MSAVI.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.normalized_difference.html b/docs/_build/html/api/eolab.rastertools.processing.algo.normalized_difference.html new file mode 100644 index 00000000..e70014f0 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.normalized_difference.html @@ -0,0 +1,152 @@ + + + + + + + + + normalized_difference — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

normalized_difference

+
+
+eolab.rastertools.processing.algo.normalized_difference(bands: ndarray) ndarray[source]
+

Compute the Normalized Difference Vegetation Index +The coefficient ranges from -1 to 1 in each pixel.

+

The function considers the bands of the input data in the following order : +Red, NIR (Near Infra-Red).

+
+\[NDVI = \frac{NIR - RED}{NIR + RED}\]
+
+
Parameters:
+

input_data (np.ndarray) – Numpy array of 3 dimensions (number of bands, number of lines, number of columns) +with number of bands > 1.

+
+
Returns:
+

Numpy array of the size (number of lines, number of columns) containing the computed TNDVI.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.pvi.html b/docs/_build/html/api/eolab.rastertools.processing.algo.pvi.html new file mode 100644 index 00000000..4c6f8c52 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.pvi.html @@ -0,0 +1,155 @@ + + + + + + + + + pvi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

pvi

+
+
+eolab.rastertools.processing.algo.pvi(bands: ndarray) ndarray[source]
+

Compute the Perpendicular Vegetation Index +The coefficient ranges from -1 to 1 in each pixel.

+

The function considers the bands of the input data in the following order : +Red, NIR (Near Infra-Red).

+
+\[PVI = 0.74 (NIR - 0.90893 RED - 7.46216)\]
+
+
Parameters:
+

input_data (np.ndarray) – Numpy array of 3 dimensions (number of bands, number of lines, number of columns) +with number of bands > 1.

+
+
Returns:
+

Numpy array of the size (number of lines, number of columns) containing the computed PVI.

+
+
+

References

+

Richardson A.J., Wiegand C.L., 1977. Distinguishing vegetation from soil background +information. Photogramm Eng Rem S 43-1541-1552

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.redness_index.html b/docs/_build/html/api/eolab.rastertools.processing.algo.redness_index.html new file mode 100644 index 00000000..a24077e6 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.redness_index.html @@ -0,0 +1,151 @@ + + + + + + + + + redness_index — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

redness_index

+
+
+eolab.rastertools.processing.algo.redness_index(bands: ndarray) ndarray[source]
+

Compute the Redness Index of the input data.

+
+\[RI = \frac{RED^2} {GREEN^3}\]
+

The function considers the bands of the input data in the following order : +Red, Green.

+
+
Parameters:
+

input_data (np.ndarray) – Numpy array of 3 dimensions (number of bands, number of lines, number of columns) +with number of bands > 1.

+
+
Returns:
+

Numpy array of size (number of lines, number of columns) containing the computed Redness Index.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.rvi.html b/docs/_build/html/api/eolab.rastertools.processing.algo.rvi.html new file mode 100644 index 00000000..c3b358d4 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.rvi.html @@ -0,0 +1,155 @@ + + + + + + + + + rvi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

rvi

+
+
+eolab.rastertools.processing.algo.rvi(bands: ndarray) ndarray[source]
+

Compute the Ratio Vegetation Index +The coefficient is positive in each pixel.

+

The function considers the bands of the input data in the following order : +Red, NIR (Near Infra-Red).

+
+\[PVI = \frac{NIR}{RED}\]
+
+
Parameters:
+

input_data (np.ndarray) – Numpy array of 3 dimensions (number of bands, number of lines, number of columns) +with number of bands > 1.

+
+
Returns:
+

Numpy array of the size (number of lines, number of columns) containing the computed RVI.

+
+
+

References

+

Jordan C.F., 1969. Derivation of leaf area index from quality of light on the forest +floor. Ecology 50:663-666

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.savi.html b/docs/_build/html/api/eolab.rastertools.processing.algo.savi.html new file mode 100644 index 00000000..05d17226 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.savi.html @@ -0,0 +1,154 @@ + + + + + + + + + savi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

savi

+
+
+eolab.rastertools.processing.algo.savi(bands: ndarray) ndarray[source]
+

Compute the Soil Adjusted Vegetation Index +The coefficient ranges from -1 to 1 in each pixel.

+

The function considers the bands of the input data in the following order : +Red, NIR (Near Infra-Red).

+
+\[SAVI = \frac{(NIR - RED) (1 + 0.5)}{NIR + RED + 0.5}\]
+
+
Parameters:
+

input_data (np.ndarray) – Numpy array of 3 dimensions (number of bands, number of lines, number of columns) +with number of bands > 1.

+
+
Returns:
+

Numpy array of the size (number of lines, number of columns) containing the computed SAVI.

+
+
+

References

+

Huete A.R., 1988. A soil-adjusted vegetation index (SAVI). Remote Sens Environ 25:295-309

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.speed.html b/docs/_build/html/api/eolab.rastertools.processing.algo.speed.html new file mode 100644 index 00000000..90a2047d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.speed.html @@ -0,0 +1,163 @@ + + + + + + + + + speed — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

speed

+
+
+eolab.rastertools.processing.algo.speed(data0: ndarray, data1: ndarray, interval: float) ndarray[source]
+

Compute the speed of the input data based on the difference between two time points.

+
+
Parameters:
+
    +
  • data0 (numpy.ndarray) – Numpy array containing the band value(s) at the first date. +Shape must be (number_of_lines, number_of_columns).

  • +
  • data1 (numpy.ndarray) – Numpy array containing the band value(s) at the second date. +Shape must match data0.

  • +
  • interval (float) – Time interval (in the same units as the timestamps of the input data) +between the first and second dates.

  • +
+
+
Returns:
+

+
Numpy array of shape (number_of_lines, number_of_columns)

containing the computed speed of the sequence. The values represent +the change in band values per unit time.

+
+
+

+
+
Return type:
+

numpy.ndarray

+
+
Raises:
+

ValueError – If data0 and data1 do not have the same shape, or if interval is zero.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.svf.html b/docs/_build/html/api/eolab.rastertools.processing.algo.svf.html new file mode 100644 index 00000000..084b5af5 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.svf.html @@ -0,0 +1,163 @@ + + + + + + + + + svf — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

svf

+
+
+eolab.rastertools.processing.algo.svf(input_data: ndarray, radius: int = 8, directions: int = 12, resolution: float = 0.5, altitude=None) ndarray[source]
+

Computes the Sky View Factor (SVF), which represents the fraction of the visible sky from each point in a Digital Height Model (DHM).

+

More information about the Sky View Factor can be found here.

+
+
Parameters:
+
    +
  • input_data (np.ndarray) – A 3D numpy array of shape (1, number_of_lines, number_of_columns) containing the Digital Height Model (DHM). +The function only accepts arrays with one band (the first dimension must be 1).

  • +
  • radius (int) – The maximum distance (in pixels) around each point to evaluate the horizontal elevation angle. Default is 8.

  • +
  • direction (int) – The number of discrete directions to compute the vertical angle. Default is 12.

  • +
  • resolution (float) – The spatial resolution of the input data in meters. Default is 0.5.

  • +
  • altitude (Optional[np.ndarray]) – A reference altitude to use for computing the SVF. If not specified, SVF is computed using the elevation of each point.

  • +
+
+
Returns:
+

+
A numpy array of the same size as input_data, containing the Sky View Factor for each point,

where values range from 0 (no visible sky) to 1 (full sky visibility).

+
+
+

+
+
Return type:
+

np.ndarray

+
+
Raises:
+

ValueError – If input_data does not have 3 dimensions or if the first dimension is not of size 1.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.tndvi.html b/docs/_build/html/api/eolab.rastertools.processing.algo.tndvi.html new file mode 100644 index 00000000..7613f247 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.tndvi.html @@ -0,0 +1,157 @@ + + + + + + + + + tndvi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

tndvi

+
+
+eolab.rastertools.processing.algo.tndvi(bands: ndarray) ndarray[source]
+

Compute the Transformed Normalized Difference Vegetation Index +The coefficient is positive in each pixel.

+

The function considers the bands of the input data in the following order : +Red, NIR (Near Infra-Red).

+
+\[TNDVI = \sqrt{NDVI + 0.5}\]
+
+
Parameters:
+

input_data (np.ndarray) – Numpy array of 3 dimensions (number of bands, number of lines, number of columns) +with number of bands > 1.

+
+
Returns:
+

Numpy array of the size (number of lines, number of columns) containing the computed TNDVI.

+
+
+

References

+

Deering D.W., Rouse J.W., Haas R.H., and Schell J.A., 1975. Measuring forage production +of grazing units from Landsat MSS data. Pages 1169-1178 In: Cook J.J. (Ed.), Proceedings +of the Tenth International Symposium on Remote Sensing of Environment (Ann Arbor, 1975), +Vol. 2, Ann Arbor, Michigan, USA.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.algo.tsavi.html b/docs/_build/html/api/eolab.rastertools.processing.algo.tsavi.html new file mode 100644 index 00000000..39993af1 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.algo.tsavi.html @@ -0,0 +1,156 @@ + + + + + + + + + tsavi — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

tsavi

+
+
+eolab.rastertools.processing.algo.tsavi(bands: ndarray) ndarray[source]
+

Compute the Transformed Soil Adjusted Vegetation Index +The coefficient ranges from -1 to 1 in each pixel.

+

The function considers the bands of the input data in the following order : +Red, NIR (Near Infra-Red).

+
+\[TSAVI = \frac{0.7 (NIR - 0.7 RED - 0.9)}{0.7 NIR + RED + 0.08 (1 + 0.7^2)}\]
+
+
Parameters:
+

input_data (np.ndarray) – Numpy array of 3 dimensions (number of bands, number of lines, number of columns) +with number of bands > 1.

+
+
Returns:
+

Numpy array of the size (number of lines, number of columns) containing the computed TSAVI.

+
+
+

References

+

Baret F., Guyot G., Major D., 1989. TSAVI: a vegetation index which minimizes soil +brightness effects on LAI or APAR estimation. 12th Canadian Symposium on Remote +Sensing and IGARSS 1990, Vancouver, Canada, 07/10-14.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.html b/docs/_build/html/api/eolab.rastertools.processing.html new file mode 100644 index 00000000..dd6f2f73 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.html @@ -0,0 +1,151 @@ + + + + + + + + + eolab.rastertools.processing — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.processing

+

Description

+

This module contains the rastertools processing algorithms.

+

Submodules

+ + + + + + + + + + + + + + + + + + +

eolab.rastertools.processing.algo

Algorithms on raster data

eolab.rastertools.processing.rasterproc

Definition of a radiometric indice and functions to compute it.

eolab.rastertools.processing.sliding

This module defines a method to run a RasterProcessing on sliding windows.

eolab.rastertools.processing.stats

Functions to compute statistics on raster images.

eolab.rastertools.processing.vector

Utilities methods on vector images

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.html new file mode 100644 index 00000000..46945be1 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.html @@ -0,0 +1,139 @@ + + + + + + + + + RadioindiceProcessing.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.__init__

+
+
+RadioindiceProcessing.__init__(name: str, algo: ~typing.Callable = <function normalized_difference>, nodata: float = -2.0, dtype: ~numpy.dtype = <class 'numpy.float32'>)[source]
+

Constructor. See documentation of RasterProcessing.__init__ for +the description of input arguments.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.html new file mode 100644 index 00000000..7811a412 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.html @@ -0,0 +1,138 @@ + + + + + + + + + RadioindiceProcessing.algo — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.algo

+
+
+property RadioindiceProcessing.algo: Callable
+

Process an algo that is called on a multidimensional array of data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.html new file mode 100644 index 00000000..2b37f754 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.html @@ -0,0 +1,138 @@ + + + + + + + + + RadioindiceProcessing.aliases — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.aliases

+
+
+property RadioindiceProcessing.aliases
+

Aliases of the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.html new file mode 100644 index 00000000..0dfcfc78 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.html @@ -0,0 +1,139 @@ + + + + + + + + + RadioindiceProcessing.arguments — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.arguments

+
+
+property RadioindiceProcessing.arguments
+

Definition of Arguments that parametrize the processing algorithm (see with_arguments for +the description of the data structure)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.html new file mode 100644 index 00000000..cfec2027 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.html @@ -0,0 +1,138 @@ + + + + + + + + + RadioindiceProcessing.channels — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.channels

+
+
+property RadioindiceProcessing.channels: List[BandChannel]
+

List of channels necessary to compute the radiometric indice

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.html new file mode 100644 index 00000000..5f870a39 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.html @@ -0,0 +1,138 @@ + + + + + + + + + RadioindiceProcessing.compress — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.compress

+
+
+property RadioindiceProcessing.compress: str
+

Set the compression to use

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.html new file mode 100644 index 00000000..d766914b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.html @@ -0,0 +1,148 @@ + + + + + + + + + RadioindiceProcessing.compute — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.compute

+
+
+RadioindiceProcessing.compute(input_data: List[ndarray] | ndarray) ndarray
+

Compute the output from the different bands of the input data. Output +data are supposed to be the same size as input_data.

+
+
Parameters:
+

input_data ([np.ndarray] or np.ndarray) – List of input data (one np.ndarray per band) or a 3 dimensions np.ndarray +with all bands

+
+
Returns:
+

Numpy array or list of numpy arrays of the size of input data

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.html new file mode 100644 index 00000000..dce2944c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.html @@ -0,0 +1,143 @@ + + + + + + + + + RadioindiceProcessing.configure — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.configure

+
+
+RadioindiceProcessing.configure(argsdict)
+

Configure the processing algo with its specific arguments’ values

+
+
Parameters:
+

argsdict (dict) – Dictionary of arguments names and values, for instance {“kernel_size”: 8}

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.html new file mode 100644 index 00000000..b452539b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.html @@ -0,0 +1,138 @@ + + + + + + + + + RadioindiceProcessing.description — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.description

+
+
+property RadioindiceProcessing.description
+

Long description of the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.html new file mode 100644 index 00000000..14d5b03a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.html @@ -0,0 +1,138 @@ + + + + + + + + + RadioindiceProcessing.dtype — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.dtype

+
+
+property RadioindiceProcessing.dtype
+

Type of the generated data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.html new file mode 100644 index 00000000..f964fde6 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.html @@ -0,0 +1,138 @@ + + + + + + + + + RadioindiceProcessing.help — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.help

+
+
+property RadioindiceProcessing.help
+

Help message of the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.html new file mode 100644 index 00000000..63502fc2 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.html @@ -0,0 +1,206 @@ + + + + + + + + + RadioindiceProcessing — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing

+
+
+class eolab.rastertools.processing.rasterproc.RadioindiceProcessing(name: str, algo: ~typing.Callable = <function normalized_difference>, nodata: float = -2.0, dtype: ~numpy.dtype = <class 'numpy.float32'>)[source]
+

Bases: RasterProcessing

+

Class that defines a raster processing for computing radiometric indice. +This class defines the list of BandChannel necessary to compute the radiometric indice.

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

RadioindiceProcessing.algo

Process an algo that is called on a multidimensional array of data

RadioindiceProcessing.aliases

Aliases of the processing

RadioindiceProcessing.arguments

Definition of Arguments that parametrize the processing algorithm (see with_arguments for the description of the data structure)

RadioindiceProcessing.channels

List of channels necessary to compute the radiometric indice

RadioindiceProcessing.compress

Set the compression to use

RadioindiceProcessing.description

Long description of the processing

RadioindiceProcessing.dtype

Type of the generated data

RadioindiceProcessing.help

Help message of the processing

RadioindiceProcessing.in_dtype

Type of the processed data

RadioindiceProcessing.name

Name of the processing

RadioindiceProcessing.nbits

Bits size of the generated data

RadioindiceProcessing.nodata

No data value of the generated data

RadioindiceProcessing.per_band_algo

Whether the algo is applied on a dataset that contains only one band (per_band_algo=True) or on a dataset with all bands (per_band_algo=False)

+

Methods

+ + + + + + + + + + + + + + + + + + + + + +

RadioindiceProcessing.__init__(name[, algo, ...])

Constructor.

RadioindiceProcessing.compute(input_data)

Compute the output from the different bands of the input data.

RadioindiceProcessing.configure(argsdict)

Configure the processing algo with its specific arguments' values

RadioindiceProcessing.with_arguments(arguments)

Add new arguments that parametrize the processing algorithm.

RadioindiceProcessing.with_channels(channels)

Set the BandChannels necessary to compute the radiometric indice

RadioindiceProcessing.with_documentation([...])

Set up the documentation for the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.html new file mode 100644 index 00000000..6c6e7626 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.html @@ -0,0 +1,138 @@ + + + + + + + + + RadioindiceProcessing.in_dtype — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.in_dtype

+
+
+property RadioindiceProcessing.in_dtype
+

Type of the processed data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.html new file mode 100644 index 00000000..e3d8b3e6 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.html @@ -0,0 +1,138 @@ + + + + + + + + + RadioindiceProcessing.name — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.name

+
+
+property RadioindiceProcessing.name: str
+

Name of the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.html new file mode 100644 index 00000000..75e44af9 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.html @@ -0,0 +1,138 @@ + + + + + + + + + RadioindiceProcessing.nbits — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.nbits

+
+
+property RadioindiceProcessing.nbits: int
+

Bits size of the generated data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.html new file mode 100644 index 00000000..3ba6a394 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.html @@ -0,0 +1,138 @@ + + + + + + + + + RadioindiceProcessing.nodata — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.nodata

+
+
+property RadioindiceProcessing.nodata: float
+

No data value of the generated data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.html new file mode 100644 index 00000000..9eb95f5e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.html @@ -0,0 +1,139 @@ + + + + + + + + + RadioindiceProcessing.per_band_algo — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.per_band_algo

+
+
+property RadioindiceProcessing.per_band_algo: bool
+

Whether the algo is applied on a dataset that contains only one band +(per_band_algo=True) or on a dataset with all bands (per_band_algo=False)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.html new file mode 100644 index 00000000..f0a26adc --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.html @@ -0,0 +1,153 @@ + + + + + + + + + RadioindiceProcessing.with_arguments — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.with_arguments

+
+
+RadioindiceProcessing.with_arguments(arguments)
+

Add new arguments that parametrize the processing algorithm.

+
+
Parameters:
+

arguments (Dict[str, Dict]) – Dictionary where the keys are the arguments’ names and the values are dictionaries +of arguments’ properties as defined in ArgumentParser.add_argument . +The properties dictionaries are used to configure the command line ‘rastertools’.* +The possible keys are: action, nargs, const, default, type, choices, required, help, +metavar and dest

+
+
Returns:
+

Current instance so that it is possible to chain the with… calls (fluent API)

+
+
Return type:
+

self

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.html new file mode 100644 index 00000000..40445642 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.html @@ -0,0 +1,146 @@ + + + + + + + + + RadioindiceProcessing.with_channels — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.with_channels

+
+
+RadioindiceProcessing.with_channels(channels: List[BandChannel])[source]
+

Set the BandChannels necessary to compute the radiometric indice

+
+
Parameters:
+

channels ([eolab.rastertools.product.BandChannel]) – Channels to process, default None

+
+
Returns:
+

The current instance so that it is possible to chain the with… calls (fluent API)

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.html new file mode 100644 index 00000000..c079dae5 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.html @@ -0,0 +1,153 @@ + + + + + + + + + RadioindiceProcessing.with_documentation — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RadioindiceProcessing.with_documentation

+
+
+RadioindiceProcessing.with_documentation(aliases: List[str] | None = None, help: str = '', description: str = '')
+

Set up the documentation for the processing

+
+
Parameters:
+
    +
  • aliases ([str], optional, default=None) – List of command aliases

  • +
  • help (str, optional, default="") – Help message

  • +
  • description (str, optional, default="") – Long description

  • +
+
+
Returns:
+

Current instance so that it is possible to chain the with… calls (fluent API)

+
+
Return type:
+

self

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.html new file mode 100644 index 00000000..f16a7669 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.html @@ -0,0 +1,139 @@ + + + + + + + + + RasterFilter.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.__init__

+
+
+RasterFilter.__init__(name: str, algo: ~typing.Callable | None = None, nodata: float = -2.0, dtype: ~numpy.dtype = <class 'numpy.float32'>, per_band_algo: bool = False)[source]
+

Constructor. See documentation of RasterProcessing.__init__ for +the description of input arguments.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.html new file mode 100644 index 00000000..5cc1350d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterFilter.algo — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.algo

+
+
+property RasterFilter.algo: Callable
+

Process an algo that is called on a multidimensional array of data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.html new file mode 100644 index 00000000..eafaffca --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterFilter.aliases — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.aliases

+
+
+property RasterFilter.aliases
+

Aliases of the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.html new file mode 100644 index 00000000..64dc1e85 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.html @@ -0,0 +1,139 @@ + + + + + + + + + RasterFilter.arguments — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.arguments

+
+
+property RasterFilter.arguments
+

Definition of Arguments that parametrize the processing algorithm (see with_arguments for +the description of the data structure)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.html new file mode 100644 index 00000000..d0403673 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterFilter.compress — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.compress

+
+
+property RasterFilter.compress: str
+

Set the compression to use

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.html new file mode 100644 index 00000000..304722f2 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.html @@ -0,0 +1,148 @@ + + + + + + + + + RasterFilter.compute — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.compute

+
+
+RasterFilter.compute(input_data: List[ndarray] | ndarray) ndarray
+

Compute the output from the different bands of the input data. Output +data are supposed to be the same size as input_data.

+
+
Parameters:
+

input_data ([np.ndarray] or np.ndarray) – List of input data (one np.ndarray per band) or a 3 dimensions np.ndarray +with all bands

+
+
Returns:
+

Numpy array or list of numpy arrays of the size of input data

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.html new file mode 100644 index 00000000..b9dfb10c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.html @@ -0,0 +1,143 @@ + + + + + + + + + RasterFilter.configure — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.configure

+
+
+RasterFilter.configure(argsdict)
+

Configure the processing algo with its specific arguments’ values

+
+
Parameters:
+

argsdict (dict) – Dictionary of arguments names and values, for instance {“kernel_size”: 8}

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.html new file mode 100644 index 00000000..fab3f108 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterFilter.description — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.description

+
+
+property RasterFilter.description
+

Long description of the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.html new file mode 100644 index 00000000..4f2ba8f5 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterFilter.dtype — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.dtype

+
+
+property RasterFilter.dtype
+

Type of the generated data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.html new file mode 100644 index 00000000..5d9603ea --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterFilter.help — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.help

+
+
+property RasterFilter.help
+

Help message of the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.html new file mode 100644 index 00000000..582832d8 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.html @@ -0,0 +1,200 @@ + + + + + + + + + RasterFilter — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter

+
+
+class eolab.rastertools.processing.rasterproc.RasterFilter(name: str, algo: ~typing.Callable | None = None, nodata: float = -2.0, dtype: ~numpy.dtype = <class 'numpy.float32'>, per_band_algo: bool = False)[source]
+

Bases: RasterProcessing

+

Class that defines a raster processing for applying a filter on a kernel (square of +configurable size).

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

RasterFilter.algo

Process an algo that is called on a multidimensional array of data

RasterFilter.aliases

Aliases of the processing

RasterFilter.arguments

Definition of Arguments that parametrize the processing algorithm (see with_arguments for the description of the data structure)

RasterFilter.compress

Set the compression to use

RasterFilter.description

Long description of the processing

RasterFilter.dtype

Type of the generated data

RasterFilter.help

Help message of the processing

RasterFilter.in_dtype

Type of the processed data

RasterFilter.name

Name of the processing

RasterFilter.nbits

Bits size of the generated data

RasterFilter.nodata

No data value of the generated data

RasterFilter.per_band_algo

Whether the algo is applied on a dataset that contains only one band (per_band_algo=True) or on a dataset with all bands (per_band_algo=False)

+

Methods

+ + + + + + + + + + + + + + + + + + +

RasterFilter.__init__(name[, algo, nodata, ...])

Constructor.

RasterFilter.compute(input_data)

Compute the output from the different bands of the input data.

RasterFilter.configure(argsdict)

Configure the processing algo with its specific arguments' values

RasterFilter.with_arguments(arguments)

Add new arguments that parametrize the processing algorithm.

RasterFilter.with_documentation([aliases, ...])

Set up the documentation for the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.html new file mode 100644 index 00000000..ecd1aa41 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterFilter.in_dtype — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.in_dtype

+
+
+property RasterFilter.in_dtype
+

Type of the processed data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.html new file mode 100644 index 00000000..cfd1ea81 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterFilter.name — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.name

+
+
+property RasterFilter.name: str
+

Name of the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.html new file mode 100644 index 00000000..a6403f56 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterFilter.nbits — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.nbits

+
+
+property RasterFilter.nbits: int
+

Bits size of the generated data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.html new file mode 100644 index 00000000..c8d318a3 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterFilter.nodata — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.nodata

+
+
+property RasterFilter.nodata: float
+

No data value of the generated data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.html new file mode 100644 index 00000000..16dc37ac --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.html @@ -0,0 +1,139 @@ + + + + + + + + + RasterFilter.per_band_algo — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.per_band_algo

+
+
+property RasterFilter.per_band_algo: bool
+

Whether the algo is applied on a dataset that contains only one band +(per_band_algo=True) or on a dataset with all bands (per_band_algo=False)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.html new file mode 100644 index 00000000..00880c0e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.html @@ -0,0 +1,153 @@ + + + + + + + + + RasterFilter.with_arguments — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.with_arguments

+
+
+RasterFilter.with_arguments(arguments)
+

Add new arguments that parametrize the processing algorithm.

+
+
Parameters:
+

arguments (Dict[str, Dict]) – Dictionary where the keys are the arguments’ names and the values are dictionaries +of arguments’ properties as defined in ArgumentParser.add_argument . +The properties dictionaries are used to configure the command line ‘rastertools’.* +The possible keys are: action, nargs, const, default, type, choices, required, help, +metavar and dest

+
+
Returns:
+

Current instance so that it is possible to chain the with… calls (fluent API)

+
+
Return type:
+

self

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.html new file mode 100644 index 00000000..1776e983 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.html @@ -0,0 +1,153 @@ + + + + + + + + + RasterFilter.with_documentation — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterFilter.with_documentation

+
+
+RasterFilter.with_documentation(aliases: List[str] | None = None, help: str = '', description: str = '')
+

Set up the documentation for the processing

+
+
Parameters:
+
    +
  • aliases ([str], optional, default=None) – List of command aliases

  • +
  • help (str, optional, default="") – Help message

  • +
  • description (str, optional, default="") – Long description

  • +
+
+
Returns:
+

Current instance so that it is possible to chain the with… calls (fluent API)

+
+
Return type:
+

self

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.html new file mode 100644 index 00000000..71f2612b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.html @@ -0,0 +1,159 @@ + + + + + + + + + RasterProcessing.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.__init__

+
+
+RasterProcessing.__init__(name: str, algo: Callable | None = None, nodata: float | None = None, dtype: dtype | None = None, in_dtype: dtype | None = None, compress: str | None = None, nbits: int = False, per_band_algo: bool = False)[source]
+

Constructor

+
+
Parameters:
+
    +
  • name (str) – Display name of the processing

  • +
  • algo (Callable[[List[np.ndarray], kwargs], np.ndarray], optional, default=None) – Lambda function used to compute the indice. The lambda function +takes as input a multidimensional array of data to process and the list of +the arguments values of the processing (see with_argument()). +It returns the processed data.

  • +
  • nodata (float, optional, default=None) – Nodata value for the output data

  • +
  • dtype (rasterio or numpy data type, optional, default=None) – Type of generated data. When None, the generated data are supposed +to be of the same type as input data.

  • +
  • in_dtype (rasterio or numpy data type, optional, default=None) – Type of processed data. When None, the processed data are supposed +to be of the same type as dtype parameter.

  • +
  • compress (str, optional, default=None) – Set the compression to use.

  • +
  • nbits (int, optional, default=None) – Create a file with less than 8 bits per sample by passing a value from +1 to 7. The apparent pixel type should be Byte.

  • +
  • per_band_algo (bool, optional, default=False) – Whether the algo is applied on a dataset that contains only one band +(per_band_algo=True) or on a dataset with all bands (per_band_algo=False)

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.html new file mode 100644 index 00000000..4ac50914 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterProcessing.algo — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.algo

+
+
+property RasterProcessing.algo: Callable
+

Process an algo that is called on a multidimensional array of data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.html new file mode 100644 index 00000000..aa18d682 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterProcessing.aliases — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.aliases

+
+
+property RasterProcessing.aliases
+

Aliases of the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.html new file mode 100644 index 00000000..dbb8de29 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.html @@ -0,0 +1,139 @@ + + + + + + + + + RasterProcessing.arguments — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.arguments

+
+
+property RasterProcessing.arguments
+

Definition of Arguments that parametrize the processing algorithm (see with_arguments for +the description of the data structure)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.html new file mode 100644 index 00000000..89b298b7 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterProcessing.compress — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.compress

+
+
+property RasterProcessing.compress: str
+

Set the compression to use

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.html new file mode 100644 index 00000000..40ca9e95 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.html @@ -0,0 +1,148 @@ + + + + + + + + + RasterProcessing.compute — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.compute

+
+
+RasterProcessing.compute(input_data: List[ndarray] | ndarray) ndarray[source]
+

Compute the output from the different bands of the input data. Output +data are supposed to be the same size as input_data.

+
+
Parameters:
+

input_data ([np.ndarray] or np.ndarray) – List of input data (one np.ndarray per band) or a 3 dimensions np.ndarray +with all bands

+
+
Returns:
+

Numpy array or list of numpy arrays of the size of input data

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.html new file mode 100644 index 00000000..f5dc9227 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.html @@ -0,0 +1,143 @@ + + + + + + + + + RasterProcessing.configure — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.configure

+
+
+RasterProcessing.configure(argsdict)[source]
+

Configure the processing algo with its specific arguments’ values

+
+
Parameters:
+

argsdict (dict) – Dictionary of arguments names and values, for instance {“kernel_size”: 8}

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.html new file mode 100644 index 00000000..052c0de7 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterProcessing.description — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.description

+
+
+property RasterProcessing.description
+

Long description of the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.html new file mode 100644 index 00000000..733d1096 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterProcessing.dtype — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.dtype

+
+
+property RasterProcessing.dtype
+

Type of the generated data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.html new file mode 100644 index 00000000..bc3a689e --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterProcessing.help — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.help

+
+
+property RasterProcessing.help
+

Help message of the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.html new file mode 100644 index 00000000..6173c0e5 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.html @@ -0,0 +1,201 @@ + + + + + + + + + RasterProcessing — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing

+
+
+class eolab.rastertools.processing.rasterproc.RasterProcessing(name: str, algo: Callable | None = None, nodata: float | None = None, dtype: dtype | None = None, in_dtype: dtype | None = None, compress: str | None = None, nbits: int = False, per_band_algo: bool = False)[source]
+

Bases: object

+

Defines a processing algorithm for raster image data.

+

This class allows users to define custom processing operations on raster data +by specifying an algorithm, data types, compression, and other parameters.

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

RasterProcessing.algo

Process an algo that is called on a multidimensional array of data

RasterProcessing.aliases

Aliases of the processing

RasterProcessing.arguments

Definition of Arguments that parametrize the processing algorithm (see with_arguments for the description of the data structure)

RasterProcessing.compress

Set the compression to use

RasterProcessing.description

Long description of the processing

RasterProcessing.dtype

Type of the generated data

RasterProcessing.help

Help message of the processing

RasterProcessing.in_dtype

Type of the processed data

RasterProcessing.name

Name of the processing

RasterProcessing.nbits

Bits size of the generated data

RasterProcessing.nodata

No data value of the generated data

RasterProcessing.per_band_algo

Whether the algo is applied on a dataset that contains only one band (per_band_algo=True) or on a dataset with all bands (per_band_algo=False)

+

Methods

+ + + + + + + + + + + + + + + + + + +

RasterProcessing.__init__(name[, algo, ...])

Constructor

RasterProcessing.compute(input_data)

Compute the output from the different bands of the input data.

RasterProcessing.configure(argsdict)

Configure the processing algo with its specific arguments' values

RasterProcessing.with_arguments(arguments)

Add new arguments that parametrize the processing algorithm.

RasterProcessing.with_documentation([...])

Set up the documentation for the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.html new file mode 100644 index 00000000..f7aa0553 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterProcessing.in_dtype — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.in_dtype

+
+
+property RasterProcessing.in_dtype
+

Type of the processed data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.html new file mode 100644 index 00000000..e3aa48c4 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterProcessing.name — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.name

+
+
+property RasterProcessing.name: str
+

Name of the processing

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.html new file mode 100644 index 00000000..4ddaac19 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterProcessing.nbits — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.nbits

+
+
+property RasterProcessing.nbits: int
+

Bits size of the generated data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.html new file mode 100644 index 00000000..29e89fd3 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterProcessing.nodata — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.nodata

+
+
+property RasterProcessing.nodata: float
+

No data value of the generated data

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.html new file mode 100644 index 00000000..04f9f51b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.html @@ -0,0 +1,139 @@ + + + + + + + + + RasterProcessing.per_band_algo — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.per_band_algo

+
+
+property RasterProcessing.per_band_algo: bool
+

Whether the algo is applied on a dataset that contains only one band +(per_band_algo=True) or on a dataset with all bands (per_band_algo=False)

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.html new file mode 100644 index 00000000..d9df17f7 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.html @@ -0,0 +1,153 @@ + + + + + + + + + RasterProcessing.with_arguments — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.with_arguments

+
+
+RasterProcessing.with_arguments(arguments)[source]
+

Add new arguments that parametrize the processing algorithm.

+
+
Parameters:
+

arguments (Dict[str, Dict]) – Dictionary where the keys are the arguments’ names and the values are dictionaries +of arguments’ properties as defined in ArgumentParser.add_argument . +The properties dictionaries are used to configure the command line ‘rastertools’.* +The possible keys are: action, nargs, const, default, type, choices, required, help, +metavar and dest

+
+
Returns:
+

Current instance so that it is possible to chain the with… calls (fluent API)

+
+
Return type:
+

self

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.html new file mode 100644 index 00000000..728cebc7 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.html @@ -0,0 +1,153 @@ + + + + + + + + + RasterProcessing.with_documentation — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProcessing.with_documentation

+
+
+RasterProcessing.with_documentation(aliases: List[str] | None = None, help: str = '', description: str = '')[source]
+

Set up the documentation for the processing

+
+
Parameters:
+
    +
  • aliases ([str], optional, default=None) – List of command aliases

  • +
  • help (str, optional, default="") – Help message

  • +
  • description (str, optional, default="") – Long description

  • +
+
+
Returns:
+

Current instance so that it is possible to chain the with… calls (fluent API)

+
+
Return type:
+

self

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.rasterproc.html b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.html new file mode 100644 index 00000000..e1900a4d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.rasterproc.html @@ -0,0 +1,146 @@ + + + + + + + + + eolab.rastertools.processing.rasterproc — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.processing.rasterproc

+

Description

+

Definition of a radiometric indice and functions to compute it.

+

Classes

+ + + + + + + + + + + + +

RadioindiceProcessing

Class that defines a raster processing for computing radiometric indice.

RasterFilter

Class that defines a raster processing for applying a filter on a kernel (square of configurable size).

RasterProcessing

Defines a processing algorithm for raster image data.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.sliding.compute_sliding.html b/docs/_build/html/api/eolab.rastertools.processing.sliding.compute_sliding.html new file mode 100644 index 00000000..b07eba91 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.sliding.compute_sliding.html @@ -0,0 +1,167 @@ + + + + + + + + + compute_sliding — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

compute_sliding

+
+
+eolab.rastertools.processing.sliding.compute_sliding(input_image: str, output_image: str, rasterprocessing: RasterProcessing, window_size: tuple = (1024, 1024), window_overlap: int = 0, pad_mode: str = 'edge', bands: List[int] | None = None)[source]
+

Apply a sliding window raster processing operation on an input image and save the result.

+

This function processes a raster image in small sliding windows, allowing efficient +memory management for large datasets by processing chunks. The specified rasterprocessing +operation is applied to each window, with options for padding and overlapping windows.

+
+
Parameters:
+
    +
  • input_image (str) – Path to the input raster image file to be processed.

  • +
  • output_image (str) – Path to save the output raster image after processing.

  • +
  • rasterprocessing (RasterProcessing) – A processing object defining the algorithm and +parameters to apply on each window of the input image.

  • +
  • window_size (tuple(int, int), optional) – Size of each window for processing, +default is (1024, 1024).

  • +
  • window_overlap (int, optional) – Number of pixels to overlap between consecutive windows, +default is 0.

  • +
  • pad_mode (str, optional, default="edge") – Padding mode for the edges of the windows, default is “edge”. +Refer to `numpy.pad <https://numpy.org/doc/stable/reference/generated/numpy.pad.html`_ documentation for valid modes.

  • +
  • bands (List[int], optional) – List of specific bands to process. If None, all bands in +the input image will be processed.

  • +
+
+
Raises:
+

ValueError – If specified band indices are out of range for the input image.

+
+
+
+

Note

+

This function supports concurrent processing and makes use of a thread pool for efficient +handling of multiple windows. Window padding at the image boundaries is applied as +specified, and sliding window indices are computed internally.

+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.sliding.html b/docs/_build/html/api/eolab.rastertools.processing.sliding.html new file mode 100644 index 00000000..36bc9007 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.sliding.html @@ -0,0 +1,140 @@ + + + + + + + + + eolab.rastertools.processing.sliding — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.processing.sliding

+

Description

+

This module defines a method to run a RasterProcessing on sliding windows.

+

Functions

+ + + + + + +

compute_sliding

Apply a sliding window raster processing operation on an input image and save the result.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.stats.compute_zonal_stats.html b/docs/_build/html/api/eolab.rastertools.processing.stats.compute_zonal_stats.html new file mode 100644 index 00000000..d24035d6 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.stats.compute_zonal_stats.html @@ -0,0 +1,175 @@ + + + + + + + + + compute_zonal_stats — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

compute_zonal_stats

+
+
+eolab.rastertools.processing.stats.compute_zonal_stats(geoms: GeoDataFrame, image: str, bands: List[int] = [1], stats: List[str] = ['min', 'max', 'mean', 'std'], categorical: bool = False) List[List[Dict[str, float]]][source]
+

Compute zonal statistics for an input raster image over specified geometries.

+

This function calculates statistical summaries (e.g., min, max, mean, standard deviation) +for each feature in the provided geometries (GeoDataFrame) using the specified raster image. +If the raster is categorical, the function can compute counts of unique values.

+
+
Parameters:
+
    +
  • geoms (GeoDataFrame) – A GeoDataFrame containing geometries (e.g., polygons) for which statistics will be computed.

  • +
  • image (str) – Path to the raster image file to process.

  • +
  • bands (List[int], optional) – A list of raster band indices to process. Defaults to [1] (the first band).

  • +
  • stats (List[str], optional) – A list of statistical metrics to compute. Possible values include: +- “min”: Minimum value within the geometry. +- “max”: Maximum value within the geometry. +- “mean”: Mean (average) value within the geometry. +- “std”: Standard deviation within the geometry. +- Other metrics may be supported based on the implementation of _compute_stats. +Defaults to [“min”, “max”, “mean”, “std”].

  • +
  • categorical (bool, optional) – If True, treats the raster as categorical, computing counts of unique values within each geometry. +Defaults to False.

  • +
+
+
Returns:
+

A nested list where: +- The outer list corresponds to each geometry in the GeoDataFrame. +- The inner list corresponds to each band processed. +- Each dictionary contains the computed statistics, with stat names as keys and their values as values.

+
+
Return type:
+

List[List[Dict[str, float]]]

+
+
+

Example

+

``` +import geopandas as gpd +from rastertools import compute_zonal_stats

+

geoms = gpd.read_file(“polygons.shp”) +stats = compute_zonal_stats(geoms, “input_image.tif”, bands=[1, 2], stats=[“mean”, “std”]) +print(stats) +```

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.html b/docs/_build/html/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.html new file mode 100644 index 00000000..cc2c9de0 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.html @@ -0,0 +1,204 @@ + + + + + + + + + compute_zonal_stats_per_category — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

compute_zonal_stats_per_category

+
+
+eolab.rastertools.processing.stats.compute_zonal_stats_per_category(geoms: GeoDataFrame, image: str, bands: List[int] = [1], stats: List[str] = ['min', 'max', 'mean', 'std'], categories: GeoDataFrame | None = None, category_index: str = 'Classe', category_labels: Dict[str, str] | None = None)[source]
+

Compute zonal statistics for an input raster image, categorized by specified subregions.

+

This function calculates statistical metrics for a raster image over a set of geometries +(e.g., polygons) provided in geoms. If a set of categories (subregions within each geometry) +is provided, statistics are computed separately for each category within each geometry.

+
+
Parameters:
+
    +
  • geoms (GeoDataFrame) – A GeoDataFrame containing the input geometries (e.g., polygons) to compute +statistics over.

  • +
  • image (str) – The file path to the input raster image.

  • +
  • bands (List[int], optional) – A list of raster band indices to process. Defaults to [1] (the first band).

  • +
  • stats (List[str], optional) – A list of statistical metrics to compute. Supported values include: +- “min”: Minimum value within the geometry. +- “max”: Maximum value within the geometry. +- “mean”: Mean value within the geometry. +- “std”: Standard deviation within the geometry. +Defaults to [“min”, “max”, “mean”, “std”].

  • +
  • categories (GeoDataFrame, optional) – A GeoDataFrame containing category geometries that define subregions of the +input geometries. Defaults to None.

  • +
  • category_index (str, optional) – The column in the categories GeoDataFrame that identifies category labels +for each geometry. Defaults to ‘Classe’.

  • +
  • category_labels (Dict[str, str], optional) – A dictionary mapping category values (from category_index) to human-readable +labels. If provided, these labels replace category values in the output. +Defaults to None.

  • +
+
+
Returns:
+

A nested list of dictionaries containing the computed statistics: +- Outer list corresponds to each input geometry in geoms. +- Inner list corresponds to each raster band being processed. +- Each dictionary maps statistic names (e.g., “mean”, “max”) to their respective values.

+
+
Return type:
+

List[List[Dict[str, float]]]

+
+
Raises:
+

IOError – If any input geometry is not of type Polygon or MultiPolygon.

+
+
+

Notes

+
    +
  • For each geometry in geoms, the function subdivides it into subregions based +on the geometries in categories (if provided). Statistics are then computed +for each subregion separately.

  • +
  • The function assumes that the raster image is georeferenced and aligned with +the coordinate system of the input geometries.

  • +
+

Example

+

``` +import geopandas as gpd +from rastertools import compute_zonal_stats_per_category

+

geoms = gpd.read_file(“regions.shp”) +categories = gpd.read_file(“landcover.shp”) +image_path = “satellite_image.tif”

+
+
stats = compute_zonal_stats_per_category(

geoms=geoms, +image=image_path, +categories=categories, +category_index=”Land_Type”, +category_labels={1: “Forest”, 2: “Urban”, 3: “Water”}

+
+
+

)

+
+
for geometry_stats in stats:

print(geometry_stats)

+
+
+

```

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.stats.extract_zonal_outliers.html b/docs/_build/html/api/eolab.rastertools.processing.stats.extract_zonal_outliers.html new file mode 100644 index 00000000..483de39d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.stats.extract_zonal_outliers.html @@ -0,0 +1,152 @@ + + + + + + + + + extract_zonal_outliers — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

extract_zonal_outliers

+
+
+eolab.rastertools.processing.stats.extract_zonal_outliers(geoms: GeoDataFrame, image: str, outliers_image: str, prefix: List[str] | None = None, bands: List[int] = [1], sigma: float = 2)[source]
+

Extract the outliers of an input image and store the results in a new image where +all outliers are written with their real values and other pixels are stored with the +mean value. The outliers are computed for each geometry. The stats mean and std of the +geometries shall have been computed by the function compute_zonal_stats.

+
+
Parameters:
+
    +
  • geoms (GeoDataFrame) – Geometries that contain as metadata the statistics (at least the mean and std)

  • +
  • image (str) – Filename of the input image to process

  • +
  • outliers_image (str) – Filename of the ioutput image

  • +
  • prefix ([str]) – Add a prefix to the stats keys. Must have the same size as bands

  • +
  • bands ([int], optional, default=[1]) – List of bands to process in the input image

  • +
  • sigma (float, optional, default=2) – Distance (in sigma) to the mean value to consider a point as an outlier

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.stats.html b/docs/_build/html/api/eolab.rastertools.processing.stats.html new file mode 100644 index 00000000..e7c863ec --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.stats.html @@ -0,0 +1,149 @@ + + + + + + + + + eolab.rastertools.processing.stats — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.processing.stats

+

Description

+

Functions to compute statistics on raster images.

+

Functions

+ + + + + + + + + + + + + + + +

compute_zonal_stats

Compute zonal statistics for an input raster image over specified geometries.

compute_zonal_stats_per_category

Compute zonal statistics for an input raster image, categorized by specified subregions.

extract_zonal_outliers

Extract the outliers of an input image and store the results in a new image where all outliers are written with their real values and other pixels are stored with the mean value.

plot_stats

Plot temporal statistics for geometries across multiple dates.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.stats.plot_stats.html b/docs/_build/html/api/eolab.rastertools.processing.stats.plot_stats.html new file mode 100644 index 00000000..0ab8dd4c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.stats.plot_stats.html @@ -0,0 +1,195 @@ + + + + + + + + + plot_stats — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

plot_stats

+
+
+eolab.rastertools.processing.stats.plot_stats(chartfile: str, stats_per_date: Dict[datetime, GeoDataFrame], stats: List[str] = ['min', 'max', 'mean', 'std'], index_name: str = 'ID', display: bool = False)[source]
+

Plot temporal statistics for geometries across multiple dates.

+

This function visualizes the evolution of specified statistics (e.g., “min”, “mean”) +over time for different zones defined in the input GeoDataFrames. The output is +saved as a chart file, and optionally displayed.

+
+
Parameters:
+
    +
  • chartfile (str) – Path to the file where the generated chart will be saved.

  • +
  • stats_per_date (Dict[datetime.datetime, gpd.GeoDataFrame]) – A dictionary mapping each date to a GeoDataFrame containing the statistics +for that date. Each GeoDataFrame should include the specified index_name +column and relevant statistics columns.

  • +
  • stats (List[str], optional) – A list of statistics to plot (e.g., “min”, “max”, “mean”, “std”). Defaults +to [“min”, “max”, “mean”, “std”].

  • +
  • index_name (str, optional) – Name of the column in the GeoDataFrames that uniquely identifies the zones +(e.g., region IDs). Defaults to ‘ID’.

  • +
  • display (bool, optional) – If True, the generated plot is displayed after saving. Defaults to False.

  • +
+
+
Raises:
+

ValueError – If the specified index_name is not present in the combined GeoDataFrame.

+
+
+

Notes

+
    +
  • The stats_per_date dictionary must be ordered or sortable by date to ensure +proper time-series plotting.

  • +
  • Each GeoDataFrame in stats_per_date should have columns named in the format +<prefix>.<stat> (e.g., “temperature.mean”).

  • +
+

Example

+

``` +import geopandas as gpd +import datetime +from plot_tools import plot_stats

+

# Example input +stats_per_date = {

+
+

datetime.datetime(2023, 1, 1): gpd.GeoDataFrame({…}), +datetime.datetime(2023, 2, 1): gpd.GeoDataFrame({…}),

+
+

}

+
+
plot_stats(

chartfile=”output_chart.png”, +stats_per_date=stats_per_date, +stats=[“mean”, “std”], +index_name=”RegionID”, +display=True

+
+
+
+

)

+
+
Output:
    +
  • Saves a time-series plot of the specified statistics as chartfile.

  • +
  • Optionally displays the plot if display=True.

  • +
+
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.vector.clip.html b/docs/_build/html/api/eolab.rastertools.processing.vector.clip.html new file mode 100644 index 00000000..7a9dc383 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.vector.clip.html @@ -0,0 +1,155 @@ + + + + + + + + + clip — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

clip

+
+
+eolab.rastertools.processing.vector.clip(geoms: GeoDataFrame | Path | str, raster: Path | str, output: str | Path | None = None, driver: str = 'GeoJSON') GeoDataFrame[source]
+

Clip the geometries to the raster bounds. +Clipping is supposed to be a little bit faster than intersect

+
+
Parameters:
+
    +
  • geoms (str or Path or gpd.GeoDataFrame) – Filename of the vector data (if str) or GeoDataFrame

  • +
  • raster (str or Path) – Raster image

  • +
  • output (str or Path, optional, default=None) – File where to save the clipped geoms +If None, nothing written to disk (only in memory)

  • +
  • driver (str, optional, default=GeoJSON) – Driver to write the output

  • +
+
+
Returns:
+

The clipped geometries

+
+
Return type:
+

gpd.GeoDataFrame

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.vector.crop.html b/docs/_build/html/api/eolab.rastertools.processing.vector.crop.html new file mode 100644 index 00000000..3369b14d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.vector.crop.html @@ -0,0 +1,146 @@ + + + + + + + + + crop — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

crop

+
+
+eolab.rastertools.processing.vector.crop(input_image: Path | str, roi: GeoDataFrame | Path | str, output_image: Path | str)[source]
+

Crops an input image to the roi bounds.

+
+
Parameters:
+
    +
  • input_image (pathlib.Path or str) – Filename of the raster image to crop

  • +
  • roi (str or Path or GeoDataFrame) – Filename of the vector data (if str) or GeoDataFrame

  • +
  • output_image (pathlib.Path or str) – Filename of the generated raster image

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.vector.dissolve.html b/docs/_build/html/api/eolab.rastertools.processing.vector.dissolve.html new file mode 100644 index 00000000..85af16ce --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.vector.dissolve.html @@ -0,0 +1,153 @@ + + + + + + + + + dissolve — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

dissolve

+
+
+eolab.rastertools.processing.vector.dissolve(geoms: GeoDataFrame | Path | str, output: str | Path | None = None, driver: str = 'GeoJSON') GeoDataFrame[source]
+

Dissolves all geometries in one

+
+
Parameters:
+
    +
  • geoms (str or Path or gpd.GeoDataFrame) – Filename of the vector data (if str) or GeoDataFrame

  • +
  • output (str or Path, optional, default=None) – File where to save the dissolved geoms +If None, nothing written to disk (only in memory)

  • +
  • driver (str, optional, default=GeoJSON) – Driver to write the output

  • +
+
+
Returns:
+

The dissolved geometries

+
+
Return type:
+

gpd.GeoDataFrame

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.vector.filter.html b/docs/_build/html/api/eolab.rastertools.processing.vector.filter.html new file mode 100644 index 00000000..734cbc3a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.vector.filter.html @@ -0,0 +1,156 @@ + + + + + + + + + filter — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

filter

+
+
+eolab.rastertools.processing.vector.filter(geoms: GeoDataFrame | Path | str, raster: Path | str, within: bool = False, output: str | Path | None = None, driver: str = 'GeoJSON') GeoDataFrame[source]
+

Filter the geometries to keep those which intersect the raster bounds

+
+
Parameters:
+
    +
  • geoms (str or Path or gpd.GeoDataFrame) – Filename of the vector data (if str) or GeoDataFrame

  • +
  • raster (str or Path) – Raster image

  • +
  • within (bool, optional, default=False) – If true, statistics are computed for geometries within the raster shape. Otherwise +statistics are computed for geometries that intersect the raster shape.

  • +
  • output (str or Path, optional, default=None) – File where to save the filtered geoms +If None, nothing written to disk (only in memory)

  • +
  • driver (str, optional, default=GeoJSON) – Driver to write the output

  • +
+
+
Returns:
+

The geometries that intesect the raster

+
+
Return type:
+

gpd.GeoDataFrame

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.vector.filter_dissolve.html b/docs/_build/html/api/eolab.rastertools.processing.vector.filter_dissolve.html new file mode 100644 index 00000000..20e9fbd7 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.vector.filter_dissolve.html @@ -0,0 +1,155 @@ + + + + + + + + + filter_dissolve — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

filter_dissolve

+
+
+eolab.rastertools.processing.vector.filter_dissolve(geom: GeoDataFrame, cat_geom: GeoDataFrame, id: str = 'Classe') GeoDataFrame[source]
+

Filter a classification to the extent of a geometry. Returns a list of multipolygons +corresponding to each category. Categories are merged according to the id label if +entry is a geodataframe

+
+
Parameters:
+
    +
  • geom (gpd.GeoDataFrame) – Geometry corresponding to ROI

  • +
  • cat_geom (gpd.GeoDataFrame) – Geometries with labels, corresponding +to a classification

  • +
  • id (str, optional, default="Classe") – Name of classes label in cat_geom

  • +
+
+
Returns:
+

The filtered geometries

+
+
Return type:
+

gpd.GeoDataFrame

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.vector.get_raster_shape.html b/docs/_build/html/api/eolab.rastertools.processing.vector.get_raster_shape.html new file mode 100644 index 00000000..8fb1ea78 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.vector.get_raster_shape.html @@ -0,0 +1,153 @@ + + + + + + + + + get_raster_shape — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

get_raster_shape

+
+
+eolab.rastertools.processing.vector.get_raster_shape(raster: Path | str, output: str | Path | None = None, driver: str = 'GeoJSON') GeoDataFrame[source]
+

Extract the raster extent (shape where raster values are not masked)

+
+
Parameters:
+
    +
  • raster (str or Path) – Raster image

  • +
  • output (str or Path, optional, default=None) – File where to save the shape geom +If None, nothing written to disk (only in memory)

  • +
  • driver (str, optional, default=GeoJSON) – Driver to write the output

  • +
+
+
Returns:
+

The geometries in the raster CRS

+
+
Return type:
+

gpd.GeoDataFrame

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.vector.html b/docs/_build/html/api/eolab.rastertools.processing.vector.html new file mode 100644 index 00000000..bc9fd647 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.vector.html @@ -0,0 +1,164 @@ + + + + + + + + + eolab.rastertools.processing.vector — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.processing.vector

+

Description

+

Utilities methods on vector images

+

Functions

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

clip

Clip the geometries to the raster bounds.

crop

Crops an input image to the roi bounds.

dissolve

Dissolves all geometries in one

filter

Filter the geometries to keep those which intersect the raster bounds

filter_dissolve

Filter a classification to the extent of a geometry.

get_raster_shape

Extract the raster extent (shape where raster values are not masked)

rasterize

Rasterize geometries using the raster shape and CRS.

reproject

Reproject the geometries in the raster CRS

vectorize

Vectorize a raster containing categorical data.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.vector.rasterize.html b/docs/_build/html/api/eolab.rastertools.processing.vector.rasterize.html new file mode 100644 index 00000000..96d180ef --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.vector.rasterize.html @@ -0,0 +1,158 @@ + + + + + + + + + rasterize — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

rasterize

+
+
+eolab.rastertools.processing.vector.rasterize(geoms: GeoDataFrame | Path | str, raster: Path | str, burn: str = 'index', burn_type='int32', nodata=-1, output: str | Path | None = None)[source]
+

Rasterize geometries using the raster shape and CRS. Output is a GeoTiff where every pixels +have the value of the “burn” attribute of geometries.

+
+
Parameters:
+
    +
  • geoms (str or Path or gpd.GeoDataFrame) – Filename of the vector data (if str) or GeoDataFrame

  • +
  • raster (str or Path) – Filename of the raster image

  • +
  • burn (str, optional, default='index') – Attribute to burn in the raster. Default is the index of the geometry.

  • +
  • burn_type (rasterio.dtypes, optional, default=rasterio.int32) – Type of the attribute values to burn. Must be coherent with actual +burned attribute.

  • +
  • nodata (value compatible with burn_type, optional, default=-1) – Value corresponding to nodata in the generated raster.

  • +
  • output (str or Path, optional, default=None) – Output file where to save the rasterized geometries. +If None, nothing written to disk (only in memory)

  • +
+
+
Returns:
+

The dataset containing the burned values

+
+
Return type:
+

np.ndarray

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.vector.reproject.html b/docs/_build/html/api/eolab.rastertools.processing.vector.reproject.html new file mode 100644 index 00000000..6784bac4 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.vector.reproject.html @@ -0,0 +1,154 @@ + + + + + + + + + reproject — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

reproject

+
+
+eolab.rastertools.processing.vector.reproject(geoms: GeoDataFrame | Path | str, raster: Path | str, output: str | Path | None = None, driver: str = 'GeoJSON') GeoDataFrame[source]
+

Reproject the geometries in the raster CRS

+
+
Parameters:
+
    +
  • geoms (str or Path or gpd.GeoDataFrame) – Filename of the vector data (if str) or GeoDataFrame

  • +
  • raster (str or Path) – Raster image

  • +
  • output (str or Path, optional, default=None) – File where to save the reprojected geoms +If None, nothing written to disk (only in memory)

  • +
  • driver (str, optional, default="GeoJSON") – Driver to write the output

  • +
+
+
Returns:
+

The geometries in the raster CRS

+
+
Return type:
+

gpd.GeoDataFrame

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.processing.vector.vectorize.html b/docs/_build/html/api/eolab.rastertools.processing.vector.vectorize.html new file mode 100644 index 00000000..410bdb9c --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.processing.vector.vectorize.html @@ -0,0 +1,153 @@ + + + + + + + + + vectorize — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

vectorize

+
+
+eolab.rastertools.processing.vector.vectorize(category_raster: Path | str, raster: Path | str, category_column: str = 'Classe') GeoDataFrame[source]
+

Vectorize a raster containing categorical data. Only data intersecting the raster bounds +are vectorized.

+
+
Parameters:
+
    +
  • category_raster (str or Path) – Raster containing categories to vectorize data (if str)

  • +
  • raster (str or Path) – Raster image defining the zone of interest

  • +
  • category_column (str, optional, default="Classe") – Name of the column containing the category in the resulting geodataframe

  • +
+
+
Returns:
+

The geometries generated by the vectorization in the category crs

+
+
Return type:
+

gpd.GeoDataFrame

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.html b/docs/_build/html/api/eolab.rastertools.product.html new file mode 100644 index 00000000..b3f3dd09 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.html @@ -0,0 +1,153 @@ + + + + + + + + + eolab.rastertools.product — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.product

+

Description

+

This module defines the raster product definition.

+

Functions

+ + + + + + +

s2_maja_mask

Computes the mask band from the Sentinel2 L2A MAJA cloud mask

+

Submodules

+ + + + + + + + + + + + +

eolab.rastertools.product.rasterproduct

Data Model for raster product enabling to extract bands, timestamp, etc.

eolab.rastertools.product.rastertype

Data Model for raster product enabling to extract bands, timestamp, etc.

eolab.rastertools.product.vrt

Utilities to handle vrt image format

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.html new file mode 100644 index 00000000..f60f58bf --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.html @@ -0,0 +1,146 @@ + + + + + + + + + RasterProduct.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.__init__

+
+
+RasterProduct.__init__(file: Path | str, vrt_outputdir: str | Path | None = None)[source]
+

Constructor

+
+
Parameters:
+
    +
  • file (Path or str) – Path to the raster product

  • +
  • vrt_outputdir (Path or str, optional, default=None) – Dir where to store the generated VRT image(s). If None, output is in memory.

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.html new file mode 100644 index 00000000..889e7421 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.html @@ -0,0 +1,140 @@ + + + + + + + + + RasterProduct.bands_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.bands_files

+
+
+property RasterProduct.bands_files
+

Dictionary of available bands. Key is the identifier of the band, +value is the path to the band. If all bands are in the same file, the +dictionary contains only one key named “all”.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.html new file mode 100644 index 00000000..a258a8b7 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterProduct.channels — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.channels

+
+
+property RasterProduct.channels
+

List of available channels in the product

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.create_in_memory_vrt.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.create_in_memory_vrt.html new file mode 100644 index 00000000..5210f459 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.create_in_memory_vrt.html @@ -0,0 +1,143 @@ + + + + + + + + + RasterProduct.create_in_memory_vrt — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.create_in_memory_vrt

+
+
+RasterProduct.create_in_memory_vrt(vrt_content)[source]
+

Create an in-memory VRT using Rasterio’s MemoryFile.

+
+
Parameters:
+

vrt_content (str) – The XML content of the VRT file.

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.html new file mode 100644 index 00000000..147cdeb2 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterProduct.file — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.file

+
+
+property RasterProduct.file: Path
+

Product path

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.html new file mode 100644 index 00000000..dd421d51 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterProduct.free_in_memory_vrts — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.free_in_memory_vrts

+
+
+RasterProduct.free_in_memory_vrts()[source]
+

Free in-memory VRTs by closing all MemoryFile objects.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.html new file mode 100644 index 00000000..7196c146 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.html @@ -0,0 +1,146 @@ + + + + + + + + + RasterProduct.get_date — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.get_date

+
+
+RasterProduct.get_date() datetime[source]
+

Extracts the timestamp of the raster

+
+
Returns:
+

Timestamp of the raster

+
+
Return type:
+

datetime.datetime

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.html new file mode 100644 index 00000000..cf321eb5 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.html @@ -0,0 +1,146 @@ + + + + + + + + + RasterProduct.get_date_string — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.get_date_string

+
+
+RasterProduct.get_date_string(strformat: str | None = None) str[source]
+

Extracts the timestamp of the raster and returns it as a formatted string

+
+
Returns:
+

String formatted timestamp of the raster

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.html new file mode 100644 index 00000000..e5b5879d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.html @@ -0,0 +1,164 @@ + + + + + + + + + RasterProduct.get_raster — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.get_raster

+
+
+RasterProduct.get_raster(bands: str | List[str] = 'all', masks: str | List[str] = 'all', roi: str | Path | None = None, create_maskband: bool = True)[source]
+

Gets the path to the raster corresponding to this product. +This method allows to crop the raster to a specified ROI and to apply the band masks.

+
+
Parameters:
+
    +
  • bands (str or [str], default="all") – List of bands ids to get in the generated raster. If “all”, all bands +defined in the rastertype will be present in the raster.

  • +
  • masks (str or [str], default="all") – List of masks bands ids to get in the generated raster. If “all”, all +masks bands defined in the rastertype will be present in the raster. If +None, no mask band will be present in the rastertype.

  • +
  • roi (Path or str, optional, default=None) – Region of interest defined by a vector data (e.g. GeoJSON) for +cropping the raster.

  • +
  • create_maskband (bool, optional, default=True) – Whether to create the VRT product with a maskband that is a composition +of all the given masks.

  • +
+
+
Returns:
+

+
Raster path (either a path to a regular image or

a memory path such as /vsimem/…)

+
+
+

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.html new file mode 100644 index 00000000..6787c527 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.html @@ -0,0 +1,146 @@ + + + + + + + + + RasterProduct.get_relative_orbit — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.get_relative_orbit

+
+
+RasterProduct.get_relative_orbit() int[source]
+

Extracts the relative orbit number of the raster

+
+
Returns:
+

Relative orbit number of the raster

+
+
Return type:
+

int

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.html new file mode 100644 index 00000000..023bb241 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.html @@ -0,0 +1,146 @@ + + + + + + + + + RasterProduct.get_satellite — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.get_satellite

+
+
+RasterProduct.get_satellite() str[source]
+

Extracts the satellite’s name of the raster

+
+
Returns:
+

Name of the satellite

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.html new file mode 100644 index 00000000..e3237813 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.html @@ -0,0 +1,146 @@ + + + + + + + + + RasterProduct.get_tile — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.get_tile

+
+
+RasterProduct.get_tile() str[source]
+

Extracts the tile identifier of the raster

+
+
Returns:
+

Tile tile identifier of the raster

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.html new file mode 100644 index 00000000..bd2cae0f --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.html @@ -0,0 +1,213 @@ + + + + + + + + + RasterProduct — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct

+
+
+class eolab.rastertools.product.rasterproduct.RasterProduct(file: Path | str, vrt_outputdir: str | Path | None = None)[source]
+

Bases: object

+

Data model for a raster product that handles :

+
+
    +
  • a raster type

  • +
  • the list of available bands

  • +
  • the path to the product

  • +
+
+

A raster product can be easily like this:

+
with RasterProduct("my_product_filename.zip") as product:
+    rastertype = product.rastertype()
+    raster = product.get_raster()  # raster is an in-memory VRT that can
+                                   # be opened using rasterio
+    with rasterio.open(raster) as rst:
+        print(rst.count)
+        data = rst.read([1, 2, 3], masked=True)  # data is a numpy masked array
+
+
+

A raster product handles several in-memory VRTs that must be properly released. The +with statement enables this. If you want to control the clean-up of the in-memory VRTs +you have to call free_in_memory_vrts().

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + +

RasterProduct.bands_files

Dictionary of available bands.

RasterProduct.channels

List of available channels in the product

RasterProduct.file

Product path

RasterProduct.is_archive

Whether the raster product is an archive (zip, tar, dir, ...) or a regular raster image

RasterProduct.masks_files

Dictionary of available mask bands.

RasterProduct.rastertype

Type of the raster

+

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

RasterProduct.__init__(file[, vrt_outputdir])

Constructor

RasterProduct.free_in_memory_vrts()

Free in-memory VRTs by closing all MemoryFile objects.

RasterProduct.get_date()

Extracts the timestamp of the raster

RasterProduct.get_date_string([strformat])

Extracts the timestamp of the raster and returns it as a formatted string

RasterProduct.get_raster([bands, masks, ...])

Gets the path to the raster corresponding to this product.

RasterProduct.get_relative_orbit()

Extracts the relative orbit number of the raster

RasterProduct.get_satellite()

Extracts the satellite's name of the raster

RasterProduct.get_tile()

Extracts the tile identifier of the raster

RasterProduct.open([bands, masks, roi])

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.html new file mode 100644 index 00000000..d7b3fcb6 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.html @@ -0,0 +1,139 @@ + + + + + + + + + RasterProduct.is_archive — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.is_archive

+
+
+property RasterProduct.is_archive
+

Whether the raster product is an archive (zip, tar, dir, …) or +a regular raster image

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.html new file mode 100644 index 00000000..95fae9e1 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.html @@ -0,0 +1,139 @@ + + + + + + + + + RasterProduct.masks_files — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.masks_files

+
+
+property RasterProduct.masks_files
+

Dictionary of available mask bands. Key is the identifier of the mask band, +value is the path to the band.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.html new file mode 100644 index 00000000..a39e582d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.html @@ -0,0 +1,137 @@ + + + + + + + + + RasterProduct.open — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.open

+
+
+RasterProduct.open(bands: str | List[str] = 'all', masks: str | List[str] = 'all', roi: str | Path | None = None)[source]
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.html new file mode 100644 index 00000000..3c45dbfe --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterProduct.rastertype — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterProduct.rastertype

+
+
+property RasterProduct.rastertype: RasterType
+

Type of the raster

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rasterproduct.html b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.html new file mode 100644 index 00000000..bf2c5731 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rasterproduct.html @@ -0,0 +1,140 @@ + + + + + + + + + eolab.rastertools.product.rasterproduct — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.product.rasterproduct

+

Description

+

Data Model for raster product enabling to extract bands, timestamp, etc.

+

Classes

+ + + + + + +

RasterProduct

Data model for a raster product that handles :

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.Band.__init__.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.Band.__init__.html new file mode 100644 index 00000000..798b30b3 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.Band.__init__.html @@ -0,0 +1,137 @@ + + + + + + + + + Band.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

Band.__init__

+
+
+Band.__init__(identifier: str, description: str | None = None)[source]
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.Band.description.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.Band.description.html new file mode 100644 index 00000000..2b770e48 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.Band.description.html @@ -0,0 +1,138 @@ + + + + + + + + + Band.description — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

Band.description

+
+
+property Band.description
+

Description of the band

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.Band.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.Band.html new file mode 100644 index 00000000..89f4aac2 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.Band.html @@ -0,0 +1,157 @@ + + + + + + + + + Band — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

Band

+
+
+class eolab.rastertools.product.rastertype.Band(identifier: str, description: str | None = None)[source]
+

Bases: object

+

Definition of a band: its identifier in the product’s name pattern and its description

+

Attributes

+ + + + + + + + + +

Band.description

Description of the band

Band.identifier

String that enables to identify the band in a raster product

+

Methods

+ + + + + + +

Band.__init__(identifier[, description])

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.Band.identifier.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.Band.identifier.html new file mode 100644 index 00000000..62bd96d8 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.Band.identifier.html @@ -0,0 +1,138 @@ + + + + + + + + + Band.identifier — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

Band.identifier

+
+
+property Band.identifier
+

String that enables to identify the band in a raster product

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.blue.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.blue.html new file mode 100644 index 00000000..4644cfd3 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.blue.html @@ -0,0 +1,137 @@ + + + + + + + + + BandChannel.blue — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BandChannel.blue

+
+
+BandChannel.blue = 'blue'
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.html new file mode 100644 index 00000000..43135c99 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.html @@ -0,0 +1,137 @@ + + + + + + + + + BandChannel.blue_60m — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BandChannel.blue_60m

+
+
+BandChannel.blue_60m = 'blue_60m'
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.green.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.green.html new file mode 100644 index 00000000..c9ae7f53 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.green.html @@ -0,0 +1,137 @@ + + + + + + + + + BandChannel.green — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BandChannel.green

+
+
+BandChannel.green = 'green'
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.html new file mode 100644 index 00000000..bf6ad027 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.html @@ -0,0 +1,182 @@ + + + + + + + + + BandChannel — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BandChannel

+
+
+class eolab.rastertools.product.rastertype.BandChannel(value)[source]
+

Bases: Enum

+

Defines the band channel of a raster product

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

BandChannel.blue

BandChannel.green

BandChannel.red

BandChannel.nir

BandChannel.mir

BandChannel.swir

BandChannel.red_edge1

BandChannel.red_edge2

BandChannel.red_edge3

BandChannel.red_edge4

BandChannel.blue_60m

BandChannel.nir_60m

BandChannel.mir_60m

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.mir.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.mir.html new file mode 100644 index 00000000..b1a9cd01 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.mir.html @@ -0,0 +1,137 @@ + + + + + + + + + BandChannel.mir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BandChannel.mir

+
+
+BandChannel.mir = 'mir'
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.html new file mode 100644 index 00000000..7c8690a9 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.html @@ -0,0 +1,137 @@ + + + + + + + + + BandChannel.mir_60m — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BandChannel.mir_60m

+
+
+BandChannel.mir_60m = 'mir_60m'
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.nir.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.nir.html new file mode 100644 index 00000000..a2e877c9 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.nir.html @@ -0,0 +1,137 @@ + + + + + + + + + BandChannel.nir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BandChannel.nir

+
+
+BandChannel.nir = 'nir'
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.html new file mode 100644 index 00000000..2e70d388 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.html @@ -0,0 +1,137 @@ + + + + + + + + + BandChannel.nir_60m — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BandChannel.nir_60m

+
+
+BandChannel.nir_60m = 'nir_60m'
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red.html new file mode 100644 index 00000000..e63455ae --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red.html @@ -0,0 +1,137 @@ + + + + + + + + + BandChannel.red — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BandChannel.red

+
+
+BandChannel.red = 'red'
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.html new file mode 100644 index 00000000..8a1bcd72 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.html @@ -0,0 +1,137 @@ + + + + + + + + + BandChannel.red_edge1 — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BandChannel.red_edge1

+
+
+BandChannel.red_edge1 = 'red_edge1'
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.html new file mode 100644 index 00000000..9811a079 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.html @@ -0,0 +1,137 @@ + + + + + + + + + BandChannel.red_edge2 — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BandChannel.red_edge2

+
+
+BandChannel.red_edge2 = 'red_edge2'
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.html new file mode 100644 index 00000000..d6018324 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.html @@ -0,0 +1,137 @@ + + + + + + + + + BandChannel.red_edge3 — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BandChannel.red_edge3

+
+
+BandChannel.red_edge3 = 'red_edge3'
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.html new file mode 100644 index 00000000..ed752d95 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.html @@ -0,0 +1,137 @@ + + + + + + + + + BandChannel.red_edge4 — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BandChannel.red_edge4

+
+
+BandChannel.red_edge4 = 'red_edge4'
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.swir.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.swir.html new file mode 100644 index 00000000..5f734aa5 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.swir.html @@ -0,0 +1,137 @@ + + + + + + + + + BandChannel.swir — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

BandChannel.swir

+
+
+BandChannel.swir = 'swir'
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.__init__.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.__init__.html new file mode 100644 index 00000000..623bd4c9 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.__init__.html @@ -0,0 +1,158 @@ + + + + + + + + + RasterType.__init__ — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.__init__

+
+
+RasterType.__init__(name: str, product_pattern: str, bands_pattern: str, bands: Dict[BandChannel, Band], masks: List[Band], date_format: str = '%Y%m%d-%H%M%S', maskfunc: str | None = None, nodata: float = -10000, masknodata: int = 1)[source]
+

Constructor

+
+
Parameters:
+
    +
  • name (str) – Display name of the rastertype

  • +
  • product_pattern (str) – Pattern to identify a file corresponding to this RasterType +The pattern can contain a capturing group corresponding to +the product timestamp

  • +
  • bands_pattern (str) – Pattern to identify a band file in the product. The pattern can +contain a capturing group corresponding to the bands’ identifiers +in case bands are separated in different files

  • +
  • bands (dict(BandChannel, Band)) – Dictionary associating the channel and the band definition for all available bands

  • +
  • masks ([Band]) – List of bands that define the masks of the product type

  • +
  • date_format (str, optional, default="%Y%m%d-%H%M%S") – Date format ot the product timestamp (used to convert a string to datetime)

  • +
  • maskfunc (str, optional, default=None) – Name of the function to convert pixels of the band defined as the mask +(typically the cloud mask) to boolean values.

  • +
  • nodata (float, optional, default=-10000) – No data value of the raster product

  • +
  • masknodata (int, optional, default=1) – No data value of the mask

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.accept.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.accept.html new file mode 100644 index 00000000..c4aabb6b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.accept.html @@ -0,0 +1,149 @@ + + + + + + + + + RasterType.accept — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.accept

+
+
+RasterType.accept(file: Path | str) bool[source]
+

Check if the file corresponds to this raster type

+
+
Parameters:
+

file (Path or str) – Product name or path to analyse

+
+
Returns:
+

True if the file matches this RasterType

+
+
Return type:
+

bool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.add.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.add.html new file mode 100644 index 00000000..32cf54c8 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.add.html @@ -0,0 +1,150 @@ + + + + + + + + + RasterType.add — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.add

+
+
+static RasterType.add(rastertypes)[source]
+

Add new raster types definitions from a json file

+
+
Parameters:
+

rastertypes (str) – rastertypes description as JSON string

+
+
Returns:
+

List of rastertype’s name and parameters. Parameters are +provided as a tuple.

+
+
Return type:
+

[(str, tuple)]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.html new file mode 100644 index 00000000..ab3da154 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterType.bands_pattern — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.bands_pattern

+
+
+property RasterType.bands_pattern
+

Pattern that enables to identify the bands in a product of this rastertype

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.channels.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.channels.html new file mode 100644 index 00000000..e3a307b7 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.channels.html @@ -0,0 +1,146 @@ + + + + + + + + + RasterType.channels — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.channels

+
+
+property RasterType.channels: List[BandChannel]
+

Gets the list of all available channels

+
+
Returns:
+

List of available bands channels for this type of product

+
+
Return type:
+

[eolab.rastertools.product.BandChannel]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.date_format.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.date_format.html new file mode 100644 index 00000000..c43e7d41 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.date_format.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterType.date_format — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.date_format

+
+
+property RasterType.date_format
+

Format of the date in the product’s name

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.find.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.find.html new file mode 100644 index 00000000..256a92b3 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.find.html @@ -0,0 +1,150 @@ + + + + + + + + + RasterType.find — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.find

+
+
+static RasterType.find(file: Path | str)[source]
+

Gets the raster type corresponding to the input file

+
+
Parameters:
+

file (Path or str) – Product name or path to analyse

+
+
Returns:
+

the RasterType corresponding +to the input file

+
+
Return type:
+

eolab.rastertools.product.RasterType

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get.html new file mode 100644 index 00000000..2c87556d --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterType.get — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.get

+
+
+static RasterType.get(name: str)[source]
+

Get the raster type by its name

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.html new file mode 100644 index 00000000..76259a87 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.html @@ -0,0 +1,149 @@ + + + + + + + + + RasterType.get_band_description — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.get_band_description

+
+
+RasterType.get_band_description(channel: BandChannel) List[str][source]
+

Gets the band description of the given channel.

+
+
Parameters:
+

channel (eolab.rastertools.product.BandChannel) – Band channel

+
+
Returns:
+

The band description if found, None otherwise

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.html new file mode 100644 index 00000000..3649b248 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.html @@ -0,0 +1,146 @@ + + + + + + + + + RasterType.get_band_descriptions — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.get_band_descriptions

+
+
+RasterType.get_band_descriptions() List[str][source]
+

Gets the descriptions of the bands.

+
+
Returns:
+

The band description if found, None otherwise

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.html new file mode 100644 index 00000000..bf3cead3 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.html @@ -0,0 +1,149 @@ + + + + + + + + + RasterType.get_band_id — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.get_band_id

+
+
+RasterType.get_band_id(channel: BandChannel) str[source]
+

Gets the band identifier of the specified channel.

+
+
Parameters:
+

channel (eolab.rastertools.product.BandChannel) – Band channel

+
+
Returns:
+

The band id if found, None otherwise

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.html new file mode 100644 index 00000000..48b916a1 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.html @@ -0,0 +1,146 @@ + + + + + + + + + RasterType.get_band_ids — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.get_band_ids

+
+
+RasterType.get_band_ids() List[str][source]
+

Gets the bands identifiers.

+
+
Returns:
+

The bands ids

+
+
Return type:
+

[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.html new file mode 100644 index 00000000..a61949db --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.html @@ -0,0 +1,149 @@ + + + + + + + + + RasterType.get_bands_regexp — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.get_bands_regexp

+
+
+RasterType.get_bands_regexp(channels: List[BandChannel] | None = None) str[source]
+

Gets the regexp to identify the bands in the product.

+
+
Parameters:
+

channels ([eolab.rastertools.product.BandChannel]) – List of bands channels

+
+
Returns:
+

The regexp to identify the bands in the product

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_date.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_date.html new file mode 100644 index 00000000..fd845d9b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_date.html @@ -0,0 +1,149 @@ + + + + + + + + + RasterType.get_date — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.get_date

+
+
+RasterType.get_date(file: Path | str) datetime[source]
+

Extracts the timestamp of the raster from the input file

+
+
Parameters:
+

file (Path or str) – Product name or path to analyse

+
+
Returns:
+

Timestamp of the input file

+
+
Return type:
+

datetime.datetime

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_group.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_group.html new file mode 100644 index 00000000..8c9a4fd0 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_group.html @@ -0,0 +1,152 @@ + + + + + + + + + RasterType.get_group — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.get_group

+
+
+RasterType.get_group(file: Path | str, group: str) str[source]
+

Extracts a group from the input file using the product pattern

+
+
Parameters:
+
    +
  • file (Path or str) – Product name or path to analyse

  • +
  • group (str) – Name of the group to extract

  • +
+
+
Returns:
+

Group extracted from the raster file

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask.html new file mode 100644 index 00000000..fdb6ec70 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask.html @@ -0,0 +1,153 @@ + + + + + + + + + RasterType.get_mask — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.get_mask

+
+
+RasterType.get_mask(mask_id: str) Band[source]
+

Gets the mask corresponding to the given id.

+
+
Parameters:
+

mask_id (str) – Id of the mask

+
+
Returns:
+

+
the mask corresponding to the given id, or None if no mask corresponds to

the id

+
+
+

+
+
Return type:
+

Band

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.html new file mode 100644 index 00000000..51c06286 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.html @@ -0,0 +1,146 @@ + + + + + + + + + RasterType.get_mask_descriptions — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.get_mask_descriptions

+
+
+RasterType.get_mask_descriptions() List[str][source]
+

Gets the descriptions of the masks

+
+
Returns:
+

The descriptions of the masks if they are some, empty list otherwise

+
+
Return type:
+

[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.html new file mode 100644 index 00000000..a063ca31 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.html @@ -0,0 +1,146 @@ + + + + + + + + + RasterType.get_mask_ids — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.get_mask_ids

+
+
+RasterType.get_mask_ids() List[str][source]
+

Gets the identifier of the masks

+
+
Returns:
+

The identifiers of the masks if they are some, empty list otherwise

+
+
Return type:
+

[str]

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.html new file mode 100644 index 00000000..f64e5738 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.html @@ -0,0 +1,146 @@ + + + + + + + + + RasterType.get_mask_regexp — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.get_mask_regexp

+
+
+RasterType.get_mask_regexp() str[source]
+

Gets the regexp to identify the masks

+
+
Returns:
+

The regexp to identify the masks

+
+
Return type:
+

str

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.has_channel.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.has_channel.html new file mode 100644 index 00000000..ed7105f5 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.has_channel.html @@ -0,0 +1,149 @@ + + + + + + + + + RasterType.has_channel — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.has_channel

+
+
+RasterType.has_channel(channel: BandChannel) bool[source]
+

Checks if the product type contains the expected channel.

+
+
Parameters:
+

channel (eolab.rastertools.product.BandChannel) – Band channel

+
+
Returns:
+

True if this RasterType contain the channel

+
+
Return type:
+

bool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.has_channels.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.has_channels.html new file mode 100644 index 00000000..1d9847b5 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.has_channels.html @@ -0,0 +1,149 @@ + + + + + + + + + RasterType.has_channels — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.has_channels

+
+
+RasterType.has_channels(channels: List[BandChannel]) bool[source]
+

Checks if the product type contains all the expected channels.

+
+
Parameters:
+

channels ([eolab.rastertools.product.BandChannel]) – List of bands channels

+
+
Returns:
+

True if this RasterType contains all channels

+
+
Return type:
+

bool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.has_mask.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.has_mask.html new file mode 100644 index 00000000..fbec19f3 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.has_mask.html @@ -0,0 +1,146 @@ + + + + + + + + + RasterType.has_mask — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.has_mask

+
+
+RasterType.has_mask() bool[source]
+

Checks if the product type contains a mask.

+
+
Returns:
+

True if this RasterType contains a mask

+
+
Return type:
+

bool

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.html new file mode 100644 index 00000000..995b7147 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.html @@ -0,0 +1,232 @@ + + + + + + + + + RasterType — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType

+
+
+class eolab.rastertools.product.rastertype.RasterType(name: str, product_pattern: str, bands_pattern: str, bands: Dict[BandChannel, Band], masks: List[Band], date_format: str = '%Y%m%d-%H%M%S', maskfunc: str | None = None, nodata: float = -10000, masknodata: int = 1)[source]
+

Bases: object

+

Raster type definition

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

RasterType.bands_pattern

Pattern that enables to identify the bands in a product of this rastertype

RasterType.channels

Gets the list of all available channels

RasterType.date_format

Format of the date in the product's name

RasterType.maskfunc

Function that defines the mask of cloud from the raster band

RasterType.masknodata

Nodata value of the mask

RasterType.name

Name of the raster type

RasterType.nodata

Nodata value

RasterType.product_pattern

Pattern that enables to identify products of this rastertype

RasterType.rastertypes

+

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

RasterType.__init__(name, product_pattern, ...)

Constructor

RasterType.accept(file)

Check if the file corresponds to this raster type

RasterType.add(rastertypes)

Add new raster types definitions from a json file

RasterType.find(file)

Gets the raster type corresponding to the input file

RasterType.get(name)

Get the raster type by its name

RasterType.get_band_description(channel)

Gets the band description of the given channel.

RasterType.get_band_descriptions()

Gets the descriptions of the bands.

RasterType.get_band_id(channel)

Gets the band identifier of the specified channel.

RasterType.get_band_ids()

Gets the bands identifiers.

RasterType.get_bands_regexp([channels])

Gets the regexp to identify the bands in the product.

RasterType.get_date(file)

Extracts the timestamp of the raster from the input file

RasterType.get_group(file, group)

Extracts a group from the input file using the product pattern

RasterType.get_mask(mask_id)

Gets the mask corresponding to the given id.

RasterType.get_mask_descriptions()

Gets the descriptions of the masks

RasterType.get_mask_ids()

Gets the identifier of the masks

RasterType.get_mask_regexp()

Gets the regexp to identify the masks

RasterType.has_channel(channel)

Checks if the product type contains the expected channel.

RasterType.has_channels(channels)

Checks if the product type contains all the expected channels.

RasterType.has_mask()

Checks if the product type contains a mask.

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.html new file mode 100644 index 00000000..190a6cd0 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterType.maskfunc — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.maskfunc

+
+
+property RasterType.maskfunc
+

Function that defines the mask of cloud from the raster band

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.masknodata.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.masknodata.html new file mode 100644 index 00000000..989b7593 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.masknodata.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterType.masknodata — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.masknodata

+
+
+property RasterType.masknodata
+

Nodata value of the mask

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.name.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.name.html new file mode 100644 index 00000000..7b7d4de3 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.name.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterType.name — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.name

+
+
+property RasterType.name
+

Name of the raster type

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.nodata.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.nodata.html new file mode 100644 index 00000000..84f66a2a --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.nodata.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterType.nodata — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.nodata

+
+
+property RasterType.nodata
+

Nodata value

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.html new file mode 100644 index 00000000..1804e442 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.html @@ -0,0 +1,138 @@ + + + + + + + + + RasterType.product_pattern — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.product_pattern

+
+
+property RasterType.product_pattern
+

Pattern that enables to identify products of this rastertype

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.html new file mode 100644 index 00000000..1d7b0ce6 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.html @@ -0,0 +1,137 @@ + + + + + + + + + RasterType.rastertypes — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

RasterType.rastertypes

+
+
+RasterType.rastertypes = {'S2_L1C': S2_L1C, 'S2_L2A_MAJA': S2_L2A_MAJA, 'S2_L2A_SEN2CORE': S2_L2A_SEN2CORE, 'S2_L3A_THEIA': S2_L3A_THEIA, 'SPOT67_GEOSUD': SPOT67_GEOSUD}
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.rastertype.html b/docs/_build/html/api/eolab.rastertools.product.rastertype.html new file mode 100644 index 00000000..51fe7a2b --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.rastertype.html @@ -0,0 +1,146 @@ + + + + + + + + + eolab.rastertools.product.rastertype — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.product.rastertype

+

Description

+

Data Model for raster product enabling to extract bands, timestamp, etc.

+

Classes

+ + + + + + + + + + + + +

Band

Definition of a band: its identifier in the product's name pattern and its description

BandChannel

Defines the band channel of a raster product

RasterType

Raster type definition

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.s2_maja_mask.html b/docs/_build/html/api/eolab.rastertools.product.s2_maja_mask.html new file mode 100644 index 00000000..5d126ef9 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.s2_maja_mask.html @@ -0,0 +1,136 @@ + + + + + + + + + s2_maja_mask — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

s2_maja_mask

+
+
+eolab.rastertools.product.s2_maja_mask(in_ar, out_ar, xoff, yoff, xsize, ysize, raster_xsize, raster_ysize, buf_radius, gt, **kwargs)[source]
+

Computes the mask band from the Sentinel2 L2A MAJA cloud mask

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.vrt.add_masks_to_vrt.html b/docs/_build/html/api/eolab.rastertools.product.vrt.add_masks_to_vrt.html new file mode 100644 index 00000000..5a899f1f --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.vrt.add_masks_to_vrt.html @@ -0,0 +1,156 @@ + + + + + + + + + add_masks_to_vrt — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

add_masks_to_vrt

+
+
+eolab.rastertools.product.vrt.add_masks_to_vrt(src_vrt: Path | str, maskfile: Path | str, bands: List[int] = [1], funcname: str | None = None, funcdef: str | None = None) str[source]
+

Adds a mask bands to the vrt.

+
+
Parameters:
+
    +
  • src_vrt (pathlib.Path or str) – Vrt input image

  • +
  • maskfile (pathlib.Path or str) – Input image that contains the bands to use as masks

  • +
  • bands ([int]) – Bands in the the input image to use as masks

  • +
  • funcname (str, optional, default=None) – Fully qualified name of the pixel function (e.g. indices.vrt.s2_maja_mask) +used to compute the mask from the maskfile dataset.

  • +
  • funcdef (str, optional, default=None) – Function definition (without its signature). If None, the function funcname +must be available in the scope

  • +
+
+
Returns:
+

XML content (vrt format) with the added mask band.

+
+
Return type:
+

(str)

+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.vrt.html b/docs/_build/html/api/eolab.rastertools.product.vrt.html new file mode 100644 index 00000000..e1351460 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.vrt.html @@ -0,0 +1,143 @@ + + + + + + + + + eolab.rastertools.product.vrt — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

eolab.rastertools.product.vrt

+

Description

+

Utilities to handle vrt image format

+

Functions

+ + + + + + + + + +

add_masks_to_vrt

Adds a mask bands to the vrt.

set_band_descriptions

Set the descriptions of the bands in a VRT image.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/eolab.rastertools.product.vrt.set_band_descriptions.html b/docs/_build/html/api/eolab.rastertools.product.vrt.set_band_descriptions.html new file mode 100644 index 00000000..b59f15b4 --- /dev/null +++ b/docs/_build/html/api/eolab.rastertools.product.vrt.set_band_descriptions.html @@ -0,0 +1,145 @@ + + + + + + + + + set_band_descriptions — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

set_band_descriptions

+
+
+eolab.rastertools.product.vrt.set_band_descriptions(src_vrt: Path | str, descriptions: List[str])[source]
+

Set the descriptions of the bands in a VRT image.

+
+
Parameters:
+
    +
  • src_vrt (pathlib.Path or str) – VRT input image

  • +
  • descriptions ([str]) – Descriptions of the bands

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/api/modules.html b/docs/_build/html/api/modules.html new file mode 100644 index 00000000..4623afa4 --- /dev/null +++ b/docs/_build/html/api/modules.html @@ -0,0 +1,150 @@ + + + + + + + + + eolab — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/authors.html b/docs/_build/html/authors.html new file mode 100644 index 00000000..560d77cc --- /dev/null +++ b/docs/_build/html/authors.html @@ -0,0 +1,134 @@ + + + + + + + + + Contributors — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Contributors

+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/changelog.html b/docs/_build/html/changelog.html new file mode 100644 index 00000000..a97f2566 --- /dev/null +++ b/docs/_build/html/changelog.html @@ -0,0 +1,147 @@ + + + + + + + + + Changelog — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Changelog

+
+

Version 0.6.0

+

OpenSource release.

+
+
+

Version 0.6.1

+
+

Hillshade

+
    +
  • lzw compression for outputs

  • +
  • Better handling of errors regarding radius computation

  • +
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/cli.html b/docs/_build/html/cli.html new file mode 100644 index 00000000..70550141 --- /dev/null +++ b/docs/_build/html/cli.html @@ -0,0 +1,230 @@ + + + + + + + + + Command Line Interface — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Command Line Interface

+
+

rastertools

+

The CLI rastertools enable to activate several subcommands, one per raster tool:

+
$ rastertools --help
+usage: rastertools [-h] [-t RASTERTYPE] [--version] [--max_workers MAX_WORKERS] [--debug] [-v] [-vv]
+                   {filter,fi,hillshade,hs,radioindice,ri,speed,sp,svf,tiling,ti,timeseries,ts,zonalstats,zs} ...
+
+Collection of tools on raster data
+
+optional arguments:
+  -h, --help            show this help message and exit
+  -t RASTERTYPE, --rastertype RASTERTYPE
+                        JSON file defining additional raster types of input files
+  --version             show program's version number and exit
+  --max_workers MAX_WORKERS
+                        Maximum number of workers for parallel processing. If not given, it will default
+                        to the number of processors on the machine. When all processors are not allocated
+                        to run rastertools, it is thus recommended to set this option.
+  --debug               Store to disk the intermediate VRT images that are generated when handling the
+                        input files which can be complex raster product composed of several band files.
+  -v, --verbose         set loglevel to INFO
+  -vv, --very-verbose   set loglevel to DEBUG
+
+Commands:
+  {filter,fi,hillshade,hs,radioindice,ri,speed,sp,svf,tiling,ti,timeseries,ts,zonalstats,zs}
+    filter (fi)         Apply a filter to a set of images
+    hillshade (hs)      Compute hillshades of a Digital Elevation / Surface / Height Model (a raster
+                        containing the height of the point as pixel values)
+    radioindice (ri)    Compute radiometric indices
+    speed (sp)          Compute speed of rasters
+    svf                 Compute Sky View Factor of a Digital Height Model
+    tiling (ti)         Generate image tiles
+    timeseries (ts)     Temporal gap filling of an image time series
+    zonalstats (zs)     Compute zonal statistics
+
+
+

The rastertools CLI generates the following sys.exit values:

+
    +
  • 0: everything runs fine

  • +
  • 1: processing error

  • +
  • 2: wrong configuration of the raster tool (e.g. invalid parameter value given in the command line)

  • +
+

rastertools is thus the entry point for all the following tools:

+ +

rastertools enables to configure additional custom rastertypes (cf. Usage) and to set-up logging +level. Most of the rastertools display their progression using a progress bar. The progress bar is +displayed when the logging level is set to INFO or DEBUG. It can also be disabled / enabled +independently to the logging level by setting an environment variable named RASTERTOOLS_NOTQDM. For +instance, setting the environment variable to 1 (resp. 0) will disable (resp. enable) the display +of the progress bar:

+
$ export RASTERTOOLS_NOTQDM=1
+$ rastertools -v ri [...]
+
+
+

Most of the rastertools are designed to split down rasters into small chunks of data so that +the processing can be run in parallel using several processors. The command line of the tools +defines an argument called window_size which corresponds to the size of the chunks. It is also +possible to specify the number of workers (i.e. processors) to use for parallel processing. The +number of workers shall not exceed the number of processors of the machine. It is necessary to +specify this option (–max_workers) when running rastertools on a machine where all cpus are +not allocated to the job, e.g. if you submit the processing to a job scheduler such as PBSPro. +Alternatively, you can set an environment variable like this and keep the argument +–max_workers unset:

+
$ export RASTERTOOLS_MAXWORKERS=12
+$ rastertools -v hillshade [...] # it will use 12 processors
+
+
+
+
+

Docker/Singularity

+

By default the Docker / Singularity container executes: rastertools --help. To run another command, type a command like:

+
$ docker run -it -u 1000 -v $PWD/tests/tests_data:/usr/data rastertools:latest rastertools ri -r /usr/data/COMMUNE_32001.shp --ndvi /usr/data/SENTINEL2A_20180521-105702-711_L2A_T30TYP_D.zip
+
+$ singularity run rastertools_latest.sif rastertools ri -r tests/tests_data/COMMUNE_32001.shp --ndvi tests/tests_data/SENTINEL2A_20180521-105702-711_L2A_T30TYP_D.zip
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/cli/filtering.html b/docs/_build/html/cli/filtering.html new file mode 100644 index 00000000..39034a27 --- /dev/null +++ b/docs/_build/html/cli/filtering.html @@ -0,0 +1,255 @@ + + + + + + + + + filter — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

filter

+

filter (or fi) subcommand applies a convolutive filter on a a raster image.

+
$ rastertools filter --help
+usage: rastertools filter [-h] {median,sum,mean,adaptive_gaussian} ...
+
+Apply a filter to a set of images.
+
+optional arguments:
+  -h, --help            show this help message and exit
+
+Filters:
+  {median,sum,mean,adaptive_gaussian}
+    median              Apply median filter
+    sum                 Apply local sum filter
+    mean                Apply local mean filter
+    adaptive_gaussian   Apply adaptive gaussian filter
+
+
+

For different filters are available. They are applied as sub-command that each define the arguments +that configure the filter. Type option –help to get the definition of the arguments:

+
$ rastertools filter adaptive_gaussian --help
+usage: rastertools filter adaptive_gaussian [-h] --kernel_size KERNEL_SIZE
+                                            --sigma SIGMA [-o OUTPUT]
+                                            [-ws WINDOW_SIZE]
+                                            [-p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}]
+                                            [-b BANDS [BANDS ...]] [-a]
+                                            inputs [inputs ...]
+
+Execute the requested filter on the input files with the specified
+parameters. The `inputs` argument can either be a single file or a `.lst`
+file containing a list of input files.
+
+Arguments:
+
+    inputs TEXT
+
+    Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). You can
+    provide a single file with extension ".lst" (e.g. "filtering.lst") that
+    lists the input files to process (one input file per line in .lst).
+
+Options:
+    --sigma INTEGER                 Standard deviation of the Gaussian
+                                    distribution  [required]
+    -a, --all                       Process all bands
+    -b, --bands INTEGER             List of bands to process
+    -p, --pad [none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap]
+                                    Pad to use around the image, default : edge(see
+                                    https://numpy.org/doc/stable/reference/generated/numpy.pad.html
+                                    for more information)
+    -ws, --window_size INTEGER      Size of tiles to distribute processing,
+                                    default: 1024
+    -o, --output TEXT               Output directory to store results (by
+                                    default current directory)
+    --kernel_size INTEGER           Kernel size of the filter function, e.g. 3
+                                    means a square of 3x3 pixels on which the
+                                    filter function is computed (default: 8)
+    -h, --help                      Show this message and exit.
+
+Apply an adaptive (Local gaussian of 3x3) recursive filter on the input image
+
+positional arguments:
+  inputs                Input file to process (e.g. Sentinel2 L2A MAJA from
+                        THEIA). You can provide a single file with extension
+                        ".lst" (e.g. "filtering.lst") that lists the input
+                        files to process (one input file per line in .lst)
+
+optional arguments:
+  -h, --help            show this help message and exit
+  --kernel_size KERNEL_SIZE
+                        Kernel size of the filter function, e.g. 3 means a
+                        square of 3x3 pixels on which the filter function is
+                        computed (default: 8)
+  --sigma SIGMA         Standard deviation of the Gaussian distribution
+                        (sigma)
+  -o OUTPUT, --output OUTPUT
+                        Output dir where to store results (by default current
+                        dir)
+  -ws WINDOW_SIZE, --window_size WINDOW_SIZE
+                        Size of tiles to distribute processing, default: 1024
+  -p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}, --pad {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}
+                        Pad to use around the image, default : edge (see https
+                        ://numpy.org/doc/stable/reference/generated/numpy.pad.
+                        html for more information)
+  -b BANDS [BANDS ...], --bands BANDS [BANDS ...]
+                        List of bands to compute
+  -a, --all             Compute all bands
+
+By default only first band is computed.
+
+
+

Examples:

+

The following examples use an input raster file generated by radioindice. This is an NDVI of a SENTINEL2 L2A THEIA image cropped to a (small) +region of interest.

+../_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg +

To apply three filters (median, mean and adaptive_gaussian) on a kernel of dimension 16x16, run these commands:

+
$ rastertools filter median --kernel_size 16 "./SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif"
+$ rastertools filter mean --kernel_size 16 "./SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif"
+$ rastertools filter adaptive_gaussian --kernel_size 16 --sigma 1 "./SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif"
+
+
+

The commands will generate respectively:

+
    +
  • SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.tif

  • +
+../_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.jpg +
    +
  • SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.tif

  • +
+../_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.jpg +
    +
  • SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.tif

  • +
+../_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/cli/hillshade.html b/docs/_build/html/cli/hillshade.html new file mode 100644 index 00000000..89701232 --- /dev/null +++ b/docs/_build/html/cli/hillshade.html @@ -0,0 +1,219 @@ + + + + + + + + + hillshade — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

hillshade

+

hillshade (or hs) subcommand computes the hillshades of a Digital Height Model. +The tool takes the sun position (elevation and azimuth) as input and +computes the shadows of the ground surface (buildings, trees, etc.).

+
$ rastertools hillshade --help
+usage: rastertools hillshade [-h] --elevation ELEVATION --azimuth AZIMUTH
+                             [--radius RADIUS] --resolution RESOLUTION
+                             [-o OUTPUT] [-ws WINDOW_SIZE]
+                             [-p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}]
+                             inputs [inputs ...]
+
+Execute the hillshade subcommand on a Digital Height Model (DHM) using the
+given solar parameters (elevation, azimuth), resolution, and optional
+parameters for processing the raster.
+
+Arguments:
+
+    inputs TEXT
+
+    Input file to process (i.e. geotiff corresponding to a Digital Height
+    Model). You can provide a single file with extension ".lst" (e.g.
+    "hillshade.lst") that lists the input files to process (one input file
+    per line in .lst)
+
+Options:
+    --elevation FLOAT               Elevation of the sun in degrees, [0°, 90°]
+                                    where 90°=zenith and 0°=horizon  [required]
+    --azimuth FLOAT                 Azimuth of the sun in degrees, [0°, 360°]
+                                    where 0°=north, 90°=east, 180°=south and
+                                    270°=west  [required]
+    --radius INTEGER                Maximum distance (in pixels) around a point
+                                    to evaluate horizontal elevation angle. If
+                                    not set, it is automatically computed from
+                                    the range of altitudes in the digital model.
+    --resolution FLOAT              Pixel resolution in meter  [required]
+    -o, --output TEXT               Output directory to store results (by
+                                    default current directory)
+    -ws, --window_size INTEGER      Size of tiles to distribute processing,
+                                    default: 1024
+    -p, --pad [none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap]
+                                    Pad to use around the image, default : edge (see
+                                    https://numpy.org/doc/stable/reference/generated/numpy.pad.html
+                                    for more information)
+    -h, --help                      Show this message and exit.
+
+
+
+

Warning

+

This command line does not accept all input raster products as other raster tools (radioindice, zonalstats). +It is mandatory to use a raster file (typically a geotif) in a format that can be read by rasterio: rasterio.open(xxx)).

+
+

Example:

+

Let’s take as input a Digital Height Model of Toulouse generated from a PLEIADES stereo (0.5m resolution):

+../_images/dsm.jpg +

The following commands will compute the hillshades of this Digital Height Model at 3 differents solar +hours (8:00AM, noon, 6:00PM) of 21st June:

+
$ rastertools hillshade --elevation 27.2 --azimuth 82.64 --resolution 0.5 toulouse-mnh.tif
+$ rastertools hillshade --elevation 69.83 --azimuth 180 --resolution 0.5 toulouse-mnh.tif
+$ rastertools hillshade --elevation 25.82 --azimuth 278.58 --resolution 0.5 toulouse-mnh.tif
+
+
+

The generated images are rendered with QGis: +- first layer contains the hillshade (value 0 is masked) +- second layer contains the Digital Height Model rendered in grayscale (white to black)

+

Here are the captures:

+
    +
  • 8 AM

  • +
+../_images/dsm-hillshade1.jpg +
    +
  • Noon

  • +
+../_images/dsm-hillshade2.jpg +
    +
  • 6 PM

  • +
+../_images/dsm-hillshade3.jpg +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/cli/radioindice.html b/docs/_build/html/cli/radioindice.html new file mode 100644 index 00000000..780e1a91 --- /dev/null +++ b/docs/_build/html/cli/radioindice.html @@ -0,0 +1,240 @@ + + + + + + + + + radioindice — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

radioindice

+

radioindice (or ri) subcommand computes radiometric indices such as ndvi or ndwi.

+
$ rastertools radioindice --help
+usage: rastertools radioindice [-h] [-o OUTPUT] [-m] [-r ROI]
+                               [-i INDICES [INDICES ...]] [--ndvi] [--tndvi]
+                               [--rvi] [--pvi] [--savi] [--tsavi] [--msavi]
+                               [--msavi2] [--ipvi] [--evi] [--ndwi] [--ndwi2]
+                               [--mndwi] [--ndpi] [--ndti] [--ndbi] [--ri]
+                               [--bi] [--bi2] [-nd band1 band2]
+                               [-ws WINDOW_SIZE]
+                               inputs [inputs ...]
+
+Compute the requested radio indices on raster data.
+
+This command computes various vegetation and environmental indices on
+satellite or raster data based on the provided input images and options. The
+tool can compute specific indices, merge the results into one image, compute
+normalized differences between bands, and apply processing using a region of
+interest (ROI) and specified tile/window size.
+
+Arguments:
+
+    inputs TEXT
+
+    Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). You can
+    provide a single file with extension ".lst" (e.g. "radioindice.lst")
+    that lists the input files to process (one input file per line in .lst).
+
+Options:
+    -o, --output TEXT               Output directory to store results (by
+                                    default current directory)
+    -m, --merge                     Merge all indices in the same image (i.e.
+                                    one band per indice)
+    -r, --roi TEXT                  Region of interest in the input image
+                                    (vector)
+    -ws, --window_size INTEGER      Size of tiles to distribute processing,
+                                    default: 1024
+    -i, --indices TEXT              List of indices to compute. Possible indices
+                                    are: bi, bi2, evi, ipvi, mndwi, msavi,
+                                    msavi2, ndbi, ndpi, ndti, ndvi, ndwi, ndwi2,
+                                    pvi, ri, rvi, savi, tndvi, tsavi
+    --bi2                           Compute bi2 indice
+    --bi                            Compute bi indice
+    --ri                            Compute ri indice
+    --ndbi                          Compute ndbi indice
+    --ndti                          Compute ndti indice
+    --ndpi                          Compute ndpi indice
+    --mndwi                         Compute mndwi indice
+    --ndwi2                         Compute ndwi2 indice
+    --ndwi                          Compute ndwi indice
+    --evi                           Compute evi indice
+    --ipvi                          Compute ipvi indice
+    --msavi2                        Compute msavi2 indice
+    --msavi                         Compute msavi indice
+    --tsavi                         Compute tsavi indice
+    --savi                          Compute savi indice
+    --pvi                           Compute pvi indice
+    --rvi                           Compute rvi indice
+    --tndvi                         Compute tndvi indice
+    --ndvi                          Compute ndvi indice
+    -nd, --normalized_difference band1 band2
+                                    Compute the normalized difference of two
+                                    bands defineda s parameter of this option,
+                                    e.g. "-nd red nir" will compute (red-
+                                    nir)/(red+nir). See
+                                    eolab.rastertools.product.rastertype.
+                                    BandChannel for the list of
+                                    bands names. Several nd options can be set
+                                    to compute several normalized differences.
+    -h, --help                      Show this message and exit.
+
+If no indice option is explicitly set, NDVI, NDWI and NDWI2 are computed.
+
+
+
+

Warning

+

radioindice only accepts input files that match one of the configured raster types, either a built-in raster type +or a custom raster type defined with option -t of rastertools. See section “Raster types”.

+
+

Examples :

+

The first command computes the NDVI of a Sentinel-2 L2A product. The computation is performed on a region of interest defined +by a shapefile. The NDVI is then computed on a subset of the input product.

+

Let’s have a look of the Sentinel-2 L2A product in false color (Green, Red, NIR). The region of interest is highlighted with +a black line.

+../_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-grn.jpg +
$ rastertools radioindice -r "./COMMUNE_32001.shp" --ndvi ./SENTINEL2A_20180521-105702-711_L2A_T30TYP_D.zip
+
+
+

The generated NDVI image is:

+../_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi_cropped.jpg +

The second command computes two indices (NDVI and NDWI) of the same input image. No region of interest is configured.

+
$ rastertools radioindice -i ndvi ndwi -m ./SENTINEL2A_20180521-105702-711_L2A_T30TYP_D.zip
+
+
+

The generated image has two bands (because option -m is activated): first one is the ndvi, second one is the ndwi. If -m option +is not activated, two images would be generated, one image per indice.

+

Here is a capture of the first band (ndvi):

+../_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/cli/speed.html b/docs/_build/html/cli/speed.html new file mode 100644 index 00000000..473b7e91 --- /dev/null +++ b/docs/_build/html/cli/speed.html @@ -0,0 +1,189 @@ + + + + + + + + + speed — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

speed

+

speed (or sp) computes the time derivative of the radiometry of a series of raster products of the same type.

+
$ rastertools speed --help
+usage: rastertools speed [-h] [-b BANDS [BANDS ...]] [-a] [-o OUTPUT]
+                         inputs [inputs ...]
+
+Compute the speed of radiometric values for multiple raster images.
+
+This command calculates the speed of radiometric values for raster data,
+optionally processing specific bands or all bands from the input images. The
+results are saved to a specified output directory.
+
+Arguments:
+
+    inputs TEXT
+
+    Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). You can
+    provide a single file with extension ".lst" (e.g. "speed.lst") that
+    lists the input files to process (one input file per line in .lst).
+
+Options:
+    -b, --bands INTEGER  List of bands to process
+    -a, --all            Process all bands
+    -o, --output TEXT    Output directory to store results (by default current
+                         directory)
+    -h, --help           Show this message and exit.
+
+
+
+

Warning

+

At least two input rasters must be given. The rasters must match one of the configured raster types, +either a built-in raster type or a custom raster type defined with option -t of rastertools. +See section “Raster types”.

+
+

Example:

+
$ rastertools speed ./SENTINEL2A_20180521-105702-711_L2A_T30TYP_D-ndvi.zip ./SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif
+
+
+

This command generates an image with one band that represents \(\\frac{ndvi_2 - ndvi_1}{date_2 - data_1}\) where:

+
    +
  • index 1 corresponds to the first image in the command line: date_1=2018/05/21 10:57:02

  • +
  • index 2 corresponds to the second image in the command line: date_2=2018/10/23 10:51:07

  • +
+

Here is a capture of the output image:

+../_images/speed_ndvi.jpg +

Notice the presence of a nodata zone that comes from the SENTINEL2B product which has a cloud mask.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/cli/svf.html b/docs/_build/html/cli/svf.html new file mode 100644 index 00000000..6134e2b4 --- /dev/null +++ b/docs/_build/html/cli/svf.html @@ -0,0 +1,242 @@ + + + + + + + + + svf — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+

svf

+

svf computes the SVF of a Digital Height Model.

+

SVF stands for Sky View Factor. It is a geophysical parameter that measures the portion of the sky +visible from a certain point. The portion of the sky visible above the surface is especially relevant +in energy balance studies and computation of diffuse solar insolation.

+

Sky-view factor is defined as the proportion of visible sky (\(\Omega\)) above a certain +observation point as seen from a two-dimensional representation.

+

The light that falls from the sky onto a certain part of the surface is reduced by the obstacles +that form the horizon. These obstacles can be described in all directions by the vertical +elevation angle above the horizontal plane.

+

A good SVF approximation can therefore be performed with the estimate of this angle +in several directions. After the vertical elevation angle is determined in the chosen +number of directions n, the SVF is determined as a sum of all portions of the sky within +each direction: \(\sum \frac {\cos \gamma_i}{n}\), where \(\gamma_i\) is the +vertical angle of the horizon in the`direction i.

+

The angle \(\gamma\) is extracted from the Digital Elevation Model: +\(\tan \frac{Height}{Distance}\):

+
                    _____
+                  x|     |  ^
+              x    |     |  | Height (from Digital Elevation Model)
+         x   __    |     |  |
+____p_______|  |___|     |__v____________
+    <-------------->
+        Distance
+
+
+

Where p is the current pixel where the SVF is computed.

+

In a direction, the algorithm computes all angles and keeps the largest one. To avoid testing +too many points, the “radius” parameter defines the max distance of the pixel to test.

+
$ rastertools svf --help
+usage: rastertools svf [-h] --radius RADIUS --directions DIRECTIONS
+                       --resolution RESOLUTION [--altitude ALTITUDE]
+                       [-o OUTPUT] [-ws WINDOW_SIZE]
+                       [-p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}]
+                       inputs [inputs ...]
+
+Compute the Sky View Factor (SVF) of a Digital Height Model (DHM).
+
+The Sky View Factor (SVF) is a measure of the visibility of the sky from a
+point in a Digital Height Model (DHM). It is calculated by evaluating the
+horizontal elevation angle from a given point in multiple directions (as
+specified by the user), and is influenced by the topography and surrounding
+terrain features.
+
+Arguments:
+
+    inputs TEXT
+
+    Input file to process (i.e. geotiff corresponding to a Digital Height
+    Model). You can provide a single file with extension ".lst" (e.g.
+    "svf.lst") that lists the input files to process (one input file
+    per line in .lst)
+
+Options:
+    --radius INTEGER                Maximum distance (in pixels) around a point
+                                    to evaluate horizontal elevation angle
+                                    [required]
+    --directions INTEGER            Number of directions on which to compute the
+                                    horizon elevation angle  [required]
+    --resolution FLOAT              Pixel resolution in meter  [required]
+    --altitude INTEGER              Reference altitude to use for computing the
+                                    SVF. If this option is not specified, SVF is
+                                    computed for every point at the altitude of
+                                    the point
+    -o, --output TEXT               Output directory to store results (by
+                                    default current directory)
+    -ws, --window_size INTEGER      Size of tiles to distribute processing,
+                                    default: 1024
+    -p, --pad [none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap]
+                                    Pad to use around the image, default : edge(see
+                                    https://numpy.org/doc/stable/reference/generated/numpy.pad.html
+                                    for more information)
+    -h, --help                      Show this message and exit.
+
+
+
+

Warning

+

This command line does not accept all input raster products as other raster tools (radioindice, zonalstats). +It is mandatory to use a raster file (typically a geotif) in a format that can be read by rasterio: rasterio.open(xxx)).

+
+

Example:

+

Let’s take as input a Digital Height Model of Toulouse generated from a PLEIADES stereo (0.5m resolution):

+../_images/dsm.jpg +

The first command line computes the Sky View Factor using 16 directions and a radius of 50 pixels (25 meters). +The SVF is computed at the altitude of every point of the Digital Height Model, i.e. the SVF is computed on top +of buildings (for the highest building, SVF is thus 1).

+
$ rastertools svf --radius 50 --directions 16 --resolution 0.5 tests\tests_data\toulouse-mnh.tif
+
+
+

This command generates the following SVF:

+../_images/dsm-svf.jpg +

It is also possible to compute the SVF at a specified height, for instance on ground (0m altitude for a Digital Height Model).

+
$ rastertools svf --radius 50 --directions 16 --resolution 0.5 tests\tests_data\toulouse-mnh.tif
+
+
+

The SVF is the following:

+../_images/dsm-svf0.jpg +

As expected, the SVF at altitude 0m are equal to 0 for pixels inside buildings, and are the same as in the previous image +for pixels outside the buildings.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/cli/tiling.html b/docs/_build/html/cli/tiling.html new file mode 100644 index 00000000..85df37a7 --- /dev/null +++ b/docs/_build/html/cli/tiling.html @@ -0,0 +1,213 @@ + + + + + + + + + tiling — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

tiling

+

tiling (or ti) tiles an input raster following the geometries defined in a vector +file.

+
$ rastertools tiling --help
+usage: rastertools tiling [-h] -g GRID_FILE [--id_col ID_COLUMN]
+                          [--id ID [ID ...]] [-o OUTPUT] [-n OUTPUT_NAME]
+                          [-d SUBDIR_NAME]
+                          inputs [inputs ...]
+Generate tiles of an input raster image following the geometries defined by
+a given grid.
+
+The tiling command divides a raster image into smaller tiles based on a grid
+defined in a vector-based spatial data file. Each tile corresponds to a
+specific area within the grid, and tiles can be saved using a customizable
+naming convention and optionally placed in subdirectories based on their
+tile ID.
+
+Arguments:
+
+    inputs TEXT
+
+    Raster files to process. You can provide a single file with extension
+    ".lst" (e.g. "tiling.lst") that lists the input files to process (one
+    input file per line in .lst)
+
+Options:
+    -g, --grid TEXT    vector-based spatial data file containing the grid to use
+                       to generate the tiles  [required]
+    --id_col TEXT      Name of the column in the grid file used to number the
+                       tiles. When ids are defined, this argument is requiredto
+                       identify which column corresponds to the define ids
+    --id INTEGER       Tiles ids of the grid to export as new tile, default all
+    -o, --output TEXT  Output directory to store results (by default current
+                       directory)
+    -n, --name TEXT    Basename for the output raster tiles,
+                       default:"{}_tile{}". The basename must be defined as a
+                       formatted string where tile index is at position 1 and
+                       original filename is at position 0. For instance,
+                       tile{1}.tif will generate the filename tile75.tif for the
+                       tile id = 75
+    -d, --dir TEXT     When each tile must be generated in a
+                       different subdirectory, it defines the naming convention
+                       for the subdirectory. It is a formatted string with one
+                       positional parameter corresponding to the tile index. For
+                       instance, tile{} will generate the subdirectory name
+                       tile75/for the tile id = 75. By default, subdirectory is
+                       not defined and output files will be generated directly
+                       in the output directory
+    -h, --help         Show this message and exit.
+
+
+

In the next examples, we will be working on a grid of 4 cells (ids 1, 2, 3 and 4): grid.geojson and the image: image.tif. +The grid and the image only overlap on the cells 1 and 2.

+
    +
  • example 1:

    +
    rastertools -v ti -g grid.geojson image.tif
    +
    +
    +
  • +
+

This command will return 2 files in the current directory named image_tile1.tif et image_tile2.tif +corresponding to the cells 1 and 2. The command will return an error for cells 3 and 4 because they do not overlap the raster image.

+
    +
  • exemple 2:

    +
    rastertools -v ti -g grid.geojson image.tif --id 2 4 --name output_{1}.tif
    +
    +
    +
  • +
+

This command will return 1 file in the current directory named output_2.tif and will return an error for cell 4 because this cell +does not overlap the raster image.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/cli/timeseries.html b/docs/_build/html/cli/timeseries.html new file mode 100644 index 00000000..5cbb9d2a --- /dev/null +++ b/docs/_build/html/cli/timeseries.html @@ -0,0 +1,203 @@ + + + + + + + + + timeseries — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

timeseries

+

timeseries (or ts) generates a series of rasters at given dates from a set of input rasters +of the same type. When input rasters contain gaps (due for instance to clouds), gaps are filled in +the generated rasters.

+

To generate the timeseries, this tool uses linear interpolation of every pixels in the input rasters.

+

If some of the requested dates are before (resp. after) the dates of the input rasters, the +corresponding generated raster will contain the raster values of the first (resp. last) input raster +and may thus contain the same gaps as the input raster.

+
$ rastertools timeseries --help
+
+usage: rastertools timeseries [-h] [-b BANDS [BANDS ...]] [-a] [-o OUTPUT]
+                              [-s START_DATE] [-e END_DATE] [-p TIME_PERIOD]
+                              [-ws WINDOW_SIZE]
+                              inputs [inputs ...]
+
+Generate a timeseries of images (without gaps) from a set of input images.
+Data not present in the input images (e.g., missing images for specific
+dates or masked data) are interpolated (with linear interpolation) so that
+all gaps in the timeseries are filled.
+
+This command is useful for generating continuous timeseries data, even when
+some input images are missing or contain masked values.
+
+Arguments:
+
+    inputs TEXT
+
+        Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). You can
+        provide a single file with extension ".lst" (e.g. "speed.lst") that
+        lists the input files to process (one input file per line in .lst).
+
+Options:
+    -b, --bands LIST            List of bands to process
+    -a, --all                   Process all bands
+    -o, --output TEXT           Output directory to store results (by default
+                                current directory)
+    -s, --start_date TEXT       Start date of the timeseries to generate in the
+                                following format: yyyy-MM-dd
+    -e, --end_date TEXT         End date of the timeseries to generate in the
+                                following format: yyyy-MM-dd
+    -p, --time_period INTEGER   Time period (number of days) between two
+                                consecutive images in the timeseries to generate
+                                e.g. 10 = generate one image every 10 days
+    -ws, --window_size INTEGER  Size of tiles to distribute processing, default:
+                                1024
+    -h, --help                  Show this message and exit.
+
+
+
+

Warning

+

At least two input rasters must be given. The rasters must match one of the configured raster types, +either a built-in raster type or a custom raster type defined with option -t of rastertools. +See section “Raster types”. The raster type must define where to get the date of the product +in the filename.

+
+

Example:

+
$ rastertools timeseries ./SENTINEL2A_20180521-105702-711_L2A_T30TYP_D-ndvi.zip ./SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif -s 2018-05-21 -e 2018-10-25 -p 10 -ws 512
+
+
+

This command generates rasters from 2018-05-21 until 2018-10-25 with a timeperiod between +two consecutive images of 10 days (2018-05-21, 2018-05-31, 2018-06-10, …).

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/cli/zonalstats.html b/docs/_build/html/cli/zonalstats.html new file mode 100644 index 00000000..1ff80af0 --- /dev/null +++ b/docs/_build/html/cli/zonalstats.html @@ -0,0 +1,271 @@ + + + + + + + + + zonalstats — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

zonalstats

+

zonalstats (or zs) computes zonal statistics of an input raster. The zones are defined by +a vector file (shapefile, geojson, etc.). If no vector file is provided, the statistics are +computed on the whole image.

+

Statistics inside a geometry can be computed for different categories also defined by a vector +file. For instance, is is possible to compute the average height of buildings and vegetation of +cities using:

+
    +
  • a Digital Height Model (input raster file)

  • +
  • a shapefile with the boundaries of cities (-g argument)

  • +
  • a shapefile with the buildings / vegetation classification (–category_file)

  • +
+
$ rastertools zonalstats --help
+usage: rastertools zonalstats [-h] [-o OUTPUT] [-f OUTPUT_FORMAT]
+                              [-g GEOMETRIES] [-w] [--stats STATS [STATS ...]]
+                              [--categorical]
+                              [--valid_threshold VALID_THRESHOLD] [--area]
+                              [--prefix PREFIX] [-b BANDS [BANDS ...]] [-a]
+                              [--sigma SIGMA] [-c CHARTFILE] [-d]
+                              [-gi GEOM_INDEX] [--category_file CATEGORY_FILE]
+                              [--category_index CATEGORY_INDEX]
+                              [--category_names CATEGORY_NAMES]
+                              inputs [inputs ...]
+
+Compute zonal statistics of a raster image.
+
+Available statistics are: min, max, range, mean, std, percentile_x (x in [0,
+100]), median, mad, count, valid, nodata, sum, majority, minority, unique.
+
+By default, only the first band is computed unless specified otherwise.
+
+Arguments:
+
+  inputs TEXT
+
+  Raster files to process. You can provide a single filewith extension
+  ".lst" (e.g. "zonalstats.lst") that lists the input files to process
+  (one input file per line in .lst)
+
+Options:
+  -o, --output TEXT           Output directory to store results (by default
+                              current directory)
+  -f, --format TEXT           Output format of the results when input
+                              geometries are provided (by default ESRI
+                              Shapefile). Possible values are ESRI Shapefile,
+                              GeoJSON, CSV, GPKG, GML
+  -g, --geometry TEXT         List of geometries where to compute statistics
+                              (vector like a shapefile or geojson)
+  -w, --within                When activated, statistics are computed for the
+                              geometries that are within the raster shape. The
+                              default behaviour otherwise is to compute
+                              statistics for all geometries that intersect the
+                              raster shape.
+  --stats TEXT                List of stats to compute. Possible stats are:
+                              min max range mean std percentile_x (x in [0,
+                              100]) median mad count valid nodata sum majority
+                              minority unique
+  --categorical               If the input raster is categorical (i.e. raster
+                              values represent discrete classes) compute the
+                              counts of every unique pixel values.
+  --valid_threshold FLOAT     Minimum percentage of valid pixels in a shape to
+                              compute its statistics.
+  --area                      Whether to multiply all stats by the area of a
+                              cell of the input raster.
+  --prefix TEXT               Add a prefix to the keys (default: None). One
+                              prefix per band (e.g. 'band1 band2')
+  -b, --bands INTEGER         List of bands to process
+  -a, --all                   Process all bands
+  --sigma TEXT                Distance to the mean value (in sigma) in order
+                              to produce a raster that highlights outliers.
+  -c, --chart TEXT            Generate a chart per stat and per geometry
+                              (x=timestamp of the input products / y=stat
+                              value) and store it in the file defined by this
+                              argument
+  -d, --display               Display the chart
+  -gi, --geometry-index TEXT  Name of the geometry index used for the chart
+                              (default='ID')
+  --category_file TEXT        File (raster or geometries) containing discrete
+                              classes classifying the ROI.
+  --category_index TEXT       Column name identifying categories in
+                              categroy_file (only if file format is
+                              geometries)
+  --category_names TEXT       JSON files containing a dict with classes index
+                              as keys and names to display classes as values.
+  -h, --help                  Show this message and exit.
+
+
+

When -g option is set with a valid geometries file, zonalstats generate a new vector file with the following metadata:

+
    +
  • [prefix].name : name of the band (if available in the input raster)

  • +
  • [prefix].date : date of the input raster (if the raster has one of the configured raster types, either a built-in raster +type or an additional custom raster type)

  • +
  • [prefix].[stat] : values of the statistics

  • +
  • [prefix].[pixel] : count of pixels having value = [pixel] when the categorical option is activated

  • +
  • [prefix].[category][stat] : values of the statistics for the category [category] when the category_names option is activated.

  • +
+

With :

+
    +
  • [prefix] : prefix defined in the command line. If not set in the command line: b[band_number]

  • +
  • [stat] : name of the statistics, e.g. mean, std

  • +
+

If no vector file is set in the command line, the statistics are stored in a new vector file that contains a single entry +whose geometry is the raster shape (without the zones of nodata).

+

Examples:

+

The following examples use an input raster file generated by radioindice. This is an NDVI of a SENTINEL2 L2A THEIA image that +covers most of the cities we are interested in.

+../_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-geoms.jpg +

The first command generates statistics of ndvi values for several cities

+
$ rastertools zs -f GeoJSON -g COMMUNE_32.geojson --stats min max mean std SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif
+
+
+

This generates a new vector file that contains for each entity the stats values.

+../_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats.jpg +

Notice that some cities are partially covered by the input raster and their statistics are thus probably not fully relevant. +To disable the computation for these cities, use option –within.

+
$ rastertools zs -f GeoJSON -g COMMUNE_32.geojson --within --stats min max mean std SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif
+
+
+

The new vector file is now:

+../_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats2.jpg +

Let’s use another raster file that corresponds to a land cover map named OSO. In this map, every pixel has +a value that represents its class (for instance: 1=dense urban area).

+

The following command line enables to count the pixels of every classes:

+
$ rastertools zs -f GeoJSON --categorical OCS_2017_CESBIO.tif
+
+
+

The generated vector file contains one geometry (a green square that corresponds to the shape of the +input raster) with the number of pixels for each category:

+../_images/oso-stats.jpg +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html new file mode 100644 index 00000000..7c45481c --- /dev/null +++ b/docs/_build/html/genindex.html @@ -0,0 +1,1796 @@ + + + + + + + + Index — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ _ + | A + | B + | C + | D + | E + | F + | G + | H + | I + | K + | L + | M + | N + | O + | P + | R + | S + | T + | V + | W + | Z + +
+

_

+ + +
+ +

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

K

+ + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + +
+ +

P

+ + + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

V

+ + +
+ +

W

+ + + +
+ +

Z

+ + +
+ + + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/index.html b/docs/_build/html/index.html new file mode 100644 index 00000000..6aad02ed --- /dev/null +++ b/docs/_build/html/index.html @@ -0,0 +1,193 @@ + + + + + + + + + Rastertools — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Rastertools

+

This project consists in a command line named rastertools that enables to run several processing on raster files, typically +Sentinel2 raster images:

+
    +
  • compute radiometric indices (e.g. ndvi).

  • +
  • compute the time derivative of the radiometry of two raster images.

  • +
  • generate a timeseries of rasters from a set of input rasters; a linear interpolation and a gap +filling are performed.

  • +
  • compute statistics such as min, max, mean, etc. Statistics can be computed on the whole raster image +or can be computed on several geometries defined with a vector file - e.g. geojson or shapefile.

  • +
  • split input image raster in tiles following the geometries defined in a vector file.

  • +
  • apply a filter (median, local sum, local mean, adaptive gaussian)

  • +
  • compute the Sky View Factor and the Hillshades of input rasters that represent a Digital Surface/Elevation/Height Model.

  • +
+

The aim of rastertools is also to make the use of the following raster products transparent:

+ +

rastertools accept any of this raster product as input files. No need to unpack the archive to get +the raster files containing the different bands, to merge the bands, extract the region of interest and +so on: rastertools does it.

+

rastertools also accepts additional custom raster types. The new raster types shall be defined in a +JSON file and provided as an argument of the rastertools CLI (cf. Usage)

+

rastertools has a public API that enables to activate all the tools and extend their capabilities (e.g. +add a new radiometric indice).

+
+

Contents

+

Install

+ +
+
+

Usage

+ +
+
+

Development

+ +
+
+

About

+ +
+
+
+
+

Indices and tables

+ +
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/install.html b/docs/_build/html/install.html new file mode 100644 index 00000000..c26d5b88 --- /dev/null +++ b/docs/_build/html/install.html @@ -0,0 +1,162 @@ + + + + + + + + + Conda — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Conda

+

First, create a conda environment via:

+
$ conda env create -f environment.yml
+$ conda env update -f env_update.yml
+
+
+

The following libraries will be installed in the conda environment named rastertools :

+
    +
  • pyscaffold

  • +
  • geopandas

  • +
  • scipy

  • +
  • gdal

  • +
  • rasterio

  • +
  • matplotlib

  • +
  • tqdm

  • +
+

Secondly, run commands:

+
$ conda activate rastertools
+$ pip install -e .
+
+
+

rastertools will be installed in the conda environment. Then, the CLI rastertools can be used and the API eolab.rastertools +can be called in a python script.

+
+
+

Docker et Singularity

+

rastertools can be used in a Docker container that is built from the Dockerfile available in the root directory of the project. +To create the docker image, run:

+
$ docker build -t rastertools:latest .
+
+
+

To create the singularity image from the docker image, run:

+
$ singularity build rastertools_latest.sif docker://rastertools:latest
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/license.html b/docs/_build/html/license.html new file mode 100644 index 00000000..59138881 --- /dev/null +++ b/docs/_build/html/license.html @@ -0,0 +1,332 @@ + + + + + + + + + License — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

License

+

+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [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.
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/objects.inv b/docs/_build/html/objects.inv new file mode 100644 index 00000000..1100da70 Binary files /dev/null and b/docs/_build/html/objects.inv differ diff --git a/docs/_build/html/private_api.html b/docs/_build/html/private_api.html new file mode 100644 index 00000000..af20c23a --- /dev/null +++ b/docs/_build/html/private_api.html @@ -0,0 +1,147 @@ + + + + + + + + + Private API — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Private API

+

This section describes the private API of rastertools.

+ + + + + + + + + + + + +

cli

Module that defines the subcommands of rastertools.

processing

This module contains the rastertools processing algorithms.

product

This module defines the raster product definition.

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/py-modindex.html b/docs/_build/html/py-modindex.html new file mode 100644 index 00000000..d2185bf3 --- /dev/null +++ b/docs/_build/html/py-modindex.html @@ -0,0 +1,299 @@ + + + + + + + + Python Module Index — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ e +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ e
+ eolab +
    + eolab.rastertools +
    + eolab.rastertools.cli +
    + eolab.rastertools.cli.filtering +
    + eolab.rastertools.cli.hillshade +
    + eolab.rastertools.cli.radioindice +
    + eolab.rastertools.cli.speed +
    + eolab.rastertools.cli.svf +
    + eolab.rastertools.cli.tiling +
    + eolab.rastertools.cli.timeseries +
    + eolab.rastertools.cli.utils_cli +
    + eolab.rastertools.cli.zonalstats +
    + eolab.rastertools.filtering +
    + eolab.rastertools.hillshade +
    + eolab.rastertools.main +
    + eolab.rastertools.processing +
    + eolab.rastertools.processing.algo +
    + eolab.rastertools.processing.rasterproc +
    + eolab.rastertools.processing.sliding +
    + eolab.rastertools.processing.stats +
    + eolab.rastertools.processing.vector +
    + eolab.rastertools.product +
    + eolab.rastertools.product.rasterproduct +
    + eolab.rastertools.product.rastertype +
    + eolab.rastertools.product.vrt +
    + eolab.rastertools.radioindice +
    + eolab.rastertools.rastertools +
    + eolab.rastertools.speed +
    + eolab.rastertools.svf +
    + eolab.rastertools.tiling +
    + eolab.rastertools.timeseries +
    + eolab.rastertools.utils +
    + eolab.rastertools.zonalstats +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/rasterproduct.html b/docs/_build/html/rasterproduct.html new file mode 100644 index 00000000..5263d2fe --- /dev/null +++ b/docs/_build/html/rasterproduct.html @@ -0,0 +1,213 @@ + + + + + + + + + Raster types — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Raster types

+

Some of the rastertools can only handle input raster files of a recognized raster type.

+

This concerns radioindice, speed and also zonalstats when this latter is asked to plot the statistics. +In these 3 cases, the tool needs to know the available raster bands (radioindice) or to extract the +timestamp of the raster product (speed, zonalstats): the tools use the description of the raster type +to retrieve this information.

+

The other tools are more flexible and also accept input rasters of unknown type provided that the input raster +can be read by rasterio.

+
+

Note

+

Tools like radioindice and zonalstats generate output filenames that follow the naming convention defined +in the rastertype of the input raster products. For instance, an NDVI generated from a Sentinel-2 L1C product +will be named so that the NDVI output file will be recognized as a Sentinel-2 L1C product. The timestamp of the +NDVI can thus be extracted by speed or zonalstats if they are chained after radioindice.

+
+
+

Built-in raster types

+

rastertools has several built-in raster types:

+ + ++++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Built-in raster types

Name

Naming convention

Pattern to identify raster bands

Date format

Mask function

Nodata

Sentinel-2 L2A THEIA

^SENTINEL2._(?P<date>[0-9-]{15}).*_L2A_T(?P<tile>.*)_.*$

^SENTINEL2.*_(?P<bands>{}).(tif|TIF|vrt|VRT)$

%Y%m%d-%H%M%S

eolab.rastertools.product.vrt.s2_maja_mask

-10000

Sentinel-2 L3A THEIA

^SENTINEL2X_(?P<date>[0-9-]{15}).*_L3A_T(?P<tile>.*)_.*$

^SENTINEL2.*_(?P<bands>{}).(tif|TIF|vrt|VRT)$

%Y%m%d-%H%M%S

No mask

-10000

Sentinel-2 L1C PEPS

^S2._MSIL1C_(?P<date>[0-9T]*)_Nd*_R(?P<relorbit>d*)_T(?P<tile>.*)_.*$

^.*_[0-9T]*_(?P<bands>{}).jp2$

%Y%m%dT%H%M%S

No mask

0

Sentinel-2 L2A PEPS

^S2._MSIL2A_(?P<date>[0-9T]*)_Nd*_R(?P<relorbit>d*)_T(?P<tile>.*)_.*$

^.*_[0-9T]*_(?P<bands>{}).jp2$

%Y%m%dT%H%M%S

No mask

0

SPOT6/7

^SPOT._[0-9]{4}_.*_GEOSUD_MS_.*$

^.*IMG_SPOT._MS_.*.(tif|TIF)$

No timestamp in product name

No mask

-10000

+
+
+

Add custom raster types

+

rastertools CLI has a special argument -t that allows to define custom raster types. This argument must +be set with the path to a JSON file that contains the new raster types definitions.

+

The structure of the JSON file is described in eolab.rastertools.add_custom_rastertypes

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_build/html/search.html b/docs/_build/html/search.html new file mode 100644 index 00000000..2e57ddea --- /dev/null +++ b/docs/_build/html/search.html @@ -0,0 +1,139 @@ + + + + + + + + Search — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+ +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js new file mode 100644 index 00000000..5035d8c5 --- /dev/null +++ b/docs/_build/html/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["api/eolab", "api/eolab.rastertools", "api/eolab.rastertools.Filtering", "api/eolab.rastertools.Filtering.__init__", "api/eolab.rastertools.Filtering.adaptive_gaussian", "api/eolab.rastertools.Filtering.bands", "api/eolab.rastertools.Filtering.get_default_filters", "api/eolab.rastertools.Filtering.keep_vrt", "api/eolab.rastertools.Filtering.local_mean", "api/eolab.rastertools.Filtering.local_sum", "api/eolab.rastertools.Filtering.median_filter", "api/eolab.rastertools.Filtering.outputdir", "api/eolab.rastertools.Filtering.pad_mode", "api/eolab.rastertools.Filtering.postprocess_files", "api/eolab.rastertools.Filtering.process_file", "api/eolab.rastertools.Filtering.process_files", "api/eolab.rastertools.Filtering.raster_filter", "api/eolab.rastertools.Filtering.vrt_dir", "api/eolab.rastertools.Filtering.window_size", "api/eolab.rastertools.Filtering.with_filter_configuration", "api/eolab.rastertools.Filtering.with_output", "api/eolab.rastertools.Filtering.with_vrt_stored", "api/eolab.rastertools.Filtering.with_windows", "api/eolab.rastertools.Hillshade", "api/eolab.rastertools.Hillshade.__init__", "api/eolab.rastertools.Hillshade.azimuth", "api/eolab.rastertools.Hillshade.elevation", "api/eolab.rastertools.Hillshade.keep_vrt", "api/eolab.rastertools.Hillshade.outputdir", "api/eolab.rastertools.Hillshade.pad_mode", "api/eolab.rastertools.Hillshade.postprocess_files", "api/eolab.rastertools.Hillshade.process_file", "api/eolab.rastertools.Hillshade.process_files", "api/eolab.rastertools.Hillshade.radius", "api/eolab.rastertools.Hillshade.resolution", "api/eolab.rastertools.Hillshade.vrt_dir", "api/eolab.rastertools.Hillshade.window_size", "api/eolab.rastertools.Hillshade.with_output", "api/eolab.rastertools.Hillshade.with_vrt_stored", "api/eolab.rastertools.Hillshade.with_windows", "api/eolab.rastertools.Radioindice", "api/eolab.rastertools.Radioindice.__init__", "api/eolab.rastertools.Radioindice.bi", "api/eolab.rastertools.Radioindice.bi2", "api/eolab.rastertools.Radioindice.evi", "api/eolab.rastertools.Radioindice.get_default_indices", "api/eolab.rastertools.Radioindice.indices", "api/eolab.rastertools.Radioindice.ipvi", "api/eolab.rastertools.Radioindice.keep_vrt", "api/eolab.rastertools.Radioindice.merge", "api/eolab.rastertools.Radioindice.mndwi", "api/eolab.rastertools.Radioindice.msavi", "api/eolab.rastertools.Radioindice.msavi2", "api/eolab.rastertools.Radioindice.ndbi", "api/eolab.rastertools.Radioindice.ndpi", "api/eolab.rastertools.Radioindice.ndti", "api/eolab.rastertools.Radioindice.ndvi", "api/eolab.rastertools.Radioindice.ndwi", "api/eolab.rastertools.Radioindice.ndwi2", "api/eolab.rastertools.Radioindice.outputdir", "api/eolab.rastertools.Radioindice.pad_mode", "api/eolab.rastertools.Radioindice.postprocess_files", "api/eolab.rastertools.Radioindice.process_file", "api/eolab.rastertools.Radioindice.process_files", "api/eolab.rastertools.Radioindice.pvi", "api/eolab.rastertools.Radioindice.ri", "api/eolab.rastertools.Radioindice.roi", "api/eolab.rastertools.Radioindice.rvi", "api/eolab.rastertools.Radioindice.savi", "api/eolab.rastertools.Radioindice.tndvi", "api/eolab.rastertools.Radioindice.tsavi", "api/eolab.rastertools.Radioindice.vrt_dir", "api/eolab.rastertools.Radioindice.window_size", "api/eolab.rastertools.Radioindice.with_output", "api/eolab.rastertools.Radioindice.with_roi", "api/eolab.rastertools.Radioindice.with_vrt_stored", "api/eolab.rastertools.Radioindice.with_windows", "api/eolab.rastertools.Rastertool", "api/eolab.rastertools.Rastertool.__init__", "api/eolab.rastertools.Rastertool.keep_vrt", "api/eolab.rastertools.Rastertool.outputdir", "api/eolab.rastertools.Rastertool.postprocess_files", "api/eolab.rastertools.Rastertool.process_file", "api/eolab.rastertools.Rastertool.process_files", "api/eolab.rastertools.Rastertool.vrt_dir", "api/eolab.rastertools.Rastertool.with_output", "api/eolab.rastertools.Rastertool.with_vrt_stored", "api/eolab.rastertools.RastertoolConfigurationException", "api/eolab.rastertools.SVF", "api/eolab.rastertools.SVF.__init__", "api/eolab.rastertools.SVF.altitude", "api/eolab.rastertools.SVF.keep_vrt", "api/eolab.rastertools.SVF.nb_directions", "api/eolab.rastertools.SVF.outputdir", "api/eolab.rastertools.SVF.pad_mode", "api/eolab.rastertools.SVF.postprocess_files", "api/eolab.rastertools.SVF.process_file", "api/eolab.rastertools.SVF.process_files", "api/eolab.rastertools.SVF.radius", "api/eolab.rastertools.SVF.resolution", "api/eolab.rastertools.SVF.vrt_dir", "api/eolab.rastertools.SVF.window_size", "api/eolab.rastertools.SVF.with_altitude", "api/eolab.rastertools.SVF.with_output", "api/eolab.rastertools.SVF.with_vrt_stored", "api/eolab.rastertools.SVF.with_windows", "api/eolab.rastertools.Speed", "api/eolab.rastertools.Speed.__init__", "api/eolab.rastertools.Speed.bands", "api/eolab.rastertools.Speed.keep_vrt", "api/eolab.rastertools.Speed.outputdir", "api/eolab.rastertools.Speed.postprocess_files", "api/eolab.rastertools.Speed.process_file", "api/eolab.rastertools.Speed.process_files", "api/eolab.rastertools.Speed.vrt_dir", "api/eolab.rastertools.Speed.with_output", "api/eolab.rastertools.Speed.with_vrt_stored", "api/eolab.rastertools.Tiling", "api/eolab.rastertools.Tiling.__init__", "api/eolab.rastertools.Tiling.grid", "api/eolab.rastertools.Tiling.keep_vrt", "api/eolab.rastertools.Tiling.output_basename", "api/eolab.rastertools.Tiling.output_subdir", "api/eolab.rastertools.Tiling.outputdir", "api/eolab.rastertools.Tiling.postprocess_files", "api/eolab.rastertools.Tiling.process_file", "api/eolab.rastertools.Tiling.process_files", "api/eolab.rastertools.Tiling.vrt_dir", "api/eolab.rastertools.Tiling.with_id_column", "api/eolab.rastertools.Tiling.with_output", "api/eolab.rastertools.Tiling.with_vrt_stored", "api/eolab.rastertools.Timeseries", "api/eolab.rastertools.Timeseries.__init__", "api/eolab.rastertools.Timeseries.bands", "api/eolab.rastertools.Timeseries.end_date", "api/eolab.rastertools.Timeseries.keep_vrt", "api/eolab.rastertools.Timeseries.outputdir", "api/eolab.rastertools.Timeseries.pad_mode", "api/eolab.rastertools.Timeseries.period", "api/eolab.rastertools.Timeseries.postprocess_files", "api/eolab.rastertools.Timeseries.process_file", "api/eolab.rastertools.Timeseries.process_files", "api/eolab.rastertools.Timeseries.start_date", "api/eolab.rastertools.Timeseries.vrt_dir", "api/eolab.rastertools.Timeseries.window_size", "api/eolab.rastertools.Timeseries.with_output", "api/eolab.rastertools.Timeseries.with_vrt_stored", "api/eolab.rastertools.Timeseries.with_windows", "api/eolab.rastertools.Windowable", "api/eolab.rastertools.Windowable.__init__", "api/eolab.rastertools.Windowable.pad_mode", "api/eolab.rastertools.Windowable.window_size", "api/eolab.rastertools.Windowable.with_windows", "api/eolab.rastertools.Zonalstats", "api/eolab.rastertools.Zonalstats.__init__", "api/eolab.rastertools.Zonalstats.area", "api/eolab.rastertools.Zonalstats.bands", "api/eolab.rastertools.Zonalstats.categorical", "api/eolab.rastertools.Zonalstats.category_file", "api/eolab.rastertools.Zonalstats.category_file_type", "api/eolab.rastertools.Zonalstats.category_index", "api/eolab.rastertools.Zonalstats.category_labels", "api/eolab.rastertools.Zonalstats.chart_file", "api/eolab.rastertools.Zonalstats.compute_stats", "api/eolab.rastertools.Zonalstats.display_chart", "api/eolab.rastertools.Zonalstats.generated_stats", "api/eolab.rastertools.Zonalstats.generated_stats_dates", "api/eolab.rastertools.Zonalstats.generated_stats_per_date", "api/eolab.rastertools.Zonalstats.geometries", "api/eolab.rastertools.Zonalstats.geometry_index", "api/eolab.rastertools.Zonalstats.keep_vrt", "api/eolab.rastertools.Zonalstats.output_format", "api/eolab.rastertools.Zonalstats.outputdir", "api/eolab.rastertools.Zonalstats.postprocess_files", "api/eolab.rastertools.Zonalstats.prefix", "api/eolab.rastertools.Zonalstats.process_file", "api/eolab.rastertools.Zonalstats.process_files", "api/eolab.rastertools.Zonalstats.sigma", "api/eolab.rastertools.Zonalstats.stats", "api/eolab.rastertools.Zonalstats.supported_output_formats", "api/eolab.rastertools.Zonalstats.valid_stats", "api/eolab.rastertools.Zonalstats.valid_threshold", "api/eolab.rastertools.Zonalstats.vrt_dir", "api/eolab.rastertools.Zonalstats.with_chart", "api/eolab.rastertools.Zonalstats.with_geometries", "api/eolab.rastertools.Zonalstats.with_outliers", "api/eolab.rastertools.Zonalstats.with_output", "api/eolab.rastertools.Zonalstats.with_per_category", "api/eolab.rastertools.Zonalstats.with_vrt_stored", "api/eolab.rastertools.Zonalstats.within", "api/eolab.rastertools.cli", "api/eolab.rastertools.cli.filtering", "api/eolab.rastertools.cli.filtering.create_filter", "api/eolab.rastertools.cli.filtering.create_filtering", "api/eolab.rastertools.cli.filtering.filter_options", "api/eolab.rastertools.cli.hillshade", "api/eolab.rastertools.cli.radioindice", "api/eolab.rastertools.cli.radioindice.indices_opt", "api/eolab.rastertools.cli.speed", "api/eolab.rastertools.cli.svf", "api/eolab.rastertools.cli.tiling", "api/eolab.rastertools.cli.timeseries", "api/eolab.rastertools.cli.utils_cli", "api/eolab.rastertools.cli.utils_cli.apply_process", "api/eolab.rastertools.cli.with_bands_arguments", "api/eolab.rastertools.cli.with_outputdir_arguments", "api/eolab.rastertools.cli.with_window_arguments", "api/eolab.rastertools.cli.zonalstats", "api/eolab.rastertools.processing", "api/eolab.rastertools.processing.algo", "api/eolab.rastertools.processing.algo.adaptive_gaussian", "api/eolab.rastertools.processing.algo.brightness_index", "api/eolab.rastertools.processing.algo.brightness_index2", "api/eolab.rastertools.processing.algo.evi", "api/eolab.rastertools.processing.algo.hillshade", "api/eolab.rastertools.processing.algo.interpolated_timeseries", "api/eolab.rastertools.processing.algo.ipvi", "api/eolab.rastertools.processing.algo.local_mean", "api/eolab.rastertools.processing.algo.local_sum", "api/eolab.rastertools.processing.algo.median", "api/eolab.rastertools.processing.algo.msavi", "api/eolab.rastertools.processing.algo.msavi2", "api/eolab.rastertools.processing.algo.normalized_difference", "api/eolab.rastertools.processing.algo.pvi", "api/eolab.rastertools.processing.algo.redness_index", "api/eolab.rastertools.processing.algo.rvi", "api/eolab.rastertools.processing.algo.savi", "api/eolab.rastertools.processing.algo.speed", "api/eolab.rastertools.processing.algo.svf", "api/eolab.rastertools.processing.algo.tndvi", "api/eolab.rastertools.processing.algo.tsavi", "api/eolab.rastertools.processing.rasterproc", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation", "api/eolab.rastertools.processing.rasterproc.RasterFilter", "api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__", "api/eolab.rastertools.processing.rasterproc.RasterFilter.algo", "api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases", "api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments", "api/eolab.rastertools.processing.rasterproc.RasterFilter.compress", "api/eolab.rastertools.processing.rasterproc.RasterFilter.compute", "api/eolab.rastertools.processing.rasterproc.RasterFilter.configure", "api/eolab.rastertools.processing.rasterproc.RasterFilter.description", "api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype", "api/eolab.rastertools.processing.rasterproc.RasterFilter.help", "api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype", "api/eolab.rastertools.processing.rasterproc.RasterFilter.name", "api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits", "api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata", "api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo", "api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments", "api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation", "api/eolab.rastertools.processing.rasterproc.RasterProcessing", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.description", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.help", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.name", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation", "api/eolab.rastertools.processing.sliding", "api/eolab.rastertools.processing.sliding.compute_sliding", "api/eolab.rastertools.processing.stats", "api/eolab.rastertools.processing.stats.compute_zonal_stats", "api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category", "api/eolab.rastertools.processing.stats.extract_zonal_outliers", "api/eolab.rastertools.processing.stats.plot_stats", "api/eolab.rastertools.processing.vector", "api/eolab.rastertools.processing.vector.clip", "api/eolab.rastertools.processing.vector.crop", "api/eolab.rastertools.processing.vector.dissolve", "api/eolab.rastertools.processing.vector.filter", "api/eolab.rastertools.processing.vector.filter_dissolve", "api/eolab.rastertools.processing.vector.get_raster_shape", "api/eolab.rastertools.processing.vector.rasterize", "api/eolab.rastertools.processing.vector.reproject", "api/eolab.rastertools.processing.vector.vectorize", "api/eolab.rastertools.product", "api/eolab.rastertools.product.rasterproduct", "api/eolab.rastertools.product.rasterproduct.RasterProduct", "api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__", "api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files", "api/eolab.rastertools.product.rasterproduct.RasterProduct.channels", "api/eolab.rastertools.product.rasterproduct.RasterProduct.file", "api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts", "api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date", "api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string", "api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster", "api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit", "api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite", "api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile", "api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive", "api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files", "api/eolab.rastertools.product.rasterproduct.RasterProduct.open", "api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype", "api/eolab.rastertools.product.rastertype", "api/eolab.rastertools.product.rastertype.Band", "api/eolab.rastertools.product.rastertype.Band.__init__", "api/eolab.rastertools.product.rastertype.Band.description", "api/eolab.rastertools.product.rastertype.Band.identifier", "api/eolab.rastertools.product.rastertype.BandChannel", "api/eolab.rastertools.product.rastertype.BandChannel.blue", "api/eolab.rastertools.product.rastertype.BandChannel.blue_60m", "api/eolab.rastertools.product.rastertype.BandChannel.green", "api/eolab.rastertools.product.rastertype.BandChannel.mir", "api/eolab.rastertools.product.rastertype.BandChannel.mir_60m", "api/eolab.rastertools.product.rastertype.BandChannel.nir", "api/eolab.rastertools.product.rastertype.BandChannel.nir_60m", "api/eolab.rastertools.product.rastertype.BandChannel.red", "api/eolab.rastertools.product.rastertype.BandChannel.red_edge1", "api/eolab.rastertools.product.rastertype.BandChannel.red_edge2", "api/eolab.rastertools.product.rastertype.BandChannel.red_edge3", "api/eolab.rastertools.product.rastertype.BandChannel.red_edge4", "api/eolab.rastertools.product.rastertype.BandChannel.swir", "api/eolab.rastertools.product.rastertype.RasterType", "api/eolab.rastertools.product.rastertype.RasterType.__init__", "api/eolab.rastertools.product.rastertype.RasterType.accept", "api/eolab.rastertools.product.rastertype.RasterType.add", "api/eolab.rastertools.product.rastertype.RasterType.bands_pattern", "api/eolab.rastertools.product.rastertype.RasterType.channels", "api/eolab.rastertools.product.rastertype.RasterType.date_format", "api/eolab.rastertools.product.rastertype.RasterType.find", "api/eolab.rastertools.product.rastertype.RasterType.get", "api/eolab.rastertools.product.rastertype.RasterType.get_band_description", "api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions", "api/eolab.rastertools.product.rastertype.RasterType.get_band_id", "api/eolab.rastertools.product.rastertype.RasterType.get_band_ids", "api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp", "api/eolab.rastertools.product.rastertype.RasterType.get_date", "api/eolab.rastertools.product.rastertype.RasterType.get_group", "api/eolab.rastertools.product.rastertype.RasterType.get_mask", "api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions", "api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids", "api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp", "api/eolab.rastertools.product.rastertype.RasterType.has_channel", "api/eolab.rastertools.product.rastertype.RasterType.has_channels", "api/eolab.rastertools.product.rastertype.RasterType.has_mask", "api/eolab.rastertools.product.rastertype.RasterType.maskfunc", "api/eolab.rastertools.product.rastertype.RasterType.masknodata", "api/eolab.rastertools.product.rastertype.RasterType.name", "api/eolab.rastertools.product.rastertype.RasterType.nodata", "api/eolab.rastertools.product.rastertype.RasterType.product_pattern", "api/eolab.rastertools.product.rastertype.RasterType.rastertypes", "api/eolab.rastertools.product.s2_maja_mask", "api/eolab.rastertools.product.vrt", "api/eolab.rastertools.product.vrt.add_masks_to_vrt", "api/eolab.rastertools.product.vrt.set_band_descriptions", "api/modules", "authors", "changelog", "cli", "cli/filtering", "cli/hillshade", "cli/radioindice", "cli/speed", "cli/svf", "cli/tiling", "cli/timeseries", "cli/zonalstats", "index", "install", "license", "private_api", "rasterproduct", "usage"], "filenames": ["api/eolab.rst", "api/eolab.rastertools.rst", "api/eolab.rastertools.Filtering.rst", "api/eolab.rastertools.Filtering.__init__.rst", "api/eolab.rastertools.Filtering.adaptive_gaussian.rst", "api/eolab.rastertools.Filtering.bands.rst", "api/eolab.rastertools.Filtering.get_default_filters.rst", "api/eolab.rastertools.Filtering.keep_vrt.rst", "api/eolab.rastertools.Filtering.local_mean.rst", "api/eolab.rastertools.Filtering.local_sum.rst", "api/eolab.rastertools.Filtering.median_filter.rst", "api/eolab.rastertools.Filtering.outputdir.rst", "api/eolab.rastertools.Filtering.pad_mode.rst", "api/eolab.rastertools.Filtering.postprocess_files.rst", "api/eolab.rastertools.Filtering.process_file.rst", "api/eolab.rastertools.Filtering.process_files.rst", "api/eolab.rastertools.Filtering.raster_filter.rst", "api/eolab.rastertools.Filtering.vrt_dir.rst", "api/eolab.rastertools.Filtering.window_size.rst", "api/eolab.rastertools.Filtering.with_filter_configuration.rst", "api/eolab.rastertools.Filtering.with_output.rst", "api/eolab.rastertools.Filtering.with_vrt_stored.rst", "api/eolab.rastertools.Filtering.with_windows.rst", "api/eolab.rastertools.Hillshade.rst", "api/eolab.rastertools.Hillshade.__init__.rst", "api/eolab.rastertools.Hillshade.azimuth.rst", "api/eolab.rastertools.Hillshade.elevation.rst", "api/eolab.rastertools.Hillshade.keep_vrt.rst", "api/eolab.rastertools.Hillshade.outputdir.rst", "api/eolab.rastertools.Hillshade.pad_mode.rst", "api/eolab.rastertools.Hillshade.postprocess_files.rst", "api/eolab.rastertools.Hillshade.process_file.rst", "api/eolab.rastertools.Hillshade.process_files.rst", "api/eolab.rastertools.Hillshade.radius.rst", "api/eolab.rastertools.Hillshade.resolution.rst", "api/eolab.rastertools.Hillshade.vrt_dir.rst", "api/eolab.rastertools.Hillshade.window_size.rst", "api/eolab.rastertools.Hillshade.with_output.rst", "api/eolab.rastertools.Hillshade.with_vrt_stored.rst", "api/eolab.rastertools.Hillshade.with_windows.rst", "api/eolab.rastertools.Radioindice.rst", "api/eolab.rastertools.Radioindice.__init__.rst", "api/eolab.rastertools.Radioindice.bi.rst", "api/eolab.rastertools.Radioindice.bi2.rst", "api/eolab.rastertools.Radioindice.evi.rst", "api/eolab.rastertools.Radioindice.get_default_indices.rst", "api/eolab.rastertools.Radioindice.indices.rst", "api/eolab.rastertools.Radioindice.ipvi.rst", "api/eolab.rastertools.Radioindice.keep_vrt.rst", "api/eolab.rastertools.Radioindice.merge.rst", "api/eolab.rastertools.Radioindice.mndwi.rst", "api/eolab.rastertools.Radioindice.msavi.rst", "api/eolab.rastertools.Radioindice.msavi2.rst", "api/eolab.rastertools.Radioindice.ndbi.rst", "api/eolab.rastertools.Radioindice.ndpi.rst", "api/eolab.rastertools.Radioindice.ndti.rst", "api/eolab.rastertools.Radioindice.ndvi.rst", "api/eolab.rastertools.Radioindice.ndwi.rst", "api/eolab.rastertools.Radioindice.ndwi2.rst", "api/eolab.rastertools.Radioindice.outputdir.rst", "api/eolab.rastertools.Radioindice.pad_mode.rst", "api/eolab.rastertools.Radioindice.postprocess_files.rst", "api/eolab.rastertools.Radioindice.process_file.rst", "api/eolab.rastertools.Radioindice.process_files.rst", "api/eolab.rastertools.Radioindice.pvi.rst", "api/eolab.rastertools.Radioindice.ri.rst", "api/eolab.rastertools.Radioindice.roi.rst", "api/eolab.rastertools.Radioindice.rvi.rst", "api/eolab.rastertools.Radioindice.savi.rst", "api/eolab.rastertools.Radioindice.tndvi.rst", "api/eolab.rastertools.Radioindice.tsavi.rst", "api/eolab.rastertools.Radioindice.vrt_dir.rst", "api/eolab.rastertools.Radioindice.window_size.rst", "api/eolab.rastertools.Radioindice.with_output.rst", "api/eolab.rastertools.Radioindice.with_roi.rst", "api/eolab.rastertools.Radioindice.with_vrt_stored.rst", "api/eolab.rastertools.Radioindice.with_windows.rst", "api/eolab.rastertools.Rastertool.rst", "api/eolab.rastertools.Rastertool.__init__.rst", "api/eolab.rastertools.Rastertool.keep_vrt.rst", "api/eolab.rastertools.Rastertool.outputdir.rst", "api/eolab.rastertools.Rastertool.postprocess_files.rst", "api/eolab.rastertools.Rastertool.process_file.rst", "api/eolab.rastertools.Rastertool.process_files.rst", "api/eolab.rastertools.Rastertool.vrt_dir.rst", "api/eolab.rastertools.Rastertool.with_output.rst", "api/eolab.rastertools.Rastertool.with_vrt_stored.rst", "api/eolab.rastertools.RastertoolConfigurationException.rst", "api/eolab.rastertools.SVF.rst", "api/eolab.rastertools.SVF.__init__.rst", "api/eolab.rastertools.SVF.altitude.rst", "api/eolab.rastertools.SVF.keep_vrt.rst", "api/eolab.rastertools.SVF.nb_directions.rst", "api/eolab.rastertools.SVF.outputdir.rst", "api/eolab.rastertools.SVF.pad_mode.rst", "api/eolab.rastertools.SVF.postprocess_files.rst", "api/eolab.rastertools.SVF.process_file.rst", "api/eolab.rastertools.SVF.process_files.rst", "api/eolab.rastertools.SVF.radius.rst", "api/eolab.rastertools.SVF.resolution.rst", "api/eolab.rastertools.SVF.vrt_dir.rst", "api/eolab.rastertools.SVF.window_size.rst", "api/eolab.rastertools.SVF.with_altitude.rst", "api/eolab.rastertools.SVF.with_output.rst", "api/eolab.rastertools.SVF.with_vrt_stored.rst", "api/eolab.rastertools.SVF.with_windows.rst", "api/eolab.rastertools.Speed.rst", "api/eolab.rastertools.Speed.__init__.rst", "api/eolab.rastertools.Speed.bands.rst", "api/eolab.rastertools.Speed.keep_vrt.rst", "api/eolab.rastertools.Speed.outputdir.rst", "api/eolab.rastertools.Speed.postprocess_files.rst", "api/eolab.rastertools.Speed.process_file.rst", "api/eolab.rastertools.Speed.process_files.rst", "api/eolab.rastertools.Speed.vrt_dir.rst", "api/eolab.rastertools.Speed.with_output.rst", "api/eolab.rastertools.Speed.with_vrt_stored.rst", "api/eolab.rastertools.Tiling.rst", "api/eolab.rastertools.Tiling.__init__.rst", "api/eolab.rastertools.Tiling.grid.rst", "api/eolab.rastertools.Tiling.keep_vrt.rst", "api/eolab.rastertools.Tiling.output_basename.rst", "api/eolab.rastertools.Tiling.output_subdir.rst", "api/eolab.rastertools.Tiling.outputdir.rst", "api/eolab.rastertools.Tiling.postprocess_files.rst", "api/eolab.rastertools.Tiling.process_file.rst", "api/eolab.rastertools.Tiling.process_files.rst", "api/eolab.rastertools.Tiling.vrt_dir.rst", "api/eolab.rastertools.Tiling.with_id_column.rst", "api/eolab.rastertools.Tiling.with_output.rst", "api/eolab.rastertools.Tiling.with_vrt_stored.rst", "api/eolab.rastertools.Timeseries.rst", "api/eolab.rastertools.Timeseries.__init__.rst", "api/eolab.rastertools.Timeseries.bands.rst", "api/eolab.rastertools.Timeseries.end_date.rst", "api/eolab.rastertools.Timeseries.keep_vrt.rst", "api/eolab.rastertools.Timeseries.outputdir.rst", "api/eolab.rastertools.Timeseries.pad_mode.rst", "api/eolab.rastertools.Timeseries.period.rst", "api/eolab.rastertools.Timeseries.postprocess_files.rst", "api/eolab.rastertools.Timeseries.process_file.rst", "api/eolab.rastertools.Timeseries.process_files.rst", "api/eolab.rastertools.Timeseries.start_date.rst", "api/eolab.rastertools.Timeseries.vrt_dir.rst", "api/eolab.rastertools.Timeseries.window_size.rst", "api/eolab.rastertools.Timeseries.with_output.rst", "api/eolab.rastertools.Timeseries.with_vrt_stored.rst", "api/eolab.rastertools.Timeseries.with_windows.rst", "api/eolab.rastertools.Windowable.rst", "api/eolab.rastertools.Windowable.__init__.rst", "api/eolab.rastertools.Windowable.pad_mode.rst", "api/eolab.rastertools.Windowable.window_size.rst", "api/eolab.rastertools.Windowable.with_windows.rst", "api/eolab.rastertools.Zonalstats.rst", "api/eolab.rastertools.Zonalstats.__init__.rst", "api/eolab.rastertools.Zonalstats.area.rst", "api/eolab.rastertools.Zonalstats.bands.rst", "api/eolab.rastertools.Zonalstats.categorical.rst", "api/eolab.rastertools.Zonalstats.category_file.rst", "api/eolab.rastertools.Zonalstats.category_file_type.rst", "api/eolab.rastertools.Zonalstats.category_index.rst", "api/eolab.rastertools.Zonalstats.category_labels.rst", "api/eolab.rastertools.Zonalstats.chart_file.rst", "api/eolab.rastertools.Zonalstats.compute_stats.rst", "api/eolab.rastertools.Zonalstats.display_chart.rst", "api/eolab.rastertools.Zonalstats.generated_stats.rst", "api/eolab.rastertools.Zonalstats.generated_stats_dates.rst", "api/eolab.rastertools.Zonalstats.generated_stats_per_date.rst", "api/eolab.rastertools.Zonalstats.geometries.rst", "api/eolab.rastertools.Zonalstats.geometry_index.rst", "api/eolab.rastertools.Zonalstats.keep_vrt.rst", "api/eolab.rastertools.Zonalstats.output_format.rst", "api/eolab.rastertools.Zonalstats.outputdir.rst", "api/eolab.rastertools.Zonalstats.postprocess_files.rst", "api/eolab.rastertools.Zonalstats.prefix.rst", "api/eolab.rastertools.Zonalstats.process_file.rst", "api/eolab.rastertools.Zonalstats.process_files.rst", "api/eolab.rastertools.Zonalstats.sigma.rst", "api/eolab.rastertools.Zonalstats.stats.rst", "api/eolab.rastertools.Zonalstats.supported_output_formats.rst", "api/eolab.rastertools.Zonalstats.valid_stats.rst", "api/eolab.rastertools.Zonalstats.valid_threshold.rst", "api/eolab.rastertools.Zonalstats.vrt_dir.rst", "api/eolab.rastertools.Zonalstats.with_chart.rst", "api/eolab.rastertools.Zonalstats.with_geometries.rst", "api/eolab.rastertools.Zonalstats.with_outliers.rst", "api/eolab.rastertools.Zonalstats.with_output.rst", "api/eolab.rastertools.Zonalstats.with_per_category.rst", "api/eolab.rastertools.Zonalstats.with_vrt_stored.rst", "api/eolab.rastertools.Zonalstats.within.rst", "api/eolab.rastertools.cli.rst", "api/eolab.rastertools.cli.filtering.rst", "api/eolab.rastertools.cli.filtering.create_filter.rst", "api/eolab.rastertools.cli.filtering.create_filtering.rst", "api/eolab.rastertools.cli.filtering.filter_options.rst", "api/eolab.rastertools.cli.hillshade.rst", "api/eolab.rastertools.cli.radioindice.rst", "api/eolab.rastertools.cli.radioindice.indices_opt.rst", "api/eolab.rastertools.cli.speed.rst", "api/eolab.rastertools.cli.svf.rst", "api/eolab.rastertools.cli.tiling.rst", "api/eolab.rastertools.cli.timeseries.rst", "api/eolab.rastertools.cli.utils_cli.rst", "api/eolab.rastertools.cli.utils_cli.apply_process.rst", "api/eolab.rastertools.cli.with_bands_arguments.rst", "api/eolab.rastertools.cli.with_outputdir_arguments.rst", "api/eolab.rastertools.cli.with_window_arguments.rst", "api/eolab.rastertools.cli.zonalstats.rst", "api/eolab.rastertools.processing.rst", "api/eolab.rastertools.processing.algo.rst", "api/eolab.rastertools.processing.algo.adaptive_gaussian.rst", "api/eolab.rastertools.processing.algo.brightness_index.rst", "api/eolab.rastertools.processing.algo.brightness_index2.rst", "api/eolab.rastertools.processing.algo.evi.rst", "api/eolab.rastertools.processing.algo.hillshade.rst", "api/eolab.rastertools.processing.algo.interpolated_timeseries.rst", "api/eolab.rastertools.processing.algo.ipvi.rst", "api/eolab.rastertools.processing.algo.local_mean.rst", "api/eolab.rastertools.processing.algo.local_sum.rst", "api/eolab.rastertools.processing.algo.median.rst", "api/eolab.rastertools.processing.algo.msavi.rst", "api/eolab.rastertools.processing.algo.msavi2.rst", "api/eolab.rastertools.processing.algo.normalized_difference.rst", "api/eolab.rastertools.processing.algo.pvi.rst", "api/eolab.rastertools.processing.algo.redness_index.rst", "api/eolab.rastertools.processing.algo.rvi.rst", "api/eolab.rastertools.processing.algo.savi.rst", "api/eolab.rastertools.processing.algo.speed.rst", "api/eolab.rastertools.processing.algo.svf.rst", "api/eolab.rastertools.processing.algo.tndvi.rst", "api/eolab.rastertools.processing.algo.tsavi.rst", "api/eolab.rastertools.processing.rasterproc.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.rst", "api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.description.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.help.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.name.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.rst", "api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.rst", "api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.rst", "api/eolab.rastertools.processing.sliding.rst", "api/eolab.rastertools.processing.sliding.compute_sliding.rst", "api/eolab.rastertools.processing.stats.rst", "api/eolab.rastertools.processing.stats.compute_zonal_stats.rst", "api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.rst", "api/eolab.rastertools.processing.stats.extract_zonal_outliers.rst", "api/eolab.rastertools.processing.stats.plot_stats.rst", "api/eolab.rastertools.processing.vector.rst", "api/eolab.rastertools.processing.vector.clip.rst", "api/eolab.rastertools.processing.vector.crop.rst", "api/eolab.rastertools.processing.vector.dissolve.rst", "api/eolab.rastertools.processing.vector.filter.rst", "api/eolab.rastertools.processing.vector.filter_dissolve.rst", "api/eolab.rastertools.processing.vector.get_raster_shape.rst", "api/eolab.rastertools.processing.vector.rasterize.rst", "api/eolab.rastertools.processing.vector.reproject.rst", "api/eolab.rastertools.processing.vector.vectorize.rst", "api/eolab.rastertools.product.rst", "api/eolab.rastertools.product.rasterproduct.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.file.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.open.rst", "api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.rst", "api/eolab.rastertools.product.rastertype.rst", "api/eolab.rastertools.product.rastertype.Band.rst", "api/eolab.rastertools.product.rastertype.Band.__init__.rst", "api/eolab.rastertools.product.rastertype.Band.description.rst", "api/eolab.rastertools.product.rastertype.Band.identifier.rst", "api/eolab.rastertools.product.rastertype.BandChannel.rst", "api/eolab.rastertools.product.rastertype.BandChannel.blue.rst", "api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.rst", "api/eolab.rastertools.product.rastertype.BandChannel.green.rst", "api/eolab.rastertools.product.rastertype.BandChannel.mir.rst", "api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.rst", "api/eolab.rastertools.product.rastertype.BandChannel.nir.rst", "api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.rst", "api/eolab.rastertools.product.rastertype.BandChannel.red.rst", "api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.rst", "api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.rst", "api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.rst", "api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.rst", "api/eolab.rastertools.product.rastertype.BandChannel.swir.rst", "api/eolab.rastertools.product.rastertype.RasterType.rst", "api/eolab.rastertools.product.rastertype.RasterType.__init__.rst", "api/eolab.rastertools.product.rastertype.RasterType.accept.rst", "api/eolab.rastertools.product.rastertype.RasterType.add.rst", "api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.rst", "api/eolab.rastertools.product.rastertype.RasterType.channels.rst", "api/eolab.rastertools.product.rastertype.RasterType.date_format.rst", "api/eolab.rastertools.product.rastertype.RasterType.find.rst", "api/eolab.rastertools.product.rastertype.RasterType.get.rst", "api/eolab.rastertools.product.rastertype.RasterType.get_band_description.rst", "api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.rst", "api/eolab.rastertools.product.rastertype.RasterType.get_band_id.rst", "api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.rst", "api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.rst", "api/eolab.rastertools.product.rastertype.RasterType.get_date.rst", "api/eolab.rastertools.product.rastertype.RasterType.get_group.rst", "api/eolab.rastertools.product.rastertype.RasterType.get_mask.rst", "api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.rst", "api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.rst", "api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.rst", "api/eolab.rastertools.product.rastertype.RasterType.has_channel.rst", "api/eolab.rastertools.product.rastertype.RasterType.has_channels.rst", "api/eolab.rastertools.product.rastertype.RasterType.has_mask.rst", "api/eolab.rastertools.product.rastertype.RasterType.maskfunc.rst", "api/eolab.rastertools.product.rastertype.RasterType.masknodata.rst", "api/eolab.rastertools.product.rastertype.RasterType.name.rst", "api/eolab.rastertools.product.rastertype.RasterType.nodata.rst", "api/eolab.rastertools.product.rastertype.RasterType.product_pattern.rst", "api/eolab.rastertools.product.rastertype.RasterType.rastertypes.rst", "api/eolab.rastertools.product.s2_maja_mask.rst", "api/eolab.rastertools.product.vrt.rst", "api/eolab.rastertools.product.vrt.add_masks_to_vrt.rst", "api/eolab.rastertools.product.vrt.set_band_descriptions.rst", "api/modules.rst", "authors.rst", "changelog.rst", "cli.rst", "cli/filtering.rst", "cli/hillshade.rst", "cli/radioindice.rst", "cli/speed.rst", "cli/svf.rst", "cli/tiling.rst", "cli/timeseries.rst", "cli/zonalstats.rst", "index.rst", "install.rst", "license.rst", "private_api.rst", "rasterproduct.rst", "usage.rst"], "titles": ["eolab namespace", "eolab.rastertools package", "Filtering", "Filtering.__init__", "Filtering.adaptive_gaussian", "Filtering.bands", "Filtering.get_default_filters", "Filtering.keep_vrt", "Filtering.local_mean", "Filtering.local_sum", "Filtering.median_filter", "Filtering.outputdir", "Filtering.pad_mode", "Filtering.postprocess_files", "Filtering.process_file", "Filtering.process_files", "Filtering.raster_filter", "Filtering.vrt_dir", "Filtering.window_size", "Filtering.with_filter_configuration", "Filtering.with_output", "Filtering.with_vrt_stored", "Filtering.with_windows", "Hillshade", "Hillshade.__init__", "Hillshade.azimuth", "Hillshade.elevation", "Hillshade.keep_vrt", "Hillshade.outputdir", "Hillshade.pad_mode", "Hillshade.postprocess_files", "Hillshade.process_file", "Hillshade.process_files", "Hillshade.radius", "Hillshade.resolution", "Hillshade.vrt_dir", "Hillshade.window_size", "Hillshade.with_output", "Hillshade.with_vrt_stored", "Hillshade.with_windows", "Radioindice", "Radioindice.__init__", "Radioindice.bi", "Radioindice.bi2", "Radioindice.evi", "Radioindice.get_default_indices", "Radioindice.indices", "Radioindice.ipvi", "Radioindice.keep_vrt", "Radioindice.merge", "Radioindice.mndwi", "Radioindice.msavi", "Radioindice.msavi2", "Radioindice.ndbi", "Radioindice.ndpi", "Radioindice.ndti", "Radioindice.ndvi", "Radioindice.ndwi", "Radioindice.ndwi2", "Radioindice.outputdir", "Radioindice.pad_mode", "Radioindice.postprocess_files", "Radioindice.process_file", "Radioindice.process_files", "Radioindice.pvi", "Radioindice.ri", "Radioindice.roi", "Radioindice.rvi", "Radioindice.savi", "Radioindice.tndvi", "Radioindice.tsavi", "Radioindice.vrt_dir", "Radioindice.window_size", "Radioindice.with_output", "Radioindice.with_roi", "Radioindice.with_vrt_stored", "Radioindice.with_windows", "Rastertool", "Rastertool.__init__", "Rastertool.keep_vrt", "Rastertool.outputdir", "Rastertool.postprocess_files", "Rastertool.process_file", "Rastertool.process_files", "Rastertool.vrt_dir", "Rastertool.with_output", "Rastertool.with_vrt_stored", "RastertoolConfigurationException", "SVF", "SVF.__init__", "SVF.altitude", "SVF.keep_vrt", "SVF.nb_directions", "SVF.outputdir", "SVF.pad_mode", "SVF.postprocess_files", "SVF.process_file", "SVF.process_files", "SVF.radius", "SVF.resolution", "SVF.vrt_dir", "SVF.window_size", "SVF.with_altitude", "SVF.with_output", "SVF.with_vrt_stored", "SVF.with_windows", "Speed", "Speed.__init__", "Speed.bands", "Speed.keep_vrt", "Speed.outputdir", "Speed.postprocess_files", "Speed.process_file", "Speed.process_files", "Speed.vrt_dir", "Speed.with_output", "Speed.with_vrt_stored", "Tiling", "Tiling.__init__", "Tiling.grid", "Tiling.keep_vrt", "Tiling.output_basename", "Tiling.output_subdir", "Tiling.outputdir", "Tiling.postprocess_files", "Tiling.process_file", "Tiling.process_files", "Tiling.vrt_dir", "Tiling.with_id_column", "Tiling.with_output", "Tiling.with_vrt_stored", "Timeseries", "Timeseries.__init__", "Timeseries.bands", "Timeseries.end_date", "Timeseries.keep_vrt", "Timeseries.outputdir", "Timeseries.pad_mode", "Timeseries.period", "Timeseries.postprocess_files", "Timeseries.process_file", "Timeseries.process_files", "Timeseries.start_date", "Timeseries.vrt_dir", "Timeseries.window_size", "Timeseries.with_output", "Timeseries.with_vrt_stored", "Timeseries.with_windows", "Windowable", "Windowable.__init__", "Windowable.pad_mode", "Windowable.window_size", "Windowable.with_windows", "Zonalstats", "Zonalstats.__init__", "Zonalstats.area", "Zonalstats.bands", "Zonalstats.categorical", "Zonalstats.category_file", "Zonalstats.category_file_type", "Zonalstats.category_index", "Zonalstats.category_labels", "Zonalstats.chart_file", "Zonalstats.compute_stats", "Zonalstats.display_chart", "Zonalstats.generated_stats", "Zonalstats.generated_stats_dates", "Zonalstats.generated_stats_per_date", "Zonalstats.geometries", "Zonalstats.geometry_index", "Zonalstats.keep_vrt", "Zonalstats.output_format", "Zonalstats.outputdir", "Zonalstats.postprocess_files", "Zonalstats.prefix", "Zonalstats.process_file", "Zonalstats.process_files", "Zonalstats.sigma", "Zonalstats.stats", "Zonalstats.supported_output_formats", "Zonalstats.valid_stats", "Zonalstats.valid_threshold", "Zonalstats.vrt_dir", "Zonalstats.with_chart", "Zonalstats.with_geometries", "Zonalstats.with_outliers", "Zonalstats.with_output", "Zonalstats.with_per_category", "Zonalstats.with_vrt_stored", "Zonalstats.within", "eolab.rastertools.cli", "eolab.rastertools.cli.filtering", "create_filter", "create_filtering", "filter_options", "eolab.rastertools.cli.hillshade", "eolab.rastertools.cli.radioindice", "indices_opt", "eolab.rastertools.cli.speed", "eolab.rastertools.cli.svf", "eolab.rastertools.cli.tiling", "eolab.rastertools.cli.timeseries", "eolab.rastertools.cli.utils_cli", "apply_process", "with_bands_arguments", "with_outputdir_arguments", "with_window_arguments", "eolab.rastertools.cli.zonalstats", "eolab.rastertools.processing", "eolab.rastertools.processing.algo", "adaptive_gaussian", "brightness_index", "brightness_index2", "evi", "hillshade", "interpolated_timeseries", "ipvi", "local_mean", "local_sum", "median", "msavi", "msavi2", "normalized_difference", "pvi", "redness_index", "rvi", "savi", "speed", "svf", "tndvi", "tsavi", "eolab.rastertools.processing.rasterproc", "RadioindiceProcessing", "RadioindiceProcessing.__init__", "RadioindiceProcessing.algo", "RadioindiceProcessing.aliases", "RadioindiceProcessing.arguments", "RadioindiceProcessing.channels", "RadioindiceProcessing.compress", "RadioindiceProcessing.compute", "RadioindiceProcessing.configure", "RadioindiceProcessing.description", "RadioindiceProcessing.dtype", "RadioindiceProcessing.help", "RadioindiceProcessing.in_dtype", "RadioindiceProcessing.name", "RadioindiceProcessing.nbits", "RadioindiceProcessing.nodata", "RadioindiceProcessing.per_band_algo", "RadioindiceProcessing.with_arguments", "RadioindiceProcessing.with_channels", "RadioindiceProcessing.with_documentation", "RasterFilter", "RasterFilter.__init__", "RasterFilter.algo", "RasterFilter.aliases", "RasterFilter.arguments", "RasterFilter.compress", "RasterFilter.compute", "RasterFilter.configure", "RasterFilter.description", "RasterFilter.dtype", "RasterFilter.help", "RasterFilter.in_dtype", "RasterFilter.name", "RasterFilter.nbits", "RasterFilter.nodata", "RasterFilter.per_band_algo", "RasterFilter.with_arguments", "RasterFilter.with_documentation", "RasterProcessing", "RasterProcessing.__init__", "RasterProcessing.algo", "RasterProcessing.aliases", "RasterProcessing.arguments", "RasterProcessing.compress", "RasterProcessing.compute", "RasterProcessing.configure", "RasterProcessing.description", "RasterProcessing.dtype", "RasterProcessing.help", "RasterProcessing.in_dtype", "RasterProcessing.name", "RasterProcessing.nbits", "RasterProcessing.nodata", "RasterProcessing.per_band_algo", "RasterProcessing.with_arguments", "RasterProcessing.with_documentation", "eolab.rastertools.processing.sliding", "compute_sliding", "eolab.rastertools.processing.stats", "compute_zonal_stats", "compute_zonal_stats_per_category", "extract_zonal_outliers", "plot_stats", "eolab.rastertools.processing.vector", "clip", "crop", "dissolve", "filter", "filter_dissolve", "get_raster_shape", "rasterize", "reproject", "vectorize", "eolab.rastertools.product", "eolab.rastertools.product.rasterproduct", "RasterProduct", "RasterProduct.__init__", "RasterProduct.bands_files", "RasterProduct.channels", "RasterProduct.file", "RasterProduct.free_in_memory_vrts", "RasterProduct.get_date", "RasterProduct.get_date_string", "RasterProduct.get_raster", "RasterProduct.get_relative_orbit", "RasterProduct.get_satellite", "RasterProduct.get_tile", "RasterProduct.is_archive", "RasterProduct.masks_files", "RasterProduct.open", "RasterProduct.rastertype", "eolab.rastertools.product.rastertype", "Band", "Band.__init__", "Band.description", "Band.identifier", "BandChannel", "BandChannel.blue", "BandChannel.blue_60m", "BandChannel.green", "BandChannel.mir", "BandChannel.mir_60m", "BandChannel.nir", "BandChannel.nir_60m", "BandChannel.red", "BandChannel.red_edge1", "BandChannel.red_edge2", "BandChannel.red_edge3", "BandChannel.red_edge4", "BandChannel.swir", "RasterType", "RasterType.__init__", "RasterType.accept", "RasterType.add", "RasterType.bands_pattern", "RasterType.channels", "RasterType.date_format", "RasterType.find", "RasterType.get", "RasterType.get_band_description", "RasterType.get_band_descriptions", "RasterType.get_band_id", "RasterType.get_band_ids", "RasterType.get_bands_regexp", "RasterType.get_date", "RasterType.get_group", "RasterType.get_mask", "RasterType.get_mask_descriptions", "RasterType.get_mask_ids", "RasterType.get_mask_regexp", "RasterType.has_channel", "RasterType.has_channels", "RasterType.has_mask", "RasterType.maskfunc", "RasterType.masknodata", "RasterType.name", "RasterType.nodata", "RasterType.product_pattern", "RasterType.rastertypes", "s2_maja_mask", "eolab.rastertools.product.vrt", "add_masks_to_vrt", "set_band_descriptions", "eolab", "Contributors", "Changelog", "Command Line Interface", "filter", "hillshade", "radioindice", "speed", "svf", "tiling", "timeseries", "zonalstats", "Rastertools", "Conda", "License", "Private API", "Raster types", "API Reference"], "terms": {"rastertool": [0, 2, 3, 6, 13, 15, 19, 20, 21, 22, 23, 30, 32, 37, 38, 39, 40, 41, 45, 61, 63, 73, 74, 75, 76, 87, 88, 95, 97, 103, 104, 105, 106, 111, 112, 113, 115, 116, 117, 124, 126, 128, 129, 130, 131, 139, 140, 141, 145, 146, 147, 148, 152, 153, 173, 176, 183, 184, 185, 186, 187, 188, 192, 193, 194, 197, 203, 204, 205, 206, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 249, 250, 252, 268, 270, 286, 289, 291, 292, 293, 294, 296, 297, 298, 299, 300, 301, 302, 303, 304, 307, 324, 328, 342, 347, 349, 351, 353, 355, 362, 363, 371, 373, 374, 375, 379, 380, 381, 382, 383, 384, 385, 386, 388, 390, 391], "packag": [0, 375], "cli": [0, 1, 192, 193, 194, 197, 203, 204, 205, 206, 378, 387, 388, 391], "with_bands_argu": [0, 1], "with_outputdir_argu": [0, 1], "with_window_argu": [0, 1], "filter": [0, 128, 192, 193, 194, 203, 210, 219, 252, 300, 375, 378, 387], "hillshad": [0, 203, 375, 378, 387], "radioindic": [0, 197, 375, 378, 379, 380, 383, 386, 391, 392], "speed": [0, 375, 378, 385, 391], "svf": [0, 375, 378], "tile": [0, 318, 375, 378, 379, 380, 381, 383, 385, 387, 391, 392], "timeseri": [0, 215, 375, 378, 387], "zonalstat": [0, 375, 378, 380, 383, 391], "process": [0, 1, 2, 3, 5, 6, 13, 14, 15, 22, 30, 31, 32, 39, 40, 41, 45, 61, 62, 63, 76, 81, 82, 83, 95, 96, 97, 105, 107, 108, 111, 112, 113, 124, 125, 126, 132, 133, 139, 140, 141, 147, 152, 154, 156, 163, 167, 173, 175, 176, 193, 203, 204, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 234, 235, 236, 240, 241, 243, 244, 245, 249, 250, 251, 252, 254, 255, 256, 259, 260, 262, 263, 264, 268, 269, 270, 271, 272, 273, 274, 277, 278, 280, 281, 282, 286, 287, 289, 291, 292, 293, 294, 296, 297, 298, 299, 300, 301, 302, 303, 304, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 392], "algo": [0, 1, 2, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 240, 248, 252, 253, 259, 267, 270, 271, 277, 285], "rasterproc": [0, 1, 232, 252, 270], "slide": [0, 1, 8, 9, 10, 217, 218, 219, 289], "stat": [0, 1, 153, 154, 158, 165, 167, 171, 173, 174, 175, 180, 184, 187, 189, 291, 292, 293, 294, 386], "vector": [0, 1, 40, 66, 74, 128, 159, 187, 296, 297, 298, 299, 300, 301, 302, 303, 315, 381, 384, 386, 387], "product": [0, 1, 21, 38, 40, 69, 75, 77, 86, 104, 116, 130, 146, 153, 188, 229, 250, 307, 308, 310, 311, 315, 319, 324, 327, 328, 342, 343, 344, 346, 347, 348, 349, 351, 353, 355, 356, 357, 362, 363, 364, 369, 371, 373, 374, 378, 380, 381, 382, 383, 385, 386, 387, 389, 391], "s2_maja_mask": [0, 1, 373, 391], "rasterproduct": [0, 1, 392], "rastertyp": [0, 1, 307, 315, 324, 328, 378, 381, 391, 392], "vrt": [0, 1, 7, 17, 21, 27, 35, 38, 48, 71, 75, 77, 79, 84, 86, 91, 100, 104, 109, 114, 116, 120, 127, 130, 135, 143, 146, 170, 182, 188, 203, 307, 308, 312, 315, 373, 374, 378, 391], "submodul": [0, 190, 208, 305, 375], "modul": [0, 190, 208, 288, 305, 375, 387], "adaptive_gaussian": [0, 1, 379], "band": [0, 1, 2, 3, 21, 31, 38, 40, 49, 73, 75, 77, 86, 104, 106, 107, 116, 130, 131, 132, 146, 153, 154, 163, 174, 188, 193, 204, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 239, 248, 258, 267, 271, 276, 285, 289, 291, 292, 293, 306, 307, 309, 315, 320, 321, 323, 328, 342, 343, 346, 347, 351, 352, 353, 354, 355, 358, 362, 363, 365, 371, 373, 374, 378, 379, 381, 382, 385, 386, 387, 391, 392], "get_default_filt": [0, 1], "local_mean": [0, 1], "local_sum": [0, 1], "median_filt": [0, 1, 2, 219], "process_fil": [0, 1, 2, 392], "raster_filt": [0, 1, 2, 3], "with_filter_configur": [0, 1, 2], "azimuth": [0, 1, 23, 24, 214, 380], "elev": [0, 1, 23, 24, 33, 88, 89, 98, 214, 228, 378, 380, 383, 387], "radiu": [0, 1, 23, 24, 31, 88, 89, 214, 228, 377, 380, 383], "resolut": [0, 1, 23, 24, 54, 55, 88, 89, 214, 228, 380, 383], "main": [0, 375], "add_custom_rastertyp": [0, 1, 391, 392], "run": [0, 1, 2, 13, 15, 30, 32, 61, 63, 81, 82, 83, 95, 97, 112, 113, 124, 126, 140, 141, 176, 288, 378, 379, 387, 388], "run_tool": 392, "bi": [0, 1, 211, 212, 381], "bi2": [0, 1, 381], "evi": [0, 1, 381], "get_default_indic": [0, 1], "indic": [0, 1, 40, 41, 45, 49, 62, 73, 197, 214, 231, 232, 237, 250, 271, 289, 291, 292, 373, 378, 381, 389], "ipvi": [0, 1, 381], "merg": [0, 1, 40, 73, 300, 381, 387, 392], "mndwi": [0, 1, 381], "msavi": [0, 1, 221, 381], "msavi2": [0, 1, 381], "ndbi": [0, 1, 381], "ndpi": [0, 1, 381], "ndti": [0, 1, 381], "ndvi": [0, 1, 51, 69, 220, 222, 229, 378, 379, 381, 382, 385, 386, 387, 391, 392], "ndwi": [0, 1, 50, 381], "ndwi2": [0, 1, 381], "pvi": [0, 1, 225, 381], "ri": [0, 1, 224, 378, 381], "roi": [0, 1, 74, 297, 300, 315, 321, 381, 386, 392], "rvi": [0, 1, 381], "savi": [0, 1, 381], "tndvi": [0, 1, 222, 381], "tsavi": [0, 1, 381], "with_output": [0, 1, 2, 392], "with_roi": [0, 1, 392], "compute_indic": [0, 1], "keep_vrt": [0, 1, 21, 38, 75, 86, 104, 116, 130, 146, 188], "outputdir": [0, 1, 20, 37, 73, 85, 103, 115, 129, 145, 186], "postprocess_fil": [0, 1, 15, 32, 63, 83, 97, 113, 126, 141, 176], "vrt_dir": [0, 1], "with_vrt_stor": [0, 1], "rastertoolconfigurationexcept": [0, 1, 203, 392], "window": [0, 1, 2, 8, 9, 10, 12, 18, 22, 23, 29, 36, 39, 40, 60, 72, 76, 88, 94, 101, 105, 131, 137, 144, 147, 193, 206, 217, 218, 219, 288, 289, 381, 392], "pad_mod": [0, 1, 22, 39, 76, 105, 147, 152, 289], "window_s": [0, 1, 22, 39, 76, 105, 147, 152, 193, 289, 378, 379, 380, 381, 383, 385], "with_window": [0, 1, 2], "compute_spe": [0, 1], "altitud": [0, 1, 102, 228, 380, 383], "nb_direct": [0, 1, 88, 89], "with_altitud": [0, 1], "grid": [0, 1, 117, 384], "output_basenam": [0, 1, 129], "output_subdir": [0, 1, 129], "with_id_column": [0, 1], "end_dat": [0, 1, 131, 132, 385], "period": [0, 1, 131, 132, 385], "start_dat": [0, 1, 131, 132, 385], "compute_timeseri": [0, 1], "util": [0, 295, 372, 375], "get_basenam": [0, 1], "get_metadata_nam": [0, 1], "get_suffix": [0, 1], "highest_power_of_2": [0, 1], "is_dir": [0, 1], "slices_1d": [0, 1], "slices_2d": [0, 1], "to_path": [0, 1], "to_tupl": [0, 1], "area": [0, 1, 67, 153, 154, 163, 214, 225, 384, 386], "categor": [0, 1, 153, 154, 291, 292, 304, 386], "category_fil": [0, 1, 187, 386], "category_file_typ": [0, 1], "category_index": [0, 1, 187, 292, 386], "category_label": [0, 1, 292], "chart_fil": [0, 1, 183], "compute_stat": [0, 1], "display_chart": [0, 1], "generated_stat": [0, 1, 167], "generated_stats_d": [0, 1], "generated_stats_per_d": [0, 1], "geometri": [0, 1, 74, 117, 118, 119, 125, 128, 158, 160, 163, 169, 183, 184, 189, 291, 292, 293, 294, 296, 298, 299, 300, 301, 302, 303, 304, 384, 386, 387], "geometry_index": [0, 1, 183], "output_format": [0, 1, 186, 386], "prefix": [0, 1, 153, 154, 293, 294, 386], "sigma": [0, 1, 4, 185, 210, 293, 379, 386], "supported_output_format": [0, 1, 186], "valid_stat": [0, 1, 154], "valid_threshold": [0, 1, 153, 154, 386], "with_chart": [0, 1], "with_geometri": [0, 1], "with_outli": [0, 1], "with_per_categori": [0, 1], "within": [0, 1, 88, 184, 217, 218, 219, 291, 292, 299, 383, 384, 386, 389], "content": [0, 373, 375, 389], "create_argpars": [], "create_filt": 1, "create_hillshad": [], "create_radioindic": [], "create_spe": [], "create_svf": [], "create_til": [], "create_timeseri": [], "create_zonalstat": [], "brightness_index": 1, "brightness_index2": 1, "interpolated_timeseri": 1, "median": [1, 2, 6, 10, 12, 29, 60, 94, 137, 150, 180, 379, 380, 383, 386, 387], "normalized_differ": [1, 232, 233, 381], "redness_index": 1, "radioindiceprocess": [1, 40, 41, 45, 46], "alias": [1, 251, 269, 287], "argument": [1, 19, 154, 193, 203, 204, 205, 206, 233, 240, 249, 253, 259, 268, 271, 277, 286, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 391], "channel": [1, 40, 42, 43, 44, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 64, 65, 67, 68, 69, 70, 250, 328, 343, 351, 353, 355, 362, 363, 392], "compress": [1, 270, 271, 377], "descript": [1, 2, 163, 190, 191, 195, 196, 198, 199, 200, 201, 202, 207, 208, 209, 231, 233, 236, 251, 253, 256, 269, 274, 287, 288, 290, 295, 305, 306, 323, 324, 325, 345, 351, 352, 359, 372, 374, 389, 391, 392], "dtype": [1, 232, 233, 252, 253, 270, 271, 302], "help": [1, 2, 249, 251, 268, 269, 286, 287, 378, 379, 380, 381, 382, 383, 384, 385, 386, 392], "in_dtyp": [1, 270, 271], "name": [1, 16, 19, 106, 117, 118, 121, 122, 128, 129, 160, 161, 162, 163, 166, 169, 183, 184, 187, 193, 232, 233, 240, 249, 252, 253, 259, 268, 270, 271, 277, 286, 291, 292, 294, 300, 304, 309, 317, 324, 342, 343, 344, 345, 348, 349, 350, 356, 357, 373, 378, 381, 384, 386, 387, 388, 389, 391, 392], "nbit": [1, 270, 271], "nodata": [1, 180, 215, 232, 233, 252, 253, 270, 271, 302, 342, 343, 366, 382, 386, 391, 392], "per_band_algo": [1, 252, 253, 270, 271], "__init__": 1, "comput": [1, 8, 9, 10, 23, 31, 40, 41, 46, 62, 88, 89, 90, 92, 96, 102, 106, 111, 153, 154, 155, 157, 158, 163, 168, 173, 175, 178, 180, 181, 184, 185, 187, 189, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 237, 250, 271, 289, 290, 291, 292, 293, 299, 371, 373, 377, 378, 379, 380, 381, 382, 383, 386, 387, 389], "configur": [1, 2, 19, 21, 22, 38, 39, 75, 76, 77, 86, 87, 102, 104, 105, 116, 117, 130, 146, 147, 148, 152, 188, 193, 203, 204, 205, 206, 249, 252, 268, 286, 378, 379, 381, 382, 385, 386, 389, 392], "with_argu": [1, 2, 236, 256, 271, 274], "with_channel": 1, "with_document": [1, 2], "rasterfilt": [1, 2, 3, 4, 6, 16], "rasterprocess": [1, 232, 233, 252, 253, 288, 289], "compute_slid": 1, "compute_zonal_stat": [1, 293], "compute_zonal_stats_per_categori": 1, "extract_zonal_outli": 1, "plot_stat": 1, "clip": 1, "crop": [1, 74, 315, 379], "dissolv": 1, "filter_dissolv": 1, "get_raster_shap": 1, "raster": [1, 2, 6, 16, 21, 23, 24, 34, 38, 40, 75, 77, 86, 87, 88, 104, 106, 116, 117, 118, 119, 130, 131, 146, 153, 154, 159, 163, 167, 184, 188, 189, 193, 203, 206, 209, 215, 232, 252, 270, 289, 290, 291, 292, 296, 297, 299, 301, 303, 304, 305, 306, 307, 308, 313, 314, 315, 316, 317, 318, 319, 322, 323, 327, 328, 342, 343, 344, 345, 349, 350, 356, 357, 365, 367, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387], "reproject": 1, "bands_fil": 1, "file": [1, 13, 14, 15, 21, 30, 31, 32, 38, 40, 61, 62, 63, 75, 77, 81, 82, 83, 86, 95, 96, 97, 104, 111, 112, 113, 116, 117, 118, 124, 125, 126, 128, 129, 130, 139, 140, 141, 146, 159, 160, 162, 165, 166, 167, 173, 175, 176, 183, 184, 186, 187, 188, 193, 203, 271, 289, 291, 292, 294, 296, 298, 299, 301, 302, 303, 307, 308, 309, 343, 344, 345, 349, 356, 357, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 389, 391, 392], "is_arch": 1, "masks_fil": 1, "free_in_memory_vrt": [1, 307], "get_dat": 1, "get_date_str": 1, "get_rast": [1, 307], "get_relative_orbit": 1, "get_satellit": 1, "get_til": 1, "open": [1, 50, 307, 380, 383, 392], "identifi": [1, 160, 169, 177, 292, 294, 309, 318, 320, 324, 325, 343, 346, 353, 354, 355, 360, 361, 369, 384, 386, 389, 391, 392], "bandchannel": [1, 232, 237, 250, 342, 343, 347, 351, 353, 355, 362, 363, 381], "blue": [1, 44, 212, 213, 392], "green": [1, 42, 43, 50, 54, 55, 58, 65, 211, 212, 224, 381, 386, 392], "red": [1, 42, 43, 44, 47, 51, 52, 55, 56, 64, 65, 67, 68, 69, 70, 211, 212, 213, 216, 220, 221, 222, 223, 224, 225, 226, 229, 230, 381, 392], "nir": [1, 43, 44, 47, 51, 52, 53, 56, 57, 58, 64, 67, 68, 69, 70, 213, 216, 220, 221, 222, 223, 225, 226, 229, 230, 381, 392], "mir": [1, 50, 53, 54, 57, 392], "swir": [1, 392], "red_edge1": [1, 392], "red_edge2": [1, 392], "red_edge3": [1, 392], "red_edge4": [1, 392], "blue_60m": [1, 392], "nir_60m": [1, 392], "mir_60m": [1, 392], "bands_pattern": [1, 342, 343, 392], "date_format": [1, 342, 343, 392], "maskfunc": [1, 342, 343, 392], "masknodata": [1, 342, 343], "product_pattern": [1, 342, 343, 392], "accept": [1, 210, 214, 217, 218, 219, 228, 380, 381, 383, 387, 389, 391], "add": [1, 148, 154, 163, 204, 205, 206, 249, 268, 286, 293, 373, 386, 387, 389, 392], "find": 1, "get": [1, 2, 6, 45, 119, 167, 315, 347, 349, 351, 352, 353, 354, 355, 358, 359, 360, 361, 379, 385, 387], "get_band_descript": 1, "get_band_id": 1, "get_bands_regexp": 1, "get_group": 1, "get_mask": 1, "get_mask_descript": 1, "get_mask_id": 1, "get_mask_regexp": 1, "has_channel": 1, "has_mask": 1, "add_masks_to_vrt": 1, "set_band_descript": 1, "thi": [1, 2, 13, 15, 23, 30, 32, 61, 63, 77, 81, 82, 83, 87, 88, 95, 97, 112, 113, 124, 126, 140, 141, 167, 176, 180, 190, 193, 203, 208, 214, 232, 270, 288, 289, 291, 292, 294, 305, 307, 315, 343, 344, 346, 347, 362, 363, 364, 369, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 389, 390, 391, 392], "defin": [1, 4, 12, 23, 29, 40, 60, 66, 74, 87, 88, 94, 117, 119, 129, 137, 150, 154, 190, 217, 218, 232, 249, 252, 268, 270, 286, 288, 289, 292, 294, 304, 305, 315, 328, 343, 365, 378, 379, 381, 382, 383, 384, 385, 386, 387, 389, 391, 392], "can": [1, 2, 12, 21, 22, 23, 29, 38, 39, 40, 60, 75, 76, 77, 86, 88, 94, 104, 105, 106, 116, 117, 130, 137, 146, 147, 150, 152, 154, 166, 180, 188, 228, 291, 307, 343, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 391, 392], "appli": [1, 2, 3, 4, 10, 14, 16, 193, 203, 210, 219, 248, 252, 267, 271, 285, 289, 315, 378, 379, 381, 387, 389], "differ": [1, 50, 53, 54, 55, 56, 57, 58, 69, 117, 129, 222, 227, 229, 239, 258, 276, 294, 343, 379, 380, 381, 384, 386, 387, 389, 392], "kind": [1, 389], "imag": [1, 2, 3, 7, 12, 13, 14, 15, 17, 18, 21, 22, 23, 27, 29, 30, 31, 32, 35, 36, 38, 39, 40, 48, 49, 60, 61, 62, 63, 71, 72, 73, 74, 75, 76, 77, 79, 81, 82, 83, 84, 86, 88, 91, 94, 95, 96, 97, 100, 101, 104, 105, 106, 107, 109, 111, 112, 113, 114, 116, 117, 118, 119, 120, 124, 125, 126, 127, 130, 131, 132, 135, 137, 139, 140, 141, 143, 144, 146, 147, 148, 150, 151, 152, 154, 163, 170, 173, 175, 176, 182, 184, 188, 270, 289, 290, 291, 292, 293, 295, 296, 297, 299, 301, 302, 303, 304, 308, 315, 319, 372, 373, 374, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 392], "class": [1, 2, 23, 24, 40, 41, 77, 87, 88, 106, 117, 131, 148, 153, 161, 187, 231, 232, 233, 252, 253, 270, 292, 300, 304, 306, 307, 323, 324, 328, 342, 386, 389, 392], "kernel_s": [1, 2, 3, 8, 9, 10, 193, 210, 217, 218, 219, 240, 259, 277, 379], "int": [1, 2, 3, 5, 18, 22, 23, 24, 36, 39, 72, 76, 88, 89, 101, 105, 106, 107, 108, 128, 131, 132, 133, 144, 147, 151, 152, 153, 154, 156, 163, 193, 210, 214, 217, 218, 219, 228, 246, 265, 270, 271, 283, 289, 291, 292, 293, 316, 342, 343, 373], "list": [1, 2, 3, 5, 6, 13, 14, 15, 30, 31, 32, 40, 41, 45, 46, 61, 62, 63, 81, 82, 83, 95, 96, 97, 106, 107, 108, 111, 112, 113, 124, 125, 126, 128, 131, 132, 133, 139, 140, 141, 153, 154, 156, 163, 165, 166, 167, 173, 175, 176, 178, 179, 180, 193, 194, 203, 204, 215, 232, 237, 239, 250, 251, 258, 269, 271, 276, 287, 289, 291, 292, 293, 294, 300, 307, 310, 315, 321, 342, 343, 345, 347, 351, 352, 354, 355, 359, 360, 363, 373, 374, 379, 380, 381, 382, 383, 384, 385, 386, 389], "1": [1, 2, 3, 23, 44, 51, 52, 56, 68, 70, 106, 107, 117, 129, 131, 132, 153, 154, 193, 210, 211, 213, 214, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 228, 229, 230, 271, 291, 292, 293, 294, 302, 307, 342, 343, 373, 378, 379, 382, 383, 384, 386, 389, 392], "sourc": [1, 2, 3, 6, 14, 19, 23, 24, 31, 40, 41, 45, 62, 73, 74, 77, 78, 81, 82, 83, 85, 86, 87, 88, 89, 96, 102, 106, 107, 111, 117, 118, 125, 128, 129, 131, 132, 139, 148, 152, 153, 154, 163, 173, 175, 183, 184, 185, 186, 187, 192, 193, 194, 197, 203, 204, 205, 206, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 250, 252, 253, 270, 271, 276, 277, 286, 287, 289, 291, 292, 293, 294, 296, 297, 298, 299, 300, 301, 302, 303, 304, 307, 308, 312, 313, 314, 315, 316, 317, 318, 321, 324, 325, 328, 342, 343, 344, 345, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 371, 373, 374, 389, 392], "base": [1, 2, 23, 24, 40, 77, 88, 106, 117, 121, 131, 148, 153, 214, 227, 232, 252, 270, 291, 292, 307, 324, 328, 342, 381, 384, 389, 392], "tool": [1, 2, 23, 40, 77, 87, 88, 106, 117, 131, 148, 153, 191, 193, 195, 196, 198, 199, 200, 201, 203, 206, 207, 378, 380, 381, 383, 385, 387, 391], "predefin": [1, 2, 6, 45], "ar": [1, 2, 11, 21, 22, 28, 38, 39, 40, 49, 59, 75, 76, 80, 86, 93, 104, 105, 110, 116, 117, 123, 130, 136, 146, 147, 152, 154, 167, 172, 179, 184, 185, 186, 188, 189, 214, 215, 239, 249, 258, 268, 271, 276, 286, 289, 292, 293, 299, 300, 301, 304, 309, 343, 345, 359, 360, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 389, 391, 392], "avail": [1, 2, 307, 309, 310, 320, 343, 347, 373, 379, 386, 387, 388, 389, 391], "local": [1, 2, 6, 8, 9, 217, 218, 379, 387], "sum": [1, 2, 6, 9, 88, 180, 218, 379, 383, 386, 387], "mean": [1, 2, 6, 8, 12, 29, 60, 94, 137, 150, 163, 180, 185, 217, 291, 292, 293, 294, 379, 380, 383, 386, 387, 389], "adapt": [1, 2, 4, 6, 210, 379, 387], "gaussian": [1, 2, 4, 6, 210, 379, 387], "A": [1, 2, 14, 31, 51, 54, 55, 56, 57, 64, 68, 69, 88, 96, 173, 193, 203, 210, 213, 214, 215, 217, 218, 219, 220, 223, 226, 228, 229, 289, 291, 292, 294, 307, 383, 389, 392], "i": [1, 2, 3, 8, 9, 12, 15, 19, 20, 21, 22, 23, 24, 29, 32, 37, 38, 39, 40, 49, 60, 63, 73, 74, 75, 76, 77, 83, 85, 86, 87, 88, 90, 94, 97, 102, 103, 104, 105, 113, 115, 116, 117, 126, 128, 129, 130, 131, 137, 141, 145, 146, 147, 150, 152, 154, 160, 176, 180, 183, 184, 185, 186, 187, 188, 190, 193, 203, 210, 213, 214, 215, 217, 218, 219, 225, 227, 228, 229, 234, 248, 249, 250, 251, 254, 267, 268, 269, 271, 272, 285, 286, 287, 289, 291, 292, 294, 296, 300, 302, 307, 308, 309, 315, 319, 320, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 391, 392], "kernel": [1, 2, 3, 4, 19, 193, 210, 217, 218, 219, 252, 379], "size": [1, 2, 3, 8, 9, 18, 19, 22, 36, 39, 72, 76, 101, 105, 144, 147, 148, 151, 152, 193, 210, 211, 212, 213, 214, 216, 217, 218, 219, 221, 222, 223, 224, 225, 226, 228, 229, 230, 239, 246, 252, 258, 265, 276, 283, 289, 293, 378, 379, 380, 381, 383, 385], "To": [1, 2, 23, 88, 378, 379, 383, 385, 386, 388, 389, 392], "set": [1, 2, 3, 15, 20, 23, 32, 37, 63, 73, 74, 83, 85, 97, 102, 103, 107, 113, 115, 126, 128, 129, 132, 141, 145, 148, 154, 176, 183, 184, 185, 186, 187, 193, 203, 204, 205, 206, 238, 250, 251, 257, 269, 271, 275, 287, 292, 374, 378, 379, 380, 381, 385, 386, 387, 391, 392], "you": [1, 2, 307, 378, 379, 380, 381, 382, 383, 384, 385, 386, 389], "need": [1, 2, 13, 30, 40, 61, 81, 95, 124, 387, 391], "call": [1, 2, 15, 19, 20, 21, 22, 32, 37, 38, 39, 63, 73, 74, 75, 76, 83, 85, 86, 97, 102, 103, 104, 105, 113, 115, 116, 126, 128, 129, 130, 141, 145, 146, 147, 152, 167, 176, 183, 184, 185, 186, 187, 188, 234, 249, 250, 251, 254, 268, 269, 272, 286, 287, 307, 378, 388, 392], "16": [1, 2, 379, 383], "custom": [1, 2, 270, 378, 381, 382, 385, 386, 387], "addit": [1, 2, 13, 30, 61, 81, 95, 124, 180, 193, 378, 386, 387, 389], "easili": [1, 2, 307], "ad": [1, 2, 373], "instanci": [1, 2], "see": [1, 2, 22, 39, 76, 105, 147, 152, 186, 233, 236, 253, 256, 271, 274, 379, 380, 381, 382, 383, 385, 389, 392], "The": [1, 2, 3, 4, 10, 12, 15, 19, 20, 21, 22, 23, 29, 32, 37, 38, 39, 40, 60, 63, 73, 74, 75, 76, 83, 85, 86, 88, 90, 94, 97, 102, 103, 104, 105, 113, 115, 116, 117, 125, 126, 128, 129, 130, 131, 137, 141, 145, 146, 147, 150, 152, 154, 163, 165, 166, 168, 169, 176, 188, 193, 203, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 249, 250, 268, 271, 286, 289, 291, 292, 293, 294, 296, 298, 299, 300, 301, 302, 303, 304, 307, 343, 351, 352, 353, 354, 355, 359, 360, 361, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 391, 392], "paramet": [1, 2, 3, 4, 13, 14, 15, 19, 20, 21, 22, 23, 24, 30, 31, 32, 37, 38, 39, 41, 61, 62, 63, 73, 74, 75, 76, 77, 81, 82, 83, 85, 86, 87, 88, 89, 95, 96, 97, 102, 103, 104, 105, 107, 111, 112, 113, 115, 116, 118, 124, 125, 126, 128, 129, 130, 132, 139, 140, 141, 145, 146, 147, 148, 152, 154, 163, 173, 175, 176, 183, 184, 185, 186, 187, 188, 193, 203, 204, 205, 206, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 239, 240, 249, 250, 251, 258, 259, 268, 269, 270, 271, 276, 277, 286, 287, 289, 291, 292, 293, 294, 296, 297, 298, 299, 300, 301, 302, 303, 304, 308, 315, 343, 344, 345, 349, 351, 353, 355, 356, 357, 358, 362, 363, 373, 374, 378, 379, 380, 381, 383, 384, 392], "pass": [1, 2, 271], "follow": [1, 2, 117, 125, 129, 213, 216, 220, 221, 222, 223, 224, 225, 226, 229, 230, 378, 379, 380, 383, 384, 385, 386, 387, 388, 389, 391, 392], "procedur": [1, 2], "def": [1, 2], "myalgo": [1, 2], "input_data": [1, 2, 8, 9, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 228, 229, 230, 239, 258, 276], "kwarg": [1, 2, 271, 371], "contain": [1, 2, 4, 8, 9, 10, 14, 19, 23, 31, 77, 96, 128, 158, 167, 173, 184, 187, 203, 208, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 248, 267, 271, 285, 291, 292, 293, 294, 302, 304, 309, 343, 362, 363, 364, 373, 378, 379, 380, 384, 385, 386, 387, 388, 389, 391, 392], "valu": [1, 2, 19, 23, 88, 117, 128, 154, 157, 161, 163, 167, 180, 185, 187, 215, 219, 220, 227, 228, 240, 247, 249, 259, 266, 268, 271, 277, 284, 286, 291, 292, 293, 301, 302, 309, 320, 328, 343, 366, 368, 378, 380, 382, 385, 386, 392], "8": [1, 2, 52, 56, 210, 214, 217, 218, 221, 228, 240, 259, 271, 277, 379, 380, 389], "myparam": [1, 2], "do": [1, 2, 215, 227, 384, 389, 392], "somet": [1, 2], "my_filt": [1, 2], "myfilt": [1, 2], "my": [1, 2], "command": [1, 2, 249, 251, 268, 269, 286, 287, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388], "line": [1, 2, 211, 212, 213, 214, 216, 220, 221, 222, 223, 224, 225, 226, 229, 230, 249, 268, 286, 379, 380, 381, 382, 383, 384, 385, 386, 387], "interfac": [1, 2, 387, 389], "param": [1, 2], "skip": [1, 2], "default": [1, 2, 3, 12, 13, 15, 20, 22, 29, 30, 32, 37, 39, 60, 61, 63, 73, 76, 77, 81, 82, 83, 85, 94, 95, 97, 103, 105, 107, 112, 113, 115, 117, 124, 126, 129, 132, 137, 140, 141, 145, 147, 150, 152, 154, 176, 183, 184, 186, 187, 193, 210, 228, 249, 250, 251, 268, 269, 271, 286, 287, 289, 291, 292, 293, 294, 296, 298, 299, 300, 301, 302, 303, 304, 308, 315, 343, 373, 378, 379, 380, 381, 382, 383, 384, 385, 386, 392], "requir": [1, 2, 40, 249, 268, 286, 379, 380, 383, 384, 389], "true": [1, 2, 40, 49, 154, 183, 193, 206, 214, 248, 267, 271, 285, 291, 294, 299, 307, 315, 344, 362, 363, 364, 392], "type": [1, 2, 12, 19, 20, 21, 22, 29, 31, 37, 38, 39, 40, 45, 60, 62, 73, 74, 75, 76, 82, 85, 86, 94, 96, 103, 104, 105, 106, 111, 112, 115, 116, 125, 128, 129, 130, 137, 139, 140, 145, 146, 147, 150, 152, 159, 173, 175, 183, 184, 185, 186, 187, 188, 193, 210, 214, 215, 217, 218, 219, 220, 227, 228, 232, 233, 242, 244, 249, 251, 252, 253, 261, 263, 268, 269, 270, 271, 279, 281, 286, 287, 291, 292, 296, 298, 299, 300, 301, 302, 303, 304, 307, 313, 314, 315, 316, 317, 318, 322, 342, 343, 344, 345, 347, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 367, 373, 378, 379, 381, 382, 385, 386, 387, 389], "creat": [1, 2, 77, 197, 271, 315, 388], "1024": [1, 2, 22, 39, 76, 105, 147, 152, 289, 379, 380, 381, 383, 385], "edg": [1, 2, 12, 22, 29, 39, 60, 76, 94, 105, 137, 147, 148, 150, 152, 193, 210, 289, 379, 380, 383], "mytif": [1, 2], "tif": [1, 2, 117, 129, 291, 292, 379, 380, 382, 383, 384, 385, 386, 391, 392], "an": [1, 4, 40, 77, 82, 87, 112, 140, 185, 203, 206, 210, 214, 234, 254, 270, 272, 289, 291, 292, 293, 297, 307, 319, 378, 379, 382, 384, 386, 387, 389, 391, 392], "It": [1, 15, 32, 63, 83, 97, 106, 113, 117, 126, 129, 141, 176, 193, 271, 378, 380, 383, 384], "ha": [1, 381, 382, 386, 387, 389, 391], "special": [1, 13, 30, 61, 81, 82, 95, 112, 124, 140, 389, 391], "standard": [1, 4, 163, 210, 291, 292, 379], "deviat": [1, 4, 163, 210, 291, 292, 379], "distribut": [1, 4, 22, 39, 76, 105, 147, 152, 210, 379, 380, 381, 383, 385, 389], "properti": [1, 5, 7, 11, 12, 16, 17, 18, 25, 26, 27, 28, 29, 33, 34, 35, 36, 46, 48, 49, 59, 60, 66, 71, 72, 79, 80, 84, 90, 91, 92, 93, 94, 98, 99, 100, 101, 108, 109, 110, 114, 117, 119, 120, 121, 122, 123, 127, 133, 134, 135, 136, 137, 138, 142, 143, 144, 150, 151, 155, 156, 157, 158, 159, 160, 161, 162, 164, 165, 166, 167, 168, 169, 170, 171, 172, 174, 177, 178, 181, 182, 189, 234, 235, 236, 237, 238, 241, 242, 243, 244, 245, 246, 247, 248, 249, 254, 255, 256, 257, 260, 261, 262, 263, 264, 265, 266, 267, 268, 272, 273, 274, 275, 278, 279, 280, 281, 282, 283, 284, 285, 286, 309, 310, 311, 319, 320, 322, 326, 327, 346, 347, 348, 365, 366, 367, 368, 369], "static": [1, 6, 45, 345, 349, 350], "return": [1, 4, 6, 8, 9, 10, 13, 14, 15, 19, 20, 21, 22, 25, 26, 30, 31, 32, 33, 34, 37, 38, 39, 45, 61, 62, 63, 73, 74, 75, 76, 81, 82, 83, 85, 86, 95, 96, 97, 102, 103, 104, 105, 111, 112, 113, 115, 116, 124, 125, 126, 128, 129, 130, 139, 140, 141, 145, 146, 147, 152, 163, 173, 175, 176, 183, 184, 185, 186, 187, 188, 193, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 239, 249, 250, 251, 258, 268, 269, 271, 276, 286, 287, 291, 292, 296, 298, 299, 300, 301, 302, 303, 304, 313, 314, 315, 316, 317, 318, 344, 345, 347, 349, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 373, 384, 392], "inputfil": [1, 13, 14, 15, 30, 31, 32, 61, 62, 63, 81, 82, 83, 95, 96, 97, 111, 112, 113, 124, 125, 126, 139, 140, 141, 167, 173, 175, 176], "str": [1, 11, 12, 13, 14, 15, 17, 20, 22, 28, 29, 30, 31, 32, 35, 37, 39, 59, 60, 61, 62, 63, 66, 71, 73, 74, 76, 80, 81, 82, 83, 84, 85, 93, 94, 95, 96, 97, 100, 103, 105, 110, 111, 112, 113, 114, 115, 117, 118, 121, 123, 124, 125, 126, 127, 128, 129, 136, 137, 139, 140, 141, 143, 145, 147, 150, 152, 153, 154, 158, 159, 160, 161, 162, 163, 168, 169, 171, 172, 173, 174, 175, 176, 178, 182, 183, 184, 186, 187, 192, 193, 203, 232, 233, 238, 245, 249, 251, 252, 253, 257, 264, 268, 269, 270, 271, 275, 282, 286, 287, 289, 291, 292, 293, 294, 296, 297, 298, 299, 300, 301, 302, 303, 304, 307, 308, 314, 315, 317, 318, 321, 324, 325, 342, 343, 344, 345, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 373, 374], "input": [1, 3, 4, 8, 9, 10, 13, 14, 15, 21, 23, 30, 31, 32, 38, 40, 61, 62, 63, 75, 77, 81, 82, 83, 86, 87, 88, 89, 95, 96, 97, 99, 104, 107, 111, 112, 113, 116, 117, 124, 125, 126, 130, 132, 139, 140, 141, 146, 154, 163, 165, 166, 167, 173, 175, 176, 188, 203, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 233, 239, 253, 258, 271, 276, 289, 291, 292, 293, 294, 297, 349, 356, 357, 373, 374, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 391, 392], "singl": [1, 13, 30, 61, 62, 81, 82, 95, 96, 112, 124, 140, 175, 379, 380, 381, 382, 383, 384, 385, 386, 392], "element": [1, 8, 9, 14, 96, 217, 218], "gener": [1, 12, 13, 14, 15, 21, 22, 23, 29, 30, 31, 32, 38, 39, 40, 60, 61, 62, 63, 75, 76, 81, 82, 83, 86, 94, 95, 96, 97, 104, 105, 111, 112, 113, 116, 117, 122, 124, 125, 126, 128, 129, 130, 131, 132, 134, 137, 138, 139, 140, 141, 142, 146, 147, 150, 152, 162, 165, 167, 173, 175, 176, 183, 188, 215, 242, 246, 247, 261, 265, 266, 271, 279, 283, 284, 289, 294, 297, 302, 304, 308, 315, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 389, 391, 392], "argsdict": [1, 19, 193, 240, 259, 277], "dict": [1, 19, 161, 163, 187, 193, 240, 249, 259, 268, 277, 286, 291, 292, 294, 342, 343, 386], "its": [1, 19, 49, 154, 163, 181, 203, 240, 259, 277, 324, 350, 373, 386, 389, 392], "specif": [1, 19, 193, 215, 240, 259, 277, 289, 381, 382, 384, 385, 389], "dictionari": [1, 19, 167, 193, 240, 249, 259, 268, 277, 286, 291, 292, 294, 309, 320, 343], "": [1, 19, 64, 117, 167, 190, 214, 223, 227, 308, 317, 324, 342, 343, 345, 348, 378, 380, 381, 383, 385, 386, 389, 391, 392], "shall": [1, 3, 7, 19, 21, 27, 38, 48, 75, 79, 86, 91, 102, 104, 107, 109, 116, 120, 122, 128, 130, 132, 135, 146, 154, 170, 188, 293, 378, 387, 389, 392], "least": [1, 19, 293, 382, 385, 389], "kei": [1, 19, 154, 161, 167, 179, 249, 268, 286, 291, 293, 309, 320, 386], "current": [1, 19, 20, 21, 22, 24, 33, 37, 38, 39, 73, 74, 75, 76, 77, 85, 86, 88, 89, 98, 102, 103, 104, 105, 115, 116, 128, 129, 130, 145, 146, 147, 152, 183, 184, 185, 186, 187, 188, 249, 250, 251, 268, 269, 286, 287, 379, 380, 381, 382, 383, 384, 385, 386, 392], "instanc": [1, 3, 13, 19, 20, 21, 22, 30, 37, 38, 39, 40, 61, 73, 74, 75, 76, 81, 85, 86, 95, 102, 103, 104, 105, 115, 116, 117, 124, 128, 129, 130, 145, 146, 147, 152, 183, 184, 185, 186, 187, 188, 193, 203, 240, 249, 250, 251, 259, 268, 269, 277, 286, 287, 378, 383, 384, 385, 386, 391, 392], "so": [1, 19, 20, 21, 22, 37, 38, 39, 40, 73, 74, 75, 76, 85, 86, 102, 103, 104, 105, 115, 116, 128, 129, 130, 145, 146, 147, 152, 183, 184, 185, 186, 187, 188, 249, 250, 251, 268, 269, 286, 287, 378, 385, 387, 391, 392], "possibl": [1, 19, 20, 21, 22, 37, 38, 39, 40, 73, 74, 75, 76, 85, 86, 102, 103, 104, 105, 115, 116, 117, 128, 129, 130, 145, 146, 147, 152, 179, 183, 184, 185, 186, 187, 188, 197, 249, 250, 251, 268, 269, 286, 287, 291, 378, 381, 383, 386, 389], "chain": [1, 19, 20, 21, 22, 37, 38, 39, 73, 74, 75, 76, 85, 86, 102, 103, 104, 105, 115, 116, 128, 129, 130, 145, 146, 147, 152, 183, 184, 185, 186, 187, 188, 249, 250, 251, 268, 269, 286, 287, 391, 392], "fluent": [1, 19, 20, 21, 22, 37, 38, 39, 73, 74, 75, 76, 85, 86, 102, 103, 104, 105, 115, 116, 128, 129, 130, 145, 146, 147, 152, 183, 184, 185, 186, 187, 188, 249, 250, 251, 268, 269, 286, 287, 392], "api": [1, 19, 20, 21, 22, 37, 38, 39, 73, 74, 75, 76, 85, 86, 102, 103, 104, 105, 115, 116, 128, 129, 130, 145, 146, 147, 152, 183, 184, 185, 186, 187, 188, 190, 249, 250, 251, 268, 269, 286, 287, 387, 388], "which": [1, 3, 21, 38, 40, 70, 75, 77, 86, 90, 102, 104, 116, 117, 128, 130, 146, 154, 188, 210, 215, 228, 230, 291, 299, 378, 379, 382, 383, 384, 389, 392], "digit": [1, 23, 88, 89, 99, 210, 214, 217, 218, 219, 228, 378, 380, 383, 386, 387], "height": [1, 23, 88, 89, 99, 210, 214, 215, 217, 218, 219, 228, 378, 380, 383, 386, 387], "model": [1, 23, 88, 89, 99, 210, 214, 217, 218, 219, 228, 306, 307, 323, 378, 380, 383, 386, 387], "correspond": [1, 23, 129, 167, 215, 291, 292, 300, 302, 315, 343, 344, 349, 358, 378, 380, 382, 383, 384, 385, 386, 392], "given": [1, 23, 117, 203, 315, 351, 358, 378, 380, 382, 383, 384, 385], "solar": [1, 23, 88, 380, 383], "posit": [1, 23, 117, 129, 214, 219, 225, 229, 379, 380, 384], "float": [1, 23, 24, 88, 89, 102, 153, 154, 163, 177, 181, 185, 214, 215, 227, 228, 232, 233, 247, 252, 253, 266, 270, 271, 284, 291, 292, 293, 342, 343, 380, 383, 386], "none": [1, 3, 20, 23, 24, 37, 73, 85, 90, 103, 107, 115, 122, 129, 132, 145, 153, 154, 183, 186, 187, 228, 250, 251, 252, 253, 269, 270, 271, 287, 289, 292, 293, 296, 298, 299, 301, 302, 303, 307, 308, 314, 315, 321, 324, 325, 342, 343, 351, 352, 353, 355, 358, 373, 379, 380, 383, 386], "surfac": [1, 23, 88, 378, 380, 383, 387], "point": [1, 23, 24, 33, 88, 89, 90, 98, 215, 227, 228, 293, 378, 380, 383], "pixel": [1, 8, 9, 23, 24, 33, 34, 88, 89, 98, 102, 154, 155, 157, 163, 181, 185, 213, 214, 215, 216, 217, 218, 220, 221, 222, 223, 225, 226, 228, 229, 230, 271, 289, 293, 302, 343, 373, 378, 379, 380, 383, 385, 386], "At": [1, 23, 382, 385], "p": [1, 23, 54, 55, 88, 379, 380, 383, 385, 391, 392], "check": [1, 23, 344, 362, 363, 364], "ani": [1, 23, 203, 292, 387, 389, 392], "other": [1, 23, 203, 270, 291, 293, 380, 383, 389, 391, 392], "direct": [1, 23, 88, 89, 92, 203, 214, 228, 383, 389], "sun": [1, 23, 24, 25, 26, 380], "achiev": [1, 13, 23, 30, 61, 81, 82, 95, 112, 124, 140], "goal": [1, 23], "algorithm": [1, 23, 88, 208, 209, 236, 249, 256, 268, 270, 274, 286, 289, 383], "angl": [1, 23, 33, 88, 89, 98, 214, 228, 380, 383], "gamma": [1, 23, 88, 383], "tan": [1, 23, 88, 383], "frac": [1, 23, 42, 43, 44, 47, 50, 51, 53, 54, 55, 56, 57, 58, 65, 67, 68, 69, 70, 88, 211, 212, 213, 216, 220, 222, 224, 225, 226, 230, 382, 383], "distanc": [1, 23, 24, 33, 88, 89, 98, 185, 228, 293, 380, 383, 386], "_____": [1, 23, 88, 383], "x": [1, 23, 88, 383, 386], "from": [1, 23, 24, 33, 54, 55, 57, 64, 67, 69, 88, 89, 98, 106, 139, 154, 166, 203, 213, 214, 216, 220, 221, 222, 223, 225, 226, 228, 229, 230, 239, 258, 271, 276, 291, 292, 294, 345, 356, 357, 365, 371, 373, 379, 380, 381, 382, 383, 385, 387, 388, 389, 391, 392], "__": [1, 23, 88, 383], "____p_______": [1, 23, 88, 383], "___": [1, 23, 88, 383], "__v____________": [1, 23, 88, 383], "anoth": [1, 23, 378, 386], "one": [1, 14, 23, 31, 40, 49, 73, 88, 129, 154, 167, 174, 210, 214, 217, 218, 219, 228, 239, 248, 258, 267, 271, 276, 285, 298, 309, 378, 379, 380, 381, 382, 383, 384, 385, 386, 389, 392], "elevation_": [1, 23], "avoid": [1, 23, 88, 383], "test": [1, 23, 88, 378, 383, 392], "too": [1, 23, 88, 383], "mani": [1, 23, 88, 383], "max": [1, 23, 88, 89, 98, 180, 291, 292, 294, 383, 386, 387], "user": [1, 23, 270, 383], "automat": [1, 23, 380], "In": [1, 23, 69, 88, 117, 129, 167, 180, 229, 383, 384, 386, 389, 391, 392], "latter": [1, 23, 391], "case": [1, 23, 167, 343, 391, 392], "delta": [1, 23], "h": [1, 23, 50, 51, 56, 69, 220, 229, 342, 343, 378, 379, 380, 381, 382, 383, 384, 385, 386, 391, 392], "where": [1, 11, 17, 20, 23, 28, 35, 37, 59, 71, 73, 77, 80, 84, 85, 88, 93, 100, 103, 110, 114, 115, 117, 122, 123, 127, 129, 136, 143, 145, 163, 168, 172, 180, 182, 184, 186, 214, 215, 220, 228, 249, 268, 286, 291, 293, 294, 296, 298, 299, 301, 302, 303, 308, 378, 379, 380, 382, 383, 384, 385, 386, 389], "min": [1, 23, 180, 291, 292, 294, 386, 387], "output": [1, 11, 13, 20, 23, 28, 30, 37, 40, 49, 59, 61, 73, 74, 77, 80, 81, 85, 88, 93, 95, 103, 110, 115, 117, 121, 122, 123, 124, 129, 136, 145, 171, 172, 179, 186, 193, 205, 215, 217, 218, 239, 258, 271, 276, 289, 292, 294, 296, 298, 299, 301, 302, 303, 308, 377, 379, 380, 381, 382, 383, 384, 385, 386, 391, 392], "mask": [1, 23, 214, 215, 301, 307, 315, 320, 321, 342, 343, 358, 359, 360, 361, 364, 365, 366, 371, 373, 380, 382, 385, 391, 392], "equal": [1, 23, 383], "degre": [1, 24, 25, 26, 214, 380], "consid": [1, 24, 89, 98, 185, 211, 212, 213, 214, 216, 220, 221, 222, 223, 224, 225, 226, 229, 230, 293], "evalu": [1, 24, 33, 89, 98, 228, 380, 383], "meter": [1, 24, 34, 89, 99, 228, 380, 383], "sever": [1, 21, 22, 38, 39, 40, 75, 76, 77, 86, 88, 104, 105, 116, 130, 146, 147, 152, 167, 188, 307, 378, 381, 383, 386, 387, 391, 392], "subcommand": [1, 190, 378, 379, 380, 381], "usag": [1, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387], "exampl": [1, 77, 291, 292, 294, 379, 380, 381, 382, 383, 384, 385, 386, 389, 392], "definit": [1, 191, 195, 196, 198, 199, 200, 201, 207, 231, 236, 256, 274, 305, 324, 342, 343, 345, 373, 379, 389, 391, 392], "new": [1, 249, 268, 286, 293, 345, 384, 386, 387, 391, 392], "json": [1, 187, 345, 378, 386, 387, 391, 392], "string": [1, 117, 129, 154, 314, 327, 343, 345, 384, 392], "have": [1, 13, 30, 61, 62, 81, 95, 111, 124, 139, 175, 203, 210, 214, 217, 218, 219, 227, 228, 293, 294, 302, 307, 381, 386, 389, 392], "format": [1, 117, 129, 160, 171, 179, 186, 294, 314, 343, 348, 372, 373, 380, 383, 384, 385, 386, 389, 391, 392], "rgb_tif": [1, 392], "rgb_tif_": [1, 392], "date": [1, 132, 134, 142, 163, 166, 167, 215, 227, 294, 343, 348, 385, 386, 389, 391, 392], "0": [1, 24, 44, 51, 64, 68, 69, 70, 117, 129, 153, 154, 214, 216, 220, 223, 226, 228, 229, 230, 232, 233, 252, 253, 289, 378, 380, 383, 384, 386, 389, 391, 392], "9_": [1, 392], "y": [1, 51, 54, 55, 220, 342, 343, 386, 391, 392], "m": [1, 54, 55, 342, 343, 381, 391, 392], "d_": [1, 392], "rgb_tif_arch": [1, 392], "9": [1, 70, 230, 389, 391, 392], "_": [1, 12, 29, 60, 94, 137, 150, 289, 391, 392], "tif_": [1, 392], "r": [1, 47, 51, 56, 68, 69, 216, 220, 226, 229, 378, 381, 392], "g": [1, 40, 70, 180, 185, 213, 230, 291, 292, 294, 315, 373, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 392], "b": [1, 57, 379, 382, 385, 386, 389, 392], "n": [1, 88, 383, 384, 392], "uniqu": [1, 154, 157, 180, 291, 294, 386, 392], "regexp": [1, 355, 361, 392], "match": [1, 40, 117, 215, 227, 344, 381, 382, 385, 392], "catch": [1, 392], "group": [1, 343, 357, 392], "metadata": [1, 106, 293, 386, 392], "rel": [1, 316, 392], "orbit": [1, 316, 392], "number": [1, 88, 89, 92, 177, 211, 212, 213, 216, 220, 221, 222, 223, 224, 225, 226, 228, 229, 230, 289, 316, 378, 383, 384, 385, 386, 392], "relorbit": [1, 391, 392], "free": [1, 312, 389, 392], "option": [1, 3, 20, 22, 24, 37, 39, 73, 76, 85, 103, 105, 107, 115, 117, 129, 132, 145, 147, 152, 154, 183, 184, 186, 187, 194, 197, 203, 228, 251, 269, 271, 287, 289, 291, 292, 293, 294, 296, 298, 299, 300, 301, 302, 303, 304, 308, 315, 343, 373, 378, 379, 380, 381, 382, 383, 384, 385, 386, 392], "when": [1, 12, 13, 21, 29, 30, 38, 60, 61, 75, 77, 81, 86, 87, 94, 95, 104, 116, 117, 124, 129, 130, 137, 146, 148, 150, 158, 166, 167, 188, 214, 271, 378, 384, 385, 386, 391, 392], "archiv": [1, 77, 319, 387, 389, 392], "zip": [1, 307, 319, 378, 381, 382, 385, 392], "tar": [1, 319, 392], "gz": [1, 392], "etc": [1, 306, 323, 380, 386, 387, 392], "pattern": [1, 324, 343, 346, 357, 369, 391, 392], "enabl": [1, 131, 167, 306, 307, 323, 327, 346, 369, 378, 386, 387, 392], "per": [1, 40, 49, 73, 154, 158, 167, 174, 187, 227, 239, 258, 271, 276, 378, 379, 380, 381, 382, 383, 384, 385, 386, 392], "multi": [1, 392], "first": [1, 210, 211, 212, 214, 217, 218, 219, 227, 228, 291, 292, 379, 380, 381, 382, 383, 385, 386, 388, 392], "must": [1, 40, 117, 129, 163, 193, 215, 227, 228, 293, 294, 302, 307, 373, 382, 384, 385, 389, 391, 392], "variabl": [1, 378, 392], "part": [1, 18, 22, 36, 39, 72, 76, 88, 101, 105, 144, 147, 151, 152, 383, 389, 392], "replac": [1, 292, 389, 392], "below": [1, 389, 392], "By": [1, 15, 32, 63, 83, 97, 113, 117, 126, 129, 141, 176, 378, 379, 384, 386, 392], "d": [1, 56, 69, 70, 229, 230, 342, 343, 384, 386, 389, 391, 392], "data": [1, 4, 8, 9, 10, 22, 24, 39, 66, 69, 74, 76, 105, 147, 152, 163, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 234, 236, 239, 242, 244, 246, 247, 254, 256, 258, 261, 263, 265, 266, 270, 271, 272, 274, 276, 279, 281, 283, 284, 296, 297, 298, 299, 302, 303, 304, 306, 307, 315, 323, 343, 378, 381, 382, 384, 385, 392], "10000": [1, 342, 343, 391, 392], "masknnodata": [1, 392], "For": [1, 106, 117, 129, 292, 378, 379, 384, 386, 389, 391, 392], "everi": [1, 13, 30, 40, 61, 77, 81, 88, 95, 106, 117, 124, 154, 157, 302, 383, 385, 386, 392], "filenam": [1, 66, 74, 117, 129, 158, 293, 296, 297, 298, 299, 302, 303, 384, 385, 391, 392], "insert": [1, 392], "reus": [1, 392], "fulli": [1, 373, 386, 392], "qualifi": [1, 373, 392], "python": [1, 388, 392], "function": [1, 190, 191, 193, 196, 197, 202, 203, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 228, 229, 230, 231, 232, 233, 271, 288, 289, 290, 291, 292, 293, 294, 295, 305, 343, 365, 372, 373, 379, 391, 392], "convert": [1, 343, 392], "binari": [1, 392], "unmask": [1, 392], "entri": [1, 300, 378, 386], "console_script": 1, "arg": [1, 392], "allow": [270, 289, 315, 391], "extern": [1, 51, 190, 220], "sy": 378, "exit": [203, 378, 379, 380, 381, 382, 383, 384, 385, 386], "everyth": 378, "fine": 378, "error": [203, 377, 378, 384, 392], "occur": [203, 392], "2": [1, 42, 43, 44, 51, 52, 65, 69, 70, 185, 211, 212, 213, 220, 221, 224, 229, 230, 232, 233, 252, 253, 291, 292, 293, 294, 307, 378, 380, 381, 382, 384, 387, 389, 391, 392], "wrong": [1, 87, 378], "execut": [1, 13, 30, 61, 81, 95, 111, 124, 139, 173, 193, 378, 379, 380, 389, 392], "radiometr": [1, 40, 45, 46, 231, 232, 237, 250, 378, 381, 382, 387], "If": [1, 20, 24, 31, 37, 40, 49, 73, 85, 90, 102, 103, 115, 129, 145, 154, 183, 184, 186, 193, 203, 210, 214, 215, 217, 218, 219, 227, 228, 289, 291, 292, 294, 296, 298, 299, 301, 302, 303, 307, 308, 309, 315, 373, 378, 380, 381, 383, 385, 386, 389, 392], "request": [1, 40, 173, 379, 381, 385], "fals": [1, 40, 73, 77, 153, 154, 183, 184, 189, 193, 214, 248, 252, 253, 267, 270, 271, 285, 291, 294, 299, 381, 392], "realiz": [1, 40], "subset": [1, 40, 381], "region": [1, 40, 74, 292, 294, 315, 379, 381, 387], "Of": [1, 40], "interest": [1, 40, 74, 304, 315, 379, 381, 386, 387], "e": [1, 40, 47, 73, 180, 185, 216, 291, 292, 294, 315, 373, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388], "shapefil": [1, 40, 117, 179, 186, 381, 386, 387], "geojson": [1, 40, 117, 179, 186, 296, 298, 299, 301, 303, 315, 384, 386, 387, 392], "recogn": [1, 40, 391], "exist": [1, 40, 392], "bright": [1, 42, 43, 70, 211, 212, 213, 230], "index": [1, 42, 43, 44, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 64, 65, 67, 68, 69, 70, 117, 129, 161, 183, 211, 212, 213, 216, 220, 221, 222, 223, 224, 225, 226, 229, 230, 302, 382, 384, 386, 387], "3": [1, 43, 65, 210, 211, 212, 213, 214, 216, 217, 218, 219, 221, 222, 223, 224, 225, 226, 228, 229, 230, 239, 258, 276, 292, 307, 379, 380, 384, 389, 391, 392], "enhanc": [1, 44, 50, 213], "veget": [1, 44, 47, 51, 52, 56, 57, 64, 67, 68, 69, 70, 213, 216, 220, 221, 222, 223, 225, 226, 229, 230, 381, 386], "5": [1, 44, 68, 69, 214, 226, 228, 229, 380, 383, 389], "6": [1, 44, 380, 387, 389], "7": [1, 44, 64, 70, 223, 230, 271, 387, 389, 391], "infrar": [1, 47, 56, 216], "percentag": [1, 47, 154, 181, 216, 386], "refer": [1, 12, 22, 29, 39, 47, 50, 51, 54, 55, 56, 57, 60, 64, 67, 68, 69, 70, 76, 94, 105, 137, 147, 150, 152, 216, 220, 223, 225, 226, 228, 229, 230, 289, 379, 380, 383, 387], "crippen": [1, 47, 216], "1990": [1, 47, 70, 216, 230], "calcul": [1, 24, 47, 214, 216, 291, 292, 382, 383], "faster": [1, 47, 216, 296], "remot": [1, 47, 50, 51, 54, 55, 56, 57, 68, 69, 70, 216, 220, 226, 229, 230], "sens": [1, 47, 50, 51, 54, 55, 57, 69, 70, 216, 220, 229, 230], "environ": [1, 47, 51, 54, 55, 56, 57, 68, 69, 216, 220, 226, 229, 378, 388], "vol": [1, 47, 69, 216, 229], "34": [1, 47, 216], "pp": [1, 47, 216], "71": [1, 47, 216], "73": [1, 47, 216], "bool": [1, 7, 21, 27, 38, 48, 49, 73, 75, 79, 86, 91, 104, 109, 116, 120, 130, 135, 146, 153, 154, 155, 157, 164, 170, 183, 184, 188, 189, 193, 206, 248, 252, 253, 267, 270, 271, 285, 291, 294, 299, 315, 344, 362, 363, 364], "all": [1, 3, 13, 30, 49, 61, 73, 81, 88, 95, 107, 124, 132, 154, 163, 179, 189, 193, 197, 239, 248, 258, 267, 271, 276, 285, 289, 293, 298, 309, 312, 315, 321, 343, 347, 363, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 389, 392], "same": [1, 49, 73, 106, 163, 165, 210, 214, 217, 218, 219, 227, 228, 239, 258, 271, 276, 293, 309, 381, 382, 383, 385, 389], "otherwis": [1, 49, 193, 299, 351, 352, 353, 359, 360, 386, 389], "each": [1, 8, 9, 15, 32, 49, 63, 83, 88, 97, 102, 113, 126, 129, 141, 167, 173, 176, 213, 214, 215, 216, 217, 218, 220, 221, 222, 223, 225, 226, 228, 229, 230, 289, 291, 292, 293, 294, 300, 379, 383, 384, 386, 389], "own": [1, 49, 389, 392], "modifi": [1, 50, 51, 52, 220, 221, 389], "normal": [1, 50, 53, 54, 55, 56, 57, 58, 69, 222, 229, 381, 389], "water": [1, 50, 57, 58, 292], "xu": [1, 50], "q": [1, 50], "2006": [1, 50], "modif": [1, 50, 389], "normalis": [1, 50], "featur": [1, 50, 171, 174, 291, 383], "imageri": [1, 50], "intern": [1, 50, 69, 229, 289], "journal": [1, 50], "27": [1, 50, 380], "3025": [1, 50], "3033": [1, 50], "soil": [1, 51, 52, 64, 68, 70, 213, 220, 221, 223, 226, 230], "adjust": [1, 51, 52, 68, 70, 213, 220, 221, 226, 230], "begin": [1, 51, 52, 69], "eqnarrai": [1, 51, 52, 69], "wdvi": [1, 51, 220], "4": [1, 51, 220, 384, 389, 391], "l": [1, 51, 64, 213, 220, 223], "end": [1, 51, 52, 69, 132, 134, 385, 389], "qi": [1, 51, 220], "j": [1, 51, 54, 55, 56, 64, 69, 220, 223, 229], "chehbouni": [1, 51, 220], "huet": [1, 51, 68, 220, 226], "kerr": [1, 51, 220], "1994": [1, 51, 220], "sen": [1, 51, 56, 68, 220, 226], "48": [1, 51, 220], "119": [1, 51, 220], "126": [1, 51, 220], "factor": [1, 51, 88, 96, 102, 199, 213, 220, 228, 378, 383, 387], "consider": [1, 51, 220], "develop": [1, 51, 220, 387], "proc": [1, 51, 220, 392], "physic": [1, 51, 220], "measur": [1, 24, 51, 69, 88, 214, 220, 229, 383], "signatur": [1, 51, 220, 373], "ispr": [1, 51, 220], "723": [1, 51, 220], "730": [1, 51, 220], "val": [1, 52], "sqrt": [1, 52, 69, 211, 212, 229], "built": [1, 53, 381, 382, 385, 386, 388], "up": [1, 20, 37, 53, 73, 74, 85, 103, 115, 128, 129, 145, 183, 184, 185, 186, 187, 203, 251, 269, 287, 307, 378], "pond": [1, 54, 55], "lacaux": [1, 54, 55], "tourr": [1, 54, 55], "c": [1, 54, 55, 56, 57, 64, 67, 223, 225, 386, 389], "vignol": [1, 54, 55], "ndion": [1, 54, 55], "lafay": [1, 54, 55], "classif": [1, 54, 55, 300, 386], "high": [1, 54, 55], "spatial": [1, 54, 55, 214, 228, 384], "applic": [1, 54, 55, 389], "rift": [1, 54, 55], "vallei": [1, 54, 55], "fever": [1, 54, 55], "epidem": [1, 54, 55], "seneg": [1, 54, 55], "106": [1, 54, 55], "66": [1, 54, 55], "74": [1, 54, 55, 64, 223], "elsevi": [1, 54, 55], "publish": [1, 54, 55], "2007": [1, 54, 55], "turbid": [1, 55], "rous": [1, 56, 69, 229], "w": [1, 56, 69, 229, 379, 380, 381, 383, 385, 386], "haa": [1, 56, 69, 229], "schell": [1, 56, 69, 229], "deer": [1, 56, 69, 229], "1973": [1, 56], "monitor": [1, 56], "system": [1, 56, 292, 389], "great": [1, 56], "plain": [1, 56], "ert": [1, 56], "third": [1, 56, 389], "symposium": [1, 56, 69, 70, 229, 230], "nasa": [1, 56], "sp": [1, 56, 378, 382], "351": [1, 56], "309": [1, 56, 68, 226], "317": [1, 56], "tucker": [1, 56], "1979": [1, 56], "photograph": [1, 56], "linear": [1, 56, 131, 385, 387], "combin": [1, 56, 294, 389], "127": [1, 56], "150": [1, 56], "gao": [1, 57], "1996": [1, 57], "liquid": [1, 57], "space": [1, 57, 154], "58": [1, 57, 380], "257": [1, 57], "266": [1, 57], "posix": [1, 62, 175], "path": [1, 11, 14, 28, 31, 59, 62, 80, 93, 110, 123, 136, 172, 175, 193, 203, 289, 291, 292, 294, 296, 297, 298, 299, 301, 302, 303, 304, 307, 308, 309, 311, 315, 320, 321, 344, 349, 356, 357, 373, 374, 391], "been": [1, 13, 30, 61, 62, 81, 95, 111, 124, 139, 175, 203, 293, 389], "perpendicular": [1, 64, 223], "90893": [1, 64, 223], "46216": [1, 64, 223], "richardson": [1, 64, 223], "wiegand": [1, 64, 223], "1977": [1, 64, 223], "distinguish": [1, 64, 223], "background": [1, 64, 213, 223], "inform": [1, 64, 223, 228, 379, 380, 383, 389, 391], "photogramm": [1, 64, 223], "eng": [1, 64, 223], "rem": [1, 64, 223], "43": [1, 64, 223], "1541": [1, 64, 223], "1552": [1, 64, 223], "ratio": [1, 67, 225], "jordan": [1, 67, 225], "f": [1, 67, 70, 225, 230, 386, 388, 392], "1969": [1, 67, 225], "deriv": [1, 67, 106, 111, 225, 382, 387, 389], "leaf": [1, 67, 225], "qualiti": [1, 67, 225], "light": [1, 67, 88, 225, 383], "forest": [1, 67, 225, 292], "floor": [1, 67, 225], "ecologi": [1, 67, 225], "50": [1, 67, 225, 383, 389], "663": [1, 67, 225], "666": [1, 67, 225], "1988": [1, 68, 226], "25": [1, 68, 226, 380, 383, 385], "295": [1, 68, 226], "transform": [1, 13, 30, 61, 69, 70, 81, 95, 124, 229, 230, 389], "1975": [1, 69, 229], "forag": [1, 69, 229], "graze": [1, 69, 229], "unit": [1, 69, 227, 229], "landsat": [1, 69, 229], "mss": [1, 69, 229], "page": [1, 69, 229, 387, 389], "1169": [1, 69, 229], "1178": [1, 69, 229], "cook": [1, 69, 229], "ed": [1, 69, 229], "proceed": [1, 69, 229], "tenth": [1, 69, 229], "ann": [1, 69, 229], "arbor": [1, 69, 229], "michigan": [1, 69, 229], "usa": [1, 69, 229], "08": [1, 70, 230], "baret": [1, 70, 230], "guyot": [1, 70, 230], "major": [1, 70, 180, 230, 386], "1989": [1, 70, 230], "minim": [1, 70, 230], "effect": [1, 70, 230], "lai": [1, 70, 230], "apar": [1, 70, 230], "estim": [1, 70, 88, 230, 383], "12th": [1, 70, 230], "canadian": [1, 70, 230], "igarss": [1, 70, 230], "vancouv": [1, 70, 230], "canada": [1, 70, 230], "07": [1, 70, 230, 382], "10": [1, 70, 230, 382, 385], "14": [1, 70, 230], "dir": [1, 17, 20, 35, 37, 71, 73, 77, 84, 85, 100, 103, 114, 115, 117, 122, 127, 129, 143, 145, 182, 186, 205, 308, 319, 379, 384, 392], "store": [1, 11, 17, 20, 21, 28, 35, 37, 38, 59, 71, 73, 75, 77, 80, 84, 85, 86, 93, 100, 103, 104, 110, 114, 115, 116, 117, 122, 123, 127, 129, 130, 136, 143, 145, 146, 172, 182, 186, 188, 203, 293, 308, 378, 379, 380, 381, 382, 383, 384, 385, 386], "result": [1, 11, 20, 28, 37, 59, 73, 77, 80, 85, 93, 103, 110, 115, 123, 129, 136, 145, 172, 186, 289, 293, 304, 379, 380, 381, 382, 383, 384, 385, 386, 389], "whether": [1, 7, 21, 27, 38, 48, 73, 75, 77, 79, 86, 91, 104, 109, 116, 120, 130, 135, 146, 155, 157, 164, 170, 184, 188, 189, 193, 206, 248, 267, 271, 285, 315, 319, 386, 389], "input_imag": [1, 289, 291, 297], "image_channel": 1, "indice_imag": 1, "tupl": [1, 289, 345], "produc": [1, 386], "multipl": [1, 289, 294, 382, 383], "order": [1, 165, 213, 215, 216, 220, 221, 222, 223, 224, 225, 226, 229, 230, 294, 386], "split": [1, 18, 22, 36, 39, 72, 76, 101, 105, 144, 147, 151, 152, 378, 387, 392], "small": [1, 18, 22, 36, 39, 72, 76, 101, 105, 144, 147, 151, 152, 289, 378, 379], "also": [1, 117, 180, 378, 383, 386, 387, 389, 391, 392], "except": [1, 87, 154, 203, 389, 392], "rais": [1, 31, 87, 203, 210, 214, 215, 217, 218, 219, 227, 228, 289, 292, 294, 392], "invalid": [1, 87, 378, 392], "setup": 1, "final": 1, "decor": [1, 148], "some": [1, 359, 360, 385, 386, 391], "capabl": [1, 148, 183, 387], "over": [1, 291, 292, 294], "cpu": [1, 22, 39, 76, 105, 147, 152, 378], "abc": [1, 77], "common": [1, 77, 389], "save": [1, 77, 183, 289, 294, 296, 298, 299, 301, 302, 303, 382, 384], "disk": [1, 21, 38, 75, 77, 86, 104, 116, 117, 130, 146, 188, 296, 298, 299, 301, 302, 303, 378], "intermedi": [1, 7, 17, 21, 27, 35, 38, 48, 71, 75, 77, 79, 84, 86, 91, 100, 104, 109, 114, 116, 120, 127, 130, 135, 143, 146, 170, 182, 188, 203, 378], "handl": [1, 21, 38, 75, 77, 86, 104, 116, 130, 146, 188, 203, 289, 307, 372, 377, 378, 391, 392], "mainli": [1, 77], "debug": [1, 21, 38, 75, 77, 86, 104, 116, 130, 146, 188, 203, 378], "purpos": [1, 21, 38, 75, 77, 86, 104, 116, 130, 146, 188, 389], "kept": [1, 7, 27, 48, 79, 91, 109, 120, 135, 170], "outputfil": [1, 13, 30, 61, 81, 95, 111, 124, 139, 173], "postprocess": [1, 13, 30, 61, 81, 95, 124], "step": [1, 13, 30, 61, 81, 95, 124], "mai": [1, 13, 30, 61, 81, 95, 124, 291, 385, 389], "consist": [1, 13, 30, 61, 81, 95, 124, 387, 389], "mix": [1, 13, 30, 61, 81, 95, 124], "them": [1, 13, 30, 61, 81, 95, 124], "ones": [1, 13, 30, 61, 81, 95, 117, 124], "implement": [1, 13, 15, 30, 32, 61, 63, 81, 82, 83, 95, 97, 112, 113, 124, 126, 140, 141, 176, 291], "doe": [1, 13, 30, 61, 81, 82, 95, 112, 124, 140, 167, 210, 214, 217, 218, 219, 228, 380, 383, 384, 387, 389, 392], "noth": [1, 13, 30, 61, 81, 82, 95, 112, 124, 140, 296, 298, 299, 301, 302, 303, 389], "overrid": [1, 13, 15, 30, 32, 61, 63, 81, 82, 83, 95, 97, 112, 113, 124, 126, 140, 141, 176], "method": [1, 2, 13, 23, 30, 40, 61, 77, 81, 82, 88, 95, 106, 112, 117, 124, 131, 140, 148, 153, 167, 193, 232, 252, 270, 288, 295, 307, 315, 324, 342, 392], "subclass": [1, 13, 15, 30, 32, 61, 63, 81, 82, 83, 95, 97, 112, 113, 124, 126, 140, 141, 176], "whole": [1, 13, 30, 61, 81, 95, 124, 184, 386, 387, 389], "after": [1, 13, 30, 61, 81, 88, 95, 111, 124, 139, 167, 173, 289, 294, 383, 385, 391], "empti": [1, 12, 13, 29, 30, 60, 61, 81, 82, 94, 95, 112, 124, 137, 140, 150, 163, 193, 215, 359, 360], "recurs": [1, 15, 32, 63, 83, 97, 113, 126, 141, 176, 379], "meant": [1, 15, 32, 63, 83, 97, 113, 126, 141, 176], "overriden": [1, 15, 32, 63, 83, 97, 113, 126, 141, 176], "prefer": [1, 15, 32, 63, 83, 97, 113, 126, 141, 167, 176, 389], "postproces_fil": [1, 15, 32, 63, 83, 97, 113, 126, 141, 176], "instead": [1, 15, 32, 63, 83, 97, 113, 126, 141, 176], "complex": [1, 21, 38, 75, 86, 104, 116, 130, 146, 188, 378], "compos": [1, 21, 38, 75, 86, 104, 116, 130, 146, 188, 378], "object": [1, 148, 203, 270, 289, 307, 312, 324, 342, 389, 392], "mode": [1, 12, 22, 29, 39, 60, 76, 94, 105, 137, 147, 148, 150, 152, 289], "pad": [1, 12, 22, 29, 39, 60, 76, 94, 105, 137, 147, 148, 150, 152, 193, 206, 289, 379, 380, 383], "http": [1, 12, 22, 29, 39, 60, 76, 94, 105, 137, 147, 150, 152, 289, 379, 380, 383, 387, 389], "numpi": [1, 4, 8, 9, 10, 12, 22, 29, 39, 60, 76, 94, 105, 137, 147, 150, 152, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 233, 239, 252, 253, 258, 271, 276, 289, 307, 379, 380, 383], "org": [1, 12, 22, 29, 39, 60, 76, 94, 105, 137, 147, 150, 152, 289, 379, 380, 383, 389], "doc": [1, 12, 22, 29, 39, 60, 76, 94, 105, 137, 147, 150, 152, 289, 379, 380, 383], "stabl": [1, 12, 22, 29, 39, 60, 76, 94, 105, 137, 147, 150, 152, 289, 379, 380, 383], "html": [1, 12, 22, 29, 39, 60, 76, 94, 105, 137, 147, 150, 152, 289, 379, 380, 383], "around": [1, 22, 39, 76, 105, 147, 152, 214, 228, 379, 380, 383], "time": [1, 106, 131, 132, 215, 227, 294, 378, 382, 385, 387], "radiometri": [1, 111, 382, 387], "known": [1, 106], "extract": [1, 88, 106, 166, 203, 293, 301, 306, 313, 314, 316, 317, 318, 323, 356, 357, 383, 387, 391], "timestamp": [1, 106, 163, 167, 215, 227, 306, 313, 314, 323, 343, 356, 386, 391], "tempor": [1, 111, 294, 378], "individu": [1, 111, 139, 389], "date0": 1, "datetim": [1, 131, 132, 294, 313, 343, 356], "date1": 1, "product0": 1, "product1": 1, "speed_imag": 1, "evolut": [1, 294], "dure": [1, 203, 392], "interv": [1, 227], "dataset": [1, 248, 267, 271, 285, 289, 302, 373, 392], "second": [1, 227, 380, 381, 382], "sky": [1, 88, 96, 102, 199, 228, 378, 383, 387], "view": [1, 88, 96, 102, 199, 228, 378, 383, 387], "kokalj": [1, 88], "\u017eiga": [1, 88], "2013": [1, 88], "geophys": [1, 88, 383], "portion": [1, 88, 383], "visibl": [1, 88, 228, 383], "certain": [1, 88, 383], "abov": [1, 88, 383, 389], "especi": [1, 88, 383], "relev": [1, 88, 294, 383, 386], "energi": [1, 88, 383], "balanc": [1, 88, 383], "studi": [1, 88, 383], "diffus": [1, 88, 383], "insol": [1, 88, 383], "proport": [1, 88, 383], "omega": [1, 88, 383], "observ": [1, 88, 214, 383], "seen": [1, 88, 383], "two": [1, 88, 117, 132, 227, 381, 382, 383, 385, 387, 392], "dimension": [1, 88, 383], "represent": [1, 88, 383], "fall": [1, 88, 383], "onto": [1, 88, 214, 383], "reduc": [1, 88, 213, 383], "obstacl": [1, 88, 383], "form": [1, 88, 383, 389], "horizon": [1, 88, 214, 380, 383], "These": [1, 88, 383], "describ": [1, 88, 383, 389, 390, 391], "vertic": [1, 24, 88, 228, 383], "horizont": [1, 88, 214, 228, 380, 383], "plane": [1, 88, 214, 383], "good": [1, 88, 383], "approxim": [1, 88, 383], "therefor": [1, 88, 383], "perform": [1, 88, 381, 383, 387, 389], "determin": [1, 8, 9, 10, 88, 219, 383, 389], "chosen": [1, 88, 203, 383], "co": [1, 88, 383], "gamma_i": [1, 88, 383], "keep": [1, 88, 299, 378, 383], "largest": [1, 88, 383], "geometry_fil": [1, 117, 118], "take": [1, 117, 271, 380, 383], "select": [1, 117, 193], "basenam": [1, 117, 129, 384], "rule": [1, 117], "origin": [1, 117, 129, 384, 389], "_tile": [1, 117, 129, 384], "tile75": [1, 117, 129, 384], "id": [1, 117, 128, 129, 183, 294, 300, 315, 353, 354, 358, 384, 386, 387], "75": [1, 117, 129, 384], "subdir": [1, 117, 122, 129], "selet": [1, 117], "expect": [1, 117, 362, 363, 383], "convent": [1, 122, 129, 384, 391], "directli": [1, 122, 129, 384], "id_column": [1, 128, 384], "column": [1, 128, 160, 169, 187, 211, 212, 213, 216, 220, 221, 222, 223, 224, 225, 226, 229, 230, 292, 294, 304, 384, 386], "gap": [1, 131, 378, 385, 387], "due": [1, 385], "cloud": [1, 343, 365, 371, 382, 385], "interpol": [1, 131, 215, 385, 387], "thu": [1, 131, 378, 383, 385, 386, 391, 392], "fill": [1, 131, 215, 378, 385, 387], "seri": [1, 131, 215, 294, 378, 382, 385], "dai": [1, 132, 138, 385], "start": [1, 132, 142, 385], "products_per_d": 1, "timeseries_d": 1, "timeseries_imag": 1, "statist": [1, 153, 154, 155, 163, 167, 168, 175, 181, 183, 184, 290, 291, 292, 293, 294, 299, 378, 386, 387, 391], "suffix": 1, "concaten": [1, 154], "highest": [1, 383], "power": [1, 389], "less": [1, 271], "than": [1, 31, 185, 271, 296], "window_width": 1, "shift": 1, "stop": 1, "yield": 1, "dimens": [1, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 221, 222, 223, 224, 225, 226, 228, 229, 230, 239, 258, 276, 379], "accord": [1, 300], "width": [1, 215], "between": [1, 132, 214, 227, 289, 381, 385], "consecut": [1, 132, 289, 385], "firstli": 1, "y_min": 1, "y_max": 1, "x_min": 1, "x_max": 1, "windoww": 1, "std": [1, 180, 185, 291, 292, 293, 294, 386], "dev": 1, "zone": [1, 294, 304, 382, 386], "provid": [1, 179, 203, 291, 292, 345, 379, 380, 381, 382, 383, 384, 385, 386, 387, 389, 391, 392], "outlier": [1, 177, 185, 293, 386], "emphas": 1, "greater": [1, 185, 213], "stddev": 1, "parametr": [1, 236, 249, 256, 268, 274, 286], "chart": [1, 162, 164, 173, 183, 294, 386], "we": [1, 384, 386, 389], "becaus": [1, 381, 384, 392], "zonal": [1, 153, 168, 184, 187, 291, 292, 378, 386], "multipli": [1, 154, 155, 386], "count": [1, 154, 157, 180, 291, 307, 386], "categori": [1, 158, 159, 160, 187, 292, 300, 304, 386], "either": [1, 159, 315, 379, 381, 382, 385, 386, 389], "categroy_fil": [1, 160, 386], "onli": [1, 160, 184, 193, 210, 214, 217, 218, 219, 228, 248, 267, 271, 285, 296, 298, 299, 301, 302, 303, 304, 309, 379, 381, 384, 386, 389, 391], "displai": [1, 161, 164, 183, 271, 294, 343, 378, 386, 389], "geodatafram": [1, 163, 291, 292, 293, 294, 296, 297, 298, 299, 300, 301, 302, 303, 304], "descr": [1, 163], "area_square_met": [1, 163], "project": [1, 163, 214, 387, 388], "repres": [1, 163, 214, 227, 228, 382, 386, 387, 389], "dictionnari": [1, 163], "associ": [1, 163, 187, 343, 389], "thei": [1, 166, 359, 360, 379, 384, 391], "retriev": [1, 167, 391], "timestam": [1, 167], "cannot": [1, 167, 389], "item": [1, 167], "csv": [1, 179, 186, 386], "esri": [1, 179, 186, 386], "shp": [1, 179, 291, 292, 378, 381, 392], "gml": [1, 179, 186, 386], "gpkg": [1, 179, 186, 386], "fiona": [1, 179], "supported_driv": [1, 179], "valid": [1, 154, 180, 181, 193, 215, 289, 386], "mad": [1, 180, 386], "rang": [1, 24, 180, 213, 216, 220, 221, 222, 223, 226, 228, 230, 289, 380, 386], "minor": [1, 180, 386], "percentile_xx": [1, 180], "xx": [1, 180], "percentil": [1, 154, 180], "percentile_70": [1, 180], "minimum": [1, 12, 29, 60, 94, 137, 150, 154, 163, 181, 291, 292, 379, 380, 383, 386], "shape": [1, 154, 181, 184, 210, 214, 215, 217, 218, 219, 220, 227, 228, 299, 301, 302, 386], "intersect": [1, 184, 189, 296, 299, 304, 386], "express": [1, 185, 389], "dump": [1, 186], "category_labels_json": [1, 187], "eolab": [2, 3, 6, 19, 20, 21, 22, 23, 37, 38, 39, 40, 41, 45, 73, 74, 75, 76, 77, 85, 86, 87, 88, 103, 104, 105, 106, 115, 116, 117, 128, 129, 130, 131, 145, 146, 147, 148, 152, 153, 183, 184, 185, 186, 187, 188, 192, 193, 194, 197, 203, 204, 205, 206, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 232, 250, 252, 270, 289, 291, 292, 293, 294, 296, 297, 298, 299, 300, 301, 302, 303, 304, 307, 324, 328, 342, 347, 349, 351, 353, 355, 362, 363, 371, 373, 374, 381, 388, 391, 392], "attribut": [2, 23, 40, 77, 88, 106, 117, 131, 148, 153, 232, 252, 270, 302, 307, 324, 328, 342, 389], "constructor": [3, 24, 41, 78, 89, 107, 118, 132, 154, 233, 253, 271, 308, 343], "top": [24, 383], "us": [1, 10, 12, 29, 60, 94, 118, 137, 150, 190, 193, 210, 214, 215, 217, 218, 219, 228, 238, 249, 257, 268, 271, 275, 286, 289, 291, 302, 307, 343, 357, 373, 378, 379, 380, 381, 383, 384, 385, 386, 387, 388, 389, 391, 392], "percentile_": 154, "100": [154, 386], "separ": [154, 292, 343, 389], "intend": 190, "rastertools_pars": [], "subpars": [], "code": [203, 389, 392], "like": [307, 378, 386, 391], "import": [291, 292, 294, 389, 392], "argpars": [], "main_pars": [], "argumentpars": [249, 268, 286], "add_subpars": [], "updat": 388, "parser": [204, 205, 206], "ndarrai": [210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 239, 258, 271, 276, 302], "dim": [], "muse": [], "arrai": [1, 4, 8, 9, 10, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 234, 239, 254, 258, 271, 272, 276, 307], "brillianc": [], "output_d": 215, "sort": 215, "ascend": 215, "mumpi": [], "masked_arrai": 215, "No": [247, 266, 284, 343, 381, 387, 391], "integr": [], "scipi": [1, 10, 219, 388], "ndimag": [1, 10, 219], "nd": 381, "data0": 227, "data1": 227, "np": [210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 228, 229, 230, 239, 258, 271, 276, 302], "callabl": [232, 233, 234, 252, 253, 254, 270, 271, 272], "float32": [232, 233, 252, 253], "necessari": [232, 237, 250, 378], "document": [233, 251, 253, 269, 287, 289, 389], "multidimension": [234, 254, 271, 272], "structur": [236, 256, 274, 391], "suppos": [239, 258, 271, 276, 296], "long": [241, 251, 260, 269, 278, 287], "messag": [243, 251, 262, 269, 280, 287, 378, 379, 380, 381, 382, 383, 384, 385, 386], "bit": [246, 265, 271, 283, 296], "add_argu": [249, 268, 286], "librari": 388, "action": [249, 268, 286], "narg": [249, 268, 286], "const": [249, 268, 286], "choic": [249, 268, 286], "metavar": [249, 268, 286], "dest": [249, 268, 286], "self": [1, 12, 29, 60, 94, 137, 150, 249, 251, 268, 269, 286, 287], "squar": [252, 379, 386], "lambda": 271, "rasterio": [271, 302, 307, 380, 383, 388, 391, 392], "sampl": 271, "appar": 271, "should": [203, 215, 271, 294, 389], "byte": 271, "output_imag": [289, 297], "window_overlap": 289, "overlap": [289, 384], "previou": 383, "next": 384, "geom": [291, 292, 293, 296, 298, 299, 300, 301, 302, 303], "treat": 291, "outliers_imag": 293, "written": [293, 296, 298, 299, 301, 302, 303, 389], "real": 293, "ioutput": 293, "chartfil": [294, 386], "stats_per_d": 294, "index_nam": 294, "plot": [294, 391], "gpd": [291, 292, 294, 296, 298, 299, 300, 301, 302, 303, 304], "driver": [296, 298, 299, 301, 303], "bound": [296, 297, 299, 304], "littl": 296, "memori": [289, 296, 298, 299, 301, 302, 303, 307, 308, 312, 315], "write": [296, 298, 299, 301, 303, 389], "pathlib": [297, 373, 374], "those": [299, 389], "intesect": 299, "cat_geom": 300, "extent": [300, 301], "multipolygon": [292, 300], "label": [292, 300], "cr": [301, 302, 303, 304], "burn": 302, "burn_typ": 302, "int32": 302, "geotiff": [302, 380, 383], "coher": 302, "actual": 302, "compat": 302, "category_rast": 304, "category_column": 304, "vrt_outputdir": [307, 308], "my_product_filenam": 307, "rst": 307, "print": [291, 292, 307, 389, 392], "read": [307, 380, 383, 391, 392], "properli": [203, 307], "releas": [307, 377], "statement": [307, 389], "want": 307, "control": [210, 307, 389], "clean": 307, "strformat": 314, "create_maskband": 315, "specifi": [193, 203, 214, 217, 218, 219, 228, 270, 289, 291, 292, 294, 315, 353, 378, 379, 381, 382, 383, 386, 392], "present": [294, 315, 385], "maskband": 315, "composit": 315, "regular": [315, 319], "vsimem": 315, "satellit": [214, 317, 381], "proxi": [], "enum": 328, "captur": [343, 380, 381, 382], "ot": 343, "typic": [343, 380, 383, 387], "boolean": [214, 343], "analys": [344, 349, 356, 357], "found": [228, 351, 352, 353], "mask_id": 358, "s2_l1c": 370, "s2_l2a_maja": 370, "s2_l2a_sen2cor": 370, "s2_l3a_theia": 370, "spot67_geosud": 370, "in_ar": 371, "out_ar": 371, "xoff": 371, "yoff": 371, "xsize": 371, "ysize": 371, "raster_xs": 371, "raster_ys": 371, "buf_radiu": 371, "gt": 371, "sentinel2": [371, 379, 381, 382, 385, 386, 387, 391], "l2a": [371, 379, 381, 382, 385, 386, 387, 391], "maja": [371, 379, 381, 382, 385], "src_vrt": [373, 374], "maskfil": 373, "funcnam": 373, "funcdef": 373, "without": [373, 385, 386, 389], "scope": 373, "xml": 373, "namespac": 375, "subpackag": 375, "olivi": 376, "queyrut": 376, "cne": [376, 387], "fr": [376, 387], "carol": 376, "amiot": 376, "maria": 376, "rodriguez": 376, "rosado": 376, "rodriguezrosado": 376, "alexandr": 376, "zoppi": 376, "opensourc": 377, "lzw": 377, "better": 377, "regard": [377, 389], "activ": [378, 381, 386, 387, 388, 392], "t": [378, 381, 382, 385, 388, 389, 391], "version": [378, 389], "max_work": 378, "v": [378, 384], "vv": 378, "fi": [378, 379], "ti": [378, 384], "z": [378, 386], "collect": [378, 387], "show": [378, 379, 380, 381, 382, 383, 384, 385, 386], "program": 378, "maximum": [1, 12, 24, 29, 33, 60, 94, 137, 150, 163, 228, 291, 292, 378, 379, 380, 383], "worker": 378, "parallel": 378, "processor": 378, "machin": 378, "alloc": 378, "recommend": [378, 389], "verbos": 378, "loglevel": 378, "info": 378, "veri": [378, 392], "cf": [378, 387], "log": [203, 378], "level": [210, 378], "most": [378, 386], "progress": 378, "bar": 378, "disabl": [378, 386], "independ": 378, "rastertools_notqdm": 378, "resp": [378, 385], "export": [378, 384], "design": [378, 389], "down": 378, "chunk": [289, 378], "exce": [1, 31, 378], "job": 378, "submit": [378, 389], "schedul": 378, "pbspro": 378, "altern": [378, 392], "unset": 378, "rastertools_maxwork": 378, "12": [228, 378], "u": 378, "1000": 378, "pwd": 378, "tests_data": [378, 383, 392], "usr": 378, "latest": [378, 388], "commune_32001": [378, 381, 392], "sentinel2a_20180521": [378, 381, 382, 385], "105702": [378, 381, 382, 385], "711_l2a_t30typ_d": [378, 381, 382, 385], "rastertools_latest": [378, 388], "sif": [378, 388], "convolut": 379, "sub": 379, "o": [379, 380, 381, 382, 383, 384, 385, 386], "reflect": [1, 12, 29, 60, 94, 137, 150, 379, 380, 383], "symmetr": [1, 12, 29, 60, 94, 137, 150, 379, 380, 383], "wrap": [1, 12, 29, 60, 94, 137, 150, 379, 380, 383], "3x3": 379, "theia": [379, 381, 382, 385, 386, 387, 391], "extens": [379, 380, 381, 382, 383, 384, 385, 386], "lst": [203, 379, 380, 381, 382, 383, 384, 385, 386], "more": [1, 31, 213, 228, 379, 380, 383, 389, 391], "three": 379, "16x16": 379, "sentinel2a_20180928": [379, 386], "105515": [379, 386], "685_l2a_t30typ_d": [379, 386], "respect": [292, 379], "shadow": [214, 380], "ground": [380, 383], "build": [380, 383, 386, 388], "tree": 380, "90": 380, "zenith": [24, 380], "360": 380, "north": [24, 214, 380], "east": 380, "180": 380, "south": 380, "270": 380, "west": 380, "mandatori": [380, 383], "geotif": [380, 383], "xxx": [380, 383], "let": [380, 381, 383, 386], "toulous": [380, 383], "pleiad": [380, 383], "stereo": [380, 383], "5m": [380, 383], "hour": 380, "00am": 380, "noon": 380, "00pm": 380, "21st": 380, "june": 380, "82": 380, "64": 380, "mnh": [380, 383], "69": 380, "83": 380, "278": 380, "render": 380, "qgi": 380, "layer": 380, "grayscal": 380, "white": 380, "black": [380, 381], "here": [228, 380, 381, 382, 387], "am": 380, "pm": 380, "band1": [381, 386], "band2": [381, 386], "computeposs": [], "explicitli": [381, 389], "section": [381, 382, 385, 389, 390], "sentinel": [381, 387, 391], "look": 381, "color": 381, "highlight": [381, 386], "would": 381, "sentinel2b_20181023": [382, 385, 392], "105107": [382, 385, 392], "455_l2a_t30typ_d": [382, 385, 392], "ndvi_2": 382, "ndvi_1": 382, "date_2": 382, "data_1": 382, "date_1": 382, "2018": [382, 385], "05": [382, 385], "21": [382, 385], "57": 382, "02": 382, "23": 382, "51": 382, "notic": [382, 386, 389], "presenc": 382, "come": 382, "sentinel2b": 382, "stand": 383, "0m": 383, "As": 383, "insid": [383, 386], "outsid": 383, "grid_fil": 384, "id_col": 384, "output_nam": 384, "subdir_nam": 384, "work": [384, 389], "cell": [384, 386], "directori": [1, 11, 28, 59, 80, 93, 110, 123, 136, 172, 379, 380, 381, 382, 383, 384, 385, 386, 388, 392], "image_tile1": 384, "et": 384, "image_tile2": 384, "exempl": 384, "output_": 384, "output_2": 384, "befor": 385, "last": 385, "time_period": 385, "yyyi": [385, 389], "mm": 385, "dd": 385, "512": 385, "until": 385, "timeperiod": 385, "31": 385, "06": 385, "averag": [291, 386], "citi": 386, "boundari": [289, 386], "gi": 386, "geom_index": 386, "category_nam": 386, "percentile_x": 386, "behaviour": 386, "discret": [228, 386], "One": 386, "classifi": 386, "With": [213, 220, 386], "band_numb": 386, "whose": 386, "cover": 386, "commune_32": 386, "entiti": [386, 389], "partial": 386, "probabl": 386, "now": [386, 392], "land": 386, "map": [292, 294, 386], "oso": 386, "dens": 386, "urban": [292, 386], "ocs_2017_cesbio": 386, "aim": 387, "make": [289, 387, 389], "transpar": 387, "l1c": [387, 391], "pep": [387, 391], "rocket": 387, "search": 387, "atdistrib": 387, "l3a": [387, 391], "spot": [387, 391], "ortho": 387, "geosud": 387, "equipex": 387, "web": 387, "guest": 387, "catalog": 387, "unpack": 387, "public": 387, "extend": 387, "instal": [387, 388], "conda": 387, "privat": 387, "about": [228, 387], "licens": 387, "contributor": [387, 389], "changelog": 387, "via": 388, "env": [388, 392], "yml": 388, "env_upd": 388, "pyscaffold": 388, "geopanda": [291, 292, 294, 388], "gdal": 388, "matplotlib": 388, "tqdm": 388, "secondli": 388, "pip": 388, "Then": 388, "script": 388, "dockerfil": 388, "root": 388, "apach": 389, "januari": 389, "2004": 389, "www": 389, "term": [213, 389], "AND": 389, "condit": 389, "FOR": 389, "reproduct": 389, "through": [203, 389], "licensor": 389, "copyright": 389, "owner": 389, "author": 389, "grant": 389, "legal": 389, "union": 389, "act": 389, "under": 389, "indirect": 389, "caus": 389, "manag": [203, 289, 389], "contract": 389, "ii": 389, "ownership": 389, "fifti": 389, "percent": 389, "outstand": 389, "share": 389, "iii": 389, "benefici": 389, "your": 389, "exercis": 389, "permiss": 389, "includ": [291, 292, 294, 389], "limit": 389, "softwar": 389, "mechan": 389, "translat": 389, "compil": 389, "convers": 389, "media": 389, "authorship": 389, "made": 389, "attach": 389, "appendix": 389, "editori": 389, "revis": 389, "annot": 389, "elabor": 389, "remain": 389, "mere": 389, "link": 389, "bind": 389, "thereof": 389, "contribut": 389, "intention": 389, "inclus": 389, "behalf": 389, "electron": 389, "verbal": 389, "commun": 389, "sent": 389, "mail": 389, "issu": 389, "track": 389, "discuss": 389, "improv": 389, "exclud": 389, "conspicu": 389, "mark": 389, "Not": 389, "whom": 389, "receiv": 389, "subsequ": 389, "incorpor": 389, "subject": 389, "herebi": 389, "perpetu": 389, "worldwid": 389, "non": 389, "exclus": 389, "charg": 389, "royalti": 389, "irrevoc": 389, "reproduc": 389, "prepar": 389, "publicli": 389, "sublicens": 389, "patent": 389, "state": 389, "offer": 389, "sell": 389, "transfer": 389, "claim": 389, "necessarili": 389, "infring": 389, "alon": 389, "wa": 389, "institut": 389, "litig": 389, "against": 389, "cross": 389, "counterclaim": 389, "lawsuit": 389, "alleg": 389, "constitut": 389, "contributori": 389, "termin": [203, 389], "redistribut": 389, "copi": 389, "medium": 389, "meet": 389, "give": 389, "recipi": 389, "carri": 389, "promin": 389, "chang": [213, 227, 389], "retain": 389, "trademark": 389, "pertain": 389, "text": [379, 380, 381, 382, 383, 384, 385, 386, 389], "readabl": [292, 389], "place": [384, 389], "along": 389, "wherev": 389, "parti": 389, "appear": 389, "alongsid": 389, "addendum": 389, "constru": 389, "compli": 389, "submiss": 389, "unless": [386, 389], "notwithstand": 389, "herein": 389, "supersed": 389, "agreement": 389, "trade": 389, "servic": 389, "reason": 389, "customari": 389, "disclaim": 389, "warranti": 389, "law": 389, "agre": 389, "AS": 389, "basi": 389, "OR": 389, "OF": 389, "impli": 389, "titl": 389, "merchant": 389, "fit": 389, "particular": 389, "sole": 389, "respons": 389, "appropri": [203, 389], "assum": [292, 389], "risk": 389, "liabil": 389, "event": 389, "theori": 389, "tort": 389, "neglig": 389, "deliber": 389, "grossli": 389, "liabl": 389, "damag": 389, "incident": 389, "consequenti": 389, "charact": 389, "aris": 389, "out": [289, 389], "inabl": 389, "loss": 389, "goodwil": 389, "stoppag": 389, "failur": 389, "malfunct": 389, "commerci": 389, "even": [385, 389], "advis": 389, "while": [210, 389, 392], "choos": 389, "fee": 389, "support": [289, 291, 292, 389, 392], "indemn": 389, "oblig": 389, "right": 389, "howev": 389, "indemnifi": 389, "defend": 389, "hold": 389, "harmless": 389, "incur": 389, "assert": 389, "how": 389, "boilerpl": 389, "field": 389, "enclos": 389, "bracket": 389, "don": 389, "comment": 389, "syntax": 389, "easier": 389, "identif": 389, "complianc": 389, "obtain": 389, "languag": 389, "govern": 389, "concern": 391, "ask": 391, "know": 391, "flexibl": 391, "unknown": 391, "15": 391, "_l2a_t": 391, "sentinel2x_": 391, "_l3a_t": 391, "s2": 391, "_msil1c_": 391, "9t": 391, "_nd": 391, "_r": 391, "_t": 391, "jp2": 391, "dt": 391, "_msil2a_": 391, "spot6": 391, "_geosud_ms_": 391, "img_spot": 391, "_ms_": 391, "with_": 392, "someth": 392, "simpl": 392, "rp": 392, "gdal_vrt_enable_python": 392, "my_rastertyp": 392, "_test": 392, "inherit": 392, "moreov": 392, "best": 392, "practic": 392, "try": 392, "unknown_dir": 392, "rce": 392, "err": 392, "unexpect": 392, "fdjvjdk": [], "fdgdf": [], "belong": [], "left": [], "cast": 214, "variou": 381, "fraction": 228, "click": 203, "researchg": [], "net": [], "257315893_application_of_ski": [], "view_factor_for_the_visualization_of_historic_landscape_features_in_lidar": [], "derived_relief_model": [], "sphere": [], "href": [], "coeffici": [213, 216, 220, 221, 222, 223, 225, 226, 229, 230], "Near": [213, 216, 220, 221, 222, 223, 225, 226, 229, 230], "infra": [213, 216, 220, 221, 222, 223, 225, 226, 229, 230], "c1": 213, "c2": 213, "canopi": 213, "influenc": [213, 383], "correct": 213, "aerosol": 213, "gain": 213, "sensit": 213, "sight": 214, "clockwis": [24, 214], "maskedarrai": 215, "sciencedirect": [], "com": [], "scienc": [], "articl": [], "ab": [], "pii": [], "003442579090085z": [], "223906415_a_modified_soil_adjusted_vegetation_index": [], "academia": [], "edu": [], "20596726": [], "external_factor_consideration_in_vegetation_index_develop": [], "aspr": [], "wp": [], "upload": [], "1977journal": [], "dec": [], "1977_dec_1541": [], "pdf": [], "esajourn": [], "onlinelibrari": [], "wilei": [], "doi": [], "2307": [], "1936256": [], "003442578890106x": [], "sequenc": 227, "scirp": [], "referencespap": [], "referenceid": [], "1046714": [], "3679422_tsavi_a_vegetation_index_which_minimizes_soil_brightness_effects_on_lai_and_apar_estim": [], "TO": [], "ma": 215, "nan": 215, "among": [1, 12, 29, 60, 94, 137, 150], "constant": [1, 12, 29, 60, 94, 137, 150], "linear_ramp": [1, 12, 29, 60, 94, 137, 150], "vdfvdmode": [], "valueerror": [1, 31, 210, 214, 215, 217, 218, 219, 227, 228, 289, 294], "constraint": [1, 31], "smooth": 210, "preserv": 210, "3d": [210, 214, 215, 217, 218, 219, 220, 228], "number_of_lin": [210, 214, 217, 218, 219, 227, 228], "number_of_column": [210, 214, 217, 218, 219, 227, 228], "dhm": [210, 214, 217, 218, 219, 228, 380, 383], "scale": 214, "illumin": 214, "1d": 215, "miss": [215, 385], "4d": 215, "odd": 219, "integ": [219, 379, 380, 381, 382, 383, 384, 385, 386], "neighborhood": [], "zero": 227, "full": 228, "oper": [270, 289], "effici": 289, "larg": 289, "concurr": 289, "thread": 289, "pool": 289, "kjfdlgwdrfilgj": [], "math": [], "2d": 220, "grdtbrbr": 220, "fcer": [], "previous": [], "header": [], "row": [], "alt": [], "align": 292, "center": [], "titr": [], "ref": [], "filtering_dyn": [], "utils_cli": [0, 1, 203], "handle_result": [], "filter_opt": 1, "indices_opt": 1, "apply_process": 1, "ctx": 203, "all_band": 193, "initi": 193, "readi": 193, "filter_nam": 192, "storag": [], "context": 203, "addition": 203, "filewith": 386, "continu": 385, "topographi": 383, "surround": 383, "terrain": 383, "nce": [], "divid": 384, "smaller": 384, "customiz": 384, "subdirectori": 384, "requiredto": 384, "radio": 381, "environment": 381, "defineda": 381, "get_raster_profil": [], "vsimem_to_rasterio": [], "create_in_memory_vrt": [], "vsimem_fil": [], "datasetread": [], "virtual": [], "temporari": [], "reopen": [], "reader": [], "io": [], "note": [292, 294], "both": [], "delet": [], "remov": [], "manual": [], "summari": 291, "polygon": [291, 292], "metric": [291, 292], "_compute_stat": 291, "nest": [291, 292], "outer": [291, 292], "inner": [291, 292], "read_fil": [291, 292], "subregion": 292, "human": 292, "being": 292, "ioerror": 292, "subdivid": 292, "georeferenc": 292, "coordin": 292, "landcov": 292, "image_path": 292, "satellite_imag": 292, "land_typ": 292, "geometry_stat": 292, "across": 294, "visual": 294, "sortabl": 294, "ensur": 294, "proper": 294, "temperatur": 294, "plot_tool": 294, "2023": 294, "output_chart": 294, "png": 294, "regionid": 294, "vrt_content": [], "memoryfil": 312, "close": 312}, "objects": {"": [[0, 0, 0, "-", "eolab"]], "eolab": [[1, 0, 0, "-", "rastertools"]], "eolab.rastertools": [[2, 1, 1, "", "Filtering"], [23, 1, 1, "", "Hillshade"], [40, 1, 1, "", "Radioindice"], [77, 1, 1, "", "Rastertool"], [87, 5, 1, "", "RastertoolConfigurationException"], [88, 1, 1, "", "SVF"], [106, 1, 1, "", "Speed"], [117, 1, 1, "", "Tiling"], [131, 1, 1, "", "Timeseries"], [148, 1, 1, "", "Windowable"], [153, 1, 1, "", "Zonalstats"], [392, 6, 1, "", "add_custom_rastertypes"], [190, 0, 0, "-", "cli"], [1, 0, 0, "-", "filtering"], [1, 0, 0, "-", "hillshade"], [1, 0, 0, "-", "main"], [208, 0, 0, "-", "processing"], [305, 0, 0, "-", "product"], [1, 0, 0, "-", "radioindice"], [1, 0, 0, "-", "rastertools"], [1, 0, 0, "-", "speed"], [1, 0, 0, "-", "svf"], [1, 0, 0, "-", "tiling"], [1, 0, 0, "-", "timeseries"], [1, 0, 0, "-", "utils"], [1, 0, 0, "-", "zonalstats"]], "eolab.rastertools.Filtering": [[3, 2, 1, "", "__init__"], [4, 3, 1, "", "adaptive_gaussian"], [5, 4, 1, "", "bands"], [6, 2, 1, "", "get_default_filters"], [7, 4, 1, "", "keep_vrt"], [8, 3, 1, "", "local_mean"], [9, 3, 1, "", "local_sum"], [10, 3, 1, "", "median_filter"], [11, 4, 1, "", "outputdir"], [12, 4, 1, "", "pad_mode"], [13, 2, 1, "", "postprocess_files"], [14, 2, 1, "", "process_file"], [15, 2, 1, "", "process_files"], [16, 4, 1, "", "raster_filter"], [17, 4, 1, "", "vrt_dir"], [18, 4, 1, "", "window_size"], [19, 2, 1, "", "with_filter_configuration"], [20, 2, 1, "", "with_output"], [21, 2, 1, "", "with_vrt_stored"], [22, 2, 1, "", "with_windows"]], "eolab.rastertools.Hillshade": [[24, 2, 1, "", "__init__"], [25, 4, 1, "", "azimuth"], [26, 4, 1, "", "elevation"], [27, 4, 1, "", "keep_vrt"], [28, 4, 1, "", "outputdir"], [29, 4, 1, "", "pad_mode"], [30, 2, 1, "", "postprocess_files"], [31, 2, 1, "", "process_file"], [32, 2, 1, "", "process_files"], [33, 4, 1, "", "radius"], [34, 4, 1, "", "resolution"], [35, 4, 1, "", "vrt_dir"], [36, 4, 1, "", "window_size"], [37, 2, 1, "", "with_output"], [38, 2, 1, "", "with_vrt_stored"], [39, 2, 1, "", "with_windows"]], "eolab.rastertools.Radioindice": [[41, 2, 1, "", "__init__"], [42, 3, 1, "", "bi"], [43, 3, 1, "", "bi2"], [44, 3, 1, "", "evi"], [45, 2, 1, "", "get_default_indices"], [46, 4, 1, "", "indices"], [47, 3, 1, "", "ipvi"], [48, 4, 1, "", "keep_vrt"], [49, 4, 1, "", "merge"], [50, 3, 1, "", "mndwi"], [51, 3, 1, "", "msavi"], [52, 3, 1, "", "msavi2"], [53, 3, 1, "", "ndbi"], [54, 3, 1, "", "ndpi"], [55, 3, 1, "", "ndti"], [56, 3, 1, "", "ndvi"], [57, 3, 1, "", "ndwi"], [58, 3, 1, "", "ndwi2"], [59, 4, 1, "", "outputdir"], [60, 4, 1, "", "pad_mode"], [61, 2, 1, "", "postprocess_files"], [62, 2, 1, "", "process_file"], [63, 2, 1, "", "process_files"], [64, 3, 1, "", "pvi"], [65, 3, 1, "", "ri"], [66, 4, 1, "", "roi"], [67, 3, 1, "", "rvi"], [68, 3, 1, "", "savi"], [69, 3, 1, "", "tndvi"], [70, 3, 1, "", "tsavi"], [71, 4, 1, "", "vrt_dir"], [72, 4, 1, "", "window_size"], [73, 2, 1, "", "with_output"], [74, 2, 1, "", "with_roi"], [75, 2, 1, "", "with_vrt_stored"], [76, 2, 1, "", "with_windows"]], "eolab.rastertools.Rastertool": [[78, 2, 1, "", "__init__"], [79, 4, 1, "", "keep_vrt"], [80, 4, 1, "", "outputdir"], [81, 2, 1, "", "postprocess_files"], [82, 2, 1, "", "process_file"], [83, 2, 1, "", "process_files"], [84, 4, 1, "", "vrt_dir"], [85, 2, 1, "", "with_output"], [86, 2, 1, "", "with_vrt_stored"]], "eolab.rastertools.SVF": [[89, 2, 1, "", "__init__"], [90, 4, 1, "", "altitude"], [91, 4, 1, "", "keep_vrt"], [92, 4, 1, "", "nb_directions"], [93, 4, 1, "", "outputdir"], [94, 4, 1, "", "pad_mode"], [95, 2, 1, "", "postprocess_files"], [96, 2, 1, "", "process_file"], [97, 2, 1, "", "process_files"], [98, 4, 1, "", "radius"], [99, 4, 1, "", "resolution"], [100, 4, 1, "", "vrt_dir"], [101, 4, 1, "", "window_size"], [102, 2, 1, "", "with_altitude"], [103, 2, 1, "", "with_output"], [104, 2, 1, "", "with_vrt_stored"], [105, 2, 1, "", "with_windows"]], "eolab.rastertools.Speed": [[107, 2, 1, "", "__init__"], [108, 4, 1, "", "bands"], [109, 4, 1, "", "keep_vrt"], [110, 4, 1, "", "outputdir"], [111, 2, 1, "", "postprocess_files"], [112, 2, 1, "", "process_file"], [113, 2, 1, "", "process_files"], [114, 4, 1, "", "vrt_dir"], [115, 2, 1, "", "with_output"], [116, 2, 1, "", "with_vrt_stored"]], "eolab.rastertools.Tiling": [[118, 2, 1, "", "__init__"], [119, 4, 1, "", "grid"], [120, 4, 1, "", "keep_vrt"], [121, 4, 1, "", "output_basename"], [122, 4, 1, "", "output_subdir"], [123, 4, 1, "", "outputdir"], [124, 2, 1, "", "postprocess_files"], [125, 2, 1, "", "process_file"], [126, 2, 1, "", "process_files"], [127, 4, 1, "", "vrt_dir"], [128, 2, 1, "", "with_id_column"], [129, 2, 1, "", "with_output"], [130, 2, 1, "", "with_vrt_stored"]], "eolab.rastertools.Timeseries": [[132, 2, 1, "", "__init__"], [133, 4, 1, "", "bands"], [134, 4, 1, "", "end_date"], [135, 4, 1, "", "keep_vrt"], [136, 4, 1, "", "outputdir"], [137, 4, 1, "", "pad_mode"], [138, 4, 1, "", "period"], [139, 2, 1, "", "postprocess_files"], [140, 2, 1, "", "process_file"], [141, 2, 1, "", "process_files"], [142, 4, 1, "", "start_date"], [143, 4, 1, "", "vrt_dir"], [144, 4, 1, "", "window_size"], [145, 2, 1, "", "with_output"], [146, 2, 1, "", "with_vrt_stored"], [147, 2, 1, "", "with_windows"]], "eolab.rastertools.Windowable": [[149, 2, 1, "", "__init__"], [150, 4, 1, "", "pad_mode"], [151, 4, 1, "", "window_size"], [152, 2, 1, "", "with_windows"]], "eolab.rastertools.Zonalstats": [[154, 2, 1, "", "__init__"], [155, 4, 1, "", "area"], [156, 4, 1, "", "bands"], [157, 4, 1, "", "categorical"], [158, 4, 1, "", "category_file"], [159, 4, 1, "", "category_file_type"], [160, 4, 1, "", "category_index"], [161, 4, 1, "", "category_labels"], [162, 4, 1, "", "chart_file"], [163, 2, 1, "", "compute_stats"], [164, 4, 1, "", "display_chart"], [165, 4, 1, "", "generated_stats"], [166, 4, 1, "", "generated_stats_dates"], [167, 4, 1, "", "generated_stats_per_date"], [168, 4, 1, "", "geometries"], [169, 4, 1, "", "geometry_index"], [170, 4, 1, "", "keep_vrt"], [171, 4, 1, "", "output_format"], [172, 4, 1, "", "outputdir"], [173, 2, 1, "", "postprocess_files"], [174, 4, 1, "", "prefix"], [175, 2, 1, "", "process_file"], [176, 2, 1, "", "process_files"], [177, 4, 1, "", "sigma"], [178, 4, 1, "", "stats"], [179, 3, 1, "", "supported_output_formats"], [180, 3, 1, "", "valid_stats"], [181, 4, 1, "", "valid_threshold"], [182, 4, 1, "", "vrt_dir"], [183, 2, 1, "", "with_chart"], [184, 2, 1, "", "with_geometries"], [185, 2, 1, "", "with_outliers"], [186, 2, 1, "", "with_output"], [187, 2, 1, "", "with_per_category"], [188, 2, 1, "", "with_vrt_stored"], [189, 4, 1, "", "within"]], "eolab.rastertools.cli": [[191, 0, 0, "-", "filtering"], [195, 0, 0, "-", "hillshade"], [196, 0, 0, "-", "radioindice"], [198, 0, 0, "-", "speed"], [199, 0, 0, "-", "svf"], [200, 0, 0, "-", "tiling"], [201, 0, 0, "-", "timeseries"], [202, 0, 0, "-", "utils_cli"], [204, 6, 1, "", "with_bands_arguments"], [205, 6, 1, "", "with_outputdir_arguments"], [206, 6, 1, "", "with_window_arguments"], [207, 0, 0, "-", "zonalstats"]], "eolab.rastertools.cli.filtering": [[192, 6, 1, "", "create_filter"], [193, 6, 1, "", "create_filtering"], [194, 6, 1, "", "filter_options"]], "eolab.rastertools.cli.radioindice": [[197, 6, 1, "", "indices_opt"]], "eolab.rastertools.cli.utils_cli": [[203, 6, 1, "", "apply_process"]], "eolab.rastertools.filtering": [[1, 1, 1, "", "Filtering"]], "eolab.rastertools.filtering.Filtering": [[1, 3, 1, "", "adaptive_gaussian"], [1, 4, 1, "", "bands"], [1, 2, 1, "", "get_default_filters"], [1, 3, 1, "", "local_mean"], [1, 3, 1, "", "local_sum"], [1, 3, 1, "", "median_filter"], [1, 2, 1, "", "process_file"], [1, 4, 1, "", "raster_filter"], [1, 2, 1, "", "with_filter_configuration"]], "eolab.rastertools.hillshade": [[1, 1, 1, "", "Hillshade"]], "eolab.rastertools.hillshade.Hillshade": [[1, 4, 1, "", "azimuth"], [1, 4, 1, "", "elevation"], [1, 2, 1, "", "process_file"], [1, 4, 1, "", "radius"], [1, 4, 1, "", "resolution"]], "eolab.rastertools.main": [[1, 6, 1, "", "add_custom_rastertypes"], [1, 6, 1, "", "run"]], "eolab.rastertools.processing": [[209, 0, 0, "-", "algo"], [231, 0, 0, "-", "rasterproc"], [288, 0, 0, "-", "sliding"], [290, 0, 0, "-", "stats"], [295, 0, 0, "-", "vector"]], "eolab.rastertools.processing.algo": [[210, 6, 1, "", "adaptive_gaussian"], [211, 6, 1, "", "brightness_index"], [212, 6, 1, "", "brightness_index2"], [213, 6, 1, "", "evi"], [214, 6, 1, "", "hillshade"], [215, 6, 1, "", "interpolated_timeseries"], [216, 6, 1, "", "ipvi"], [217, 6, 1, "", "local_mean"], [218, 6, 1, "", "local_sum"], [219, 6, 1, "", "median"], [220, 6, 1, "", "msavi"], [221, 6, 1, "", "msavi2"], [222, 6, 1, "", "normalized_difference"], [223, 6, 1, "", "pvi"], [224, 6, 1, "", "redness_index"], [225, 6, 1, "", "rvi"], [226, 6, 1, "", "savi"], [227, 6, 1, "", "speed"], [228, 6, 1, "", "svf"], [229, 6, 1, "", "tndvi"], [230, 6, 1, "", "tsavi"]], "eolab.rastertools.processing.rasterproc": [[232, 1, 1, "", "RadioindiceProcessing"], [252, 1, 1, "", "RasterFilter"], [270, 1, 1, "", "RasterProcessing"]], "eolab.rastertools.processing.rasterproc.RadioindiceProcessing": [[233, 2, 1, "", "__init__"], [234, 4, 1, "", "algo"], [235, 4, 1, "", "aliases"], [236, 4, 1, "", "arguments"], [237, 4, 1, "", "channels"], [238, 4, 1, "", "compress"], [239, 2, 1, "", "compute"], [240, 2, 1, "", "configure"], [241, 4, 1, "", "description"], [242, 4, 1, "", "dtype"], [243, 4, 1, "", "help"], [244, 4, 1, "", "in_dtype"], [245, 4, 1, "", "name"], [246, 4, 1, "", "nbits"], [247, 4, 1, "", "nodata"], [248, 4, 1, "", "per_band_algo"], [249, 2, 1, "", "with_arguments"], [250, 2, 1, "", "with_channels"], [251, 2, 1, "", "with_documentation"]], "eolab.rastertools.processing.rasterproc.RasterFilter": [[253, 2, 1, "", "__init__"], [254, 4, 1, "", "algo"], [255, 4, 1, "", "aliases"], [256, 4, 1, "", "arguments"], [257, 4, 1, "", "compress"], [258, 2, 1, "", "compute"], [259, 2, 1, "", "configure"], [260, 4, 1, "", "description"], [261, 4, 1, "", "dtype"], [262, 4, 1, "", "help"], [263, 4, 1, "", "in_dtype"], [264, 4, 1, "", "name"], [265, 4, 1, "", "nbits"], [266, 4, 1, "", "nodata"], [267, 4, 1, "", "per_band_algo"], [268, 2, 1, "", "with_arguments"], [269, 2, 1, "", "with_documentation"]], "eolab.rastertools.processing.rasterproc.RasterProcessing": [[271, 2, 1, "", "__init__"], [272, 4, 1, "", "algo"], [273, 4, 1, "", "aliases"], [274, 4, 1, "", "arguments"], [275, 4, 1, "", "compress"], [276, 2, 1, "", "compute"], [277, 2, 1, "", "configure"], [278, 4, 1, "", "description"], [279, 4, 1, "", "dtype"], [280, 4, 1, "", "help"], [281, 4, 1, "", "in_dtype"], [282, 4, 1, "", "name"], [283, 4, 1, "", "nbits"], [284, 4, 1, "", "nodata"], [285, 4, 1, "", "per_band_algo"], [286, 2, 1, "", "with_arguments"], [287, 2, 1, "", "with_documentation"]], "eolab.rastertools.processing.sliding": [[289, 6, 1, "", "compute_sliding"]], "eolab.rastertools.processing.stats": [[291, 6, 1, "", "compute_zonal_stats"], [292, 6, 1, "", "compute_zonal_stats_per_category"], [293, 6, 1, "", "extract_zonal_outliers"], [294, 6, 1, "", "plot_stats"]], "eolab.rastertools.processing.vector": [[296, 6, 1, "", "clip"], [297, 6, 1, "", "crop"], [298, 6, 1, "", "dissolve"], [299, 6, 1, "", "filter"], [300, 6, 1, "", "filter_dissolve"], [301, 6, 1, "", "get_raster_shape"], [302, 6, 1, "", "rasterize"], [303, 6, 1, "", "reproject"], [304, 6, 1, "", "vectorize"]], "eolab.rastertools.product": [[306, 0, 0, "-", "rasterproduct"], [323, 0, 0, "-", "rastertype"], [371, 6, 1, "", "s2_maja_mask"], [372, 0, 0, "-", "vrt"]], "eolab.rastertools.product.rasterproduct": [[307, 1, 1, "", "RasterProduct"]], "eolab.rastertools.product.rasterproduct.RasterProduct": [[308, 2, 1, "", "__init__"], [309, 4, 1, "", "bands_files"], [310, 4, 1, "", "channels"], [311, 4, 1, "", "file"], [312, 2, 1, "", "free_in_memory_vrts"], [313, 2, 1, "", "get_date"], [314, 2, 1, "", "get_date_string"], [315, 2, 1, "", "get_raster"], [316, 2, 1, "", "get_relative_orbit"], [317, 2, 1, "", "get_satellite"], [318, 2, 1, "", "get_tile"], [319, 4, 1, "", "is_archive"], [320, 4, 1, "", "masks_files"], [321, 2, 1, "", "open"], [322, 4, 1, "", "rastertype"]], "eolab.rastertools.product.rastertype": [[324, 1, 1, "", "Band"], [328, 1, 1, "", "BandChannel"], [342, 1, 1, "", "RasterType"]], "eolab.rastertools.product.rastertype.Band": [[325, 2, 1, "", "__init__"], [326, 4, 1, "", "description"], [327, 4, 1, "", "identifier"]], "eolab.rastertools.product.rastertype.BandChannel": [[329, 3, 1, "", "blue"], [330, 3, 1, "", "blue_60m"], [331, 3, 1, "", "green"], [332, 3, 1, "", "mir"], [333, 3, 1, "", "mir_60m"], [334, 3, 1, "", "nir"], [335, 3, 1, "", "nir_60m"], [336, 3, 1, "", "red"], [337, 3, 1, "", "red_edge1"], [338, 3, 1, "", "red_edge2"], [339, 3, 1, "", "red_edge3"], [340, 3, 1, "", "red_edge4"], [341, 3, 1, "", "swir"]], "eolab.rastertools.product.rastertype.RasterType": [[343, 2, 1, "", "__init__"], [344, 2, 1, "", "accept"], [345, 2, 1, "", "add"], [346, 4, 1, "", "bands_pattern"], [347, 4, 1, "", "channels"], [348, 4, 1, "", "date_format"], [349, 2, 1, "", "find"], [350, 2, 1, "", "get"], [351, 2, 1, "", "get_band_description"], [352, 2, 1, "", "get_band_descriptions"], [353, 2, 1, "", "get_band_id"], [354, 2, 1, "", "get_band_ids"], [355, 2, 1, "", "get_bands_regexp"], [356, 2, 1, "", "get_date"], [357, 2, 1, "", "get_group"], [358, 2, 1, "", "get_mask"], [359, 2, 1, "", "get_mask_descriptions"], [360, 2, 1, "", "get_mask_ids"], [361, 2, 1, "", "get_mask_regexp"], [362, 2, 1, "", "has_channel"], [363, 2, 1, "", "has_channels"], [364, 2, 1, "", "has_mask"], [365, 4, 1, "", "maskfunc"], [366, 4, 1, "", "masknodata"], [367, 4, 1, "", "name"], [368, 4, 1, "", "nodata"], [369, 4, 1, "", "product_pattern"], [370, 3, 1, "", "rastertypes"]], "eolab.rastertools.product.vrt": [[373, 6, 1, "", "add_masks_to_vrt"], [374, 6, 1, "", "set_band_descriptions"]], "eolab.rastertools.radioindice": [[1, 1, 1, "", "Radioindice"], [1, 6, 1, "", "compute_indices"]], "eolab.rastertools.radioindice.Radioindice": [[1, 3, 1, "", "bi"], [1, 3, 1, "", "bi2"], [1, 3, 1, "", "evi"], [1, 2, 1, "", "get_default_indices"], [1, 4, 1, "", "indices"], [1, 3, 1, "", "ipvi"], [1, 4, 1, "", "merge"], [1, 3, 1, "", "mndwi"], [1, 3, 1, "", "msavi"], [1, 3, 1, "", "msavi2"], [1, 3, 1, "", "ndbi"], [1, 3, 1, "", "ndpi"], [1, 3, 1, "", "ndti"], [1, 3, 1, "", "ndvi"], [1, 3, 1, "", "ndwi"], [1, 3, 1, "", "ndwi2"], [1, 2, 1, "", "process_file"], [1, 3, 1, "", "pvi"], [1, 3, 1, "", "ri"], [1, 4, 1, "", "roi"], [1, 3, 1, "", "rvi"], [1, 3, 1, "", "savi"], [1, 3, 1, "", "tndvi"], [1, 3, 1, "", "tsavi"], [1, 2, 1, "", "with_output"], [1, 2, 1, "", "with_roi"]], "eolab.rastertools.rastertools": [[1, 1, 1, "", "Rastertool"], [1, 5, 1, "", "RastertoolConfigurationException"], [1, 1, 1, "", "Windowable"]], "eolab.rastertools.rastertools.Rastertool": [[1, 4, 1, "", "keep_vrt"], [1, 4, 1, "", "outputdir"], [1, 2, 1, "", "postprocess_files"], [1, 2, 1, "", "process_file"], [1, 2, 1, "", "process_files"], [1, 4, 1, "", "vrt_dir"], [1, 2, 1, "", "with_output"], [1, 2, 1, "", "with_vrt_stored"]], "eolab.rastertools.rastertools.Windowable": [[1, 4, 1, "", "pad_mode"], [1, 4, 1, "", "window_size"], [1, 2, 1, "", "with_windows"]], "eolab.rastertools.speed": [[1, 1, 1, "", "Speed"], [1, 6, 1, "", "compute_speed"]], "eolab.rastertools.speed.Speed": [[1, 4, 1, "", "bands"], [1, 2, 1, "", "postprocess_files"]], "eolab.rastertools.svf": [[1, 1, 1, "", "SVF"]], "eolab.rastertools.svf.SVF": [[1, 4, 1, "", "altitude"], [1, 4, 1, "", "nb_directions"], [1, 2, 1, "", "process_file"], [1, 4, 1, "", "radius"], [1, 4, 1, "", "resolution"], [1, 2, 1, "", "with_altitude"]], "eolab.rastertools.tiling": [[1, 1, 1, "", "Tiling"]], "eolab.rastertools.tiling.Tiling": [[1, 4, 1, "", "grid"], [1, 4, 1, "", "output_basename"], [1, 4, 1, "", "output_subdir"], [1, 2, 1, "", "process_file"], [1, 2, 1, "", "with_id_column"], [1, 2, 1, "", "with_output"]], "eolab.rastertools.timeseries": [[1, 1, 1, "", "Timeseries"], [1, 6, 1, "", "compute_timeseries"]], "eolab.rastertools.timeseries.Timeseries": [[1, 4, 1, "", "bands"], [1, 4, 1, "", "end_date"], [1, 4, 1, "", "period"], [1, 2, 1, "", "postprocess_files"], [1, 4, 1, "", "start_date"]], "eolab.rastertools.utils": [[1, 6, 1, "", "get_basename"], [1, 6, 1, "", "get_metadata_name"], [1, 6, 1, "", "get_suffixes"], [1, 6, 1, "", "highest_power_of_2"], [1, 6, 1, "", "is_dir"], [1, 6, 1, "", "slices_1d"], [1, 6, 1, "", "slices_2d"], [1, 6, 1, "", "to_path"], [1, 6, 1, "", "to_tuple"]], "eolab.rastertools.zonalstats": [[1, 1, 1, "", "Zonalstats"]], "eolab.rastertools.zonalstats.Zonalstats": [[1, 4, 1, "", "area"], [1, 4, 1, "", "bands"], [1, 4, 1, "", "categorical"], [1, 4, 1, "", "category_file"], [1, 4, 1, "", "category_file_type"], [1, 4, 1, "", "category_index"], [1, 4, 1, "", "category_labels"], [1, 4, 1, "", "chart_file"], [1, 2, 1, "", "compute_stats"], [1, 4, 1, "", "display_chart"], [1, 4, 1, "", "generated_stats"], [1, 4, 1, "", "generated_stats_dates"], [1, 4, 1, "", "generated_stats_per_date"], [1, 4, 1, "", "geometries"], [1, 4, 1, "", "geometry_index"], [1, 4, 1, "", "output_format"], [1, 2, 1, "", "postprocess_files"], [1, 4, 1, "", "prefix"], [1, 2, 1, "", "process_file"], [1, 4, 1, "", "sigma"], [1, 4, 1, "", "stats"], [1, 3, 1, "", "supported_output_formats"], [1, 3, 1, "", "valid_stats"], [1, 4, 1, "", "valid_threshold"], [1, 2, 1, "", "with_chart"], [1, 2, 1, "", "with_geometries"], [1, 2, 1, "", "with_outliers"], [1, 2, 1, "", "with_output"], [1, 2, 1, "", "with_per_category"], [1, 4, 1, "", "within"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:property", "5": "py:exception", "6": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "property", "Python property"], "5": ["py", "exception", "Python exception"], "6": ["py", "function", "Python function"]}, "titleterms": {"eolab": [0, 1, 190, 191, 195, 196, 198, 199, 200, 201, 202, 207, 208, 209, 231, 288, 290, 295, 305, 306, 323, 372, 375], "namespac": 0, "subpackag": [0, 1], "rastertool": [1, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 190, 191, 195, 196, 198, 199, 200, 201, 202, 207, 208, 209, 231, 288, 290, 295, 305, 306, 323, 372, 378, 387, 392], "packag": 1, "submodul": 1, "filter": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 191, 299, 379], "modul": 1, "hillshad": [1, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 195, 214, 377, 380], "main": 1, "radioindic": [1, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 196, 381], "speed": [1, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 198, 227, 382], "svf": [1, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 199, 228, 383], "tile": [1, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 200, 384], "timeseri": [1, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 201, 385], "util": 1, "zonalstat": [1, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 207, 386], "content": [1, 387], "__init__": [3, 24, 41, 78, 89, 107, 118, 132, 149, 154, 233, 253, 271, 308, 325, 343], "adaptive_gaussian": [4, 210], "band": [5, 108, 133, 156, 324, 325, 326, 327], "get_default_filt": 6, "keep_vrt": [7, 27, 48, 79, 91, 109, 120, 135, 170], "local_mean": [8, 217], "local_sum": [9, 218], "median_filt": 10, "outputdir": [11, 28, 59, 80, 93, 110, 123, 136, 172], "pad_mod": [12, 29, 60, 94, 137, 150], "postprocess_fil": [13, 30, 61, 81, 95, 111, 124, 139, 173], "process_fil": [14, 15, 31, 32, 62, 63, 82, 83, 96, 97, 112, 113, 125, 126, 140, 141, 175, 176], "raster_filt": 16, "vrt_dir": [17, 35, 71, 84, 100, 114, 127, 143, 182], "window_s": [18, 36, 72, 101, 144, 151], "with_filter_configur": 19, "with_output": [20, 37, 73, 85, 103, 115, 129, 145, 186], "with_vrt_stor": [21, 38, 75, 86, 104, 116, 130, 146, 188], "with_window": [22, 39, 76, 105, 147, 152], "azimuth": 25, "elev": 26, "radiu": [33, 98], "resolut": [34, 99], "bi": 42, "bi2": 43, "evi": [44, 213], "get_default_indic": 45, "indic": [46, 387], "ipvi": [47, 216], "merg": 49, "mndwi": 50, "msavi": [51, 220], "msavi2": [52, 221], "ndbi": 53, "ndpi": 54, "ndti": 55, "ndvi": 56, "ndwi": 57, "ndwi2": 58, "pvi": [64, 223], "ri": 65, "roi": 66, "rvi": [67, 225], "savi": [68, 226], "tndvi": [69, 229], "tsavi": [70, 230], "with_roi": 74, "rastertoolconfigurationexcept": 87, "altitud": 90, "nb_direct": 92, "with_altitud": 102, "grid": 119, "output_basenam": 121, "output_subdir": 122, "with_id_column": 128, "end_dat": 134, "period": 138, "start_dat": 142, "window": [148, 149, 150, 151, 152], "area": 155, "categor": 157, "category_fil": 158, "category_file_typ": 159, "category_index": 160, "category_label": 161, "chart_fil": 162, "compute_stat": 163, "display_chart": 164, "generated_stat": 165, "generated_stats_d": 166, "generated_stats_per_d": 167, "geometri": 168, "geometry_index": 169, "output_format": 171, "prefix": 174, "sigma": 177, "stat": [178, 290], "supported_output_format": 179, "valid_stat": 180, "valid_threshold": 181, "with_chart": 183, "with_geometri": 184, "with_outli": 185, "with_per_categori": 187, "within": 189, "cli": [190, 191, 195, 196, 198, 199, 200, 201, 202, 207], "create_argpars": [], "create_filt": [192, 193], "create_hillshad": [], "create_radioindic": [], "create_spe": [], "create_svf": [], "create_til": [], "create_timeseri": [], "with_bands_argu": 204, "with_outputdir_argu": 205, "with_window_argu": 206, "create_zonalstat": [], "process": [208, 209, 231, 288, 290, 295], "algo": [209, 234, 254, 272], "brightness_index": 211, "brightness_index2": 212, "interpolated_timeseri": 215, "median": 219, "normalized_differ": 222, "redness_index": 224, "rasterproc": 231, "radioindiceprocess": [232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251], "alias": [235, 255, 273], "argument": [236, 256, 274], "channel": [237, 310, 347], "compress": [238, 257, 275], "comput": [239, 258, 276], "configur": [240, 259, 277], "descript": [241, 260, 278, 326], "dtype": [242, 261, 279], "help": [243, 262, 280], "in_dtyp": [244, 263, 281], "name": [245, 264, 282, 367], "nbit": [246, 265, 283], "nodata": [247, 266, 284, 368], "per_band_algo": [248, 267, 285], "with_argu": [249, 268, 286], "with_channel": 250, "with_document": [251, 269, 287], "rasterfilt": [252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269], "rasterprocess": [270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287], "slide": 288, "compute_slid": 289, "compute_zonal_stat": 291, "compute_zonal_stats_per_categori": 292, "extract_zonal_outli": 293, "plot_stat": 294, "vector": [295, 304], "clip": 296, "crop": 297, "dissolv": 298, "filter_dissolv": 300, "get_raster_shap": 301, "raster": [302, 391, 392], "reproject": 303, "product": [305, 306, 323, 372, 392], "rasterproduct": [306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322], "bands_fil": 309, "file": 311, "free_in_memory_vrt": 312, "get_dat": [313, 356], "get_date_str": 314, "get_rast": 315, "get_relative_orbit": 316, "get_satellit": 317, "get_til": 318, "is_arch": 319, "masks_fil": 320, "open": 321, "rastertyp": [322, 323, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370], "identifi": 327, "bandchannel": [328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341], "blue": 329, "blue_60m": 330, "green": 331, "mir": 332, "mir_60m": 333, "nir": 334, "nir_60m": 335, "red": 336, "red_edge1": 337, "red_edge2": 338, "red_edge3": 339, "red_edge4": 340, "swir": 341, "accept": 344, "add": [345, 391], "bands_pattern": 346, "date_format": 348, "find": 349, "get": 350, "get_band_descript": [351, 352], "get_band_id": [353, 354], "get_bands_regexp": 355, "get_group": 357, "get_mask": 358, "get_mask_descript": 359, "get_mask_id": 360, "get_mask_regexp": 361, "has_channel": [362, 363], "has_mask": 364, "maskfunc": 365, "masknodata": 366, "product_pattern": 369, "s2_maja_mask": 371, "vrt": 372, "add_masks_to_vrt": 373, "set_band_descript": 374, "contributor": 376, "changelog": 377, "version": 377, "0": 377, "6": 377, "1": 377, "command": 378, "line": 378, "interfac": 378, "docker": [378, 388], "singular": [378, 388], "tabl": 387, "conda": 388, "et": 388, "licens": 389, "privat": 390, "api": [390, 392], "type": [391, 392], "built": 391, "custom": [391, 392], "refer": 392, "ad": 392, "design": 392, "rule": 392, "tool": 392, "side": [], "imag": [], "vfsdd": [], "handle_result": [], "filtering_dyn": [], "filter_opt": 194, "indices_opt": 197, "utils_cli": 202, "apply_process": 203, "create_in_memory_vrt": []}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1, "sphinx": 58}, "alltitles": {"Contributors": [[376, "contributors"]], "Changelog": [[377, "changelog"]], "Version 0.6.0": [[377, "version-0-6-0"]], "Version 0.6.1": [[377, "version-0-6-1"]], "Hillshade": [[377, "hillshade"], [23, "hillshade"]], "Rastertools": [[387, "rastertools"]], "Contents": [[387, "contents"]], "Indices and tables": [[387, "indices-and-tables"]], "Conda": [[388, "conda"]], "Docker et Singularity": [[388, "docker-et-singularity"]], "License": [[389, "license"]], "Private API": [[390, "private-api"]], "Raster types": [[391, "raster-types"]], "Built-in raster types": [[391, "built-in-raster-types"], [391, "id1"]], "Add custom raster types": [[391, "add-custom-raster-types"]], "eolab namespace": [[0, "module-eolab"]], "Subpackages": [[0, "subpackages"], [1, "subpackages"]], "eolab.rastertools package": [[1, "eolab-rastertools-package"]], "Submodules": [[1, "submodules"]], "eolab.rastertools.filtering module": [[1, "module-eolab.rastertools.filtering"]], "eolab.rastertools.hillshade module": [[1, "module-eolab.rastertools.hillshade"]], "eolab.rastertools.main module": [[1, "module-eolab.rastertools.main"]], "eolab.rastertools.radioindice module": [[1, "module-eolab.rastertools.radioindice"]], "eolab.rastertools.rastertools module": [[1, "module-eolab.rastertools.rastertools"]], "eolab.rastertools.speed module": [[1, "module-eolab.rastertools.speed"]], "eolab.rastertools.svf module": [[1, "module-eolab.rastertools.svf"]], "eolab.rastertools.tiling module": [[1, "module-eolab.rastertools.tiling"]], "eolab.rastertools.timeseries module": [[1, "module-eolab.rastertools.timeseries"]], "eolab.rastertools.utils module": [[1, "module-eolab.rastertools.utils"]], "eolab.rastertools.zonalstats module": [[1, "module-eolab.rastertools.zonalstats"]], "Module contents": [[1, "module-eolab.rastertools"]], "Filtering": [[2, "filtering"]], "Filtering.__init__": [[3, "filtering-init"]], "Filtering.adaptive_gaussian": [[4, "filtering-adaptive-gaussian"]], "Filtering.bands": [[5, "filtering-bands"]], "Filtering.get_default_filters": [[6, "filtering-get-default-filters"]], "Filtering.keep_vrt": [[7, "filtering-keep-vrt"]], "Filtering.local_mean": [[8, "filtering-local-mean"]], "Filtering.local_sum": [[9, "filtering-local-sum"]], "Filtering.median_filter": [[10, "filtering-median-filter"]], "Filtering.outputdir": [[11, "filtering-outputdir"]], "Filtering.pad_mode": [[12, "filtering-pad-mode"]], "Filtering.postprocess_files": [[13, "filtering-postprocess-files"]], "Filtering.process_file": [[14, "filtering-process-file"]], "Filtering.process_files": [[15, "filtering-process-files"]], "Filtering.raster_filter": [[16, "filtering-raster-filter"]], "Filtering.vrt_dir": [[17, "filtering-vrt-dir"]], "Filtering.window_size": [[18, "filtering-window-size"]], "Filtering.with_filter_configuration": [[19, "filtering-with-filter-configuration"]], "Filtering.with_output": [[20, "filtering-with-output"]], "Filtering.with_vrt_stored": [[21, "filtering-with-vrt-stored"]], "Filtering.with_windows": [[22, "filtering-with-windows"]], "Hillshade.__init__": [[24, "hillshade-init"]], "Hillshade.azimuth": [[25, "hillshade-azimuth"]], "Hillshade.elevation": [[26, "hillshade-elevation"]], "Hillshade.keep_vrt": [[27, "hillshade-keep-vrt"]], "Hillshade.outputdir": [[28, "hillshade-outputdir"]], "Hillshade.pad_mode": [[29, "hillshade-pad-mode"]], "Hillshade.postprocess_files": [[30, "hillshade-postprocess-files"]], "Hillshade.process_file": [[31, "hillshade-process-file"]], "Hillshade.process_files": [[32, "hillshade-process-files"]], "Hillshade.radius": [[33, "hillshade-radius"]], "Hillshade.resolution": [[34, "hillshade-resolution"]], "Hillshade.vrt_dir": [[35, "hillshade-vrt-dir"]], "Hillshade.window_size": [[36, "hillshade-window-size"]], "Hillshade.with_output": [[37, "hillshade-with-output"]], "Hillshade.with_vrt_stored": [[38, "hillshade-with-vrt-stored"]], "Hillshade.with_windows": [[39, "hillshade-with-windows"]], "Radioindice": [[40, "radioindice"]], "Radioindice.__init__": [[41, "radioindice-init"]], "Radioindice.bi": [[42, "radioindice-bi"]], "Radioindice.bi2": [[43, "radioindice-bi2"]], "Radioindice.evi": [[44, "radioindice-evi"]], "Radioindice.get_default_indices": [[45, "radioindice-get-default-indices"]], "Radioindice.indices": [[46, "radioindice-indices"]], "Radioindice.ipvi": [[47, "radioindice-ipvi"]], "Radioindice.keep_vrt": [[48, "radioindice-keep-vrt"]], "Radioindice.merge": [[49, "radioindice-merge"]], "Radioindice.mndwi": [[50, "radioindice-mndwi"]], "Radioindice.msavi": [[51, "radioindice-msavi"]], "Radioindice.msavi2": [[52, "radioindice-msavi2"]], "Radioindice.ndbi": [[53, "radioindice-ndbi"]], "Radioindice.ndpi": [[54, "radioindice-ndpi"]], "Radioindice.ndti": [[55, "radioindice-ndti"]], "Radioindice.ndvi": [[56, "radioindice-ndvi"]], "Radioindice.ndwi": [[57, "radioindice-ndwi"]], "Radioindice.ndwi2": [[58, "radioindice-ndwi2"]], "Radioindice.outputdir": [[59, "radioindice-outputdir"]], "Radioindice.pad_mode": [[60, "radioindice-pad-mode"]], "Radioindice.postprocess_files": [[61, "radioindice-postprocess-files"]], "Radioindice.process_file": [[62, "radioindice-process-file"]], "Radioindice.process_files": [[63, "radioindice-process-files"]], "Radioindice.pvi": [[64, "radioindice-pvi"]], "Radioindice.ri": [[65, "radioindice-ri"]], "Radioindice.roi": [[66, "radioindice-roi"]], "Radioindice.rvi": [[67, "radioindice-rvi"]], "Radioindice.savi": [[68, "radioindice-savi"]], "Radioindice.tndvi": [[69, "radioindice-tndvi"]], "Radioindice.tsavi": [[70, "radioindice-tsavi"]], "Radioindice.vrt_dir": [[71, "radioindice-vrt-dir"]], "Radioindice.window_size": [[72, "radioindice-window-size"]], "Radioindice.with_output": [[73, "radioindice-with-output"]], "Radioindice.with_roi": [[74, "radioindice-with-roi"]], "Radioindice.with_vrt_stored": [[75, "radioindice-with-vrt-stored"]], "Radioindice.with_windows": [[76, "radioindice-with-windows"]], "Rastertool": [[77, "rastertool"]], "Rastertool.__init__": [[78, "rastertool-init"]], "Rastertool.keep_vrt": [[79, "rastertool-keep-vrt"]], "Rastertool.outputdir": [[80, "rastertool-outputdir"]], "Rastertool.postprocess_files": [[81, "rastertool-postprocess-files"]], "Rastertool.process_file": [[82, "rastertool-process-file"]], "Rastertool.process_files": [[83, "rastertool-process-files"]], "Rastertool.vrt_dir": [[84, "rastertool-vrt-dir"]], "Rastertool.with_output": [[85, "rastertool-with-output"]], "Rastertool.with_vrt_stored": [[86, "rastertool-with-vrt-stored"]], "RastertoolConfigurationException": [[87, "rastertoolconfigurationexception"]], "SVF": [[88, "svf"]], "SVF.__init__": [[89, "svf-init"]], "SVF.altitude": [[90, "svf-altitude"]], "SVF.keep_vrt": [[91, "svf-keep-vrt"]], "SVF.nb_directions": [[92, "svf-nb-directions"]], "SVF.outputdir": [[93, "svf-outputdir"]], "SVF.pad_mode": [[94, "svf-pad-mode"]], "SVF.postprocess_files": [[95, "svf-postprocess-files"]], "SVF.process_file": [[96, "svf-process-file"]], "SVF.process_files": [[97, "svf-process-files"]], "SVF.radius": [[98, "svf-radius"]], "SVF.resolution": [[99, "svf-resolution"]], "SVF.vrt_dir": [[100, "svf-vrt-dir"]], "SVF.window_size": [[101, "svf-window-size"]], "SVF.with_altitude": [[102, "svf-with-altitude"]], "SVF.with_output": [[103, "svf-with-output"]], "SVF.with_vrt_stored": [[104, "svf-with-vrt-stored"]], "SVF.with_windows": [[105, "svf-with-windows"]], "Speed": [[106, "speed"]], "Speed.__init__": [[107, "speed-init"]], "Speed.bands": [[108, "speed-bands"]], "Speed.keep_vrt": [[109, "speed-keep-vrt"]], "Speed.outputdir": [[110, "speed-outputdir"]], "Speed.postprocess_files": [[111, "speed-postprocess-files"]], "Speed.process_file": [[112, "speed-process-file"]], "Speed.process_files": [[113, "speed-process-files"]], "Speed.vrt_dir": [[114, "speed-vrt-dir"]], "Speed.with_output": [[115, "speed-with-output"]], "Speed.with_vrt_stored": [[116, "speed-with-vrt-stored"]], "Tiling": [[117, "tiling"]], "Tiling.__init__": [[118, "tiling-init"]], "Tiling.grid": [[119, "tiling-grid"]], "Tiling.keep_vrt": [[120, "tiling-keep-vrt"]], "Tiling.output_basename": [[121, "tiling-output-basename"]], "Tiling.output_subdir": [[122, "tiling-output-subdir"]], "Tiling.outputdir": [[123, "tiling-outputdir"]], "Tiling.postprocess_files": [[124, "tiling-postprocess-files"]], "Tiling.process_file": [[125, "tiling-process-file"]], "Tiling.process_files": [[126, "tiling-process-files"]], "Tiling.vrt_dir": [[127, "tiling-vrt-dir"]], "Tiling.with_id_column": [[128, "tiling-with-id-column"]], "Tiling.with_output": [[129, "tiling-with-output"]], "Tiling.with_vrt_stored": [[130, "tiling-with-vrt-stored"]], "Timeseries": [[131, "timeseries"]], "Timeseries.__init__": [[132, "timeseries-init"]], "Timeseries.bands": [[133, "timeseries-bands"]], "Timeseries.end_date": [[134, "timeseries-end-date"]], "Timeseries.keep_vrt": [[135, "timeseries-keep-vrt"]], "Timeseries.outputdir": [[136, "timeseries-outputdir"]], "Timeseries.pad_mode": [[137, "timeseries-pad-mode"]], "Timeseries.period": [[138, "timeseries-period"]], "Timeseries.postprocess_files": [[139, "timeseries-postprocess-files"]], "Timeseries.process_file": [[140, "timeseries-process-file"]], "Timeseries.process_files": [[141, "timeseries-process-files"]], "Timeseries.start_date": [[142, "timeseries-start-date"]], "Timeseries.vrt_dir": [[143, "timeseries-vrt-dir"]], "Timeseries.window_size": [[144, "timeseries-window-size"]], "Timeseries.with_output": [[145, "timeseries-with-output"]], "Timeseries.with_vrt_stored": [[146, "timeseries-with-vrt-stored"]], "Timeseries.with_windows": [[147, "timeseries-with-windows"]], "Windowable": [[148, "windowable"]], "Windowable.__init__": [[149, "windowable-init"]], "Windowable.pad_mode": [[150, "windowable-pad-mode"]], "Windowable.window_size": [[151, "windowable-window-size"]], "Windowable.with_windows": [[152, "windowable-with-windows"]], "Zonalstats": [[153, "zonalstats"]], "Zonalstats.__init__": [[154, "zonalstats-init"]], "Zonalstats.area": [[155, "zonalstats-area"]], "Zonalstats.bands": [[156, "zonalstats-bands"]], "Zonalstats.categorical": [[157, "zonalstats-categorical"]], "Zonalstats.category_file": [[158, "zonalstats-category-file"]], "Zonalstats.category_file_type": [[159, "zonalstats-category-file-type"]], "Zonalstats.category_index": [[160, "zonalstats-category-index"]], "Zonalstats.category_labels": [[161, "zonalstats-category-labels"]], "Zonalstats.chart_file": [[162, "zonalstats-chart-file"]], "Zonalstats.compute_stats": [[163, "zonalstats-compute-stats"]], "Zonalstats.display_chart": [[164, "zonalstats-display-chart"]], "Zonalstats.generated_stats": [[165, "zonalstats-generated-stats"]], "Zonalstats.generated_stats_dates": [[166, "zonalstats-generated-stats-dates"]], "Zonalstats.generated_stats_per_date": [[167, "zonalstats-generated-stats-per-date"]], "Zonalstats.geometries": [[168, "zonalstats-geometries"]], "Zonalstats.geometry_index": [[169, "zonalstats-geometry-index"]], "Zonalstats.keep_vrt": [[170, "zonalstats-keep-vrt"]], "Zonalstats.output_format": [[171, "zonalstats-output-format"]], "Zonalstats.outputdir": [[172, "zonalstats-outputdir"]], "Zonalstats.postprocess_files": [[173, "zonalstats-postprocess-files"]], "Zonalstats.prefix": [[174, "zonalstats-prefix"]], "Zonalstats.process_file": [[175, "zonalstats-process-file"]], "Zonalstats.process_files": [[176, "zonalstats-process-files"]], "Zonalstats.sigma": [[177, "zonalstats-sigma"]], "Zonalstats.stats": [[178, "zonalstats-stats"]], "Zonalstats.supported_output_formats": [[179, "zonalstats-supported-output-formats"]], "Zonalstats.valid_stats": [[180, "zonalstats-valid-stats"]], "Zonalstats.valid_threshold": [[181, "zonalstats-valid-threshold"]], "Zonalstats.vrt_dir": [[182, "zonalstats-vrt-dir"]], "Zonalstats.with_chart": [[183, "zonalstats-with-chart"]], "Zonalstats.with_geometries": [[184, "zonalstats-with-geometries"]], "Zonalstats.with_outliers": [[185, "zonalstats-with-outliers"]], "Zonalstats.with_output": [[186, "zonalstats-with-output"]], "Zonalstats.with_per_category": [[187, "zonalstats-with-per-category"]], "Zonalstats.with_vrt_stored": [[188, "zonalstats-with-vrt-stored"]], "Zonalstats.within": [[189, "zonalstats-within"]], "eolab.rastertools.cli": [[190, "eolab-rastertools-cli"]], "eolab.rastertools.cli.filtering": [[191, "eolab-rastertools-cli-filtering"]], "create_filter": [[192, "create-filter"]], "create_filtering": [[193, "create-filtering"]], "filter_options": [[194, "filter-options"]], "eolab.rastertools.cli.hillshade": [[195, "eolab-rastertools-cli-hillshade"]], "eolab.rastertools.cli.radioindice": [[196, "eolab-rastertools-cli-radioindice"]], "indices_opt": [[197, "indices-opt"]], "eolab.rastertools.cli.speed": [[198, "eolab-rastertools-cli-speed"]], "eolab.rastertools.cli.svf": [[199, "eolab-rastertools-cli-svf"]], "eolab.rastertools.cli.tiling": [[200, "eolab-rastertools-cli-tiling"]], "eolab.rastertools.cli.timeseries": [[201, "eolab-rastertools-cli-timeseries"]], "eolab.rastertools.cli.utils_cli": [[202, "eolab-rastertools-cli-utils-cli"]], "apply_process": [[203, "apply-process"]], "with_bands_arguments": [[204, "with-bands-arguments"]], "with_outputdir_arguments": [[205, "with-outputdir-arguments"]], "with_window_arguments": [[206, "with-window-arguments"]], "eolab.rastertools.cli.zonalstats": [[207, "eolab-rastertools-cli-zonalstats"]], "eolab.rastertools.processing": [[208, "eolab-rastertools-processing"]], "eolab.rastertools.processing.algo": [[209, "eolab-rastertools-processing-algo"]], "adaptive_gaussian": [[210, "adaptive-gaussian"]], "brightness_index": [[211, "brightness-index"]], "brightness_index2": [[212, "brightness-index2"]], "evi": [[213, "evi"]], "hillshade": [[214, "hillshade"], [380, "hillshade"]], "interpolated_timeseries": [[215, "interpolated-timeseries"]], "ipvi": [[216, "ipvi"]], "local_mean": [[217, "local-mean"]], "local_sum": [[218, "local-sum"]], "median": [[219, "median"]], "msavi": [[220, "msavi"]], "msavi2": [[221, "msavi2"]], "normalized_difference": [[222, "normalized-difference"]], "pvi": [[223, "pvi"]], "redness_index": [[224, "redness-index"]], "rvi": [[225, "rvi"]], "savi": [[226, "savi"]], "speed": [[227, "speed"], [382, "speed"]], "svf": [[228, "svf"], [383, "svf"]], "tndvi": [[229, "tndvi"]], "tsavi": [[230, "tsavi"]], "eolab.rastertools.processing.rasterproc": [[231, "eolab-rastertools-processing-rasterproc"]], "RadioindiceProcessing": [[232, "radioindiceprocessing"]], "RadioindiceProcessing.__init__": [[233, "radioindiceprocessing-init"]], "RadioindiceProcessing.algo": [[234, "radioindiceprocessing-algo"]], "RadioindiceProcessing.aliases": [[235, "radioindiceprocessing-aliases"]], "RadioindiceProcessing.arguments": [[236, "radioindiceprocessing-arguments"]], "RadioindiceProcessing.channels": [[237, "radioindiceprocessing-channels"]], "RadioindiceProcessing.compress": [[238, "radioindiceprocessing-compress"]], "RadioindiceProcessing.compute": [[239, "radioindiceprocessing-compute"]], "RadioindiceProcessing.configure": [[240, "radioindiceprocessing-configure"]], "RadioindiceProcessing.description": [[241, "radioindiceprocessing-description"]], "RadioindiceProcessing.dtype": [[242, "radioindiceprocessing-dtype"]], "RadioindiceProcessing.help": [[243, "radioindiceprocessing-help"]], "RadioindiceProcessing.in_dtype": [[244, "radioindiceprocessing-in-dtype"]], "RadioindiceProcessing.name": [[245, "radioindiceprocessing-name"]], "RadioindiceProcessing.nbits": [[246, "radioindiceprocessing-nbits"]], "RadioindiceProcessing.nodata": [[247, "radioindiceprocessing-nodata"]], "RadioindiceProcessing.per_band_algo": [[248, "radioindiceprocessing-per-band-algo"]], "RadioindiceProcessing.with_arguments": [[249, "radioindiceprocessing-with-arguments"]], "RadioindiceProcessing.with_channels": [[250, "radioindiceprocessing-with-channels"]], "RadioindiceProcessing.with_documentation": [[251, "radioindiceprocessing-with-documentation"]], "RasterFilter": [[252, "rasterfilter"]], "RasterFilter.__init__": [[253, "rasterfilter-init"]], "RasterFilter.algo": [[254, "rasterfilter-algo"]], "RasterFilter.aliases": [[255, "rasterfilter-aliases"]], "RasterFilter.arguments": [[256, "rasterfilter-arguments"]], "RasterFilter.compress": [[257, "rasterfilter-compress"]], "RasterFilter.compute": [[258, "rasterfilter-compute"]], "RasterFilter.configure": [[259, "rasterfilter-configure"]], "RasterFilter.description": [[260, "rasterfilter-description"]], "RasterFilter.dtype": [[261, "rasterfilter-dtype"]], "RasterFilter.help": [[262, "rasterfilter-help"]], "RasterFilter.in_dtype": [[263, "rasterfilter-in-dtype"]], "RasterFilter.name": [[264, "rasterfilter-name"]], "RasterFilter.nbits": [[265, "rasterfilter-nbits"]], "RasterFilter.nodata": [[266, "rasterfilter-nodata"]], "RasterFilter.per_band_algo": [[267, "rasterfilter-per-band-algo"]], "RasterFilter.with_arguments": [[268, "rasterfilter-with-arguments"]], "RasterFilter.with_documentation": [[269, "rasterfilter-with-documentation"]], "RasterProcessing": [[270, "rasterprocessing"]], "RasterProcessing.__init__": [[271, "rasterprocessing-init"]], "RasterProcessing.algo": [[272, "rasterprocessing-algo"]], "RasterProcessing.aliases": [[273, "rasterprocessing-aliases"]], "RasterProcessing.arguments": [[274, "rasterprocessing-arguments"]], "RasterProcessing.compress": [[275, "rasterprocessing-compress"]], "RasterProcessing.compute": [[276, "rasterprocessing-compute"]], "RasterProcessing.configure": [[277, "rasterprocessing-configure"]], "RasterProcessing.description": [[278, "rasterprocessing-description"]], "RasterProcessing.dtype": [[279, "rasterprocessing-dtype"]], "RasterProcessing.help": [[280, "rasterprocessing-help"]], "RasterProcessing.in_dtype": [[281, "rasterprocessing-in-dtype"]], "RasterProcessing.name": [[282, "rasterprocessing-name"]], "RasterProcessing.nbits": [[283, "rasterprocessing-nbits"]], "RasterProcessing.nodata": [[284, "rasterprocessing-nodata"]], "RasterProcessing.per_band_algo": [[285, "rasterprocessing-per-band-algo"]], "RasterProcessing.with_arguments": [[286, "rasterprocessing-with-arguments"]], "RasterProcessing.with_documentation": [[287, "rasterprocessing-with-documentation"]], "eolab.rastertools.processing.sliding": [[288, "eolab-rastertools-processing-sliding"]], "compute_sliding": [[289, "compute-sliding"]], "eolab.rastertools.processing.stats": [[290, "eolab-rastertools-processing-stats"]], "compute_zonal_stats": [[291, "compute-zonal-stats"]], "compute_zonal_stats_per_category": [[292, "compute-zonal-stats-per-category"]], "extract_zonal_outliers": [[293, "extract-zonal-outliers"]], "plot_stats": [[294, "plot-stats"]], ")": [[294, "id3"]], "eolab.rastertools.processing.vector": [[295, "eolab-rastertools-processing-vector"]], "clip": [[296, "clip"]], "crop": [[297, "crop"]], "dissolve": [[298, "dissolve"]], "filter": [[299, "filter"], [379, "filter"]], "filter_dissolve": [[300, "filter-dissolve"]], "get_raster_shape": [[301, "get-raster-shape"]], "rasterize": [[302, "rasterize"]], "reproject": [[303, "reproject"]], "vectorize": [[304, "vectorize"]], "eolab.rastertools.product": [[305, "eolab-rastertools-product"]], "eolab.rastertools.product.rasterproduct": [[306, "eolab-rastertools-product-rasterproduct"]], "RasterProduct": [[307, "rasterproduct"]], "RasterProduct.__init__": [[308, "rasterproduct-init"]], "RasterProduct.bands_files": [[309, "rasterproduct-bands-files"]], "RasterProduct.channels": [[310, "rasterproduct-channels"]], "RasterProduct.file": [[311, "rasterproduct-file"]], "RasterProduct.free_in_memory_vrts": [[312, "rasterproduct-free-in-memory-vrts"]], "RasterProduct.get_date": [[313, "rasterproduct-get-date"]], "RasterProduct.get_date_string": [[314, "rasterproduct-get-date-string"]], "RasterProduct.get_raster": [[315, "rasterproduct-get-raster"]], "RasterProduct.get_relative_orbit": [[316, "rasterproduct-get-relative-orbit"]], "RasterProduct.get_satellite": [[317, "rasterproduct-get-satellite"]], "RasterProduct.get_tile": [[318, "rasterproduct-get-tile"]], "RasterProduct.is_archive": [[319, "rasterproduct-is-archive"]], "RasterProduct.masks_files": [[320, "rasterproduct-masks-files"]], "RasterProduct.open": [[321, "rasterproduct-open"]], "RasterProduct.rastertype": [[322, "rasterproduct-rastertype"]], "eolab.rastertools.product.rastertype": [[323, "eolab-rastertools-product-rastertype"]], "Band": [[324, "band"]], "Band.__init__": [[325, "band-init"]], "Band.description": [[326, "band-description"]], "Band.identifier": [[327, "band-identifier"]], "BandChannel": [[328, "bandchannel"]], "BandChannel.blue": [[329, "bandchannel-blue"]], "BandChannel.blue_60m": [[330, "bandchannel-blue-60m"]], "BandChannel.green": [[331, "bandchannel-green"]], "BandChannel.mir": [[332, "bandchannel-mir"]], "BandChannel.mir_60m": [[333, "bandchannel-mir-60m"]], "BandChannel.nir": [[334, "bandchannel-nir"]], "BandChannel.nir_60m": [[335, "bandchannel-nir-60m"]], "BandChannel.red": [[336, "bandchannel-red"]], "BandChannel.red_edge1": [[337, "bandchannel-red-edge1"]], "BandChannel.red_edge2": [[338, "bandchannel-red-edge2"]], "BandChannel.red_edge3": [[339, "bandchannel-red-edge3"]], "BandChannel.red_edge4": [[340, "bandchannel-red-edge4"]], "BandChannel.swir": [[341, "bandchannel-swir"]], "RasterType": [[342, "rastertype"]], "RasterType.__init__": [[343, "rastertype-init"]], "RasterType.accept": [[344, "rastertype-accept"]], "RasterType.add": [[345, "rastertype-add"]], "RasterType.bands_pattern": [[346, "rastertype-bands-pattern"]], "RasterType.channels": [[347, "rastertype-channels"]], "RasterType.date_format": [[348, "rastertype-date-format"]], "RasterType.find": [[349, "rastertype-find"]], "RasterType.get": [[350, "rastertype-get"]], "RasterType.get_band_description": [[351, "rastertype-get-band-description"]], "RasterType.get_band_descriptions": [[352, "rastertype-get-band-descriptions"]], "RasterType.get_band_id": [[353, "rastertype-get-band-id"]], "RasterType.get_band_ids": [[354, "rastertype-get-band-ids"]], "RasterType.get_bands_regexp": [[355, "rastertype-get-bands-regexp"]], "RasterType.get_date": [[356, "rastertype-get-date"]], "RasterType.get_group": [[357, "rastertype-get-group"]], "RasterType.get_mask": [[358, "rastertype-get-mask"]], "RasterType.get_mask_descriptions": [[359, "rastertype-get-mask-descriptions"]], "RasterType.get_mask_ids": [[360, "rastertype-get-mask-ids"]], "RasterType.get_mask_regexp": [[361, "rastertype-get-mask-regexp"]], "RasterType.has_channel": [[362, "rastertype-has-channel"]], "RasterType.has_channels": [[363, "rastertype-has-channels"]], "RasterType.has_mask": [[364, "rastertype-has-mask"]], "RasterType.maskfunc": [[365, "rastertype-maskfunc"]], "RasterType.masknodata": [[366, "rastertype-masknodata"]], "RasterType.name": [[367, "rastertype-name"]], "RasterType.nodata": [[368, "rastertype-nodata"]], "RasterType.product_pattern": [[369, "rastertype-product-pattern"]], "RasterType.rastertypes": [[370, "rastertype-rastertypes"]], "s2_maja_mask": [[371, "s2-maja-mask"]], "eolab.rastertools.product.vrt": [[372, "eolab-rastertools-product-vrt"]], "add_masks_to_vrt": [[373, "add-masks-to-vrt"]], "set_band_descriptions": [[374, "set-band-descriptions"]], "eolab": [[375, "eolab"]], "Command Line Interface": [[378, "command-line-interface"]], "rastertools": [[378, "rastertools"], [392, "rastertools"]], "Docker/Singularity": [[378, "docker-singularity"]], "radioindice": [[381, "radioindice"]], "tiling": [[384, "tiling"]], "timeseries": [[385, "timeseries"]], "zonalstats": [[386, "zonalstats"]], "API Reference": [[392, "api-reference"]], "Raster products": [[392, "raster-products"]], "Adding custom raster types": [[392, "adding-custom-raster-types"]], "Design rules of raster tools": [[392, "design-rules-of-raster-tools"]]}, "indexentries": {"eolab": [[0, "module-eolab"]], "module": [[0, "module-eolab"], [1, "module-eolab.rastertools"], [1, "module-eolab.rastertools.filtering"], [1, "module-eolab.rastertools.hillshade"], [1, "module-eolab.rastertools.main"], [1, "module-eolab.rastertools.radioindice"], [1, "module-eolab.rastertools.rastertools"], [1, "module-eolab.rastertools.speed"], [1, "module-eolab.rastertools.svf"], [1, "module-eolab.rastertools.tiling"], [1, "module-eolab.rastertools.timeseries"], [1, "module-eolab.rastertools.utils"], [1, "module-eolab.rastertools.zonalstats"], [190, "module-eolab.rastertools.cli"], [191, "module-eolab.rastertools.cli.filtering"], [195, "module-eolab.rastertools.cli.hillshade"], [196, "module-eolab.rastertools.cli.radioindice"], [198, "module-eolab.rastertools.cli.speed"], [199, "module-eolab.rastertools.cli.svf"], [200, "module-eolab.rastertools.cli.tiling"], [201, "module-eolab.rastertools.cli.timeseries"], [202, "module-eolab.rastertools.cli.utils_cli"], [207, "module-eolab.rastertools.cli.zonalstats"], [208, "module-eolab.rastertools.processing"], [209, "module-eolab.rastertools.processing.algo"], [231, "module-eolab.rastertools.processing.rasterproc"], [288, "module-eolab.rastertools.processing.sliding"], [290, "module-eolab.rastertools.processing.stats"], [295, "module-eolab.rastertools.processing.vector"], [305, "module-eolab.rastertools.product"], [306, "module-eolab.rastertools.product.rasterproduct"], [323, "module-eolab.rastertools.product.rastertype"], [372, "module-eolab.rastertools.product.vrt"]], "filtering (class in eolab.rastertools)": [[1, "eolab.rastertools.Filtering"], [2, "eolab.rastertools.Filtering"]], "filtering (class in eolab.rastertools.filtering)": [[1, "eolab.rastertools.filtering.Filtering"]], "hillshade (class in eolab.rastertools)": [[1, "eolab.rastertools.Hillshade"], [23, "eolab.rastertools.Hillshade"]], "hillshade (class in eolab.rastertools.hillshade)": [[1, "eolab.rastertools.hillshade.Hillshade"]], "radioindice (class in eolab.rastertools)": [[1, "eolab.rastertools.Radioindice"], [40, "eolab.rastertools.Radioindice"]], "radioindice (class in eolab.rastertools.radioindice)": [[1, "eolab.rastertools.radioindice.Radioindice"]], "rastertool (class in eolab.rastertools)": [[1, "eolab.rastertools.Rastertool"], [77, "eolab.rastertools.Rastertool"]], "rastertool (class in eolab.rastertools.rastertools)": [[1, "eolab.rastertools.rastertools.Rastertool"]], "rastertoolconfigurationexception": [[1, "eolab.rastertools.RastertoolConfigurationException"], [1, "eolab.rastertools.rastertools.RastertoolConfigurationException"], [87, "eolab.rastertools.RastertoolConfigurationException"]], "svf (class in eolab.rastertools)": [[1, "eolab.rastertools.SVF"], [88, "eolab.rastertools.SVF"]], "svf (class in eolab.rastertools.svf)": [[1, "eolab.rastertools.svf.SVF"]], "speed (class in eolab.rastertools)": [[1, "eolab.rastertools.Speed"], [106, "eolab.rastertools.Speed"]], "speed (class in eolab.rastertools.speed)": [[1, "eolab.rastertools.speed.Speed"]], "tiling (class in eolab.rastertools)": [[1, "eolab.rastertools.Tiling"], [117, "eolab.rastertools.Tiling"]], "tiling (class in eolab.rastertools.tiling)": [[1, "eolab.rastertools.tiling.Tiling"]], "timeseries (class in eolab.rastertools)": [[1, "eolab.rastertools.Timeseries"], [131, "eolab.rastertools.Timeseries"]], "timeseries (class in eolab.rastertools.timeseries)": [[1, "eolab.rastertools.timeseries.Timeseries"]], "windowable (class in eolab.rastertools)": [[1, "eolab.rastertools.Windowable"], [148, "eolab.rastertools.Windowable"]], "windowable (class in eolab.rastertools.rastertools)": [[1, "eolab.rastertools.rastertools.Windowable"]], "zonalstats (class in eolab.rastertools)": [[1, "eolab.rastertools.Zonalstats"], [153, "eolab.rastertools.Zonalstats"]], "zonalstats (class in eolab.rastertools.zonalstats)": [[1, "eolab.rastertools.zonalstats.Zonalstats"]], "adaptive_gaussian (eolab.rastertools.filtering attribute)": [[1, "eolab.rastertools.Filtering.adaptive_gaussian"], [4, "eolab.rastertools.Filtering.adaptive_gaussian"]], "adaptive_gaussian (eolab.rastertools.filtering.filtering attribute)": [[1, "eolab.rastertools.filtering.Filtering.adaptive_gaussian"]], "add_custom_rastertypes() (in module eolab.rastertools)": [[1, "eolab.rastertools.add_custom_rastertypes"], [392, "eolab.rastertools.add_custom_rastertypes"]], "add_custom_rastertypes() (in module eolab.rastertools.main)": [[1, "eolab.rastertools.main.add_custom_rastertypes"]], "altitude (eolab.rastertools.svf property)": [[1, "eolab.rastertools.SVF.altitude"], [90, "eolab.rastertools.SVF.altitude"]], "altitude (eolab.rastertools.svf.svf property)": [[1, "eolab.rastertools.svf.SVF.altitude"]], "area (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.area"], [155, "eolab.rastertools.Zonalstats.area"]], "area (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.area"]], "azimuth (eolab.rastertools.hillshade property)": [[1, "eolab.rastertools.Hillshade.azimuth"], [25, "eolab.rastertools.Hillshade.azimuth"]], "azimuth (eolab.rastertools.hillshade.hillshade property)": [[1, "eolab.rastertools.hillshade.Hillshade.azimuth"]], "bands (eolab.rastertools.filtering property)": [[1, "eolab.rastertools.Filtering.bands"], [5, "eolab.rastertools.Filtering.bands"]], "bands (eolab.rastertools.speed property)": [[1, "eolab.rastertools.Speed.bands"], [108, "eolab.rastertools.Speed.bands"]], "bands (eolab.rastertools.timeseries property)": [[1, "eolab.rastertools.Timeseries.bands"], [133, "eolab.rastertools.Timeseries.bands"]], "bands (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.bands"], [156, "eolab.rastertools.Zonalstats.bands"]], "bands (eolab.rastertools.filtering.filtering property)": [[1, "eolab.rastertools.filtering.Filtering.bands"]], "bands (eolab.rastertools.speed.speed property)": [[1, "eolab.rastertools.speed.Speed.bands"]], "bands (eolab.rastertools.timeseries.timeseries property)": [[1, "eolab.rastertools.timeseries.Timeseries.bands"]], "bands (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.bands"]], "bi (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.bi"], [42, "eolab.rastertools.Radioindice.bi"]], "bi (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.bi"]], "bi2 (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.bi2"], [43, "eolab.rastertools.Radioindice.bi2"]], "bi2 (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.bi2"]], "categorical (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.categorical"], [157, "eolab.rastertools.Zonalstats.categorical"]], "categorical (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.categorical"]], "category_file (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.category_file"], [158, "eolab.rastertools.Zonalstats.category_file"]], "category_file (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.category_file"]], "category_file_type (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.category_file_type"], [159, "eolab.rastertools.Zonalstats.category_file_type"]], "category_file_type (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.category_file_type"]], "category_index (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.category_index"], [160, "eolab.rastertools.Zonalstats.category_index"]], "category_index (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.category_index"]], "category_labels (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.category_labels"], [161, "eolab.rastertools.Zonalstats.category_labels"]], "category_labels (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.category_labels"]], "chart_file (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.chart_file"], [162, "eolab.rastertools.Zonalstats.chart_file"]], "chart_file (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.chart_file"]], "compute_indices() (in module eolab.rastertools.radioindice)": [[1, "eolab.rastertools.radioindice.compute_indices"]], "compute_speed() (in module eolab.rastertools.speed)": [[1, "eolab.rastertools.speed.compute_speed"]], "compute_stats() (eolab.rastertools.zonalstats method)": [[1, "eolab.rastertools.Zonalstats.compute_stats"], [163, "eolab.rastertools.Zonalstats.compute_stats"]], "compute_stats() (eolab.rastertools.zonalstats.zonalstats method)": [[1, "eolab.rastertools.zonalstats.Zonalstats.compute_stats"]], "compute_timeseries() (in module eolab.rastertools.timeseries)": [[1, "eolab.rastertools.timeseries.compute_timeseries"]], "display_chart (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.display_chart"], [164, "eolab.rastertools.Zonalstats.display_chart"]], "display_chart (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.display_chart"]], "elevation (eolab.rastertools.hillshade property)": [[1, "eolab.rastertools.Hillshade.elevation"], [26, "eolab.rastertools.Hillshade.elevation"]], "elevation (eolab.rastertools.hillshade.hillshade property)": [[1, "eolab.rastertools.hillshade.Hillshade.elevation"]], "end_date (eolab.rastertools.timeseries property)": [[1, "eolab.rastertools.Timeseries.end_date"], [134, "eolab.rastertools.Timeseries.end_date"]], "end_date (eolab.rastertools.timeseries.timeseries property)": [[1, "eolab.rastertools.timeseries.Timeseries.end_date"]], "eolab.rastertools": [[1, "module-eolab.rastertools"]], "eolab.rastertools.filtering": [[1, "module-eolab.rastertools.filtering"]], "eolab.rastertools.hillshade": [[1, "module-eolab.rastertools.hillshade"]], "eolab.rastertools.main": [[1, "module-eolab.rastertools.main"]], "eolab.rastertools.radioindice": [[1, "module-eolab.rastertools.radioindice"]], "eolab.rastertools.rastertools": [[1, "module-eolab.rastertools.rastertools"]], "eolab.rastertools.speed": [[1, "module-eolab.rastertools.speed"]], "eolab.rastertools.svf": [[1, "module-eolab.rastertools.svf"]], "eolab.rastertools.tiling": [[1, "module-eolab.rastertools.tiling"]], "eolab.rastertools.timeseries": [[1, "module-eolab.rastertools.timeseries"]], "eolab.rastertools.utils": [[1, "module-eolab.rastertools.utils"]], "eolab.rastertools.zonalstats": [[1, "module-eolab.rastertools.zonalstats"]], "evi (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.evi"], [44, "eolab.rastertools.Radioindice.evi"]], "evi (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.evi"]], "generated_stats (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.generated_stats"], [165, "eolab.rastertools.Zonalstats.generated_stats"]], "generated_stats (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.generated_stats"]], "generated_stats_dates (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.generated_stats_dates"], [166, "eolab.rastertools.Zonalstats.generated_stats_dates"]], "generated_stats_dates (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.generated_stats_dates"]], "generated_stats_per_date (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.generated_stats_per_date"], [167, "eolab.rastertools.Zonalstats.generated_stats_per_date"]], "generated_stats_per_date (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.generated_stats_per_date"]], "geometries (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.geometries"], [168, "eolab.rastertools.Zonalstats.geometries"]], "geometries (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.geometries"]], "geometry_index (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.geometry_index"], [169, "eolab.rastertools.Zonalstats.geometry_index"]], "geometry_index (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.geometry_index"]], "get_basename() (in module eolab.rastertools.utils)": [[1, "eolab.rastertools.utils.get_basename"]], "get_default_filters() (eolab.rastertools.filtering static method)": [[1, "eolab.rastertools.Filtering.get_default_filters"], [6, "eolab.rastertools.Filtering.get_default_filters"]], "get_default_filters() (eolab.rastertools.filtering.filtering static method)": [[1, "eolab.rastertools.filtering.Filtering.get_default_filters"]], "get_default_indices() (eolab.rastertools.radioindice static method)": [[1, "eolab.rastertools.Radioindice.get_default_indices"], [45, "eolab.rastertools.Radioindice.get_default_indices"]], "get_default_indices() (eolab.rastertools.radioindice.radioindice static method)": [[1, "eolab.rastertools.radioindice.Radioindice.get_default_indices"]], "get_metadata_name() (in module eolab.rastertools.utils)": [[1, "eolab.rastertools.utils.get_metadata_name"]], "get_suffixes() (in module eolab.rastertools.utils)": [[1, "eolab.rastertools.utils.get_suffixes"]], "grid (eolab.rastertools.tiling property)": [[1, "eolab.rastertools.Tiling.grid"], [119, "eolab.rastertools.Tiling.grid"]], "grid (eolab.rastertools.tiling.tiling property)": [[1, "eolab.rastertools.tiling.Tiling.grid"]], "highest_power_of_2() (in module eolab.rastertools.utils)": [[1, "eolab.rastertools.utils.highest_power_of_2"]], "indices (eolab.rastertools.radioindice property)": [[1, "eolab.rastertools.Radioindice.indices"], [46, "eolab.rastertools.Radioindice.indices"]], "indices (eolab.rastertools.radioindice.radioindice property)": [[1, "eolab.rastertools.radioindice.Radioindice.indices"]], "ipvi (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.ipvi"], [47, "eolab.rastertools.Radioindice.ipvi"]], "ipvi (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.ipvi"]], "is_dir() (in module eolab.rastertools.utils)": [[1, "eolab.rastertools.utils.is_dir"]], "keep_vrt (eolab.rastertools.rastertool property)": [[1, "eolab.rastertools.Rastertool.keep_vrt"], [79, "eolab.rastertools.Rastertool.keep_vrt"]], "keep_vrt (eolab.rastertools.rastertools.rastertool property)": [[1, "eolab.rastertools.rastertools.Rastertool.keep_vrt"]], "local_mean (eolab.rastertools.filtering attribute)": [[1, "eolab.rastertools.Filtering.local_mean"], [8, "eolab.rastertools.Filtering.local_mean"]], "local_mean (eolab.rastertools.filtering.filtering attribute)": [[1, "eolab.rastertools.filtering.Filtering.local_mean"]], "local_sum (eolab.rastertools.filtering attribute)": [[1, "eolab.rastertools.Filtering.local_sum"], [9, "eolab.rastertools.Filtering.local_sum"]], "local_sum (eolab.rastertools.filtering.filtering attribute)": [[1, "eolab.rastertools.filtering.Filtering.local_sum"]], "median_filter (eolab.rastertools.filtering attribute)": [[1, "eolab.rastertools.Filtering.median_filter"], [10, "eolab.rastertools.Filtering.median_filter"]], "median_filter (eolab.rastertools.filtering.filtering attribute)": [[1, "eolab.rastertools.filtering.Filtering.median_filter"]], "merge (eolab.rastertools.radioindice property)": [[1, "eolab.rastertools.Radioindice.merge"], [49, "eolab.rastertools.Radioindice.merge"]], "merge (eolab.rastertools.radioindice.radioindice property)": [[1, "eolab.rastertools.radioindice.Radioindice.merge"]], "mndwi (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.mndwi"], [50, "eolab.rastertools.Radioindice.mndwi"]], "mndwi (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.mndwi"]], "msavi (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.msavi"], [51, "eolab.rastertools.Radioindice.msavi"]], "msavi (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.msavi"]], "msavi2 (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.msavi2"], [52, "eolab.rastertools.Radioindice.msavi2"]], "msavi2 (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.msavi2"]], "nb_directions (eolab.rastertools.svf property)": [[1, "eolab.rastertools.SVF.nb_directions"], [92, "eolab.rastertools.SVF.nb_directions"]], "nb_directions (eolab.rastertools.svf.svf property)": [[1, "eolab.rastertools.svf.SVF.nb_directions"]], "ndbi (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.ndbi"], [53, "eolab.rastertools.Radioindice.ndbi"]], "ndbi (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.ndbi"]], "ndpi (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.ndpi"], [54, "eolab.rastertools.Radioindice.ndpi"]], "ndpi (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.ndpi"]], "ndti (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.ndti"], [55, "eolab.rastertools.Radioindice.ndti"]], "ndti (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.ndti"]], "ndvi (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.ndvi"], [56, "eolab.rastertools.Radioindice.ndvi"]], "ndvi (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.ndvi"]], "ndwi (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.ndwi"], [57, "eolab.rastertools.Radioindice.ndwi"]], "ndwi (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.ndwi"]], "ndwi2 (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.ndwi2"], [58, "eolab.rastertools.Radioindice.ndwi2"]], "ndwi2 (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.ndwi2"]], "output_basename (eolab.rastertools.tiling property)": [[1, "eolab.rastertools.Tiling.output_basename"], [121, "eolab.rastertools.Tiling.output_basename"]], "output_basename (eolab.rastertools.tiling.tiling property)": [[1, "eolab.rastertools.tiling.Tiling.output_basename"]], "output_format (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.output_format"], [171, "eolab.rastertools.Zonalstats.output_format"]], "output_format (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.output_format"]], "output_subdir (eolab.rastertools.tiling property)": [[1, "eolab.rastertools.Tiling.output_subdir"], [122, "eolab.rastertools.Tiling.output_subdir"]], "output_subdir (eolab.rastertools.tiling.tiling property)": [[1, "eolab.rastertools.tiling.Tiling.output_subdir"]], "outputdir (eolab.rastertools.rastertool property)": [[1, "eolab.rastertools.Rastertool.outputdir"], [80, "eolab.rastertools.Rastertool.outputdir"]], "outputdir (eolab.rastertools.rastertools.rastertool property)": [[1, "eolab.rastertools.rastertools.Rastertool.outputdir"]], "pad_mode (eolab.rastertools.windowable property)": [[1, "eolab.rastertools.Windowable.pad_mode"], [150, "eolab.rastertools.Windowable.pad_mode"]], "pad_mode (eolab.rastertools.rastertools.windowable property)": [[1, "eolab.rastertools.rastertools.Windowable.pad_mode"]], "period (eolab.rastertools.timeseries property)": [[1, "eolab.rastertools.Timeseries.period"], [138, "eolab.rastertools.Timeseries.period"]], "period (eolab.rastertools.timeseries.timeseries property)": [[1, "eolab.rastertools.timeseries.Timeseries.period"]], "postprocess_files() (eolab.rastertools.rastertool method)": [[1, "eolab.rastertools.Rastertool.postprocess_files"], [81, "eolab.rastertools.Rastertool.postprocess_files"]], "postprocess_files() (eolab.rastertools.speed method)": [[1, "eolab.rastertools.Speed.postprocess_files"], [111, "eolab.rastertools.Speed.postprocess_files"]], "postprocess_files() (eolab.rastertools.timeseries method)": [[1, "eolab.rastertools.Timeseries.postprocess_files"], [139, "eolab.rastertools.Timeseries.postprocess_files"]], "postprocess_files() (eolab.rastertools.zonalstats method)": [[1, "eolab.rastertools.Zonalstats.postprocess_files"], [173, "eolab.rastertools.Zonalstats.postprocess_files"]], "postprocess_files() (eolab.rastertools.rastertools.rastertool method)": [[1, "eolab.rastertools.rastertools.Rastertool.postprocess_files"]], "postprocess_files() (eolab.rastertools.speed.speed method)": [[1, "eolab.rastertools.speed.Speed.postprocess_files"]], "postprocess_files() (eolab.rastertools.timeseries.timeseries method)": [[1, "eolab.rastertools.timeseries.Timeseries.postprocess_files"]], "postprocess_files() (eolab.rastertools.zonalstats.zonalstats method)": [[1, "eolab.rastertools.zonalstats.Zonalstats.postprocess_files"]], "prefix (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.prefix"], [174, "eolab.rastertools.Zonalstats.prefix"]], "prefix (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.prefix"]], "process_file() (eolab.rastertools.filtering method)": [[1, "eolab.rastertools.Filtering.process_file"], [14, "eolab.rastertools.Filtering.process_file"]], "process_file() (eolab.rastertools.hillshade method)": [[1, "eolab.rastertools.Hillshade.process_file"], [31, "eolab.rastertools.Hillshade.process_file"]], "process_file() (eolab.rastertools.radioindice method)": [[1, "eolab.rastertools.Radioindice.process_file"], [62, "eolab.rastertools.Radioindice.process_file"]], "process_file() (eolab.rastertools.rastertool method)": [[1, "eolab.rastertools.Rastertool.process_file"], [82, "eolab.rastertools.Rastertool.process_file"]], "process_file() (eolab.rastertools.svf method)": [[1, "eolab.rastertools.SVF.process_file"], [96, "eolab.rastertools.SVF.process_file"]], "process_file() (eolab.rastertools.tiling method)": [[1, "eolab.rastertools.Tiling.process_file"], [125, "eolab.rastertools.Tiling.process_file"]], "process_file() (eolab.rastertools.zonalstats method)": [[1, "eolab.rastertools.Zonalstats.process_file"], [175, "eolab.rastertools.Zonalstats.process_file"]], "process_file() (eolab.rastertools.filtering.filtering method)": [[1, "eolab.rastertools.filtering.Filtering.process_file"]], "process_file() (eolab.rastertools.hillshade.hillshade method)": [[1, "eolab.rastertools.hillshade.Hillshade.process_file"]], "process_file() (eolab.rastertools.radioindice.radioindice method)": [[1, "eolab.rastertools.radioindice.Radioindice.process_file"]], "process_file() (eolab.rastertools.rastertools.rastertool method)": [[1, "eolab.rastertools.rastertools.Rastertool.process_file"]], "process_file() (eolab.rastertools.svf.svf method)": [[1, "eolab.rastertools.svf.SVF.process_file"]], "process_file() (eolab.rastertools.tiling.tiling method)": [[1, "eolab.rastertools.tiling.Tiling.process_file"]], "process_file() (eolab.rastertools.zonalstats.zonalstats method)": [[1, "eolab.rastertools.zonalstats.Zonalstats.process_file"]], "process_files() (eolab.rastertools.rastertool method)": [[1, "eolab.rastertools.Rastertool.process_files"], [83, "eolab.rastertools.Rastertool.process_files"]], "process_files() (eolab.rastertools.rastertools.rastertool method)": [[1, "eolab.rastertools.rastertools.Rastertool.process_files"]], "pvi (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.pvi"], [64, "eolab.rastertools.Radioindice.pvi"]], "pvi (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.pvi"]], "radius (eolab.rastertools.hillshade property)": [[1, "eolab.rastertools.Hillshade.radius"], [33, "eolab.rastertools.Hillshade.radius"]], "radius (eolab.rastertools.svf property)": [[1, "eolab.rastertools.SVF.radius"], [98, "eolab.rastertools.SVF.radius"]], "radius (eolab.rastertools.hillshade.hillshade property)": [[1, "eolab.rastertools.hillshade.Hillshade.radius"]], "radius (eolab.rastertools.svf.svf property)": [[1, "eolab.rastertools.svf.SVF.radius"]], "raster_filter (eolab.rastertools.filtering property)": [[1, "eolab.rastertools.Filtering.raster_filter"], [16, "eolab.rastertools.Filtering.raster_filter"]], "raster_filter (eolab.rastertools.filtering.filtering property)": [[1, "eolab.rastertools.filtering.Filtering.raster_filter"]], "resolution (eolab.rastertools.hillshade property)": [[1, "eolab.rastertools.Hillshade.resolution"], [34, "eolab.rastertools.Hillshade.resolution"]], "resolution (eolab.rastertools.svf property)": [[1, "eolab.rastertools.SVF.resolution"], [99, "eolab.rastertools.SVF.resolution"]], "resolution (eolab.rastertools.hillshade.hillshade property)": [[1, "eolab.rastertools.hillshade.Hillshade.resolution"]], "resolution (eolab.rastertools.svf.svf property)": [[1, "eolab.rastertools.svf.SVF.resolution"]], "ri (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.ri"], [65, "eolab.rastertools.Radioindice.ri"]], "ri (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.ri"]], "roi (eolab.rastertools.radioindice property)": [[1, "eolab.rastertools.Radioindice.roi"], [66, "eolab.rastertools.Radioindice.roi"]], "roi (eolab.rastertools.radioindice.radioindice property)": [[1, "eolab.rastertools.radioindice.Radioindice.roi"]], "run() (in module eolab.rastertools.main)": [[1, "eolab.rastertools.main.run"]], "rvi (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.rvi"], [67, "eolab.rastertools.Radioindice.rvi"]], "rvi (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.rvi"]], "savi (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.savi"], [68, "eolab.rastertools.Radioindice.savi"]], "savi (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.savi"]], "sigma (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.sigma"], [177, "eolab.rastertools.Zonalstats.sigma"]], "sigma (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.sigma"]], "slices_1d() (in module eolab.rastertools.utils)": [[1, "eolab.rastertools.utils.slices_1d"]], "slices_2d() (in module eolab.rastertools.utils)": [[1, "eolab.rastertools.utils.slices_2d"]], "start_date (eolab.rastertools.timeseries property)": [[1, "eolab.rastertools.Timeseries.start_date"], [142, "eolab.rastertools.Timeseries.start_date"]], "start_date (eolab.rastertools.timeseries.timeseries property)": [[1, "eolab.rastertools.timeseries.Timeseries.start_date"]], "stats (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.stats"], [178, "eolab.rastertools.Zonalstats.stats"]], "stats (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.stats"]], "supported_output_formats (eolab.rastertools.zonalstats attribute)": [[1, "eolab.rastertools.Zonalstats.supported_output_formats"], [179, "eolab.rastertools.Zonalstats.supported_output_formats"]], "supported_output_formats (eolab.rastertools.zonalstats.zonalstats attribute)": [[1, "eolab.rastertools.zonalstats.Zonalstats.supported_output_formats"]], "tndvi (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.tndvi"], [69, "eolab.rastertools.Radioindice.tndvi"]], "tndvi (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.tndvi"]], "to_path() (in module eolab.rastertools.utils)": [[1, "eolab.rastertools.utils.to_path"]], "to_tuple() (in module eolab.rastertools.utils)": [[1, "eolab.rastertools.utils.to_tuple"]], "tsavi (eolab.rastertools.radioindice attribute)": [[1, "eolab.rastertools.Radioindice.tsavi"], [70, "eolab.rastertools.Radioindice.tsavi"]], "tsavi (eolab.rastertools.radioindice.radioindice attribute)": [[1, "eolab.rastertools.radioindice.Radioindice.tsavi"]], "valid_stats (eolab.rastertools.zonalstats attribute)": [[1, "eolab.rastertools.Zonalstats.valid_stats"], [180, "eolab.rastertools.Zonalstats.valid_stats"]], "valid_stats (eolab.rastertools.zonalstats.zonalstats attribute)": [[1, "eolab.rastertools.zonalstats.Zonalstats.valid_stats"]], "valid_threshold (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.valid_threshold"], [181, "eolab.rastertools.Zonalstats.valid_threshold"]], "valid_threshold (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.valid_threshold"]], "vrt_dir (eolab.rastertools.rastertool property)": [[1, "eolab.rastertools.Rastertool.vrt_dir"], [84, "eolab.rastertools.Rastertool.vrt_dir"]], "vrt_dir (eolab.rastertools.rastertools.rastertool property)": [[1, "eolab.rastertools.rastertools.Rastertool.vrt_dir"]], "window_size (eolab.rastertools.windowable property)": [[1, "eolab.rastertools.Windowable.window_size"], [151, "eolab.rastertools.Windowable.window_size"]], "window_size (eolab.rastertools.rastertools.windowable property)": [[1, "eolab.rastertools.rastertools.Windowable.window_size"]], "with_altitude() (eolab.rastertools.svf method)": [[1, "eolab.rastertools.SVF.with_altitude"], [102, "eolab.rastertools.SVF.with_altitude"]], "with_altitude() (eolab.rastertools.svf.svf method)": [[1, "eolab.rastertools.svf.SVF.with_altitude"]], "with_chart() (eolab.rastertools.zonalstats method)": [[1, "eolab.rastertools.Zonalstats.with_chart"], [183, "eolab.rastertools.Zonalstats.with_chart"]], "with_chart() (eolab.rastertools.zonalstats.zonalstats method)": [[1, "eolab.rastertools.zonalstats.Zonalstats.with_chart"]], "with_filter_configuration() (eolab.rastertools.filtering method)": [[1, "eolab.rastertools.Filtering.with_filter_configuration"], [19, "eolab.rastertools.Filtering.with_filter_configuration"]], "with_filter_configuration() (eolab.rastertools.filtering.filtering method)": [[1, "eolab.rastertools.filtering.Filtering.with_filter_configuration"]], "with_geometries() (eolab.rastertools.zonalstats method)": [[1, "eolab.rastertools.Zonalstats.with_geometries"], [184, "eolab.rastertools.Zonalstats.with_geometries"]], "with_geometries() (eolab.rastertools.zonalstats.zonalstats method)": [[1, "eolab.rastertools.zonalstats.Zonalstats.with_geometries"]], "with_id_column() (eolab.rastertools.tiling method)": [[1, "eolab.rastertools.Tiling.with_id_column"], [128, "eolab.rastertools.Tiling.with_id_column"]], "with_id_column() (eolab.rastertools.tiling.tiling method)": [[1, "eolab.rastertools.tiling.Tiling.with_id_column"]], "with_outliers() (eolab.rastertools.zonalstats method)": [[1, "eolab.rastertools.Zonalstats.with_outliers"], [185, "eolab.rastertools.Zonalstats.with_outliers"]], "with_outliers() (eolab.rastertools.zonalstats.zonalstats method)": [[1, "eolab.rastertools.zonalstats.Zonalstats.with_outliers"]], "with_output() (eolab.rastertools.radioindice method)": [[1, "eolab.rastertools.Radioindice.with_output"], [73, "eolab.rastertools.Radioindice.with_output"]], "with_output() (eolab.rastertools.rastertool method)": [[1, "eolab.rastertools.Rastertool.with_output"], [85, "eolab.rastertools.Rastertool.with_output"]], "with_output() (eolab.rastertools.tiling method)": [[1, "eolab.rastertools.Tiling.with_output"], [129, "eolab.rastertools.Tiling.with_output"]], "with_output() (eolab.rastertools.zonalstats method)": [[1, "eolab.rastertools.Zonalstats.with_output"], [186, "eolab.rastertools.Zonalstats.with_output"]], "with_output() (eolab.rastertools.radioindice.radioindice method)": [[1, "eolab.rastertools.radioindice.Radioindice.with_output"]], "with_output() (eolab.rastertools.rastertools.rastertool method)": [[1, "eolab.rastertools.rastertools.Rastertool.with_output"]], "with_output() (eolab.rastertools.tiling.tiling method)": [[1, "eolab.rastertools.tiling.Tiling.with_output"]], "with_output() (eolab.rastertools.zonalstats.zonalstats method)": [[1, "eolab.rastertools.zonalstats.Zonalstats.with_output"]], "with_per_category() (eolab.rastertools.zonalstats method)": [[1, "eolab.rastertools.Zonalstats.with_per_category"], [187, "eolab.rastertools.Zonalstats.with_per_category"]], "with_per_category() (eolab.rastertools.zonalstats.zonalstats method)": [[1, "eolab.rastertools.zonalstats.Zonalstats.with_per_category"]], "with_roi() (eolab.rastertools.radioindice method)": [[1, "eolab.rastertools.Radioindice.with_roi"], [74, "eolab.rastertools.Radioindice.with_roi"]], "with_roi() (eolab.rastertools.radioindice.radioindice method)": [[1, "eolab.rastertools.radioindice.Radioindice.with_roi"]], "with_vrt_stored() (eolab.rastertools.rastertool method)": [[1, "eolab.rastertools.Rastertool.with_vrt_stored"], [86, "eolab.rastertools.Rastertool.with_vrt_stored"]], "with_vrt_stored() (eolab.rastertools.rastertools.rastertool method)": [[1, "eolab.rastertools.rastertools.Rastertool.with_vrt_stored"]], "with_windows() (eolab.rastertools.windowable method)": [[1, "eolab.rastertools.Windowable.with_windows"], [152, "eolab.rastertools.Windowable.with_windows"]], "with_windows() (eolab.rastertools.rastertools.windowable method)": [[1, "eolab.rastertools.rastertools.Windowable.with_windows"]], "within (eolab.rastertools.zonalstats property)": [[1, "eolab.rastertools.Zonalstats.within"], [189, "eolab.rastertools.Zonalstats.within"]], "within (eolab.rastertools.zonalstats.zonalstats property)": [[1, "eolab.rastertools.zonalstats.Zonalstats.within"]], "__init__() (eolab.rastertools.filtering method)": [[3, "eolab.rastertools.Filtering.__init__"]], "keep_vrt (eolab.rastertools.filtering property)": [[7, "eolab.rastertools.Filtering.keep_vrt"]], "outputdir (eolab.rastertools.filtering property)": [[11, "eolab.rastertools.Filtering.outputdir"]], "pad_mode (eolab.rastertools.filtering property)": [[12, "eolab.rastertools.Filtering.pad_mode"]], "postprocess_files() (eolab.rastertools.filtering method)": [[13, "eolab.rastertools.Filtering.postprocess_files"]], "process_files() (eolab.rastertools.filtering method)": [[15, "eolab.rastertools.Filtering.process_files"]], "vrt_dir (eolab.rastertools.filtering property)": [[17, "eolab.rastertools.Filtering.vrt_dir"]], "window_size (eolab.rastertools.filtering property)": [[18, "eolab.rastertools.Filtering.window_size"]], "with_output() (eolab.rastertools.filtering method)": [[20, "eolab.rastertools.Filtering.with_output"]], "with_vrt_stored() (eolab.rastertools.filtering method)": [[21, "eolab.rastertools.Filtering.with_vrt_stored"]], "with_windows() (eolab.rastertools.filtering method)": [[22, "eolab.rastertools.Filtering.with_windows"]], "__init__() (eolab.rastertools.hillshade method)": [[24, "eolab.rastertools.Hillshade.__init__"]], "keep_vrt (eolab.rastertools.hillshade property)": [[27, "eolab.rastertools.Hillshade.keep_vrt"]], "outputdir (eolab.rastertools.hillshade property)": [[28, "eolab.rastertools.Hillshade.outputdir"]], "pad_mode (eolab.rastertools.hillshade property)": [[29, "eolab.rastertools.Hillshade.pad_mode"]], "postprocess_files() (eolab.rastertools.hillshade method)": [[30, "eolab.rastertools.Hillshade.postprocess_files"]], "process_files() (eolab.rastertools.hillshade method)": [[32, "eolab.rastertools.Hillshade.process_files"]], "vrt_dir (eolab.rastertools.hillshade property)": [[35, "eolab.rastertools.Hillshade.vrt_dir"]], "window_size (eolab.rastertools.hillshade property)": [[36, "eolab.rastertools.Hillshade.window_size"]], "with_output() (eolab.rastertools.hillshade method)": [[37, "eolab.rastertools.Hillshade.with_output"]], "with_vrt_stored() (eolab.rastertools.hillshade method)": [[38, "eolab.rastertools.Hillshade.with_vrt_stored"]], "with_windows() (eolab.rastertools.hillshade method)": [[39, "eolab.rastertools.Hillshade.with_windows"]], "__init__() (eolab.rastertools.radioindice method)": [[41, "eolab.rastertools.Radioindice.__init__"]], "keep_vrt (eolab.rastertools.radioindice property)": [[48, "eolab.rastertools.Radioindice.keep_vrt"]], "outputdir (eolab.rastertools.radioindice property)": [[59, "eolab.rastertools.Radioindice.outputdir"]], "pad_mode (eolab.rastertools.radioindice property)": [[60, "eolab.rastertools.Radioindice.pad_mode"]], "postprocess_files() (eolab.rastertools.radioindice method)": [[61, "eolab.rastertools.Radioindice.postprocess_files"]], "process_files() (eolab.rastertools.radioindice method)": [[63, "eolab.rastertools.Radioindice.process_files"]], "vrt_dir (eolab.rastertools.radioindice property)": [[71, "eolab.rastertools.Radioindice.vrt_dir"]], "window_size (eolab.rastertools.radioindice property)": [[72, "eolab.rastertools.Radioindice.window_size"]], "with_vrt_stored() (eolab.rastertools.radioindice method)": [[75, "eolab.rastertools.Radioindice.with_vrt_stored"]], "with_windows() (eolab.rastertools.radioindice method)": [[76, "eolab.rastertools.Radioindice.with_windows"]], "__init__() (eolab.rastertools.rastertool method)": [[78, "eolab.rastertools.Rastertool.__init__"]], "__init__() (eolab.rastertools.svf method)": [[89, "eolab.rastertools.SVF.__init__"]], "keep_vrt (eolab.rastertools.svf property)": [[91, "eolab.rastertools.SVF.keep_vrt"]], "outputdir (eolab.rastertools.svf property)": [[93, "eolab.rastertools.SVF.outputdir"]], "pad_mode (eolab.rastertools.svf property)": [[94, "eolab.rastertools.SVF.pad_mode"]], "postprocess_files() (eolab.rastertools.svf method)": [[95, "eolab.rastertools.SVF.postprocess_files"]], "process_files() (eolab.rastertools.svf method)": [[97, "eolab.rastertools.SVF.process_files"]], "vrt_dir (eolab.rastertools.svf property)": [[100, "eolab.rastertools.SVF.vrt_dir"]], "window_size (eolab.rastertools.svf property)": [[101, "eolab.rastertools.SVF.window_size"]], "with_output() (eolab.rastertools.svf method)": [[103, "eolab.rastertools.SVF.with_output"]], "with_vrt_stored() (eolab.rastertools.svf method)": [[104, "eolab.rastertools.SVF.with_vrt_stored"]], "with_windows() (eolab.rastertools.svf method)": [[105, "eolab.rastertools.SVF.with_windows"]], "__init__() (eolab.rastertools.speed method)": [[107, "eolab.rastertools.Speed.__init__"]], "keep_vrt (eolab.rastertools.speed property)": [[109, "eolab.rastertools.Speed.keep_vrt"]], "outputdir (eolab.rastertools.speed property)": [[110, "eolab.rastertools.Speed.outputdir"]], "process_file() (eolab.rastertools.speed method)": [[112, "eolab.rastertools.Speed.process_file"]], "process_files() (eolab.rastertools.speed method)": [[113, "eolab.rastertools.Speed.process_files"]], "vrt_dir (eolab.rastertools.speed property)": [[114, "eolab.rastertools.Speed.vrt_dir"]], "with_output() (eolab.rastertools.speed method)": [[115, "eolab.rastertools.Speed.with_output"]], "with_vrt_stored() (eolab.rastertools.speed method)": [[116, "eolab.rastertools.Speed.with_vrt_stored"]], "__init__() (eolab.rastertools.tiling method)": [[118, "eolab.rastertools.Tiling.__init__"]], "keep_vrt (eolab.rastertools.tiling property)": [[120, "eolab.rastertools.Tiling.keep_vrt"]], "outputdir (eolab.rastertools.tiling property)": [[123, "eolab.rastertools.Tiling.outputdir"]], "postprocess_files() (eolab.rastertools.tiling method)": [[124, "eolab.rastertools.Tiling.postprocess_files"]], "process_files() (eolab.rastertools.tiling method)": [[126, "eolab.rastertools.Tiling.process_files"]], "vrt_dir (eolab.rastertools.tiling property)": [[127, "eolab.rastertools.Tiling.vrt_dir"]], "with_vrt_stored() (eolab.rastertools.tiling method)": [[130, "eolab.rastertools.Tiling.with_vrt_stored"]], "__init__() (eolab.rastertools.timeseries method)": [[132, "eolab.rastertools.Timeseries.__init__"]], "keep_vrt (eolab.rastertools.timeseries property)": [[135, "eolab.rastertools.Timeseries.keep_vrt"]], "outputdir (eolab.rastertools.timeseries property)": [[136, "eolab.rastertools.Timeseries.outputdir"]], "pad_mode (eolab.rastertools.timeseries property)": [[137, "eolab.rastertools.Timeseries.pad_mode"]], "process_file() (eolab.rastertools.timeseries method)": [[140, "eolab.rastertools.Timeseries.process_file"]], "process_files() (eolab.rastertools.timeseries method)": [[141, "eolab.rastertools.Timeseries.process_files"]], "vrt_dir (eolab.rastertools.timeseries property)": [[143, "eolab.rastertools.Timeseries.vrt_dir"]], "window_size (eolab.rastertools.timeseries property)": [[144, "eolab.rastertools.Timeseries.window_size"]], "with_output() (eolab.rastertools.timeseries method)": [[145, "eolab.rastertools.Timeseries.with_output"]], "with_vrt_stored() (eolab.rastertools.timeseries method)": [[146, "eolab.rastertools.Timeseries.with_vrt_stored"]], "with_windows() (eolab.rastertools.timeseries method)": [[147, "eolab.rastertools.Timeseries.with_windows"]], "__init__() (eolab.rastertools.windowable method)": [[149, "eolab.rastertools.Windowable.__init__"]], "__init__() (eolab.rastertools.zonalstats method)": [[154, "eolab.rastertools.Zonalstats.__init__"]], "keep_vrt (eolab.rastertools.zonalstats property)": [[170, "eolab.rastertools.Zonalstats.keep_vrt"]], "outputdir (eolab.rastertools.zonalstats property)": [[172, "eolab.rastertools.Zonalstats.outputdir"]], "process_files() (eolab.rastertools.zonalstats method)": [[176, "eolab.rastertools.Zonalstats.process_files"]], "vrt_dir (eolab.rastertools.zonalstats property)": [[182, "eolab.rastertools.Zonalstats.vrt_dir"]], "with_vrt_stored() (eolab.rastertools.zonalstats method)": [[188, "eolab.rastertools.Zonalstats.with_vrt_stored"]], "eolab.rastertools.cli": [[190, "module-eolab.rastertools.cli"]], "eolab.rastertools.cli.filtering": [[191, "module-eolab.rastertools.cli.filtering"]], "create_filter() (in module eolab.rastertools.cli.filtering)": [[192, "eolab.rastertools.cli.filtering.create_filter"]], "create_filtering() (in module eolab.rastertools.cli.filtering)": [[193, "eolab.rastertools.cli.filtering.create_filtering"]], "filter_options() (in module eolab.rastertools.cli.filtering)": [[194, "eolab.rastertools.cli.filtering.filter_options"]], "eolab.rastertools.cli.hillshade": [[195, "module-eolab.rastertools.cli.hillshade"]], "eolab.rastertools.cli.radioindice": [[196, "module-eolab.rastertools.cli.radioindice"]], "indices_opt() (in module eolab.rastertools.cli.radioindice)": [[197, "eolab.rastertools.cli.radioindice.indices_opt"]], "eolab.rastertools.cli.speed": [[198, "module-eolab.rastertools.cli.speed"]], "eolab.rastertools.cli.svf": [[199, "module-eolab.rastertools.cli.svf"]], "eolab.rastertools.cli.tiling": [[200, "module-eolab.rastertools.cli.tiling"]], "eolab.rastertools.cli.timeseries": [[201, "module-eolab.rastertools.cli.timeseries"]], "eolab.rastertools.cli.utils_cli": [[202, "module-eolab.rastertools.cli.utils_cli"]], "apply_process() (in module eolab.rastertools.cli.utils_cli)": [[203, "eolab.rastertools.cli.utils_cli.apply_process"]], "with_bands_arguments() (in module eolab.rastertools.cli)": [[204, "eolab.rastertools.cli.with_bands_arguments"]], "with_outputdir_arguments() (in module eolab.rastertools.cli)": [[205, "eolab.rastertools.cli.with_outputdir_arguments"]], "with_window_arguments() (in module eolab.rastertools.cli)": [[206, "eolab.rastertools.cli.with_window_arguments"]], "eolab.rastertools.cli.zonalstats": [[207, "module-eolab.rastertools.cli.zonalstats"]], "eolab.rastertools.processing": [[208, "module-eolab.rastertools.processing"]], "eolab.rastertools.processing.algo": [[209, "module-eolab.rastertools.processing.algo"]], "adaptive_gaussian() (in module eolab.rastertools.processing.algo)": [[210, "eolab.rastertools.processing.algo.adaptive_gaussian"]], "brightness_index() (in module eolab.rastertools.processing.algo)": [[211, "eolab.rastertools.processing.algo.brightness_index"]], "brightness_index2() (in module eolab.rastertools.processing.algo)": [[212, "eolab.rastertools.processing.algo.brightness_index2"]], "evi() (in module eolab.rastertools.processing.algo)": [[213, "eolab.rastertools.processing.algo.evi"]], "hillshade() (in module eolab.rastertools.processing.algo)": [[214, "eolab.rastertools.processing.algo.hillshade"]], "interpolated_timeseries() (in module eolab.rastertools.processing.algo)": [[215, "eolab.rastertools.processing.algo.interpolated_timeseries"]], "ipvi() (in module eolab.rastertools.processing.algo)": [[216, "eolab.rastertools.processing.algo.ipvi"]], "local_mean() (in module eolab.rastertools.processing.algo)": [[217, "eolab.rastertools.processing.algo.local_mean"]], "local_sum() (in module eolab.rastertools.processing.algo)": [[218, "eolab.rastertools.processing.algo.local_sum"]], "median() (in module eolab.rastertools.processing.algo)": [[219, "eolab.rastertools.processing.algo.median"]], "msavi() (in module eolab.rastertools.processing.algo)": [[220, "eolab.rastertools.processing.algo.msavi"]], "msavi2() (in module eolab.rastertools.processing.algo)": [[221, "eolab.rastertools.processing.algo.msavi2"]], "normalized_difference() (in module eolab.rastertools.processing.algo)": [[222, "eolab.rastertools.processing.algo.normalized_difference"]], "pvi() (in module eolab.rastertools.processing.algo)": [[223, "eolab.rastertools.processing.algo.pvi"]], "redness_index() (in module eolab.rastertools.processing.algo)": [[224, "eolab.rastertools.processing.algo.redness_index"]], "rvi() (in module eolab.rastertools.processing.algo)": [[225, "eolab.rastertools.processing.algo.rvi"]], "savi() (in module eolab.rastertools.processing.algo)": [[226, "eolab.rastertools.processing.algo.savi"]], "speed() (in module eolab.rastertools.processing.algo)": [[227, "eolab.rastertools.processing.algo.speed"]], "svf() (in module eolab.rastertools.processing.algo)": [[228, "eolab.rastertools.processing.algo.svf"]], "tndvi() (in module eolab.rastertools.processing.algo)": [[229, "eolab.rastertools.processing.algo.tndvi"]], "tsavi() (in module eolab.rastertools.processing.algo)": [[230, "eolab.rastertools.processing.algo.tsavi"]], "eolab.rastertools.processing.rasterproc": [[231, "module-eolab.rastertools.processing.rasterproc"]], "radioindiceprocessing (class in eolab.rastertools.processing.rasterproc)": [[232, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing"]], "__init__() (eolab.rastertools.processing.rasterproc.radioindiceprocessing method)": [[233, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__"]], "algo (eolab.rastertools.processing.rasterproc.radioindiceprocessing property)": [[234, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo"]], "aliases (eolab.rastertools.processing.rasterproc.radioindiceprocessing property)": [[235, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases"]], "arguments (eolab.rastertools.processing.rasterproc.radioindiceprocessing property)": [[236, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments"]], "channels (eolab.rastertools.processing.rasterproc.radioindiceprocessing property)": [[237, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels"]], "compress (eolab.rastertools.processing.rasterproc.radioindiceprocessing property)": [[238, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress"]], "compute() (eolab.rastertools.processing.rasterproc.radioindiceprocessing method)": [[239, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute"]], "configure() (eolab.rastertools.processing.rasterproc.radioindiceprocessing method)": [[240, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure"]], "description (eolab.rastertools.processing.rasterproc.radioindiceprocessing property)": [[241, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description"]], "dtype (eolab.rastertools.processing.rasterproc.radioindiceprocessing property)": [[242, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype"]], "help (eolab.rastertools.processing.rasterproc.radioindiceprocessing property)": [[243, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help"]], "in_dtype (eolab.rastertools.processing.rasterproc.radioindiceprocessing property)": [[244, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype"]], "name (eolab.rastertools.processing.rasterproc.radioindiceprocessing property)": [[245, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name"]], "nbits (eolab.rastertools.processing.rasterproc.radioindiceprocessing property)": [[246, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits"]], "nodata (eolab.rastertools.processing.rasterproc.radioindiceprocessing property)": [[247, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata"]], "per_band_algo (eolab.rastertools.processing.rasterproc.radioindiceprocessing property)": [[248, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo"]], "with_arguments() (eolab.rastertools.processing.rasterproc.radioindiceprocessing method)": [[249, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments"]], "with_channels() (eolab.rastertools.processing.rasterproc.radioindiceprocessing method)": [[250, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels"]], "with_documentation() (eolab.rastertools.processing.rasterproc.radioindiceprocessing method)": [[251, "eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation"]], "rasterfilter (class in eolab.rastertools.processing.rasterproc)": [[252, "eolab.rastertools.processing.rasterproc.RasterFilter"]], "__init__() (eolab.rastertools.processing.rasterproc.rasterfilter method)": [[253, "eolab.rastertools.processing.rasterproc.RasterFilter.__init__"]], "algo (eolab.rastertools.processing.rasterproc.rasterfilter property)": [[254, "eolab.rastertools.processing.rasterproc.RasterFilter.algo"]], "aliases (eolab.rastertools.processing.rasterproc.rasterfilter property)": [[255, "eolab.rastertools.processing.rasterproc.RasterFilter.aliases"]], "arguments (eolab.rastertools.processing.rasterproc.rasterfilter property)": [[256, "eolab.rastertools.processing.rasterproc.RasterFilter.arguments"]], "compress (eolab.rastertools.processing.rasterproc.rasterfilter property)": [[257, "eolab.rastertools.processing.rasterproc.RasterFilter.compress"]], "compute() (eolab.rastertools.processing.rasterproc.rasterfilter method)": [[258, "eolab.rastertools.processing.rasterproc.RasterFilter.compute"]], "configure() (eolab.rastertools.processing.rasterproc.rasterfilter method)": [[259, "eolab.rastertools.processing.rasterproc.RasterFilter.configure"]], "description (eolab.rastertools.processing.rasterproc.rasterfilter property)": [[260, "eolab.rastertools.processing.rasterproc.RasterFilter.description"]], "dtype (eolab.rastertools.processing.rasterproc.rasterfilter property)": [[261, "eolab.rastertools.processing.rasterproc.RasterFilter.dtype"]], "help (eolab.rastertools.processing.rasterproc.rasterfilter property)": [[262, "eolab.rastertools.processing.rasterproc.RasterFilter.help"]], "in_dtype (eolab.rastertools.processing.rasterproc.rasterfilter property)": [[263, "eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype"]], "name (eolab.rastertools.processing.rasterproc.rasterfilter property)": [[264, "eolab.rastertools.processing.rasterproc.RasterFilter.name"]], "nbits (eolab.rastertools.processing.rasterproc.rasterfilter property)": [[265, "eolab.rastertools.processing.rasterproc.RasterFilter.nbits"]], "nodata (eolab.rastertools.processing.rasterproc.rasterfilter property)": [[266, "eolab.rastertools.processing.rasterproc.RasterFilter.nodata"]], "per_band_algo (eolab.rastertools.processing.rasterproc.rasterfilter property)": [[267, "eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo"]], "with_arguments() (eolab.rastertools.processing.rasterproc.rasterfilter method)": [[268, "eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments"]], "with_documentation() (eolab.rastertools.processing.rasterproc.rasterfilter method)": [[269, "eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation"]], "rasterprocessing (class in eolab.rastertools.processing.rasterproc)": [[270, "eolab.rastertools.processing.rasterproc.RasterProcessing"]], "__init__() (eolab.rastertools.processing.rasterproc.rasterprocessing method)": [[271, "eolab.rastertools.processing.rasterproc.RasterProcessing.__init__"]], "algo (eolab.rastertools.processing.rasterproc.rasterprocessing property)": [[272, "eolab.rastertools.processing.rasterproc.RasterProcessing.algo"]], "aliases (eolab.rastertools.processing.rasterproc.rasterprocessing property)": [[273, "eolab.rastertools.processing.rasterproc.RasterProcessing.aliases"]], "arguments (eolab.rastertools.processing.rasterproc.rasterprocessing property)": [[274, "eolab.rastertools.processing.rasterproc.RasterProcessing.arguments"]], "compress (eolab.rastertools.processing.rasterproc.rasterprocessing property)": [[275, "eolab.rastertools.processing.rasterproc.RasterProcessing.compress"]], "compute() (eolab.rastertools.processing.rasterproc.rasterprocessing method)": [[276, "eolab.rastertools.processing.rasterproc.RasterProcessing.compute"]], "configure() (eolab.rastertools.processing.rasterproc.rasterprocessing method)": [[277, "eolab.rastertools.processing.rasterproc.RasterProcessing.configure"]], "description (eolab.rastertools.processing.rasterproc.rasterprocessing property)": [[278, "eolab.rastertools.processing.rasterproc.RasterProcessing.description"]], "dtype (eolab.rastertools.processing.rasterproc.rasterprocessing property)": [[279, "eolab.rastertools.processing.rasterproc.RasterProcessing.dtype"]], "help (eolab.rastertools.processing.rasterproc.rasterprocessing property)": [[280, "eolab.rastertools.processing.rasterproc.RasterProcessing.help"]], "in_dtype (eolab.rastertools.processing.rasterproc.rasterprocessing property)": [[281, "eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype"]], "name (eolab.rastertools.processing.rasterproc.rasterprocessing property)": [[282, "eolab.rastertools.processing.rasterproc.RasterProcessing.name"]], "nbits (eolab.rastertools.processing.rasterproc.rasterprocessing property)": [[283, "eolab.rastertools.processing.rasterproc.RasterProcessing.nbits"]], "nodata (eolab.rastertools.processing.rasterproc.rasterprocessing property)": [[284, "eolab.rastertools.processing.rasterproc.RasterProcessing.nodata"]], "per_band_algo (eolab.rastertools.processing.rasterproc.rasterprocessing property)": [[285, "eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo"]], "with_arguments() (eolab.rastertools.processing.rasterproc.rasterprocessing method)": [[286, "eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments"]], "with_documentation() (eolab.rastertools.processing.rasterproc.rasterprocessing method)": [[287, "eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation"]], "eolab.rastertools.processing.sliding": [[288, "module-eolab.rastertools.processing.sliding"]], "compute_sliding() (in module eolab.rastertools.processing.sliding)": [[289, "eolab.rastertools.processing.sliding.compute_sliding"]], "eolab.rastertools.processing.stats": [[290, "module-eolab.rastertools.processing.stats"]], "compute_zonal_stats() (in module eolab.rastertools.processing.stats)": [[291, "eolab.rastertools.processing.stats.compute_zonal_stats"]], "compute_zonal_stats_per_category() (in module eolab.rastertools.processing.stats)": [[292, "eolab.rastertools.processing.stats.compute_zonal_stats_per_category"]], "extract_zonal_outliers() (in module eolab.rastertools.processing.stats)": [[293, "eolab.rastertools.processing.stats.extract_zonal_outliers"]], "plot_stats() (in module eolab.rastertools.processing.stats)": [[294, "eolab.rastertools.processing.stats.plot_stats"]], "eolab.rastertools.processing.vector": [[295, "module-eolab.rastertools.processing.vector"]], "clip() (in module eolab.rastertools.processing.vector)": [[296, "eolab.rastertools.processing.vector.clip"]], "crop() (in module eolab.rastertools.processing.vector)": [[297, "eolab.rastertools.processing.vector.crop"]], "dissolve() (in module eolab.rastertools.processing.vector)": [[298, "eolab.rastertools.processing.vector.dissolve"]], "filter() (in module eolab.rastertools.processing.vector)": [[299, "eolab.rastertools.processing.vector.filter"]], "filter_dissolve() (in module eolab.rastertools.processing.vector)": [[300, "eolab.rastertools.processing.vector.filter_dissolve"]], "get_raster_shape() (in module eolab.rastertools.processing.vector)": [[301, "eolab.rastertools.processing.vector.get_raster_shape"]], "rasterize() (in module eolab.rastertools.processing.vector)": [[302, "eolab.rastertools.processing.vector.rasterize"]], "reproject() (in module eolab.rastertools.processing.vector)": [[303, "eolab.rastertools.processing.vector.reproject"]], "vectorize() (in module eolab.rastertools.processing.vector)": [[304, "eolab.rastertools.processing.vector.vectorize"]], "eolab.rastertools.product": [[305, "module-eolab.rastertools.product"]], "eolab.rastertools.product.rasterproduct": [[306, "module-eolab.rastertools.product.rasterproduct"]], "rasterproduct (class in eolab.rastertools.product.rasterproduct)": [[307, "eolab.rastertools.product.rasterproduct.RasterProduct"]], "__init__() (eolab.rastertools.product.rasterproduct.rasterproduct method)": [[308, "eolab.rastertools.product.rasterproduct.RasterProduct.__init__"]], "bands_files (eolab.rastertools.product.rasterproduct.rasterproduct property)": [[309, "eolab.rastertools.product.rasterproduct.RasterProduct.bands_files"]], "channels (eolab.rastertools.product.rasterproduct.rasterproduct property)": [[310, "eolab.rastertools.product.rasterproduct.RasterProduct.channels"]], "file (eolab.rastertools.product.rasterproduct.rasterproduct property)": [[311, "eolab.rastertools.product.rasterproduct.RasterProduct.file"]], "free_in_memory_vrts() (eolab.rastertools.product.rasterproduct.rasterproduct method)": [[312, "eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts"]], "get_date() (eolab.rastertools.product.rasterproduct.rasterproduct method)": [[313, "eolab.rastertools.product.rasterproduct.RasterProduct.get_date"]], "get_date_string() (eolab.rastertools.product.rasterproduct.rasterproduct method)": [[314, "eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string"]], "get_raster() (eolab.rastertools.product.rasterproduct.rasterproduct method)": [[315, "eolab.rastertools.product.rasterproduct.RasterProduct.get_raster"]], "get_relative_orbit() (eolab.rastertools.product.rasterproduct.rasterproduct method)": [[316, "eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit"]], "get_satellite() (eolab.rastertools.product.rasterproduct.rasterproduct method)": [[317, "eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite"]], "get_tile() (eolab.rastertools.product.rasterproduct.rasterproduct method)": [[318, "eolab.rastertools.product.rasterproduct.RasterProduct.get_tile"]], "is_archive (eolab.rastertools.product.rasterproduct.rasterproduct property)": [[319, "eolab.rastertools.product.rasterproduct.RasterProduct.is_archive"]], "masks_files (eolab.rastertools.product.rasterproduct.rasterproduct property)": [[320, "eolab.rastertools.product.rasterproduct.RasterProduct.masks_files"]], "open() (eolab.rastertools.product.rasterproduct.rasterproduct method)": [[321, "eolab.rastertools.product.rasterproduct.RasterProduct.open"]], "rastertype (eolab.rastertools.product.rasterproduct.rasterproduct property)": [[322, "eolab.rastertools.product.rasterproduct.RasterProduct.rastertype"]], "eolab.rastertools.product.rastertype": [[323, "module-eolab.rastertools.product.rastertype"]], "band (class in eolab.rastertools.product.rastertype)": [[324, "eolab.rastertools.product.rastertype.Band"]], "__init__() (eolab.rastertools.product.rastertype.band method)": [[325, "eolab.rastertools.product.rastertype.Band.__init__"]], "description (eolab.rastertools.product.rastertype.band property)": [[326, "eolab.rastertools.product.rastertype.Band.description"]], "identifier (eolab.rastertools.product.rastertype.band property)": [[327, "eolab.rastertools.product.rastertype.Band.identifier"]], "bandchannel (class in eolab.rastertools.product.rastertype)": [[328, "eolab.rastertools.product.rastertype.BandChannel"]], "blue (eolab.rastertools.product.rastertype.bandchannel attribute)": [[329, "eolab.rastertools.product.rastertype.BandChannel.blue"]], "blue_60m (eolab.rastertools.product.rastertype.bandchannel attribute)": [[330, "eolab.rastertools.product.rastertype.BandChannel.blue_60m"]], "green (eolab.rastertools.product.rastertype.bandchannel attribute)": [[331, "eolab.rastertools.product.rastertype.BandChannel.green"]], "mir (eolab.rastertools.product.rastertype.bandchannel attribute)": [[332, "eolab.rastertools.product.rastertype.BandChannel.mir"]], "mir_60m (eolab.rastertools.product.rastertype.bandchannel attribute)": [[333, "eolab.rastertools.product.rastertype.BandChannel.mir_60m"]], "nir (eolab.rastertools.product.rastertype.bandchannel attribute)": [[334, "eolab.rastertools.product.rastertype.BandChannel.nir"]], "nir_60m (eolab.rastertools.product.rastertype.bandchannel attribute)": [[335, "eolab.rastertools.product.rastertype.BandChannel.nir_60m"]], "red (eolab.rastertools.product.rastertype.bandchannel attribute)": [[336, "eolab.rastertools.product.rastertype.BandChannel.red"]], "red_edge1 (eolab.rastertools.product.rastertype.bandchannel attribute)": [[337, "eolab.rastertools.product.rastertype.BandChannel.red_edge1"]], "red_edge2 (eolab.rastertools.product.rastertype.bandchannel attribute)": [[338, "eolab.rastertools.product.rastertype.BandChannel.red_edge2"]], "red_edge3 (eolab.rastertools.product.rastertype.bandchannel attribute)": [[339, "eolab.rastertools.product.rastertype.BandChannel.red_edge3"]], "red_edge4 (eolab.rastertools.product.rastertype.bandchannel attribute)": [[340, "eolab.rastertools.product.rastertype.BandChannel.red_edge4"]], "swir (eolab.rastertools.product.rastertype.bandchannel attribute)": [[341, "eolab.rastertools.product.rastertype.BandChannel.swir"]], "rastertype (class in eolab.rastertools.product.rastertype)": [[342, "eolab.rastertools.product.rastertype.RasterType"]], "__init__() (eolab.rastertools.product.rastertype.rastertype method)": [[343, "eolab.rastertools.product.rastertype.RasterType.__init__"]], "accept() (eolab.rastertools.product.rastertype.rastertype method)": [[344, "eolab.rastertools.product.rastertype.RasterType.accept"]], "add() (eolab.rastertools.product.rastertype.rastertype static method)": [[345, "eolab.rastertools.product.rastertype.RasterType.add"]], "bands_pattern (eolab.rastertools.product.rastertype.rastertype property)": [[346, "eolab.rastertools.product.rastertype.RasterType.bands_pattern"]], "channels (eolab.rastertools.product.rastertype.rastertype property)": [[347, "eolab.rastertools.product.rastertype.RasterType.channels"]], "date_format (eolab.rastertools.product.rastertype.rastertype property)": [[348, "eolab.rastertools.product.rastertype.RasterType.date_format"]], "find() (eolab.rastertools.product.rastertype.rastertype static method)": [[349, "eolab.rastertools.product.rastertype.RasterType.find"]], "get() (eolab.rastertools.product.rastertype.rastertype static method)": [[350, "eolab.rastertools.product.rastertype.RasterType.get"]], "get_band_description() (eolab.rastertools.product.rastertype.rastertype method)": [[351, "eolab.rastertools.product.rastertype.RasterType.get_band_description"]], "get_band_descriptions() (eolab.rastertools.product.rastertype.rastertype method)": [[352, "eolab.rastertools.product.rastertype.RasterType.get_band_descriptions"]], "get_band_id() (eolab.rastertools.product.rastertype.rastertype method)": [[353, "eolab.rastertools.product.rastertype.RasterType.get_band_id"]], "get_band_ids() (eolab.rastertools.product.rastertype.rastertype method)": [[354, "eolab.rastertools.product.rastertype.RasterType.get_band_ids"]], "get_bands_regexp() (eolab.rastertools.product.rastertype.rastertype method)": [[355, "eolab.rastertools.product.rastertype.RasterType.get_bands_regexp"]], "get_date() (eolab.rastertools.product.rastertype.rastertype method)": [[356, "eolab.rastertools.product.rastertype.RasterType.get_date"]], "get_group() (eolab.rastertools.product.rastertype.rastertype method)": [[357, "eolab.rastertools.product.rastertype.RasterType.get_group"]], "get_mask() (eolab.rastertools.product.rastertype.rastertype method)": [[358, "eolab.rastertools.product.rastertype.RasterType.get_mask"]], "get_mask_descriptions() (eolab.rastertools.product.rastertype.rastertype method)": [[359, "eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions"]], "get_mask_ids() (eolab.rastertools.product.rastertype.rastertype method)": [[360, "eolab.rastertools.product.rastertype.RasterType.get_mask_ids"]], "get_mask_regexp() (eolab.rastertools.product.rastertype.rastertype method)": [[361, "eolab.rastertools.product.rastertype.RasterType.get_mask_regexp"]], "has_channel() (eolab.rastertools.product.rastertype.rastertype method)": [[362, "eolab.rastertools.product.rastertype.RasterType.has_channel"]], "has_channels() (eolab.rastertools.product.rastertype.rastertype method)": [[363, "eolab.rastertools.product.rastertype.RasterType.has_channels"]], "has_mask() (eolab.rastertools.product.rastertype.rastertype method)": [[364, "eolab.rastertools.product.rastertype.RasterType.has_mask"]], "maskfunc (eolab.rastertools.product.rastertype.rastertype property)": [[365, "eolab.rastertools.product.rastertype.RasterType.maskfunc"]], "masknodata (eolab.rastertools.product.rastertype.rastertype property)": [[366, "eolab.rastertools.product.rastertype.RasterType.masknodata"]], "name (eolab.rastertools.product.rastertype.rastertype property)": [[367, "eolab.rastertools.product.rastertype.RasterType.name"]], "nodata (eolab.rastertools.product.rastertype.rastertype property)": [[368, "eolab.rastertools.product.rastertype.RasterType.nodata"]], "product_pattern (eolab.rastertools.product.rastertype.rastertype property)": [[369, "eolab.rastertools.product.rastertype.RasterType.product_pattern"]], "rastertypes (eolab.rastertools.product.rastertype.rastertype attribute)": [[370, "eolab.rastertools.product.rastertype.RasterType.rastertypes"]], "s2_maja_mask() (in module eolab.rastertools.product)": [[371, "eolab.rastertools.product.s2_maja_mask"]], "eolab.rastertools.product.vrt": [[372, "module-eolab.rastertools.product.vrt"]], "add_masks_to_vrt() (in module eolab.rastertools.product.vrt)": [[373, "eolab.rastertools.product.vrt.add_masks_to_vrt"]], "set_band_descriptions() (in module eolab.rastertools.product.vrt)": [[374, "eolab.rastertools.product.vrt.set_band_descriptions"]]}}) \ No newline at end of file diff --git a/docs/_build/html/usage.html b/docs/_build/html/usage.html new file mode 100644 index 00000000..3b71e185 --- /dev/null +++ b/docs/_build/html/usage.html @@ -0,0 +1,439 @@ + + + + + + + + + API Reference — rastertools 0.1.0 documentation + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

API Reference

+
+

rastertools

+

Rastertools can be activated by calling the API eolab.rastertools.run_tool.

+

Example of use in python code:

+
from eolab.rastertools import run_tool
+run_tool(args="radioindice --help".split())
+
+
+

Alternatively, every raster tools can be activated with their own API:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

Filtering(raster_filter, kernel_size[, bands])

Raster tool that applies a filter on a raster image.

Hillshade(elevation, azimuth, resolution[, ...])

Raster tool that computes the hillshades of a Digital Elevation / Surface / Height Model corresponding to a given solar position.

Radioindice(indices)

Raster tool that computes radiometric indices of a raster product.

Speed([bands])

Raster tool that computes the time derivative (speed) of raster images.

SVF(nb_directions, radius, resolution)

Raster tool that computes the Sky View Factor (SVF) of a Digital Elevation / Surface / Height Model.

Tiling(geometry_file)

Raster tool that tiles a raster following the geometries of a grid.

Timeseries(start_date, end_date, period[, bands])

Raster tool that generates the time series of raster images.

Zonalstats(stats[, categorical, ...])

Raster tool that computes zonal statistics of a raster product.

+

All these objects provide:

+ +

Example of use:

+
from eolab.rastertools import Radioindice
+proc = Radioindice(Radioindice.ndvi)
+outputs = proc.with_output(".", merge=False)
+              .with_roi("./roi.geojson")
+              .process_file("./SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip")
+print(outputs)
+
+
+
+
+

Raster products

+

Rastertools provides a useful API to open raster products that are provided as an archive or a directory containing +several images.

+

The API is very simple to use:

+
from eolab.rastertools.product import RasterProduct
+import rasterio
+
+with RasterProduct("tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip") as rp:
+   with rasterio.Env(GDAL_VRT_ENABLE_PYTHON=True):
+      with rp.open(roi="tests/tests_data/COMMUNE_32001.shp") as dataset:
+         data = dataset.read([1, 2, 3], masked=True)
+
+
+
+
+

Adding custom raster types

+

To add custom raster types, use the method eolab.rastertools.add_custom_rastertypes.

+
+
+eolab.rastertools.add_custom_rastertypes(rastertypes)[source]
+

Add definition of new raster types. The json string shall have the following format:

+
{
+  "rastertypes": [
+    {
+      "name": "RGB_TIF",
+      "product_pattern": "^RGB_TIF_(?P<date>[0-9_]*)\.(tif|TIF)$",
+      "bands": [
+        {
+          "channel": "red",
+          "description": "red"
+        },
+        {
+          "channel": "green",
+          "description": "green"
+        },
+        {
+          "channel": "blue",
+          "description": "blue"
+        },
+        {
+          "channel": "nir",
+          "description": "nir"
+        }
+      ],
+      "date_format": "%Y%m%d_%H%M%S",
+      "nodata": 0
+    },
+    {
+      "name": "RGB_TIF_ARCHIVE",
+      "product_pattern": "^RGB_TIF_(?P<date>[0-9\_]*).*$",
+      "bands_pattern": "^TIF_(?P<bands>{}).*\.(tif|TIF)$",
+      "bands": [
+        {
+          "channel": "red",
+          "identifier": "r",
+          "description": "red"
+        },
+        {
+          "channel": "green",
+          "identifier": "g",
+          "description": "green"
+        },
+        {
+          "channel": "blue",
+          "identifier": "b",
+          "description": "blue"
+        },
+        {
+          "channel": "nir",
+          "identifier": "n",
+          "description": "nir"
+        }
+      ],
+      "date_format": "%Y%m%d_%H%M%S",
+      "nodata": 0
+    }
+  ]
+}
+
+
+
    +
  • name : unique name of raster type

  • +
  • product_pattern: regexp to identify raster product matching the raster type. Regexp can +contain catching groups that identifies metadata: date (groupe name=date), relative +orbit number (relorbit), tile number (tile), any other group (free name of the group).

  • +
  • bands_pattern (optional) : when the raster product of this type is an archive +(zip, tar, tar.gz, etc.), the pattern enables to identify the files of the different +raster bands. The raster product can contain one raster file per band or one multi-bands +raster file. In the first case, the pattern must contain a group that identify +the band to which the file corresponds. This group must be defined as follows (?P<bands>{}) +in which the variable part {} will be replaced by the identifier of the band (see below).

  • +
  • date_format (optional): date format in the product name. By default: %Y%m%d-%H%M%S

  • +
  • nodata (optional): no data value of raster bands. By default: -10000

  • +
  • masknnodata (optional): nodata value in the mask band

  • +
  • For every bands:

    +
      +
    • channel: channel of the band. Must be one of: blue, green, red, nir, mir, swir, +red_edge1, red_edge2, red_edge3, red_edge4, blue_60m, nir_60m and mir_60m.

    • +
    • identifier (optional): string that identifies the band in the filenames of a raster +product that it is an archive. This identifier is inserted in the group bands of +the bands_pattern.

    • +
    • description (optional): band description that will be reused in the generated products.

    • +
    +
  • +
  • For every masks:

    +
      +
    • identifier (optional): string that identifies the mask band in the filenames of a raster +product that it is an archive. This identifier is inserted in the group bands of +the bands_pattern.

    • +
    • description (optional): mask band description that will be reused in the generated products.

    • +
    • maskfunc (optional): fully qualified name of the python function that converts the mask +band values to a binary mask (0 = masked; 1 = unmasked)

    • +
    +
  • +
+
+
Parameters:
+

rastertypes – JSON string that contains the new raster types definition

+
+
+
+ +

Example of use:

+
from eolab.rastertools import add_custom_rastertypes
+
+my_rastertypes = {
+    "rastertypes": [
+        {
+            "name": "RGB_TIF",
+            "product_pattern": "^RGB_TIF_(?P<date>[0-9_]*)_test\\.(tif|TIF)$",
+            "bands": [
+                {
+                    "channel": "red",
+                    "description": "red"
+                },
+                {
+                    "channel": "green",
+                    "description": "green"
+                },
+                {
+                    "channel": "blue",
+                    "description": "blue"
+                },
+                {
+                    "channel": "nir",
+                    "description": "nir"
+                }
+            ],
+            "date_format": "%Y%m%d_%H%M%S",
+            "nodata": 0
+        },
+        {
+            "name": "RGB_TIF_ARCHIVE",
+            "product_pattern": "^RGB_TIF_(?P<date>[0-9\\_]*).*$",
+            "bands_pattern": "^TIF_(?P<bands>{}).*\\.(tif|TIF)$",
+            "bands": [
+                {
+                    "channel": "red",
+                    "identifier": "r",
+                    "description": "red"
+                },
+                {
+                    "channel": "green",
+                    "identifier": "g",
+                    "description": "green"
+                },
+                {
+                    "channel": "blue",
+                    "identifier": "b",
+                    "description": "blue"
+                },
+                {
+                    "channel": "nir",
+                    "identifier": "n",
+                    "description": "nir"
+                }
+            ],
+            "date_format": "%Y%m%d_%H%M%S",
+            "nodata": 0
+        }
+    ]
+}
+
+add_custom_rastertypes(json)
+
+# now any rastertools can handle products of the two new rastertypes
+...
+
+
+
+
+

Design rules of raster tools

+

Every raster tool object inherits from base class eolab.rastertools.Rastertool. +If the process supports windowing, the raster tool can also inherit from eolab.rastertools.Windowable.

+ + + + + + + + + +

Rastertool()

Base class for every raster tool which contains the common configuration:

Windowable()

Decorator of a eolab.rastertools.Rastertool that adds configuration parameters to set the windowable capability of the tool:

+

A rastertool raises a eolab.rastertools.RastertoolConfigurationException when invalid +input parameter is provided.

+ + + + + + +

RastertoolConfigurationException

This class defines an exception that is raised when the configuration of the raster tool is invalid (wrong input parameter)

+

Moreover, a rastertool can raise any type of Exception during its execution. The best practice is +thus to catch exceptions that can raise as follows:

+
from eolab.rastertools import Radioindice, RastertoolConfigurationException
+
+proc = Radioindice(Radioindice.ndvi)
+try:
+    outputs = proc.with_output("unknown_dir", merge=False)
+                  .process_file("./SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip")
+except RastertoolConfigurationException as rce:
+    # do something
+    print(f"Invalid configuration of radioindice processing: {rce}")
+except Exception as err:
+    # do something
+    print(f"An unexpected error occurs while processing file: {err}")
+
+
+

In this example, a RastertoolConfigurationException is raises because the specified output dir does not +exist.

+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.jpg b/docs/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.jpg new file mode 100644 index 00000000..fb6601e5 Binary files /dev/null and b/docs/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.jpg differ diff --git a/docs/_static/css/my_custom.css b/docs/_static/css/my_custom.css new file mode 100644 index 00000000..75ab7ac6 --- /dev/null +++ b/docs/_static/css/my_custom.css @@ -0,0 +1,11 @@ +.wy-side-nav-search, .wy-nav-top { + background: #272525; +} + +.wy-side-nav-search>div.version{ + color: #D4F1F4; +} + +.wy-nav-content { + max-width: 100% !important; +} diff --git a/docs/api/eolab.rastertools.Filtering.__init__.rst b/docs/api/eolab.rastertools.Filtering.__init__.rst new file mode 100644 index 00000000..8004a542 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.__init__.rst @@ -0,0 +1,6 @@ +Filtering.\_\_init\_\_ +====================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.adaptive_gaussian.rst b/docs/api/eolab.rastertools.Filtering.adaptive_gaussian.rst new file mode 100644 index 00000000..dc117974 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.adaptive_gaussian.rst @@ -0,0 +1,6 @@ +Filtering.adaptive\_gaussian +============================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Filtering.adaptive_gaussian \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.bands.rst b/docs/api/eolab.rastertools.Filtering.bands.rst new file mode 100644 index 00000000..484c11f6 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.bands.rst @@ -0,0 +1,6 @@ +Filtering.bands +=============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Filtering.bands \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.get_default_filters.rst b/docs/api/eolab.rastertools.Filtering.get_default_filters.rst new file mode 100644 index 00000000..8c0083d1 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.get_default_filters.rst @@ -0,0 +1,6 @@ +Filtering.get\_default\_filters +=============================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.get_default_filters \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.keep_vrt.rst b/docs/api/eolab.rastertools.Filtering.keep_vrt.rst new file mode 100644 index 00000000..ddbe7d07 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.keep_vrt.rst @@ -0,0 +1,6 @@ +Filtering.keep\_vrt +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Filtering.keep_vrt \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.local_mean.rst b/docs/api/eolab.rastertools.Filtering.local_mean.rst new file mode 100644 index 00000000..5f7eca0c --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.local_mean.rst @@ -0,0 +1,6 @@ +Filtering.local\_mean +===================== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Filtering.local_mean \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.local_sum.rst b/docs/api/eolab.rastertools.Filtering.local_sum.rst new file mode 100644 index 00000000..ba7caa70 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.local_sum.rst @@ -0,0 +1,6 @@ +Filtering.local\_sum +==================== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Filtering.local_sum \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.median_filter.rst b/docs/api/eolab.rastertools.Filtering.median_filter.rst new file mode 100644 index 00000000..c17a54fd --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.median_filter.rst @@ -0,0 +1,6 @@ +Filtering.median\_filter +======================== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Filtering.median_filter \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.outputdir.rst b/docs/api/eolab.rastertools.Filtering.outputdir.rst new file mode 100644 index 00000000..173efaa7 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.outputdir.rst @@ -0,0 +1,6 @@ +Filtering.outputdir +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Filtering.outputdir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.pad_mode.rst b/docs/api/eolab.rastertools.Filtering.pad_mode.rst new file mode 100644 index 00000000..b598ad53 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.pad_mode.rst @@ -0,0 +1,6 @@ +Filtering.pad\_mode +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Filtering.pad_mode \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.postprocess_files.rst b/docs/api/eolab.rastertools.Filtering.postprocess_files.rst new file mode 100644 index 00000000..54890013 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.postprocess_files.rst @@ -0,0 +1,6 @@ +Filtering.postprocess\_files +============================ + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.postprocess_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.process_file.rst b/docs/api/eolab.rastertools.Filtering.process_file.rst new file mode 100644 index 00000000..872b9788 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.process_file.rst @@ -0,0 +1,6 @@ +Filtering.process\_file +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.process_file \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.process_files.rst b/docs/api/eolab.rastertools.Filtering.process_files.rst new file mode 100644 index 00000000..c9b80222 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.process_files.rst @@ -0,0 +1,6 @@ +Filtering.process\_files +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.process_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.raster_filter.rst b/docs/api/eolab.rastertools.Filtering.raster_filter.rst new file mode 100644 index 00000000..5506b2ce --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.raster_filter.rst @@ -0,0 +1,6 @@ +Filtering.raster\_filter +======================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Filtering.raster_filter \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.rst b/docs/api/eolab.rastertools.Filtering.rst new file mode 100644 index 00000000..0a72b826 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.rst @@ -0,0 +1,65 @@ +Filtering +========= + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Filtering + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Filtering.adaptive_gaussian + + Filtering.bands + + Filtering.keep_vrt + + Filtering.local_mean + + Filtering.local_sum + + Filtering.median_filter + + Filtering.outputdir + + Filtering.pad_mode + + Filtering.raster_filter + + Filtering.vrt_dir + + Filtering.window_size + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Filtering.__init__ + + Filtering.get_default_filters + + Filtering.postprocess_files + + Filtering.process_file + + Filtering.process_files + + Filtering.with_filter_configuration + + Filtering.with_output + + Filtering.with_vrt_stored + + Filtering.with_windows + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.vrt_dir.rst b/docs/api/eolab.rastertools.Filtering.vrt_dir.rst new file mode 100644 index 00000000..b67fadd0 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.vrt_dir.rst @@ -0,0 +1,6 @@ +Filtering.vrt\_dir +================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Filtering.vrt_dir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.window_size.rst b/docs/api/eolab.rastertools.Filtering.window_size.rst new file mode 100644 index 00000000..47864d3d --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.window_size.rst @@ -0,0 +1,6 @@ +Filtering.window\_size +====================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Filtering.window_size \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.with_filter_configuration.rst b/docs/api/eolab.rastertools.Filtering.with_filter_configuration.rst new file mode 100644 index 00000000..b4baa870 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.with_filter_configuration.rst @@ -0,0 +1,6 @@ +Filtering.with\_filter\_configuration +===================================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.with_filter_configuration \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.with_output.rst b/docs/api/eolab.rastertools.Filtering.with_output.rst new file mode 100644 index 00000000..84cdb3cf --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.with_output.rst @@ -0,0 +1,6 @@ +Filtering.with\_output +====================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.with_output \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.with_vrt_stored.rst b/docs/api/eolab.rastertools.Filtering.with_vrt_stored.rst new file mode 100644 index 00000000..42a5078a --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.with_vrt_stored.rst @@ -0,0 +1,6 @@ +Filtering.with\_vrt\_stored +=========================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.with_vrt_stored \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Filtering.with_windows.rst b/docs/api/eolab.rastertools.Filtering.with_windows.rst new file mode 100644 index 00000000..4c9324b6 --- /dev/null +++ b/docs/api/eolab.rastertools.Filtering.with_windows.rst @@ -0,0 +1,6 @@ +Filtering.with\_windows +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Filtering.with_windows \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.__init__.rst b/docs/api/eolab.rastertools.Hillshade.__init__.rst new file mode 100644 index 00000000..c66a1e2c --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.__init__.rst @@ -0,0 +1,6 @@ +Hillshade.\_\_init\_\_ +====================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Hillshade.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.azimuth.rst b/docs/api/eolab.rastertools.Hillshade.azimuth.rst new file mode 100644 index 00000000..7722c2cb --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.azimuth.rst @@ -0,0 +1,6 @@ +Hillshade.azimuth +================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.azimuth \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.elevation.rst b/docs/api/eolab.rastertools.Hillshade.elevation.rst new file mode 100644 index 00000000..a16b069d --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.elevation.rst @@ -0,0 +1,6 @@ +Hillshade.elevation +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.elevation \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.keep_vrt.rst b/docs/api/eolab.rastertools.Hillshade.keep_vrt.rst new file mode 100644 index 00000000..8aeb063f --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.keep_vrt.rst @@ -0,0 +1,6 @@ +Hillshade.keep\_vrt +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.keep_vrt \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.outputdir.rst b/docs/api/eolab.rastertools.Hillshade.outputdir.rst new file mode 100644 index 00000000..85b06b66 --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.outputdir.rst @@ -0,0 +1,6 @@ +Hillshade.outputdir +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.outputdir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.pad_mode.rst b/docs/api/eolab.rastertools.Hillshade.pad_mode.rst new file mode 100644 index 00000000..f2935825 --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.pad_mode.rst @@ -0,0 +1,6 @@ +Hillshade.pad\_mode +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.pad_mode \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.postprocess_files.rst b/docs/api/eolab.rastertools.Hillshade.postprocess_files.rst new file mode 100644 index 00000000..efad9ece --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.postprocess_files.rst @@ -0,0 +1,6 @@ +Hillshade.postprocess\_files +============================ + +.. currentmodule:: eolab.rastertools + +.. automethod:: Hillshade.postprocess_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.process_file.rst b/docs/api/eolab.rastertools.Hillshade.process_file.rst new file mode 100644 index 00000000..52595e94 --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.process_file.rst @@ -0,0 +1,6 @@ +Hillshade.process\_file +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Hillshade.process_file \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.process_files.rst b/docs/api/eolab.rastertools.Hillshade.process_files.rst new file mode 100644 index 00000000..5292b0b8 --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.process_files.rst @@ -0,0 +1,6 @@ +Hillshade.process\_files +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Hillshade.process_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.radius.rst b/docs/api/eolab.rastertools.Hillshade.radius.rst new file mode 100644 index 00000000..ecf0c4ca --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.radius.rst @@ -0,0 +1,6 @@ +Hillshade.radius +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.radius \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.resolution.rst b/docs/api/eolab.rastertools.Hillshade.resolution.rst new file mode 100644 index 00000000..655b26c4 --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.resolution.rst @@ -0,0 +1,6 @@ +Hillshade.resolution +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.resolution \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.rst b/docs/api/eolab.rastertools.Hillshade.rst new file mode 100644 index 00000000..4d9840e4 --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.rst @@ -0,0 +1,57 @@ +Hillshade +========= + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Hillshade + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Hillshade.azimuth + + Hillshade.elevation + + Hillshade.keep_vrt + + Hillshade.outputdir + + Hillshade.pad_mode + + Hillshade.radius + + Hillshade.resolution + + Hillshade.vrt_dir + + Hillshade.window_size + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Hillshade.__init__ + + Hillshade.postprocess_files + + Hillshade.process_file + + Hillshade.process_files + + Hillshade.with_output + + Hillshade.with_vrt_stored + + Hillshade.with_windows + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.vrt_dir.rst b/docs/api/eolab.rastertools.Hillshade.vrt_dir.rst new file mode 100644 index 00000000..d015a36e --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.vrt_dir.rst @@ -0,0 +1,6 @@ +Hillshade.vrt\_dir +================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.vrt_dir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.window_size.rst b/docs/api/eolab.rastertools.Hillshade.window_size.rst new file mode 100644 index 00000000..a25efced --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.window_size.rst @@ -0,0 +1,6 @@ +Hillshade.window\_size +====================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Hillshade.window_size \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.with_output.rst b/docs/api/eolab.rastertools.Hillshade.with_output.rst new file mode 100644 index 00000000..c0112596 --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.with_output.rst @@ -0,0 +1,6 @@ +Hillshade.with\_output +====================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Hillshade.with_output \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.with_vrt_stored.rst b/docs/api/eolab.rastertools.Hillshade.with_vrt_stored.rst new file mode 100644 index 00000000..47142268 --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.with_vrt_stored.rst @@ -0,0 +1,6 @@ +Hillshade.with\_vrt\_stored +=========================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Hillshade.with_vrt_stored \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Hillshade.with_windows.rst b/docs/api/eolab.rastertools.Hillshade.with_windows.rst new file mode 100644 index 00000000..386874fd --- /dev/null +++ b/docs/api/eolab.rastertools.Hillshade.with_windows.rst @@ -0,0 +1,6 @@ +Hillshade.with\_windows +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Hillshade.with_windows \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.__init__.rst b/docs/api/eolab.rastertools.Radioindice.__init__.rst new file mode 100644 index 00000000..b6430d7b --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.__init__.rst @@ -0,0 +1,6 @@ +Radioindice.\_\_init\_\_ +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.bi.rst b/docs/api/eolab.rastertools.Radioindice.bi.rst new file mode 100644 index 00000000..17167651 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.bi.rst @@ -0,0 +1,6 @@ +Radioindice.bi +============== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.bi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.bi2.rst b/docs/api/eolab.rastertools.Radioindice.bi2.rst new file mode 100644 index 00000000..a584b83f --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.bi2.rst @@ -0,0 +1,6 @@ +Radioindice.bi2 +=============== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.bi2 \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.evi.rst b/docs/api/eolab.rastertools.Radioindice.evi.rst new file mode 100644 index 00000000..271fe459 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.evi.rst @@ -0,0 +1,6 @@ +Radioindice.evi +=============== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.evi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.get_default_indices.rst b/docs/api/eolab.rastertools.Radioindice.get_default_indices.rst new file mode 100644 index 00000000..1fe2e2c7 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.get_default_indices.rst @@ -0,0 +1,6 @@ +Radioindice.get\_default\_indices +================================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.get_default_indices \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.indices.rst b/docs/api/eolab.rastertools.Radioindice.indices.rst new file mode 100644 index 00000000..d4b33526 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.indices.rst @@ -0,0 +1,6 @@ +Radioindice.indices +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.indices \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.ipvi.rst b/docs/api/eolab.rastertools.Radioindice.ipvi.rst new file mode 100644 index 00000000..0fa6f7d8 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.ipvi.rst @@ -0,0 +1,6 @@ +Radioindice.ipvi +================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ipvi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.keep_vrt.rst b/docs/api/eolab.rastertools.Radioindice.keep_vrt.rst new file mode 100644 index 00000000..0bfa3e79 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.keep_vrt.rst @@ -0,0 +1,6 @@ +Radioindice.keep\_vrt +===================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.keep_vrt \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.merge.rst b/docs/api/eolab.rastertools.Radioindice.merge.rst new file mode 100644 index 00000000..0b75863c --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.merge.rst @@ -0,0 +1,6 @@ +Radioindice.merge +================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.merge \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.mndwi.rst b/docs/api/eolab.rastertools.Radioindice.mndwi.rst new file mode 100644 index 00000000..9d26bae5 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.mndwi.rst @@ -0,0 +1,6 @@ +Radioindice.mndwi +================= + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.mndwi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.msavi.rst b/docs/api/eolab.rastertools.Radioindice.msavi.rst new file mode 100644 index 00000000..079154d3 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.msavi.rst @@ -0,0 +1,6 @@ +Radioindice.msavi +================= + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.msavi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.msavi2.rst b/docs/api/eolab.rastertools.Radioindice.msavi2.rst new file mode 100644 index 00000000..e0fe03bb --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.msavi2.rst @@ -0,0 +1,6 @@ +Radioindice.msavi2 +================== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.msavi2 \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.ndbi.rst b/docs/api/eolab.rastertools.Radioindice.ndbi.rst new file mode 100644 index 00000000..bc946113 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.ndbi.rst @@ -0,0 +1,6 @@ +Radioindice.ndbi +================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ndbi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.ndpi.rst b/docs/api/eolab.rastertools.Radioindice.ndpi.rst new file mode 100644 index 00000000..961afa94 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.ndpi.rst @@ -0,0 +1,6 @@ +Radioindice.ndpi +================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ndpi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.ndti.rst b/docs/api/eolab.rastertools.Radioindice.ndti.rst new file mode 100644 index 00000000..4da67d2c --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.ndti.rst @@ -0,0 +1,6 @@ +Radioindice.ndti +================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ndti \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.ndvi.rst b/docs/api/eolab.rastertools.Radioindice.ndvi.rst new file mode 100644 index 00000000..e1f92046 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.ndvi.rst @@ -0,0 +1,6 @@ +Radioindice.ndvi +================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ndvi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.ndwi.rst b/docs/api/eolab.rastertools.Radioindice.ndwi.rst new file mode 100644 index 00000000..a2271789 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.ndwi.rst @@ -0,0 +1,6 @@ +Radioindice.ndwi +================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ndwi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.ndwi2.rst b/docs/api/eolab.rastertools.Radioindice.ndwi2.rst new file mode 100644 index 00000000..9acd065a --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.ndwi2.rst @@ -0,0 +1,6 @@ +Radioindice.ndwi2 +================= + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ndwi2 \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.outputdir.rst b/docs/api/eolab.rastertools.Radioindice.outputdir.rst new file mode 100644 index 00000000..e9e37e82 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.outputdir.rst @@ -0,0 +1,6 @@ +Radioindice.outputdir +===================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.outputdir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.pad_mode.rst b/docs/api/eolab.rastertools.Radioindice.pad_mode.rst new file mode 100644 index 00000000..1f12d219 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.pad_mode.rst @@ -0,0 +1,6 @@ +Radioindice.pad\_mode +===================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.pad_mode \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.postprocess_files.rst b/docs/api/eolab.rastertools.Radioindice.postprocess_files.rst new file mode 100644 index 00000000..cf18a586 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.postprocess_files.rst @@ -0,0 +1,6 @@ +Radioindice.postprocess\_files +============================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.postprocess_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.process_file.rst b/docs/api/eolab.rastertools.Radioindice.process_file.rst new file mode 100644 index 00000000..77767e51 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.process_file.rst @@ -0,0 +1,6 @@ +Radioindice.process\_file +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.process_file \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.process_files.rst b/docs/api/eolab.rastertools.Radioindice.process_files.rst new file mode 100644 index 00000000..65223d23 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.process_files.rst @@ -0,0 +1,6 @@ +Radioindice.process\_files +========================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.process_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.pvi.rst b/docs/api/eolab.rastertools.Radioindice.pvi.rst new file mode 100644 index 00000000..1cb859cc --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.pvi.rst @@ -0,0 +1,6 @@ +Radioindice.pvi +=============== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.pvi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.ri.rst b/docs/api/eolab.rastertools.Radioindice.ri.rst new file mode 100644 index 00000000..b543d8fd --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.ri.rst @@ -0,0 +1,6 @@ +Radioindice.ri +============== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.ri \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.roi.rst b/docs/api/eolab.rastertools.Radioindice.roi.rst new file mode 100644 index 00000000..153596f2 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.roi.rst @@ -0,0 +1,6 @@ +Radioindice.roi +=============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.roi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.rst b/docs/api/eolab.rastertools.Radioindice.rst new file mode 100644 index 00000000..db22050b --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.rst @@ -0,0 +1,97 @@ +Radioindice +=========== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Radioindice + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Radioindice.bi + + Radioindice.bi2 + + Radioindice.evi + + Radioindice.indices + + Radioindice.ipvi + + Radioindice.keep_vrt + + Radioindice.merge + + Radioindice.mndwi + + Radioindice.msavi + + Radioindice.msavi2 + + Radioindice.ndbi + + Radioindice.ndpi + + Radioindice.ndti + + Radioindice.ndvi + + Radioindice.ndwi + + Radioindice.ndwi2 + + Radioindice.outputdir + + Radioindice.pad_mode + + Radioindice.pvi + + Radioindice.ri + + Radioindice.roi + + Radioindice.rvi + + Radioindice.savi + + Radioindice.tndvi + + Radioindice.tsavi + + Radioindice.vrt_dir + + Radioindice.window_size + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Radioindice.__init__ + + Radioindice.get_default_indices + + Radioindice.postprocess_files + + Radioindice.process_file + + Radioindice.process_files + + Radioindice.with_output + + Radioindice.with_roi + + Radioindice.with_vrt_stored + + Radioindice.with_windows + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.rvi.rst b/docs/api/eolab.rastertools.Radioindice.rvi.rst new file mode 100644 index 00000000..e7b94d1b --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.rvi.rst @@ -0,0 +1,6 @@ +Radioindice.rvi +=============== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.rvi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.savi.rst b/docs/api/eolab.rastertools.Radioindice.savi.rst new file mode 100644 index 00000000..ba1796ef --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.savi.rst @@ -0,0 +1,6 @@ +Radioindice.savi +================ + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.savi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.tndvi.rst b/docs/api/eolab.rastertools.Radioindice.tndvi.rst new file mode 100644 index 00000000..96bcac56 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.tndvi.rst @@ -0,0 +1,6 @@ +Radioindice.tndvi +================= + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.tndvi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.tsavi.rst b/docs/api/eolab.rastertools.Radioindice.tsavi.rst new file mode 100644 index 00000000..e18727e0 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.tsavi.rst @@ -0,0 +1,6 @@ +Radioindice.tsavi +================= + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Radioindice.tsavi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.vrt_dir.rst b/docs/api/eolab.rastertools.Radioindice.vrt_dir.rst new file mode 100644 index 00000000..40f3d1d2 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.vrt_dir.rst @@ -0,0 +1,6 @@ +Radioindice.vrt\_dir +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.vrt_dir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.window_size.rst b/docs/api/eolab.rastertools.Radioindice.window_size.rst new file mode 100644 index 00000000..88069182 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.window_size.rst @@ -0,0 +1,6 @@ +Radioindice.window\_size +======================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Radioindice.window_size \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.with_output.rst b/docs/api/eolab.rastertools.Radioindice.with_output.rst new file mode 100644 index 00000000..98d7e5af --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.with_output.rst @@ -0,0 +1,6 @@ +Radioindice.with\_output +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.with_output \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.with_roi.rst b/docs/api/eolab.rastertools.Radioindice.with_roi.rst new file mode 100644 index 00000000..531d468f --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.with_roi.rst @@ -0,0 +1,6 @@ +Radioindice.with\_roi +===================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.with_roi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.with_vrt_stored.rst b/docs/api/eolab.rastertools.Radioindice.with_vrt_stored.rst new file mode 100644 index 00000000..cd6ab654 --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.with_vrt_stored.rst @@ -0,0 +1,6 @@ +Radioindice.with\_vrt\_stored +============================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.with_vrt_stored \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Radioindice.with_windows.rst b/docs/api/eolab.rastertools.Radioindice.with_windows.rst new file mode 100644 index 00000000..ec7071ab --- /dev/null +++ b/docs/api/eolab.rastertools.Radioindice.with_windows.rst @@ -0,0 +1,6 @@ +Radioindice.with\_windows +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Radioindice.with_windows \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Rastertool.__init__.rst b/docs/api/eolab.rastertools.Rastertool.__init__.rst new file mode 100644 index 00000000..acf685ac --- /dev/null +++ b/docs/api/eolab.rastertools.Rastertool.__init__.rst @@ -0,0 +1,6 @@ +Rastertool.\_\_init\_\_ +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Rastertool.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Rastertool.keep_vrt.rst b/docs/api/eolab.rastertools.Rastertool.keep_vrt.rst new file mode 100644 index 00000000..1a09990f --- /dev/null +++ b/docs/api/eolab.rastertools.Rastertool.keep_vrt.rst @@ -0,0 +1,6 @@ +Rastertool.keep\_vrt +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Rastertool.keep_vrt \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Rastertool.outputdir.rst b/docs/api/eolab.rastertools.Rastertool.outputdir.rst new file mode 100644 index 00000000..045ee3ac --- /dev/null +++ b/docs/api/eolab.rastertools.Rastertool.outputdir.rst @@ -0,0 +1,6 @@ +Rastertool.outputdir +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Rastertool.outputdir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Rastertool.postprocess_files.rst b/docs/api/eolab.rastertools.Rastertool.postprocess_files.rst new file mode 100644 index 00000000..8d882328 --- /dev/null +++ b/docs/api/eolab.rastertools.Rastertool.postprocess_files.rst @@ -0,0 +1,6 @@ +Rastertool.postprocess\_files +============================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Rastertool.postprocess_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Rastertool.process_file.rst b/docs/api/eolab.rastertools.Rastertool.process_file.rst new file mode 100644 index 00000000..5cdd6ab7 --- /dev/null +++ b/docs/api/eolab.rastertools.Rastertool.process_file.rst @@ -0,0 +1,6 @@ +Rastertool.process\_file +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Rastertool.process_file \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Rastertool.process_files.rst b/docs/api/eolab.rastertools.Rastertool.process_files.rst new file mode 100644 index 00000000..67a0841e --- /dev/null +++ b/docs/api/eolab.rastertools.Rastertool.process_files.rst @@ -0,0 +1,6 @@ +Rastertool.process\_files +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Rastertool.process_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Rastertool.rst b/docs/api/eolab.rastertools.Rastertool.rst new file mode 100644 index 00000000..b193f70b --- /dev/null +++ b/docs/api/eolab.rastertools.Rastertool.rst @@ -0,0 +1,43 @@ +Rastertool +========== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Rastertool + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Rastertool.keep_vrt + + Rastertool.outputdir + + Rastertool.vrt_dir + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Rastertool.__init__ + + Rastertool.postprocess_files + + Rastertool.process_file + + Rastertool.process_files + + Rastertool.with_output + + Rastertool.with_vrt_stored + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Rastertool.vrt_dir.rst b/docs/api/eolab.rastertools.Rastertool.vrt_dir.rst new file mode 100644 index 00000000..39f3d0e9 --- /dev/null +++ b/docs/api/eolab.rastertools.Rastertool.vrt_dir.rst @@ -0,0 +1,6 @@ +Rastertool.vrt\_dir +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Rastertool.vrt_dir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Rastertool.with_output.rst b/docs/api/eolab.rastertools.Rastertool.with_output.rst new file mode 100644 index 00000000..94bacabb --- /dev/null +++ b/docs/api/eolab.rastertools.Rastertool.with_output.rst @@ -0,0 +1,6 @@ +Rastertool.with\_output +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Rastertool.with_output \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Rastertool.with_vrt_stored.rst b/docs/api/eolab.rastertools.Rastertool.with_vrt_stored.rst new file mode 100644 index 00000000..1ba3357f --- /dev/null +++ b/docs/api/eolab.rastertools.Rastertool.with_vrt_stored.rst @@ -0,0 +1,6 @@ +Rastertool.with\_vrt\_stored +============================ + +.. currentmodule:: eolab.rastertools + +.. automethod:: Rastertool.with_vrt_stored \ No newline at end of file diff --git a/docs/api/eolab.rastertools.RastertoolConfigurationException.rst b/docs/api/eolab.rastertools.RastertoolConfigurationException.rst new file mode 100644 index 00000000..83ad4b98 --- /dev/null +++ b/docs/api/eolab.rastertools.RastertoolConfigurationException.rst @@ -0,0 +1,6 @@ +RastertoolConfigurationException +================================ + +.. currentmodule:: eolab.rastertools + +.. autoexception:: RastertoolConfigurationException \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.__init__.rst b/docs/api/eolab.rastertools.SVF.__init__.rst new file mode 100644 index 00000000..3bd98f5b --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.__init__.rst @@ -0,0 +1,6 @@ +SVF.\_\_init\_\_ +================ + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.altitude.rst b/docs/api/eolab.rastertools.SVF.altitude.rst new file mode 100644 index 00000000..fda5a518 --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.altitude.rst @@ -0,0 +1,6 @@ +SVF.altitude +============ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.altitude \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.keep_vrt.rst b/docs/api/eolab.rastertools.SVF.keep_vrt.rst new file mode 100644 index 00000000..808603d8 --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.keep_vrt.rst @@ -0,0 +1,6 @@ +SVF.keep\_vrt +============= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.keep_vrt \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.nb_directions.rst b/docs/api/eolab.rastertools.SVF.nb_directions.rst new file mode 100644 index 00000000..b9f04065 --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.nb_directions.rst @@ -0,0 +1,6 @@ +SVF.nb\_directions +================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.nb_directions \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.outputdir.rst b/docs/api/eolab.rastertools.SVF.outputdir.rst new file mode 100644 index 00000000..7e077686 --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.outputdir.rst @@ -0,0 +1,6 @@ +SVF.outputdir +============= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.outputdir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.pad_mode.rst b/docs/api/eolab.rastertools.SVF.pad_mode.rst new file mode 100644 index 00000000..29a4c499 --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.pad_mode.rst @@ -0,0 +1,6 @@ +SVF.pad\_mode +============= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.pad_mode \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.postprocess_files.rst b/docs/api/eolab.rastertools.SVF.postprocess_files.rst new file mode 100644 index 00000000..bbb9edef --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.postprocess_files.rst @@ -0,0 +1,6 @@ +SVF.postprocess\_files +====================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.postprocess_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.process_file.rst b/docs/api/eolab.rastertools.SVF.process_file.rst new file mode 100644 index 00000000..bce3be38 --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.process_file.rst @@ -0,0 +1,6 @@ +SVF.process\_file +================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.process_file \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.process_files.rst b/docs/api/eolab.rastertools.SVF.process_files.rst new file mode 100644 index 00000000..3cba5118 --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.process_files.rst @@ -0,0 +1,6 @@ +SVF.process\_files +================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.process_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.radius.rst b/docs/api/eolab.rastertools.SVF.radius.rst new file mode 100644 index 00000000..95697d5b --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.radius.rst @@ -0,0 +1,6 @@ +SVF.radius +========== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.radius \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.resolution.rst b/docs/api/eolab.rastertools.SVF.resolution.rst new file mode 100644 index 00000000..60a1b6ee --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.resolution.rst @@ -0,0 +1,6 @@ +SVF.resolution +============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.resolution \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.rst b/docs/api/eolab.rastertools.SVF.rst new file mode 100644 index 00000000..908f1b22 --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.rst @@ -0,0 +1,59 @@ +SVF +=== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: SVF + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + SVF.altitude + + SVF.keep_vrt + + SVF.nb_directions + + SVF.outputdir + + SVF.pad_mode + + SVF.radius + + SVF.resolution + + SVF.vrt_dir + + SVF.window_size + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + SVF.__init__ + + SVF.postprocess_files + + SVF.process_file + + SVF.process_files + + SVF.with_altitude + + SVF.with_output + + SVF.with_vrt_stored + + SVF.with_windows + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.vrt_dir.rst b/docs/api/eolab.rastertools.SVF.vrt_dir.rst new file mode 100644 index 00000000..95526113 --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.vrt_dir.rst @@ -0,0 +1,6 @@ +SVF.vrt\_dir +============ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.vrt_dir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.window_size.rst b/docs/api/eolab.rastertools.SVF.window_size.rst new file mode 100644 index 00000000..13c9b8d5 --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.window_size.rst @@ -0,0 +1,6 @@ +SVF.window\_size +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: SVF.window_size \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.with_altitude.rst b/docs/api/eolab.rastertools.SVF.with_altitude.rst new file mode 100644 index 00000000..2206d06b --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.with_altitude.rst @@ -0,0 +1,6 @@ +SVF.with\_altitude +================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.with_altitude \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.with_output.rst b/docs/api/eolab.rastertools.SVF.with_output.rst new file mode 100644 index 00000000..7152a825 --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.with_output.rst @@ -0,0 +1,6 @@ +SVF.with\_output +================ + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.with_output \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.with_vrt_stored.rst b/docs/api/eolab.rastertools.SVF.with_vrt_stored.rst new file mode 100644 index 00000000..174ab5a8 --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.with_vrt_stored.rst @@ -0,0 +1,6 @@ +SVF.with\_vrt\_stored +===================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.with_vrt_stored \ No newline at end of file diff --git a/docs/api/eolab.rastertools.SVF.with_windows.rst b/docs/api/eolab.rastertools.SVF.with_windows.rst new file mode 100644 index 00000000..8dce108f --- /dev/null +++ b/docs/api/eolab.rastertools.SVF.with_windows.rst @@ -0,0 +1,6 @@ +SVF.with\_windows +================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: SVF.with_windows \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Speed.__init__.rst b/docs/api/eolab.rastertools.Speed.__init__.rst new file mode 100644 index 00000000..809449f2 --- /dev/null +++ b/docs/api/eolab.rastertools.Speed.__init__.rst @@ -0,0 +1,6 @@ +Speed.\_\_init\_\_ +================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Speed.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Speed.bands.rst b/docs/api/eolab.rastertools.Speed.bands.rst new file mode 100644 index 00000000..fd06b6ae --- /dev/null +++ b/docs/api/eolab.rastertools.Speed.bands.rst @@ -0,0 +1,6 @@ +Speed.bands +=========== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Speed.bands \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Speed.keep_vrt.rst b/docs/api/eolab.rastertools.Speed.keep_vrt.rst new file mode 100644 index 00000000..d8369a35 --- /dev/null +++ b/docs/api/eolab.rastertools.Speed.keep_vrt.rst @@ -0,0 +1,6 @@ +Speed.keep\_vrt +=============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Speed.keep_vrt \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Speed.outputdir.rst b/docs/api/eolab.rastertools.Speed.outputdir.rst new file mode 100644 index 00000000..fdb1a0c6 --- /dev/null +++ b/docs/api/eolab.rastertools.Speed.outputdir.rst @@ -0,0 +1,6 @@ +Speed.outputdir +=============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Speed.outputdir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Speed.postprocess_files.rst b/docs/api/eolab.rastertools.Speed.postprocess_files.rst new file mode 100644 index 00000000..c2a12c57 --- /dev/null +++ b/docs/api/eolab.rastertools.Speed.postprocess_files.rst @@ -0,0 +1,6 @@ +Speed.postprocess\_files +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Speed.postprocess_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Speed.process_file.rst b/docs/api/eolab.rastertools.Speed.process_file.rst new file mode 100644 index 00000000..84dff10e --- /dev/null +++ b/docs/api/eolab.rastertools.Speed.process_file.rst @@ -0,0 +1,6 @@ +Speed.process\_file +=================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Speed.process_file \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Speed.process_files.rst b/docs/api/eolab.rastertools.Speed.process_files.rst new file mode 100644 index 00000000..b870a470 --- /dev/null +++ b/docs/api/eolab.rastertools.Speed.process_files.rst @@ -0,0 +1,6 @@ +Speed.process\_files +==================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Speed.process_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Speed.rst b/docs/api/eolab.rastertools.Speed.rst new file mode 100644 index 00000000..a331a56f --- /dev/null +++ b/docs/api/eolab.rastertools.Speed.rst @@ -0,0 +1,45 @@ +Speed +===== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Speed + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Speed.bands + + Speed.keep_vrt + + Speed.outputdir + + Speed.vrt_dir + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Speed.__init__ + + Speed.postprocess_files + + Speed.process_file + + Speed.process_files + + Speed.with_output + + Speed.with_vrt_stored + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Speed.vrt_dir.rst b/docs/api/eolab.rastertools.Speed.vrt_dir.rst new file mode 100644 index 00000000..47caca75 --- /dev/null +++ b/docs/api/eolab.rastertools.Speed.vrt_dir.rst @@ -0,0 +1,6 @@ +Speed.vrt\_dir +============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Speed.vrt_dir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Speed.with_output.rst b/docs/api/eolab.rastertools.Speed.with_output.rst new file mode 100644 index 00000000..c175bd2d --- /dev/null +++ b/docs/api/eolab.rastertools.Speed.with_output.rst @@ -0,0 +1,6 @@ +Speed.with\_output +================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Speed.with_output \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Speed.with_vrt_stored.rst b/docs/api/eolab.rastertools.Speed.with_vrt_stored.rst new file mode 100644 index 00000000..4f5478d6 --- /dev/null +++ b/docs/api/eolab.rastertools.Speed.with_vrt_stored.rst @@ -0,0 +1,6 @@ +Speed.with\_vrt\_stored +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Speed.with_vrt_stored \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Tiling.__init__.rst b/docs/api/eolab.rastertools.Tiling.__init__.rst new file mode 100644 index 00000000..03148fce --- /dev/null +++ b/docs/api/eolab.rastertools.Tiling.__init__.rst @@ -0,0 +1,6 @@ +Tiling.\_\_init\_\_ +=================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Tiling.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Tiling.grid.rst b/docs/api/eolab.rastertools.Tiling.grid.rst new file mode 100644 index 00000000..c8787df4 --- /dev/null +++ b/docs/api/eolab.rastertools.Tiling.grid.rst @@ -0,0 +1,6 @@ +Tiling.grid +=========== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Tiling.grid \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Tiling.keep_vrt.rst b/docs/api/eolab.rastertools.Tiling.keep_vrt.rst new file mode 100644 index 00000000..9c526aae --- /dev/null +++ b/docs/api/eolab.rastertools.Tiling.keep_vrt.rst @@ -0,0 +1,6 @@ +Tiling.keep\_vrt +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Tiling.keep_vrt \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Tiling.output_basename.rst b/docs/api/eolab.rastertools.Tiling.output_basename.rst new file mode 100644 index 00000000..aa3d011b --- /dev/null +++ b/docs/api/eolab.rastertools.Tiling.output_basename.rst @@ -0,0 +1,6 @@ +Tiling.output\_basename +======================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Tiling.output_basename \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Tiling.output_subdir.rst b/docs/api/eolab.rastertools.Tiling.output_subdir.rst new file mode 100644 index 00000000..0e5c0376 --- /dev/null +++ b/docs/api/eolab.rastertools.Tiling.output_subdir.rst @@ -0,0 +1,6 @@ +Tiling.output\_subdir +===================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Tiling.output_subdir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Tiling.outputdir.rst b/docs/api/eolab.rastertools.Tiling.outputdir.rst new file mode 100644 index 00000000..fe7f6e31 --- /dev/null +++ b/docs/api/eolab.rastertools.Tiling.outputdir.rst @@ -0,0 +1,6 @@ +Tiling.outputdir +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Tiling.outputdir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Tiling.postprocess_files.rst b/docs/api/eolab.rastertools.Tiling.postprocess_files.rst new file mode 100644 index 00000000..773060e3 --- /dev/null +++ b/docs/api/eolab.rastertools.Tiling.postprocess_files.rst @@ -0,0 +1,6 @@ +Tiling.postprocess\_files +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Tiling.postprocess_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Tiling.process_file.rst b/docs/api/eolab.rastertools.Tiling.process_file.rst new file mode 100644 index 00000000..1a5bcf30 --- /dev/null +++ b/docs/api/eolab.rastertools.Tiling.process_file.rst @@ -0,0 +1,6 @@ +Tiling.process\_file +==================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Tiling.process_file \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Tiling.process_files.rst b/docs/api/eolab.rastertools.Tiling.process_files.rst new file mode 100644 index 00000000..cdb717e9 --- /dev/null +++ b/docs/api/eolab.rastertools.Tiling.process_files.rst @@ -0,0 +1,6 @@ +Tiling.process\_files +===================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Tiling.process_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Tiling.rst b/docs/api/eolab.rastertools.Tiling.rst new file mode 100644 index 00000000..eb41c368 --- /dev/null +++ b/docs/api/eolab.rastertools.Tiling.rst @@ -0,0 +1,51 @@ +Tiling +====== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Tiling + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Tiling.grid + + Tiling.keep_vrt + + Tiling.output_basename + + Tiling.output_subdir + + Tiling.outputdir + + Tiling.vrt_dir + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Tiling.__init__ + + Tiling.postprocess_files + + Tiling.process_file + + Tiling.process_files + + Tiling.with_id_column + + Tiling.with_output + + Tiling.with_vrt_stored + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Tiling.vrt_dir.rst b/docs/api/eolab.rastertools.Tiling.vrt_dir.rst new file mode 100644 index 00000000..70bfcf11 --- /dev/null +++ b/docs/api/eolab.rastertools.Tiling.vrt_dir.rst @@ -0,0 +1,6 @@ +Tiling.vrt\_dir +=============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Tiling.vrt_dir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Tiling.with_id_column.rst b/docs/api/eolab.rastertools.Tiling.with_id_column.rst new file mode 100644 index 00000000..3a993881 --- /dev/null +++ b/docs/api/eolab.rastertools.Tiling.with_id_column.rst @@ -0,0 +1,6 @@ +Tiling.with\_id\_column +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Tiling.with_id_column \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Tiling.with_output.rst b/docs/api/eolab.rastertools.Tiling.with_output.rst new file mode 100644 index 00000000..d60368b8 --- /dev/null +++ b/docs/api/eolab.rastertools.Tiling.with_output.rst @@ -0,0 +1,6 @@ +Tiling.with\_output +=================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Tiling.with_output \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Tiling.with_vrt_stored.rst b/docs/api/eolab.rastertools.Tiling.with_vrt_stored.rst new file mode 100644 index 00000000..962b43a2 --- /dev/null +++ b/docs/api/eolab.rastertools.Tiling.with_vrt_stored.rst @@ -0,0 +1,6 @@ +Tiling.with\_vrt\_stored +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Tiling.with_vrt_stored \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.__init__.rst b/docs/api/eolab.rastertools.Timeseries.__init__.rst new file mode 100644 index 00000000..b4fd0553 --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.__init__.rst @@ -0,0 +1,6 @@ +Timeseries.\_\_init\_\_ +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Timeseries.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.bands.rst b/docs/api/eolab.rastertools.Timeseries.bands.rst new file mode 100644 index 00000000..a2cff48d --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.bands.rst @@ -0,0 +1,6 @@ +Timeseries.bands +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.bands \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.end_date.rst b/docs/api/eolab.rastertools.Timeseries.end_date.rst new file mode 100644 index 00000000..bf8c4f3e --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.end_date.rst @@ -0,0 +1,6 @@ +Timeseries.end\_date +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.end_date \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.keep_vrt.rst b/docs/api/eolab.rastertools.Timeseries.keep_vrt.rst new file mode 100644 index 00000000..1421e447 --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.keep_vrt.rst @@ -0,0 +1,6 @@ +Timeseries.keep\_vrt +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.keep_vrt \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.outputdir.rst b/docs/api/eolab.rastertools.Timeseries.outputdir.rst new file mode 100644 index 00000000..af963f01 --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.outputdir.rst @@ -0,0 +1,6 @@ +Timeseries.outputdir +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.outputdir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.pad_mode.rst b/docs/api/eolab.rastertools.Timeseries.pad_mode.rst new file mode 100644 index 00000000..5b96c018 --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.pad_mode.rst @@ -0,0 +1,6 @@ +Timeseries.pad\_mode +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.pad_mode \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.period.rst b/docs/api/eolab.rastertools.Timeseries.period.rst new file mode 100644 index 00000000..892080cf --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.period.rst @@ -0,0 +1,6 @@ +Timeseries.period +================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.period \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.postprocess_files.rst b/docs/api/eolab.rastertools.Timeseries.postprocess_files.rst new file mode 100644 index 00000000..e0a49381 --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.postprocess_files.rst @@ -0,0 +1,6 @@ +Timeseries.postprocess\_files +============================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Timeseries.postprocess_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.process_file.rst b/docs/api/eolab.rastertools.Timeseries.process_file.rst new file mode 100644 index 00000000..5d28b703 --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.process_file.rst @@ -0,0 +1,6 @@ +Timeseries.process\_file +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Timeseries.process_file \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.process_files.rst b/docs/api/eolab.rastertools.Timeseries.process_files.rst new file mode 100644 index 00000000..95285ca8 --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.process_files.rst @@ -0,0 +1,6 @@ +Timeseries.process\_files +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Timeseries.process_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.rst b/docs/api/eolab.rastertools.Timeseries.rst new file mode 100644 index 00000000..133c3495 --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.rst @@ -0,0 +1,57 @@ +Timeseries +========== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Timeseries + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Timeseries.bands + + Timeseries.end_date + + Timeseries.keep_vrt + + Timeseries.outputdir + + Timeseries.pad_mode + + Timeseries.period + + Timeseries.start_date + + Timeseries.vrt_dir + + Timeseries.window_size + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Timeseries.__init__ + + Timeseries.postprocess_files + + Timeseries.process_file + + Timeseries.process_files + + Timeseries.with_output + + Timeseries.with_vrt_stored + + Timeseries.with_windows + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.start_date.rst b/docs/api/eolab.rastertools.Timeseries.start_date.rst new file mode 100644 index 00000000..af184ec9 --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.start_date.rst @@ -0,0 +1,6 @@ +Timeseries.start\_date +====================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.start_date \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.vrt_dir.rst b/docs/api/eolab.rastertools.Timeseries.vrt_dir.rst new file mode 100644 index 00000000..ff134b01 --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.vrt_dir.rst @@ -0,0 +1,6 @@ +Timeseries.vrt\_dir +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.vrt_dir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.window_size.rst b/docs/api/eolab.rastertools.Timeseries.window_size.rst new file mode 100644 index 00000000..5c3c8710 --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.window_size.rst @@ -0,0 +1,6 @@ +Timeseries.window\_size +======================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Timeseries.window_size \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.with_output.rst b/docs/api/eolab.rastertools.Timeseries.with_output.rst new file mode 100644 index 00000000..12f7a990 --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.with_output.rst @@ -0,0 +1,6 @@ +Timeseries.with\_output +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Timeseries.with_output \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.with_vrt_stored.rst b/docs/api/eolab.rastertools.Timeseries.with_vrt_stored.rst new file mode 100644 index 00000000..551c8fb5 --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.with_vrt_stored.rst @@ -0,0 +1,6 @@ +Timeseries.with\_vrt\_stored +============================ + +.. currentmodule:: eolab.rastertools + +.. automethod:: Timeseries.with_vrt_stored \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Timeseries.with_windows.rst b/docs/api/eolab.rastertools.Timeseries.with_windows.rst new file mode 100644 index 00000000..ae1fd0e5 --- /dev/null +++ b/docs/api/eolab.rastertools.Timeseries.with_windows.rst @@ -0,0 +1,6 @@ +Timeseries.with\_windows +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Timeseries.with_windows \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Windowable.__init__.rst b/docs/api/eolab.rastertools.Windowable.__init__.rst new file mode 100644 index 00000000..74df6bf9 --- /dev/null +++ b/docs/api/eolab.rastertools.Windowable.__init__.rst @@ -0,0 +1,6 @@ +Windowable.\_\_init\_\_ +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Windowable.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Windowable.pad_mode.rst b/docs/api/eolab.rastertools.Windowable.pad_mode.rst new file mode 100644 index 00000000..188a0f47 --- /dev/null +++ b/docs/api/eolab.rastertools.Windowable.pad_mode.rst @@ -0,0 +1,6 @@ +Windowable.pad\_mode +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Windowable.pad_mode \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Windowable.rst b/docs/api/eolab.rastertools.Windowable.rst new file mode 100644 index 00000000..2eb2da11 --- /dev/null +++ b/docs/api/eolab.rastertools.Windowable.rst @@ -0,0 +1,33 @@ +Windowable +========== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Windowable + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Windowable.pad_mode + + Windowable.window_size + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Windowable.__init__ + + Windowable.with_windows + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Windowable.window_size.rst b/docs/api/eolab.rastertools.Windowable.window_size.rst new file mode 100644 index 00000000..a2fa2caa --- /dev/null +++ b/docs/api/eolab.rastertools.Windowable.window_size.rst @@ -0,0 +1,6 @@ +Windowable.window\_size +======================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Windowable.window_size \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Windowable.with_windows.rst b/docs/api/eolab.rastertools.Windowable.with_windows.rst new file mode 100644 index 00000000..61936aa0 --- /dev/null +++ b/docs/api/eolab.rastertools.Windowable.with_windows.rst @@ -0,0 +1,6 @@ +Windowable.with\_windows +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Windowable.with_windows \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.__init__.rst b/docs/api/eolab.rastertools.Zonalstats.__init__.rst new file mode 100644 index 00000000..6b9c343d --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.__init__.rst @@ -0,0 +1,6 @@ +Zonalstats.\_\_init\_\_ +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.area.rst b/docs/api/eolab.rastertools.Zonalstats.area.rst new file mode 100644 index 00000000..335ee1b9 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.area.rst @@ -0,0 +1,6 @@ +Zonalstats.area +=============== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.area \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.bands.rst b/docs/api/eolab.rastertools.Zonalstats.bands.rst new file mode 100644 index 00000000..eeafda4b --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.bands.rst @@ -0,0 +1,6 @@ +Zonalstats.bands +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.bands \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.categorical.rst b/docs/api/eolab.rastertools.Zonalstats.categorical.rst new file mode 100644 index 00000000..9d265e9e --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.categorical.rst @@ -0,0 +1,6 @@ +Zonalstats.categorical +====================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.categorical \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.category_file.rst b/docs/api/eolab.rastertools.Zonalstats.category_file.rst new file mode 100644 index 00000000..4cc9a691 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.category_file.rst @@ -0,0 +1,6 @@ +Zonalstats.category\_file +========================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.category_file \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.category_file_type.rst b/docs/api/eolab.rastertools.Zonalstats.category_file_type.rst new file mode 100644 index 00000000..d3977121 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.category_file_type.rst @@ -0,0 +1,6 @@ +Zonalstats.category\_file\_type +=============================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.category_file_type \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.category_index.rst b/docs/api/eolab.rastertools.Zonalstats.category_index.rst new file mode 100644 index 00000000..2824b701 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.category_index.rst @@ -0,0 +1,6 @@ +Zonalstats.category\_index +========================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.category_index \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.category_labels.rst b/docs/api/eolab.rastertools.Zonalstats.category_labels.rst new file mode 100644 index 00000000..e109ea0e --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.category_labels.rst @@ -0,0 +1,6 @@ +Zonalstats.category\_labels +=========================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.category_labels \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.chart_file.rst b/docs/api/eolab.rastertools.Zonalstats.chart_file.rst new file mode 100644 index 00000000..36919b08 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.chart_file.rst @@ -0,0 +1,6 @@ +Zonalstats.chart\_file +====================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.chart_file \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.compute_stats.rst b/docs/api/eolab.rastertools.Zonalstats.compute_stats.rst new file mode 100644 index 00000000..fb463d8b --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.compute_stats.rst @@ -0,0 +1,6 @@ +Zonalstats.compute\_stats +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.compute_stats \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.display_chart.rst b/docs/api/eolab.rastertools.Zonalstats.display_chart.rst new file mode 100644 index 00000000..7462af2e --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.display_chart.rst @@ -0,0 +1,6 @@ +Zonalstats.display\_chart +========================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.display_chart \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.generated_stats.rst b/docs/api/eolab.rastertools.Zonalstats.generated_stats.rst new file mode 100644 index 00000000..2678b75d --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.generated_stats.rst @@ -0,0 +1,6 @@ +Zonalstats.generated\_stats +=========================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.generated_stats \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.generated_stats_dates.rst b/docs/api/eolab.rastertools.Zonalstats.generated_stats_dates.rst new file mode 100644 index 00000000..d1a00612 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.generated_stats_dates.rst @@ -0,0 +1,6 @@ +Zonalstats.generated\_stats\_dates +================================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.generated_stats_dates \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.generated_stats_per_date.rst b/docs/api/eolab.rastertools.Zonalstats.generated_stats_per_date.rst new file mode 100644 index 00000000..5bd6222a --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.generated_stats_per_date.rst @@ -0,0 +1,6 @@ +Zonalstats.generated\_stats\_per\_date +====================================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.generated_stats_per_date \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.geometries.rst b/docs/api/eolab.rastertools.Zonalstats.geometries.rst new file mode 100644 index 00000000..821a4162 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.geometries.rst @@ -0,0 +1,6 @@ +Zonalstats.geometries +===================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.geometries \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.geometry_index.rst b/docs/api/eolab.rastertools.Zonalstats.geometry_index.rst new file mode 100644 index 00000000..5f5c52ad --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.geometry_index.rst @@ -0,0 +1,6 @@ +Zonalstats.geometry\_index +========================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.geometry_index \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.keep_vrt.rst b/docs/api/eolab.rastertools.Zonalstats.keep_vrt.rst new file mode 100644 index 00000000..e30442c6 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.keep_vrt.rst @@ -0,0 +1,6 @@ +Zonalstats.keep\_vrt +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.keep_vrt \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.output_format.rst b/docs/api/eolab.rastertools.Zonalstats.output_format.rst new file mode 100644 index 00000000..9aab12e4 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.output_format.rst @@ -0,0 +1,6 @@ +Zonalstats.output\_format +========================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.output_format \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.outputdir.rst b/docs/api/eolab.rastertools.Zonalstats.outputdir.rst new file mode 100644 index 00000000..d8484a82 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.outputdir.rst @@ -0,0 +1,6 @@ +Zonalstats.outputdir +==================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.outputdir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.postprocess_files.rst b/docs/api/eolab.rastertools.Zonalstats.postprocess_files.rst new file mode 100644 index 00000000..e670f3d9 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.postprocess_files.rst @@ -0,0 +1,6 @@ +Zonalstats.postprocess\_files +============================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.postprocess_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.prefix.rst b/docs/api/eolab.rastertools.Zonalstats.prefix.rst new file mode 100644 index 00000000..9b0dd35e --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.prefix.rst @@ -0,0 +1,6 @@ +Zonalstats.prefix +================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.prefix \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.process_file.rst b/docs/api/eolab.rastertools.Zonalstats.process_file.rst new file mode 100644 index 00000000..cca06a44 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.process_file.rst @@ -0,0 +1,6 @@ +Zonalstats.process\_file +======================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.process_file \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.process_files.rst b/docs/api/eolab.rastertools.Zonalstats.process_files.rst new file mode 100644 index 00000000..8e03291c --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.process_files.rst @@ -0,0 +1,6 @@ +Zonalstats.process\_files +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.process_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.rst b/docs/api/eolab.rastertools.Zonalstats.rst new file mode 100644 index 00000000..5cc0fc1b --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.rst @@ -0,0 +1,97 @@ +Zonalstats +========== + +.. currentmodule:: eolab.rastertools + +.. autoclass:: Zonalstats + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Zonalstats.area + + Zonalstats.bands + + Zonalstats.categorical + + Zonalstats.category_file + + Zonalstats.category_file_type + + Zonalstats.category_index + + Zonalstats.category_labels + + Zonalstats.chart_file + + Zonalstats.display_chart + + Zonalstats.generated_stats + + Zonalstats.generated_stats_dates + + Zonalstats.generated_stats_per_date + + Zonalstats.geometries + + Zonalstats.geometry_index + + Zonalstats.keep_vrt + + Zonalstats.output_format + + Zonalstats.outputdir + + Zonalstats.prefix + + Zonalstats.sigma + + Zonalstats.stats + + Zonalstats.supported_output_formats + + Zonalstats.valid_stats + + Zonalstats.valid_threshold + + Zonalstats.vrt_dir + + Zonalstats.within + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Zonalstats.__init__ + + Zonalstats.compute_stats + + Zonalstats.postprocess_files + + Zonalstats.process_file + + Zonalstats.process_files + + Zonalstats.with_chart + + Zonalstats.with_geometries + + Zonalstats.with_outliers + + Zonalstats.with_output + + Zonalstats.with_per_category + + Zonalstats.with_vrt_stored + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.sigma.rst b/docs/api/eolab.rastertools.Zonalstats.sigma.rst new file mode 100644 index 00000000..959c9d8a --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.sigma.rst @@ -0,0 +1,6 @@ +Zonalstats.sigma +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.sigma \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.stats.rst b/docs/api/eolab.rastertools.Zonalstats.stats.rst new file mode 100644 index 00000000..2e32e625 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.stats.rst @@ -0,0 +1,6 @@ +Zonalstats.stats +================ + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.stats \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.supported_output_formats.rst b/docs/api/eolab.rastertools.Zonalstats.supported_output_formats.rst new file mode 100644 index 00000000..03ec083d --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.supported_output_formats.rst @@ -0,0 +1,6 @@ +Zonalstats.supported\_output\_formats +===================================== + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Zonalstats.supported_output_formats \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.valid_stats.rst b/docs/api/eolab.rastertools.Zonalstats.valid_stats.rst new file mode 100644 index 00000000..b2478648 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.valid_stats.rst @@ -0,0 +1,6 @@ +Zonalstats.valid\_stats +======================= + +.. currentmodule:: eolab.rastertools + +.. autoattribute:: Zonalstats.valid_stats \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.valid_threshold.rst b/docs/api/eolab.rastertools.Zonalstats.valid_threshold.rst new file mode 100644 index 00000000..00e818f6 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.valid_threshold.rst @@ -0,0 +1,6 @@ +Zonalstats.valid\_threshold +=========================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.valid_threshold \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.vrt_dir.rst b/docs/api/eolab.rastertools.Zonalstats.vrt_dir.rst new file mode 100644 index 00000000..f53842d7 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.vrt_dir.rst @@ -0,0 +1,6 @@ +Zonalstats.vrt\_dir +=================== + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.vrt_dir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.with_chart.rst b/docs/api/eolab.rastertools.Zonalstats.with_chart.rst new file mode 100644 index 00000000..4c9c2c24 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.with_chart.rst @@ -0,0 +1,6 @@ +Zonalstats.with\_chart +====================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.with_chart \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.with_geometries.rst b/docs/api/eolab.rastertools.Zonalstats.with_geometries.rst new file mode 100644 index 00000000..bba7e511 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.with_geometries.rst @@ -0,0 +1,6 @@ +Zonalstats.with\_geometries +=========================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.with_geometries \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.with_outliers.rst b/docs/api/eolab.rastertools.Zonalstats.with_outliers.rst new file mode 100644 index 00000000..bb0e976e --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.with_outliers.rst @@ -0,0 +1,6 @@ +Zonalstats.with\_outliers +========================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.with_outliers \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.with_output.rst b/docs/api/eolab.rastertools.Zonalstats.with_output.rst new file mode 100644 index 00000000..35363fe9 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.with_output.rst @@ -0,0 +1,6 @@ +Zonalstats.with\_output +======================= + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.with_output \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.with_per_category.rst b/docs/api/eolab.rastertools.Zonalstats.with_per_category.rst new file mode 100644 index 00000000..0b791d96 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.with_per_category.rst @@ -0,0 +1,6 @@ +Zonalstats.with\_per\_category +============================== + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.with_per_category \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.with_vrt_stored.rst b/docs/api/eolab.rastertools.Zonalstats.with_vrt_stored.rst new file mode 100644 index 00000000..1445e207 --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.with_vrt_stored.rst @@ -0,0 +1,6 @@ +Zonalstats.with\_vrt\_stored +============================ + +.. currentmodule:: eolab.rastertools + +.. automethod:: Zonalstats.with_vrt_stored \ No newline at end of file diff --git a/docs/api/eolab.rastertools.Zonalstats.within.rst b/docs/api/eolab.rastertools.Zonalstats.within.rst new file mode 100644 index 00000000..f455aa4e --- /dev/null +++ b/docs/api/eolab.rastertools.Zonalstats.within.rst @@ -0,0 +1,6 @@ +Zonalstats.within +================= + +.. currentmodule:: eolab.rastertools + +.. autoproperty:: Zonalstats.within \ No newline at end of file diff --git a/docs/api/eolab.rastertools.cli.filtering.create_filter.rst b/docs/api/eolab.rastertools.cli.filtering.create_filter.rst new file mode 100644 index 00000000..d9e0c2ef --- /dev/null +++ b/docs/api/eolab.rastertools.cli.filtering.create_filter.rst @@ -0,0 +1,6 @@ +create\_filter +============== + +.. currentmodule:: eolab.rastertools.cli.filtering + +.. autofunction:: create_filter \ No newline at end of file diff --git a/docs/api/eolab.rastertools.cli.filtering.create_filtering.rst b/docs/api/eolab.rastertools.cli.filtering.create_filtering.rst new file mode 100644 index 00000000..9c06aba1 --- /dev/null +++ b/docs/api/eolab.rastertools.cli.filtering.create_filtering.rst @@ -0,0 +1,6 @@ +create\_filtering +================= + +.. currentmodule:: eolab.rastertools.cli.filtering + +.. autofunction:: create_filtering \ No newline at end of file diff --git a/docs/api/eolab.rastertools.cli.filtering.filter_options.rst b/docs/api/eolab.rastertools.cli.filtering.filter_options.rst new file mode 100644 index 00000000..90634a1d --- /dev/null +++ b/docs/api/eolab.rastertools.cli.filtering.filter_options.rst @@ -0,0 +1,6 @@ +filter\_options +=============== + +.. currentmodule:: eolab.rastertools.cli.filtering + +.. autofunction:: filter_options \ No newline at end of file diff --git a/docs/api/eolab.rastertools.cli.filtering.rst b/docs/api/eolab.rastertools.cli.filtering.rst new file mode 100644 index 00000000..d4502a15 --- /dev/null +++ b/docs/api/eolab.rastertools.cli.filtering.rst @@ -0,0 +1,35 @@ +eolab.rastertools.cli.filtering +=============================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.filtering +.. currentmodule:: eolab.rastertools.cli.filtering + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + create_filter + create_filtering + filter_options + + + + + + + + + + + + + diff --git a/docs/api/eolab.rastertools.cli.hillshade.rst b/docs/api/eolab.rastertools.cli.hillshade.rst new file mode 100644 index 00000000..bd2404e6 --- /dev/null +++ b/docs/api/eolab.rastertools.cli.hillshade.rst @@ -0,0 +1,25 @@ +eolab.rastertools.cli.hillshade +=============================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.hillshade +.. currentmodule:: eolab.rastertools.cli.hillshade + + + + + + + + + + + + + + + + + + + diff --git a/docs/api/eolab.rastertools.cli.radioindice.indices_opt.rst b/docs/api/eolab.rastertools.cli.radioindice.indices_opt.rst new file mode 100644 index 00000000..b1fda517 --- /dev/null +++ b/docs/api/eolab.rastertools.cli.radioindice.indices_opt.rst @@ -0,0 +1,6 @@ +indices\_opt +============ + +.. currentmodule:: eolab.rastertools.cli.radioindice + +.. autofunction:: indices_opt \ No newline at end of file diff --git a/docs/api/eolab.rastertools.cli.radioindice.rst b/docs/api/eolab.rastertools.cli.radioindice.rst new file mode 100644 index 00000000..f37e7edb --- /dev/null +++ b/docs/api/eolab.rastertools.cli.radioindice.rst @@ -0,0 +1,33 @@ +eolab.rastertools.cli.radioindice +================================= + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.radioindice +.. currentmodule:: eolab.rastertools.cli.radioindice + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + indices_opt + + + + + + + + + + + + + diff --git a/docs/api/eolab.rastertools.cli.rst b/docs/api/eolab.rastertools.cli.rst new file mode 100644 index 00000000..1a1bf426 --- /dev/null +++ b/docs/api/eolab.rastertools.cli.rst @@ -0,0 +1,52 @@ +eolab.rastertools.cli +===================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli +.. currentmodule:: eolab.rastertools.cli + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + with_bands_arguments + with_outputdir_arguments + with_window_arguments + + + + + + + + + + + + + +.. rubric:: Submodules + +.. autosummary:: + :toctree: + :template: custom_module_template.rst + :recursive: + + eolab.rastertools.cli.filtering + eolab.rastertools.cli.hillshade + eolab.rastertools.cli.radioindice + eolab.rastertools.cli.speed + eolab.rastertools.cli.svf + eolab.rastertools.cli.tiling + eolab.rastertools.cli.timeseries + eolab.rastertools.cli.utils_cli + eolab.rastertools.cli.zonalstats + diff --git a/docs/api/eolab.rastertools.cli.speed.rst b/docs/api/eolab.rastertools.cli.speed.rst new file mode 100644 index 00000000..23bfdb5f --- /dev/null +++ b/docs/api/eolab.rastertools.cli.speed.rst @@ -0,0 +1,25 @@ +eolab.rastertools.cli.speed +=========================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.speed +.. currentmodule:: eolab.rastertools.cli.speed + + + + + + + + + + + + + + + + + + + diff --git a/docs/api/eolab.rastertools.cli.svf.rst b/docs/api/eolab.rastertools.cli.svf.rst new file mode 100644 index 00000000..861be220 --- /dev/null +++ b/docs/api/eolab.rastertools.cli.svf.rst @@ -0,0 +1,25 @@ +eolab.rastertools.cli.svf +========================= + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.svf +.. currentmodule:: eolab.rastertools.cli.svf + + + + + + + + + + + + + + + + + + + diff --git a/docs/api/eolab.rastertools.cli.tiling.rst b/docs/api/eolab.rastertools.cli.tiling.rst new file mode 100644 index 00000000..2746b096 --- /dev/null +++ b/docs/api/eolab.rastertools.cli.tiling.rst @@ -0,0 +1,25 @@ +eolab.rastertools.cli.tiling +============================ + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.tiling +.. currentmodule:: eolab.rastertools.cli.tiling + + + + + + + + + + + + + + + + + + + diff --git a/docs/api/eolab.rastertools.cli.timeseries.rst b/docs/api/eolab.rastertools.cli.timeseries.rst new file mode 100644 index 00000000..9d54af07 --- /dev/null +++ b/docs/api/eolab.rastertools.cli.timeseries.rst @@ -0,0 +1,25 @@ +eolab.rastertools.cli.timeseries +================================ + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.timeseries +.. currentmodule:: eolab.rastertools.cli.timeseries + + + + + + + + + + + + + + + + + + + diff --git a/docs/api/eolab.rastertools.cli.utils_cli.apply_process.rst b/docs/api/eolab.rastertools.cli.utils_cli.apply_process.rst new file mode 100644 index 00000000..a93b5a04 --- /dev/null +++ b/docs/api/eolab.rastertools.cli.utils_cli.apply_process.rst @@ -0,0 +1,6 @@ +apply\_process +============== + +.. currentmodule:: eolab.rastertools.cli.utils_cli + +.. autofunction:: apply_process \ No newline at end of file diff --git a/docs/api/eolab.rastertools.cli.utils_cli.rst b/docs/api/eolab.rastertools.cli.utils_cli.rst new file mode 100644 index 00000000..29b49f5b --- /dev/null +++ b/docs/api/eolab.rastertools.cli.utils_cli.rst @@ -0,0 +1,33 @@ +eolab.rastertools.cli.utils\_cli +================================ + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.utils_cli +.. currentmodule:: eolab.rastertools.cli.utils_cli + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + apply_process + + + + + + + + + + + + + diff --git a/docs/api/eolab.rastertools.cli.with_bands_arguments.rst b/docs/api/eolab.rastertools.cli.with_bands_arguments.rst new file mode 100644 index 00000000..a7b4372f --- /dev/null +++ b/docs/api/eolab.rastertools.cli.with_bands_arguments.rst @@ -0,0 +1,6 @@ +with\_bands\_arguments +====================== + +.. currentmodule:: eolab.rastertools.cli + +.. autofunction:: with_bands_arguments \ No newline at end of file diff --git a/docs/api/eolab.rastertools.cli.with_outputdir_arguments.rst b/docs/api/eolab.rastertools.cli.with_outputdir_arguments.rst new file mode 100644 index 00000000..8d573fb5 --- /dev/null +++ b/docs/api/eolab.rastertools.cli.with_outputdir_arguments.rst @@ -0,0 +1,6 @@ +with\_outputdir\_arguments +========================== + +.. currentmodule:: eolab.rastertools.cli + +.. autofunction:: with_outputdir_arguments \ No newline at end of file diff --git a/docs/api/eolab.rastertools.cli.with_window_arguments.rst b/docs/api/eolab.rastertools.cli.with_window_arguments.rst new file mode 100644 index 00000000..0314028c --- /dev/null +++ b/docs/api/eolab.rastertools.cli.with_window_arguments.rst @@ -0,0 +1,6 @@ +with\_window\_arguments +======================= + +.. currentmodule:: eolab.rastertools.cli + +.. autofunction:: with_window_arguments \ No newline at end of file diff --git a/docs/api/eolab.rastertools.cli.zonalstats.rst b/docs/api/eolab.rastertools.cli.zonalstats.rst new file mode 100644 index 00000000..1cf16c2f --- /dev/null +++ b/docs/api/eolab.rastertools.cli.zonalstats.rst @@ -0,0 +1,25 @@ +eolab.rastertools.cli.zonalstats +================================ + +.. rubric:: Description +.. automodule:: eolab.rastertools.cli.zonalstats +.. currentmodule:: eolab.rastertools.cli.zonalstats + + + + + + + + + + + + + + + + + + + diff --git a/docs/api/eolab.rastertools.processing.algo.adaptive_gaussian.rst b/docs/api/eolab.rastertools.processing.algo.adaptive_gaussian.rst new file mode 100644 index 00000000..7720a99f --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.adaptive_gaussian.rst @@ -0,0 +1,6 @@ +adaptive\_gaussian +================== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: adaptive_gaussian \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.brightness_index.rst b/docs/api/eolab.rastertools.processing.algo.brightness_index.rst new file mode 100644 index 00000000..f9c6e1a9 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.brightness_index.rst @@ -0,0 +1,6 @@ +brightness\_index +================= + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: brightness_index \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.brightness_index2.rst b/docs/api/eolab.rastertools.processing.algo.brightness_index2.rst new file mode 100644 index 00000000..75c5aa40 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.brightness_index2.rst @@ -0,0 +1,6 @@ +brightness\_index2 +================== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: brightness_index2 \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.evi.rst b/docs/api/eolab.rastertools.processing.algo.evi.rst new file mode 100644 index 00000000..e1424753 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.evi.rst @@ -0,0 +1,6 @@ +evi +=== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: evi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.hillshade.rst b/docs/api/eolab.rastertools.processing.algo.hillshade.rst new file mode 100644 index 00000000..65577f0a --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.hillshade.rst @@ -0,0 +1,6 @@ +hillshade +========= + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: hillshade \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.interpolated_timeseries.rst b/docs/api/eolab.rastertools.processing.algo.interpolated_timeseries.rst new file mode 100644 index 00000000..6f744fe8 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.interpolated_timeseries.rst @@ -0,0 +1,6 @@ +interpolated\_timeseries +======================== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: interpolated_timeseries \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.ipvi.rst b/docs/api/eolab.rastertools.processing.algo.ipvi.rst new file mode 100644 index 00000000..0b7e202a --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.ipvi.rst @@ -0,0 +1,6 @@ +ipvi +==== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: ipvi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.local_mean.rst b/docs/api/eolab.rastertools.processing.algo.local_mean.rst new file mode 100644 index 00000000..96e6e733 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.local_mean.rst @@ -0,0 +1,6 @@ +local\_mean +=========== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: local_mean \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.local_sum.rst b/docs/api/eolab.rastertools.processing.algo.local_sum.rst new file mode 100644 index 00000000..cfbba757 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.local_sum.rst @@ -0,0 +1,6 @@ +local\_sum +========== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: local_sum \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.median.rst b/docs/api/eolab.rastertools.processing.algo.median.rst new file mode 100644 index 00000000..f325bf10 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.median.rst @@ -0,0 +1,6 @@ +median +====== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: median \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.msavi.rst b/docs/api/eolab.rastertools.processing.algo.msavi.rst new file mode 100644 index 00000000..a52c79fd --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.msavi.rst @@ -0,0 +1,6 @@ +msavi +===== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: msavi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.msavi2.rst b/docs/api/eolab.rastertools.processing.algo.msavi2.rst new file mode 100644 index 00000000..ca83060b --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.msavi2.rst @@ -0,0 +1,6 @@ +msavi2 +====== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: msavi2 \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.normalized_difference.rst b/docs/api/eolab.rastertools.processing.algo.normalized_difference.rst new file mode 100644 index 00000000..6afcfa14 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.normalized_difference.rst @@ -0,0 +1,6 @@ +normalized\_difference +====================== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: normalized_difference \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.pvi.rst b/docs/api/eolab.rastertools.processing.algo.pvi.rst new file mode 100644 index 00000000..1bece17d --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.pvi.rst @@ -0,0 +1,6 @@ +pvi +=== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: pvi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.redness_index.rst b/docs/api/eolab.rastertools.processing.algo.redness_index.rst new file mode 100644 index 00000000..0fa92c5b --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.redness_index.rst @@ -0,0 +1,6 @@ +redness\_index +============== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: redness_index \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.rst b/docs/api/eolab.rastertools.processing.algo.rst new file mode 100644 index 00000000..afdc88f7 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.rst @@ -0,0 +1,53 @@ +eolab.rastertools.processing.algo +================================= + +.. rubric:: Description +.. automodule:: eolab.rastertools.processing.algo +.. currentmodule:: eolab.rastertools.processing.algo + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + adaptive_gaussian + brightness_index + brightness_index2 + evi + hillshade + interpolated_timeseries + ipvi + local_mean + local_sum + median + msavi + msavi2 + normalized_difference + pvi + redness_index + rvi + savi + speed + svf + tndvi + tsavi + + + + + + + + + + + + + diff --git a/docs/api/eolab.rastertools.processing.algo.rvi.rst b/docs/api/eolab.rastertools.processing.algo.rvi.rst new file mode 100644 index 00000000..4a0b64f2 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.rvi.rst @@ -0,0 +1,6 @@ +rvi +=== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: rvi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.savi.rst b/docs/api/eolab.rastertools.processing.algo.savi.rst new file mode 100644 index 00000000..79c20d4c --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.savi.rst @@ -0,0 +1,6 @@ +savi +==== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: savi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.speed.rst b/docs/api/eolab.rastertools.processing.algo.speed.rst new file mode 100644 index 00000000..d11c6a50 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.speed.rst @@ -0,0 +1,6 @@ +speed +===== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: speed \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.svf.rst b/docs/api/eolab.rastertools.processing.algo.svf.rst new file mode 100644 index 00000000..33ed289c --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.svf.rst @@ -0,0 +1,6 @@ +svf +=== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: svf \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.tndvi.rst b/docs/api/eolab.rastertools.processing.algo.tndvi.rst new file mode 100644 index 00000000..a4da13e7 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.tndvi.rst @@ -0,0 +1,6 @@ +tndvi +===== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: tndvi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.algo.tsavi.rst b/docs/api/eolab.rastertools.processing.algo.tsavi.rst new file mode 100644 index 00000000..fd2457e4 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.algo.tsavi.rst @@ -0,0 +1,6 @@ +tsavi +===== + +.. currentmodule:: eolab.rastertools.processing.algo + +.. autofunction:: tsavi \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.rst new file mode 100644 index 00000000..9d65dc1d --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.\_\_init\_\_ +================================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RadioindiceProcessing.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.rst new file mode 100644 index 00000000..628be0a5 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.algo +========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.algo \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.rst new file mode 100644 index 00000000..2394d3fe --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.aliases +============================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.aliases \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.rst new file mode 100644 index 00000000..1cc23a86 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.arguments +=============================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.arguments \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.rst new file mode 100644 index 00000000..c1add71a --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.channels +============================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.channels \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.rst new file mode 100644 index 00000000..2592bbe3 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.compress +============================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.compress \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.rst new file mode 100644 index 00000000..28f3f3b4 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.compute +============================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RadioindiceProcessing.compute \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.rst new file mode 100644 index 00000000..504b9730 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.configure +=============================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RadioindiceProcessing.configure \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.rst new file mode 100644 index 00000000..b81a33d7 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.description +================================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.description \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.rst new file mode 100644 index 00000000..28641b45 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.dtype +=========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.dtype \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.rst new file mode 100644 index 00000000..89e85e3c --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.help +========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.help \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.rst new file mode 100644 index 00000000..f23e7018 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.in\_dtype +=============================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.in_dtype \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.rst new file mode 100644 index 00000000..7c4ae734 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.name +========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.name \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.rst new file mode 100644 index 00000000..1aadbfca --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.nbits +=========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.nbits \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.rst new file mode 100644 index 00000000..e9024302 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.nodata +============================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.nodata \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.rst new file mode 100644 index 00000000..d1027f3b --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.per\_band\_algo +===================================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RadioindiceProcessing.per_band_algo \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.rst new file mode 100644 index 00000000..a62be9ee --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.rst @@ -0,0 +1,63 @@ +RadioindiceProcessing +===================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoclass:: RadioindiceProcessing + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + RadioindiceProcessing.algo + + RadioindiceProcessing.aliases + + RadioindiceProcessing.arguments + + RadioindiceProcessing.channels + + RadioindiceProcessing.compress + + RadioindiceProcessing.description + + RadioindiceProcessing.dtype + + RadioindiceProcessing.help + + RadioindiceProcessing.in_dtype + + RadioindiceProcessing.name + + RadioindiceProcessing.nbits + + RadioindiceProcessing.nodata + + RadioindiceProcessing.per_band_algo + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + RadioindiceProcessing.__init__ + + RadioindiceProcessing.compute + + RadioindiceProcessing.configure + + RadioindiceProcessing.with_arguments + + RadioindiceProcessing.with_channels + + RadioindiceProcessing.with_documentation + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.rst new file mode 100644 index 00000000..8540adc4 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.with\_arguments +===================================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RadioindiceProcessing.with_arguments \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.rst new file mode 100644 index 00000000..ae44881b --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.with\_channels +==================================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RadioindiceProcessing.with_channels \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.rst b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.rst new file mode 100644 index 00000000..03fb54e8 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.rst @@ -0,0 +1,6 @@ +RadioindiceProcessing.with\_documentation +========================================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RadioindiceProcessing.with_documentation \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.rst new file mode 100644 index 00000000..40f6906f --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.rst @@ -0,0 +1,6 @@ +RasterFilter.\_\_init\_\_ +========================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterFilter.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.rst new file mode 100644 index 00000000..685ef3d4 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.rst @@ -0,0 +1,6 @@ +RasterFilter.algo +================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.algo \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.rst new file mode 100644 index 00000000..c0865f4e --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.rst @@ -0,0 +1,6 @@ +RasterFilter.aliases +==================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.aliases \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.rst new file mode 100644 index 00000000..9284facf --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.rst @@ -0,0 +1,6 @@ +RasterFilter.arguments +====================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.arguments \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.rst new file mode 100644 index 00000000..3566399d --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.rst @@ -0,0 +1,6 @@ +RasterFilter.compress +===================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.compress \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.rst new file mode 100644 index 00000000..eb4eb7a3 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.rst @@ -0,0 +1,6 @@ +RasterFilter.compute +==================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterFilter.compute \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.rst new file mode 100644 index 00000000..22876db3 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.rst @@ -0,0 +1,6 @@ +RasterFilter.configure +====================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterFilter.configure \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.rst new file mode 100644 index 00000000..cbee9eee --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.rst @@ -0,0 +1,6 @@ +RasterFilter.description +======================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.description \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.rst new file mode 100644 index 00000000..ab6403da --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.rst @@ -0,0 +1,6 @@ +RasterFilter.dtype +================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.dtype \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.rst new file mode 100644 index 00000000..d75d0b85 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.rst @@ -0,0 +1,6 @@ +RasterFilter.help +================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.help \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.rst new file mode 100644 index 00000000..0c397258 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.rst @@ -0,0 +1,6 @@ +RasterFilter.in\_dtype +====================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.in_dtype \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.rst new file mode 100644 index 00000000..e510969e --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.rst @@ -0,0 +1,6 @@ +RasterFilter.name +================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.name \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.rst new file mode 100644 index 00000000..aecbd4e5 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.rst @@ -0,0 +1,6 @@ +RasterFilter.nbits +================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.nbits \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.rst new file mode 100644 index 00000000..ffa534bc --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.rst @@ -0,0 +1,6 @@ +RasterFilter.nodata +=================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.nodata \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.rst new file mode 100644 index 00000000..7e4ecb73 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.rst @@ -0,0 +1,6 @@ +RasterFilter.per\_band\_algo +============================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterFilter.per_band_algo \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.rst new file mode 100644 index 00000000..ba4967d9 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.rst @@ -0,0 +1,59 @@ +RasterFilter +============ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoclass:: RasterFilter + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + RasterFilter.algo + + RasterFilter.aliases + + RasterFilter.arguments + + RasterFilter.compress + + RasterFilter.description + + RasterFilter.dtype + + RasterFilter.help + + RasterFilter.in_dtype + + RasterFilter.name + + RasterFilter.nbits + + RasterFilter.nodata + + RasterFilter.per_band_algo + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + RasterFilter.__init__ + + RasterFilter.compute + + RasterFilter.configure + + RasterFilter.with_arguments + + RasterFilter.with_documentation + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.rst new file mode 100644 index 00000000..de08e990 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.rst @@ -0,0 +1,6 @@ +RasterFilter.with\_arguments +============================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterFilter.with_arguments \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.rst new file mode 100644 index 00000000..aac72168 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.rst @@ -0,0 +1,6 @@ +RasterFilter.with\_documentation +================================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterFilter.with_documentation \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.rst new file mode 100644 index 00000000..0ff7a967 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.rst @@ -0,0 +1,6 @@ +RasterProcessing.\_\_init\_\_ +============================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterProcessing.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.rst new file mode 100644 index 00000000..9d7f23f0 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.rst @@ -0,0 +1,6 @@ +RasterProcessing.algo +===================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.algo \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.rst new file mode 100644 index 00000000..eb17feb7 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.rst @@ -0,0 +1,6 @@ +RasterProcessing.aliases +======================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.aliases \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.rst new file mode 100644 index 00000000..a438a386 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.rst @@ -0,0 +1,6 @@ +RasterProcessing.arguments +========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.arguments \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.rst new file mode 100644 index 00000000..57c2f5ff --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.rst @@ -0,0 +1,6 @@ +RasterProcessing.compress +========================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.compress \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.rst new file mode 100644 index 00000000..0dd9b99e --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.rst @@ -0,0 +1,6 @@ +RasterProcessing.compute +======================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterProcessing.compute \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.rst new file mode 100644 index 00000000..f01d3746 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.rst @@ -0,0 +1,6 @@ +RasterProcessing.configure +========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterProcessing.configure \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.rst new file mode 100644 index 00000000..c1a6945e --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.rst @@ -0,0 +1,6 @@ +RasterProcessing.description +============================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.description \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.rst new file mode 100644 index 00000000..b60bf642 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.rst @@ -0,0 +1,6 @@ +RasterProcessing.dtype +====================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.dtype \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.rst new file mode 100644 index 00000000..4dc75a6a --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.rst @@ -0,0 +1,6 @@ +RasterProcessing.help +===================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.help \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.rst new file mode 100644 index 00000000..ab6dc302 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.rst @@ -0,0 +1,6 @@ +RasterProcessing.in\_dtype +========================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.in_dtype \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.rst new file mode 100644 index 00000000..7d481e8c --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.rst @@ -0,0 +1,6 @@ +RasterProcessing.name +===================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.name \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.rst new file mode 100644 index 00000000..9af3846e --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.rst @@ -0,0 +1,6 @@ +RasterProcessing.nbits +====================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.nbits \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.rst new file mode 100644 index 00000000..edbc9f7c --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.rst @@ -0,0 +1,6 @@ +RasterProcessing.nodata +======================= + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.nodata \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.rst new file mode 100644 index 00000000..4e913887 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.rst @@ -0,0 +1,6 @@ +RasterProcessing.per\_band\_algo +================================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoproperty:: RasterProcessing.per_band_algo \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.rst new file mode 100644 index 00000000..d8352b12 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.rst @@ -0,0 +1,59 @@ +RasterProcessing +================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. autoclass:: RasterProcessing + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + RasterProcessing.algo + + RasterProcessing.aliases + + RasterProcessing.arguments + + RasterProcessing.compress + + RasterProcessing.description + + RasterProcessing.dtype + + RasterProcessing.help + + RasterProcessing.in_dtype + + RasterProcessing.name + + RasterProcessing.nbits + + RasterProcessing.nodata + + RasterProcessing.per_band_algo + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + RasterProcessing.__init__ + + RasterProcessing.compute + + RasterProcessing.configure + + RasterProcessing.with_arguments + + RasterProcessing.with_documentation + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.rst new file mode 100644 index 00000000..20146616 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.rst @@ -0,0 +1,6 @@ +RasterProcessing.with\_arguments +================================ + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterProcessing.with_arguments \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.rst b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.rst new file mode 100644 index 00000000..3d564910 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.rst @@ -0,0 +1,6 @@ +RasterProcessing.with\_documentation +==================================== + +.. currentmodule:: eolab.rastertools.processing.rasterproc + +.. automethod:: RasterProcessing.with_documentation \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.rasterproc.rst b/docs/api/eolab.rastertools.processing.rasterproc.rst new file mode 100644 index 00000000..0032ffba --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rasterproc.rst @@ -0,0 +1,35 @@ +eolab.rastertools.processing.rasterproc +======================================= + +.. rubric:: Description +.. automodule:: eolab.rastertools.processing.rasterproc +.. currentmodule:: eolab.rastertools.processing.rasterproc + + + + + + + + + + + +.. rubric:: Classes + +.. autosummary:: + :toctree: + :nosignatures: + + RadioindiceProcessing + RasterFilter + RasterProcessing + + + + + + + + + diff --git a/docs/api/eolab.rastertools.processing.rst b/docs/api/eolab.rastertools.processing.rst new file mode 100644 index 00000000..8a00f31d --- /dev/null +++ b/docs/api/eolab.rastertools.processing.rst @@ -0,0 +1,38 @@ +eolab.rastertools.processing +============================ + +.. rubric:: Description +.. automodule:: eolab.rastertools.processing +.. currentmodule:: eolab.rastertools.processing + + + + + + + + + + + + + + + + + + + +.. rubric:: Submodules + +.. autosummary:: + :toctree: + :template: custom_module_template.rst + :recursive: + + eolab.rastertools.processing.algo + eolab.rastertools.processing.rasterproc + eolab.rastertools.processing.sliding + eolab.rastertools.processing.stats + eolab.rastertools.processing.vector + diff --git a/docs/api/eolab.rastertools.processing.sliding.compute_sliding.rst b/docs/api/eolab.rastertools.processing.sliding.compute_sliding.rst new file mode 100644 index 00000000..b9324398 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.sliding.compute_sliding.rst @@ -0,0 +1,6 @@ +compute\_sliding +================ + +.. currentmodule:: eolab.rastertools.processing.sliding + +.. autofunction:: compute_sliding \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.sliding.rst b/docs/api/eolab.rastertools.processing.sliding.rst new file mode 100644 index 00000000..0dd5f05f --- /dev/null +++ b/docs/api/eolab.rastertools.processing.sliding.rst @@ -0,0 +1,33 @@ +eolab.rastertools.processing.sliding +==================================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.processing.sliding +.. currentmodule:: eolab.rastertools.processing.sliding + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + compute_sliding + + + + + + + + + + + + + diff --git a/docs/api/eolab.rastertools.processing.stats.compute_zonal_stats.rst b/docs/api/eolab.rastertools.processing.stats.compute_zonal_stats.rst new file mode 100644 index 00000000..0317ca35 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.stats.compute_zonal_stats.rst @@ -0,0 +1,6 @@ +compute\_zonal\_stats +===================== + +.. currentmodule:: eolab.rastertools.processing.stats + +.. autofunction:: compute_zonal_stats \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.rst b/docs/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.rst new file mode 100644 index 00000000..6aed0e7b --- /dev/null +++ b/docs/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.rst @@ -0,0 +1,6 @@ +compute\_zonal\_stats\_per\_category +==================================== + +.. currentmodule:: eolab.rastertools.processing.stats + +.. autofunction:: compute_zonal_stats_per_category \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.stats.extract_zonal_outliers.rst b/docs/api/eolab.rastertools.processing.stats.extract_zonal_outliers.rst new file mode 100644 index 00000000..9b25b6dd --- /dev/null +++ b/docs/api/eolab.rastertools.processing.stats.extract_zonal_outliers.rst @@ -0,0 +1,6 @@ +extract\_zonal\_outliers +======================== + +.. currentmodule:: eolab.rastertools.processing.stats + +.. autofunction:: extract_zonal_outliers \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.stats.plot_stats.rst b/docs/api/eolab.rastertools.processing.stats.plot_stats.rst new file mode 100644 index 00000000..ff08c663 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.stats.plot_stats.rst @@ -0,0 +1,6 @@ +plot\_stats +=========== + +.. currentmodule:: eolab.rastertools.processing.stats + +.. autofunction:: plot_stats \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.stats.rst b/docs/api/eolab.rastertools.processing.stats.rst new file mode 100644 index 00000000..1daf8202 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.stats.rst @@ -0,0 +1,36 @@ +eolab.rastertools.processing.stats +================================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.processing.stats +.. currentmodule:: eolab.rastertools.processing.stats + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + compute_zonal_stats + compute_zonal_stats_per_category + extract_zonal_outliers + plot_stats + + + + + + + + + + + + + diff --git a/docs/api/eolab.rastertools.processing.vector.clip.rst b/docs/api/eolab.rastertools.processing.vector.clip.rst new file mode 100644 index 00000000..60ce8abe --- /dev/null +++ b/docs/api/eolab.rastertools.processing.vector.clip.rst @@ -0,0 +1,6 @@ +clip +==== + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: clip \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.vector.crop.rst b/docs/api/eolab.rastertools.processing.vector.crop.rst new file mode 100644 index 00000000..ab63a190 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.vector.crop.rst @@ -0,0 +1,6 @@ +crop +==== + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: crop \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.vector.dissolve.rst b/docs/api/eolab.rastertools.processing.vector.dissolve.rst new file mode 100644 index 00000000..134bc714 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.vector.dissolve.rst @@ -0,0 +1,6 @@ +dissolve +======== + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: dissolve \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.vector.filter.rst b/docs/api/eolab.rastertools.processing.vector.filter.rst new file mode 100644 index 00000000..253cb07b --- /dev/null +++ b/docs/api/eolab.rastertools.processing.vector.filter.rst @@ -0,0 +1,6 @@ +filter +====== + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: filter \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.vector.filter_dissolve.rst b/docs/api/eolab.rastertools.processing.vector.filter_dissolve.rst new file mode 100644 index 00000000..1575ead2 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.vector.filter_dissolve.rst @@ -0,0 +1,6 @@ +filter\_dissolve +================ + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: filter_dissolve \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.vector.get_raster_shape.rst b/docs/api/eolab.rastertools.processing.vector.get_raster_shape.rst new file mode 100644 index 00000000..df7bdd91 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.vector.get_raster_shape.rst @@ -0,0 +1,6 @@ +get\_raster\_shape +================== + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: get_raster_shape \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.vector.rasterize.rst b/docs/api/eolab.rastertools.processing.vector.rasterize.rst new file mode 100644 index 00000000..9ff9ca1f --- /dev/null +++ b/docs/api/eolab.rastertools.processing.vector.rasterize.rst @@ -0,0 +1,6 @@ +rasterize +========= + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: rasterize \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.vector.reproject.rst b/docs/api/eolab.rastertools.processing.vector.reproject.rst new file mode 100644 index 00000000..dd5d043d --- /dev/null +++ b/docs/api/eolab.rastertools.processing.vector.reproject.rst @@ -0,0 +1,6 @@ +reproject +========= + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: reproject \ No newline at end of file diff --git a/docs/api/eolab.rastertools.processing.vector.rst b/docs/api/eolab.rastertools.processing.vector.rst new file mode 100644 index 00000000..e9a01b6a --- /dev/null +++ b/docs/api/eolab.rastertools.processing.vector.rst @@ -0,0 +1,41 @@ +eolab.rastertools.processing.vector +=================================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.processing.vector +.. currentmodule:: eolab.rastertools.processing.vector + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + clip + crop + dissolve + filter + filter_dissolve + get_raster_shape + rasterize + reproject + vectorize + + + + + + + + + + + + + diff --git a/docs/api/eolab.rastertools.processing.vector.vectorize.rst b/docs/api/eolab.rastertools.processing.vector.vectorize.rst new file mode 100644 index 00000000..39b5c4d3 --- /dev/null +++ b/docs/api/eolab.rastertools.processing.vector.vectorize.rst @@ -0,0 +1,6 @@ +vectorize +========= + +.. currentmodule:: eolab.rastertools.processing.vector + +.. autofunction:: vectorize \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.rst new file mode 100644 index 00000000..56c29c3d --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.rst @@ -0,0 +1,6 @@ +RasterProduct.\_\_init\_\_ +========================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.rst new file mode 100644 index 00000000..f5fa19dd --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.rst @@ -0,0 +1,6 @@ +RasterProduct.bands\_files +========================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. autoproperty:: RasterProduct.bands_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.rst new file mode 100644 index 00000000..72fae09c --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.rst @@ -0,0 +1,6 @@ +RasterProduct.channels +====================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. autoproperty:: RasterProduct.channels \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.rst new file mode 100644 index 00000000..970fb4cf --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.rst @@ -0,0 +1,6 @@ +RasterProduct.file +================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. autoproperty:: RasterProduct.file \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.rst new file mode 100644 index 00000000..6acaa715 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.rst @@ -0,0 +1,6 @@ +RasterProduct.free\_in\_memory\_vrts +==================================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.free_in_memory_vrts \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.rst new file mode 100644 index 00000000..e933f81b --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.rst @@ -0,0 +1,6 @@ +RasterProduct.get\_date +======================= + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.get_date \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.rst new file mode 100644 index 00000000..7e18c324 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.rst @@ -0,0 +1,6 @@ +RasterProduct.get\_date\_string +=============================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.get_date_string \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.rst new file mode 100644 index 00000000..ad457790 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.rst @@ -0,0 +1,6 @@ +RasterProduct.get\_raster +========================= + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.get_raster \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.rst new file mode 100644 index 00000000..280a1173 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.rst @@ -0,0 +1,6 @@ +RasterProduct.get\_relative\_orbit +================================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.get_relative_orbit \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.rst new file mode 100644 index 00000000..144c6500 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.rst @@ -0,0 +1,6 @@ +RasterProduct.get\_satellite +============================ + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.get_satellite \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.rst new file mode 100644 index 00000000..01f1c730 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.rst @@ -0,0 +1,6 @@ +RasterProduct.get\_tile +======================= + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.get_tile \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.rst new file mode 100644 index 00000000..526d4626 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.rst @@ -0,0 +1,6 @@ +RasterProduct.is\_archive +========================= + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. autoproperty:: RasterProduct.is_archive \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.rst new file mode 100644 index 00000000..9ee8bce8 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.rst @@ -0,0 +1,6 @@ +RasterProduct.masks\_files +========================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. autoproperty:: RasterProduct.masks_files \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.rst new file mode 100644 index 00000000..c2dbeedf --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.rst @@ -0,0 +1,6 @@ +RasterProduct.open +================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. automethod:: RasterProduct.open \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.rst new file mode 100644 index 00000000..d96804be --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.rst @@ -0,0 +1,6 @@ +RasterProduct.rastertype +======================== + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. autoproperty:: RasterProduct.rastertype \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.rst b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.rst new file mode 100644 index 00000000..4b365632 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.rst @@ -0,0 +1,55 @@ +RasterProduct +============= + +.. currentmodule:: eolab.rastertools.product.rasterproduct + +.. autoclass:: RasterProduct + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + RasterProduct.bands_files + + RasterProduct.channels + + RasterProduct.file + + RasterProduct.is_archive + + RasterProduct.masks_files + + RasterProduct.rastertype + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + RasterProduct.__init__ + + RasterProduct.free_in_memory_vrts + + RasterProduct.get_date + + RasterProduct.get_date_string + + RasterProduct.get_raster + + RasterProduct.get_relative_orbit + + RasterProduct.get_satellite + + RasterProduct.get_tile + + RasterProduct.open + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rasterproduct.rst b/docs/api/eolab.rastertools.product.rasterproduct.rst new file mode 100644 index 00000000..790bec5f --- /dev/null +++ b/docs/api/eolab.rastertools.product.rasterproduct.rst @@ -0,0 +1,33 @@ +eolab.rastertools.product.rasterproduct +======================================= + +.. rubric:: Description +.. automodule:: eolab.rastertools.product.rasterproduct +.. currentmodule:: eolab.rastertools.product.rasterproduct + + + + + + + + + + + +.. rubric:: Classes + +.. autosummary:: + :toctree: + :nosignatures: + + RasterProduct + + + + + + + + + diff --git a/docs/api/eolab.rastertools.product.rastertype.Band.__init__.rst b/docs/api/eolab.rastertools.product.rastertype.Band.__init__.rst new file mode 100644 index 00000000..53d03e51 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.Band.__init__.rst @@ -0,0 +1,6 @@ +Band.\_\_init\_\_ +================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: Band.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.Band.description.rst b/docs/api/eolab.rastertools.product.rastertype.Band.description.rst new file mode 100644 index 00000000..9cbb448d --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.Band.description.rst @@ -0,0 +1,6 @@ +Band.description +================ + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: Band.description \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.Band.identifier.rst b/docs/api/eolab.rastertools.product.rastertype.Band.identifier.rst new file mode 100644 index 00000000..d29a689c --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.Band.identifier.rst @@ -0,0 +1,6 @@ +Band.identifier +=============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: Band.identifier \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.Band.rst b/docs/api/eolab.rastertools.product.rastertype.Band.rst new file mode 100644 index 00000000..37620449 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.Band.rst @@ -0,0 +1,31 @@ +Band +==== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoclass:: Band + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + Band.description + + Band.identifier + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + Band.__init__ + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.BandChannel.blue.rst b/docs/api/eolab.rastertools.product.rastertype.BandChannel.blue.rst new file mode 100644 index 00000000..3bbb1e3c --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.BandChannel.blue.rst @@ -0,0 +1,6 @@ +BandChannel.blue +================ + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.blue \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.rst b/docs/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.rst new file mode 100644 index 00000000..4d233319 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.rst @@ -0,0 +1,6 @@ +BandChannel.blue\_60m +===================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.blue_60m \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.BandChannel.green.rst b/docs/api/eolab.rastertools.product.rastertype.BandChannel.green.rst new file mode 100644 index 00000000..e8579a6d --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.BandChannel.green.rst @@ -0,0 +1,6 @@ +BandChannel.green +================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.green \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.BandChannel.mir.rst b/docs/api/eolab.rastertools.product.rastertype.BandChannel.mir.rst new file mode 100644 index 00000000..1cea98db --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.BandChannel.mir.rst @@ -0,0 +1,6 @@ +BandChannel.mir +=============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.mir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.rst b/docs/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.rst new file mode 100644 index 00000000..84bd5c36 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.rst @@ -0,0 +1,6 @@ +BandChannel.mir\_60m +==================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.mir_60m \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.BandChannel.nir.rst b/docs/api/eolab.rastertools.product.rastertype.BandChannel.nir.rst new file mode 100644 index 00000000..478fd2a6 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.BandChannel.nir.rst @@ -0,0 +1,6 @@ +BandChannel.nir +=============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.nir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.rst b/docs/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.rst new file mode 100644 index 00000000..a0f30ccd --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.rst @@ -0,0 +1,6 @@ +BandChannel.nir\_60m +==================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.nir_60m \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.BandChannel.red.rst b/docs/api/eolab.rastertools.product.rastertype.BandChannel.red.rst new file mode 100644 index 00000000..8ef290b8 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.BandChannel.red.rst @@ -0,0 +1,6 @@ +BandChannel.red +=============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.red \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.rst b/docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.rst new file mode 100644 index 00000000..594aedb9 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.rst @@ -0,0 +1,6 @@ +BandChannel.red\_edge1 +====================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.red_edge1 \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.rst b/docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.rst new file mode 100644 index 00000000..4738248c --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.rst @@ -0,0 +1,6 @@ +BandChannel.red\_edge2 +====================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.red_edge2 \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.rst b/docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.rst new file mode 100644 index 00000000..55c8d685 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.rst @@ -0,0 +1,6 @@ +BandChannel.red\_edge3 +====================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.red_edge3 \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.rst b/docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.rst new file mode 100644 index 00000000..2cc7062c --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.rst @@ -0,0 +1,6 @@ +BandChannel.red\_edge4 +====================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.red_edge4 \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.BandChannel.rst b/docs/api/eolab.rastertools.product.rastertype.BandChannel.rst new file mode 100644 index 00000000..3c5c20d4 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.BandChannel.rst @@ -0,0 +1,46 @@ +BandChannel +=========== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoclass:: BandChannel + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + BandChannel.blue + + BandChannel.green + + BandChannel.red + + BandChannel.nir + + BandChannel.mir + + BandChannel.swir + + BandChannel.red_edge1 + + BandChannel.red_edge2 + + BandChannel.red_edge3 + + BandChannel.red_edge4 + + BandChannel.blue_60m + + BandChannel.nir_60m + + BandChannel.mir_60m + + + + + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.BandChannel.swir.rst b/docs/api/eolab.rastertools.product.rastertype.BandChannel.swir.rst new file mode 100644 index 00000000..695700d1 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.BandChannel.swir.rst @@ -0,0 +1,6 @@ +BandChannel.swir +================ + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: BandChannel.swir \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.__init__.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.__init__.rst new file mode 100644 index 00000000..731339c1 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.__init__.rst @@ -0,0 +1,6 @@ +RasterType.\_\_init\_\_ +======================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.__init__ \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.accept.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.accept.rst new file mode 100644 index 00000000..debbe490 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.accept.rst @@ -0,0 +1,6 @@ +RasterType.accept +================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.accept \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.add.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.add.rst new file mode 100644 index 00000000..885f61ea --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.add.rst @@ -0,0 +1,6 @@ +RasterType.add +============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.add \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.rst new file mode 100644 index 00000000..42e931d1 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.rst @@ -0,0 +1,6 @@ +RasterType.bands\_pattern +========================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.bands_pattern \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.channels.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.channels.rst new file mode 100644 index 00000000..883f903c --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.channels.rst @@ -0,0 +1,6 @@ +RasterType.channels +=================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.channels \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.date_format.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.date_format.rst new file mode 100644 index 00000000..76af3907 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.date_format.rst @@ -0,0 +1,6 @@ +RasterType.date\_format +======================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.date_format \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.find.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.find.rst new file mode 100644 index 00000000..79d3f179 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.find.rst @@ -0,0 +1,6 @@ +RasterType.find +=============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.find \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.get.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.get.rst new file mode 100644 index 00000000..8c93c574 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.get.rst @@ -0,0 +1,6 @@ +RasterType.get +============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.rst new file mode 100644 index 00000000..6754c576 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.rst @@ -0,0 +1,6 @@ +RasterType.get\_band\_description +================================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_band_description \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.rst new file mode 100644 index 00000000..63312e7d --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.rst @@ -0,0 +1,6 @@ +RasterType.get\_band\_descriptions +================================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_band_descriptions \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.rst new file mode 100644 index 00000000..d4575c12 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.rst @@ -0,0 +1,6 @@ +RasterType.get\_band\_id +======================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_band_id \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.rst new file mode 100644 index 00000000..83ad5d08 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.rst @@ -0,0 +1,6 @@ +RasterType.get\_band\_ids +========================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_band_ids \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.rst new file mode 100644 index 00000000..c14ff828 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.rst @@ -0,0 +1,6 @@ +RasterType.get\_bands\_regexp +============================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_bands_regexp \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.get_date.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_date.rst new file mode 100644 index 00000000..8a9c0b63 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_date.rst @@ -0,0 +1,6 @@ +RasterType.get\_date +==================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_date \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.get_group.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_group.rst new file mode 100644 index 00000000..6206d2ad --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_group.rst @@ -0,0 +1,6 @@ +RasterType.get\_group +===================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_group \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask.rst new file mode 100644 index 00000000..5694f89d --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask.rst @@ -0,0 +1,6 @@ +RasterType.get\_mask +==================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_mask \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.rst new file mode 100644 index 00000000..936047c3 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.rst @@ -0,0 +1,6 @@ +RasterType.get\_mask\_descriptions +================================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_mask_descriptions \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.rst new file mode 100644 index 00000000..c0882b8e --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.rst @@ -0,0 +1,6 @@ +RasterType.get\_mask\_ids +========================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_mask_ids \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.rst new file mode 100644 index 00000000..74eaddfb --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.rst @@ -0,0 +1,6 @@ +RasterType.get\_mask\_regexp +============================ + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.get_mask_regexp \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.has_channel.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.has_channel.rst new file mode 100644 index 00000000..dbba5372 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.has_channel.rst @@ -0,0 +1,6 @@ +RasterType.has\_channel +======================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.has_channel \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.has_channels.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.has_channels.rst new file mode 100644 index 00000000..c2c81f84 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.has_channels.rst @@ -0,0 +1,6 @@ +RasterType.has\_channels +======================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.has_channels \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.has_mask.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.has_mask.rst new file mode 100644 index 00000000..4f7ed896 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.has_mask.rst @@ -0,0 +1,6 @@ +RasterType.has\_mask +==================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. automethod:: RasterType.has_mask \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.rst new file mode 100644 index 00000000..f26d1fe8 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.rst @@ -0,0 +1,6 @@ +RasterType.maskfunc +=================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.maskfunc \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.masknodata.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.masknodata.rst new file mode 100644 index 00000000..388e5dac --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.masknodata.rst @@ -0,0 +1,6 @@ +RasterType.masknodata +===================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.masknodata \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.name.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.name.rst new file mode 100644 index 00000000..4c1fcff2 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.name.rst @@ -0,0 +1,6 @@ +RasterType.name +=============== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.name \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.nodata.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.nodata.rst new file mode 100644 index 00000000..b4a3f63a --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.nodata.rst @@ -0,0 +1,6 @@ +RasterType.nodata +================= + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.nodata \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.rst new file mode 100644 index 00000000..441fb234 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.rst @@ -0,0 +1,6 @@ +RasterType.product\_pattern +=========================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoproperty:: RasterType.product_pattern \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.rst new file mode 100644 index 00000000..7f92ad9d --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.rst @@ -0,0 +1,6 @@ +RasterType.rastertypes +====================== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoattribute:: RasterType.rastertypes \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.RasterType.rst b/docs/api/eolab.rastertools.product.rastertype.RasterType.rst new file mode 100644 index 00000000..c2e64228 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.RasterType.rst @@ -0,0 +1,81 @@ +RasterType +========== + +.. currentmodule:: eolab.rastertools.product.rastertype + +.. autoclass:: RasterType + :show-inheritance: + + + + .. rubric:: Attributes + .. autosummary:: + :toctree: + + RasterType.bands_pattern + + RasterType.channels + + RasterType.date_format + + RasterType.maskfunc + + RasterType.masknodata + + RasterType.name + + RasterType.nodata + + RasterType.product_pattern + + RasterType.rastertypes + + + + + + + .. rubric:: Methods + .. autosummary:: + :toctree: + + RasterType.__init__ + + RasterType.accept + + RasterType.add + + RasterType.find + + RasterType.get + + RasterType.get_band_description + + RasterType.get_band_descriptions + + RasterType.get_band_id + + RasterType.get_band_ids + + RasterType.get_bands_regexp + + RasterType.get_date + + RasterType.get_group + + RasterType.get_mask + + RasterType.get_mask_descriptions + + RasterType.get_mask_ids + + RasterType.get_mask_regexp + + RasterType.has_channel + + RasterType.has_channels + + RasterType.has_mask + + + \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.rastertype.rst b/docs/api/eolab.rastertools.product.rastertype.rst new file mode 100644 index 00000000..0d383893 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rastertype.rst @@ -0,0 +1,35 @@ +eolab.rastertools.product.rastertype +==================================== + +.. rubric:: Description +.. automodule:: eolab.rastertools.product.rastertype +.. currentmodule:: eolab.rastertools.product.rastertype + + + + + + + + + + + +.. rubric:: Classes + +.. autosummary:: + :toctree: + :nosignatures: + + Band + BandChannel + RasterType + + + + + + + + + diff --git a/docs/api/eolab.rastertools.product.rst b/docs/api/eolab.rastertools.product.rst new file mode 100644 index 00000000..541be381 --- /dev/null +++ b/docs/api/eolab.rastertools.product.rst @@ -0,0 +1,44 @@ +eolab.rastertools.product +========================= + +.. rubric:: Description +.. automodule:: eolab.rastertools.product +.. currentmodule:: eolab.rastertools.product + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + s2_maja_mask + + + + + + + + + + + + + +.. rubric:: Submodules + +.. autosummary:: + :toctree: + :template: custom_module_template.rst + :recursive: + + eolab.rastertools.product.rasterproduct + eolab.rastertools.product.rastertype + eolab.rastertools.product.vrt + diff --git a/docs/api/eolab.rastertools.product.s2_maja_mask.rst b/docs/api/eolab.rastertools.product.s2_maja_mask.rst new file mode 100644 index 00000000..f619fe63 --- /dev/null +++ b/docs/api/eolab.rastertools.product.s2_maja_mask.rst @@ -0,0 +1,6 @@ +s2\_maja\_mask +============== + +.. currentmodule:: eolab.rastertools.product + +.. autofunction:: s2_maja_mask \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.vrt.add_masks_to_vrt.rst b/docs/api/eolab.rastertools.product.vrt.add_masks_to_vrt.rst new file mode 100644 index 00000000..02f9e351 --- /dev/null +++ b/docs/api/eolab.rastertools.product.vrt.add_masks_to_vrt.rst @@ -0,0 +1,6 @@ +add\_masks\_to\_vrt +=================== + +.. currentmodule:: eolab.rastertools.product.vrt + +.. autofunction:: add_masks_to_vrt \ No newline at end of file diff --git a/docs/api/eolab.rastertools.product.vrt.rst b/docs/api/eolab.rastertools.product.vrt.rst new file mode 100644 index 00000000..9d7f302f --- /dev/null +++ b/docs/api/eolab.rastertools.product.vrt.rst @@ -0,0 +1,34 @@ +eolab.rastertools.product.vrt +============================= + +.. rubric:: Description +.. automodule:: eolab.rastertools.product.vrt +.. currentmodule:: eolab.rastertools.product.vrt + + + + + + + +.. rubric:: Functions + +.. autosummary:: + :toctree: + :nosignatures: + + add_masks_to_vrt + set_band_descriptions + + + + + + + + + + + + + diff --git a/docs/api/eolab.rastertools.product.vrt.set_band_descriptions.rst b/docs/api/eolab.rastertools.product.vrt.set_band_descriptions.rst new file mode 100644 index 00000000..62dad010 --- /dev/null +++ b/docs/api/eolab.rastertools.product.vrt.set_band_descriptions.rst @@ -0,0 +1,6 @@ +set\_band\_descriptions +======================= + +.. currentmodule:: eolab.rastertools.product.vrt + +.. autofunction:: set_band_descriptions \ No newline at end of file diff --git a/docs/api/eolab.rastertools.rst b/docs/api/eolab.rastertools.rst new file mode 100644 index 00000000..00ffe659 --- /dev/null +++ b/docs/api/eolab.rastertools.rst @@ -0,0 +1,111 @@ +eolab.rastertools package +========================= + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + eolab.rastertools.cli + eolab.rastertools.processing + eolab.rastertools.product + +Submodules +---------- + +eolab.rastertools.filtering module +---------------------------------- + +.. automodule:: eolab.rastertools.filtering + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.hillshade module +---------------------------------- + +.. automodule:: eolab.rastertools.hillshade + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.main module +----------------------------- + +.. automodule:: eolab.rastertools.main + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.radioindice module +------------------------------------ + +.. automodule:: eolab.rastertools.radioindice + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.rastertools module +------------------------------------ + +.. automodule:: eolab.rastertools.rastertools + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.speed module +------------------------------ + +.. automodule:: eolab.rastertools.speed + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.svf module +---------------------------- + +.. automodule:: eolab.rastertools.svf + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.tiling module +------------------------------- + +.. automodule:: eolab.rastertools.tiling + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.timeseries module +----------------------------------- + +.. automodule:: eolab.rastertools.timeseries + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.utils module +------------------------------ + +.. automodule:: eolab.rastertools.utils + :members: + :undoc-members: + :show-inheritance: + +eolab.rastertools.zonalstats module +----------------------------------- + +.. automodule:: eolab.rastertools.zonalstats + :members: + :undoc-members: + :show-inheritance: + +Module contents +--------------- + +.. automodule:: eolab.rastertools + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/api/eolab.rst b/docs/api/eolab.rst new file mode 100644 index 00000000..4382d933 --- /dev/null +++ b/docs/api/eolab.rst @@ -0,0 +1,12 @@ +eolab namespace +=============== + +.. py:module:: eolab + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + eolab.rastertools diff --git a/docs/api/modules.rst b/docs/api/modules.rst new file mode 100644 index 00000000..3bf90185 --- /dev/null +++ b/docs/api/modules.rst @@ -0,0 +1,7 @@ +eolab +===== + +.. toctree:: + :maxdepth: 4 + + eolab diff --git a/docs/cli/filtering.rst b/docs/cli/filtering.rst index 6e78b4b5..56c7c22b 100644 --- a/docs/cli/filtering.rst +++ b/docs/cli/filtering.rst @@ -20,75 +20,266 @@ filter mean Apply local mean filter adaptive_gaussian Apply adaptive gaussian filter -For different filters are available. They are applied as sub-command that each define the arguments -that configure the filter. Type option --help to get the definition of the arguments: +The available filters are Adaptive Gaussian, Local Sum, and Local Mean. +Each filter is used as a sub-command and has specific arguments for filtering. +To see the definitions of these arguments, type the option --help. -.. code-block:: console +- **Median** - $ rastertools filter adaptive_gaussian --help - usage: rastertools filter adaptive_gaussian [-h] --kernel_size KERNEL_SIZE - --sigma SIGMA [-o OUTPUT] - [-ws WINDOW_SIZE] - [-p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}] - [-b BANDS [BANDS ...]] [-a] - inputs [inputs ...] - - Apply an adaptive (Local gaussian of 3x3) recursive filter on the input image - - positional arguments: - inputs Input file to process (e.g. Sentinel2 L2A MAJA from - THEIA). You can provide a single file with extension - ".lst" (e.g. "filtering.lst") that lists the input - files to process (one input file per line in .lst) - - optional arguments: - -h, --help show this help message and exit - --kernel_size KERNEL_SIZE - Kernel size of the filter function, e.g. 3 means a - square of 3x3 pixels on which the filter function is - computed (default: 8) - --sigma SIGMA Standard deviation of the Gaussian distribution - (sigma) - -o OUTPUT, --output OUTPUT - Output dir where to store results (by default current - dir) - -ws WINDOW_SIZE, --window_size WINDOW_SIZE - Size of tiles to distribute processing, default: 1024 - -p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}, --pad {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap} - Pad to use around the image, default : edge (see https - ://numpy.org/doc/stable/reference/generated/numpy.pad. - html for more information) - -b BANDS [BANDS ...], --bands BANDS [BANDS ...] - List of bands to compute - -a, --all Compute all bands - - By default only first band is computed. + .. code-block:: console -Examples: + $ rastertools filter median --help + usage: rastertools filter median [-h] --kernel_size KERNEL_SIZE [-o OUTPUT] + [-ws WINDOW_SIZE] + [-p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}] + [-b BANDS [BANDS ...]] [-a] + inputs [inputs ...] -The following examples use an input raster file generated by radioindice. This is an NDVI of a SENTINEL2 L2A THEIA image cropped to a (small) -region of interest. + Apply a median filter (see scipy median_filter for more information) -.. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg + positional arguments: + inputs Input file to process (e.g. Sentinel2 L2A MAJA from + THEIA). You can provide a single file with extension + ".lst" (e.g. "filtering.lst") that lists the input + files to process (one input file per line in .lst) -To apply three filters (median, mean and adaptive_gaussian) on a kernel of dimension 16x16, run these commands: + optional arguments: + -h, --help show this help message and exit + --kernel_size KERNEL_SIZE + Kernel size of the filter function, e.g. 3 means a + square of 3x3 pixels on which the filter function is + computed (default: 8) + -o OUTPUT, --output OUTPUT + Output dir where to store results (by default current + dir) + -ws WINDOW_SIZE, --window_size WINDOW_SIZE + Size of tiles to distribute processing, default: 1024 + -p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}, --pad {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap} + Pad to use around the image, default : edge (see https + ://numpy.org/doc/stable/reference/generated/numpy.pad. + html for more information) + -b BANDS [BANDS ...], --bands BANDS [BANDS ...] + List of bands to compute + -a, --all Compute all bands -.. code-block:: console + By default only first band is computed. + + The corresponding API functions that is called by the command line interface is the following : + + .. autofunction:: eolab.rastertools.processing.algo.median + + + Here is an example of a median filter applied to the NDVI of a SENTINEL2 L2A THEIA image cropped to a region of interest. + This raster was previously computed using :ref:`radioindice` on the original SENTINEL2 L2A THEIA image. + + .. code-block:: console + + $ rastertools filter median --kernel_size 16 "./SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + + .. list-table:: + :widths: 20 20 + :header-rows: 0 + + * - .. centered:: Original + - .. centered:: Filtered by Median + + * - .. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg + :align: center + - .. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.jpg + :align: center + +- **Local sum** + + .. code-block:: console + + $ rastertools filter sum --help + usage: rastertools filter sum [-h] --kernel_size KERNEL_SIZE [-o OUTPUT] + [-ws WINDOW_SIZE] + [-p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}] + [-b BANDS [BANDS ...]] [-a] + inputs [inputs ...] + + Apply a local sum filter using integral image method + + positional arguments: + inputs Input file to process (e.g. Sentinel2 L2A MAJA from + THEIA). You can provide a single file with extension + ".lst" (e.g. "filtering.lst") that lists the input + files to process (one input file per line in .lst) + + optional arguments: + -h, --help show this help message and exit + --kernel_size KERNEL_SIZE + Kernel size of the filter function, e.g. 3 means a + square of 3x3 pixels on which the filter function is + computed (default: 8) + -o OUTPUT, --output OUTPUT + Output dir where to store results (by default current + dir) + -ws WINDOW_SIZE, --window_size WINDOW_SIZE + Size of tiles to distribute processing, default: 1024 + -p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}, --pad {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap} + Pad to use around the image, default : edge (see https + ://numpy.org/doc/stable/reference/generated/numpy.pad. + html for more information) + -b BANDS [BANDS ...], --bands BANDS [BANDS ...] + List of bands to compute + -a, --all Compute all bands + + By default only first band is computed. + + The corresponding API functions that is called by the command line interface is the following : + + .. autofunction:: eolab.rastertools.processing.algo.local_sum + + Here is an example of the local mean applied to the NDVI of a SENTINEL2 L2A THEIA image cropped to a region of interest. + This raster was previously computed using :ref:`radioindice` on the original SENTINEL2 L2A THEIA image. + + .. code-block:: console + + $ rastertools filter sum --kernel_size 16 "./SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + + .. list-table:: + :widths: 20 20 + :header-rows: 0 + + * - .. centered:: Original + - .. centered:: Filtered by Local sum + + * - .. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg + :align: center + - .. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.jpg + :align: center + +- **Local mean** + + .. code-block:: console + + $ rastertools filter mean --help + usage: rastertools filter mean [-h] --kernel_size KERNEL_SIZE [-o OUTPUT] + [-ws WINDOW_SIZE] + [-p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}] + [-b BANDS [BANDS ...]] [-a] + inputs [inputs ...] + + Apply a local mean filter using integral image method + + positional arguments: + inputs Input file to process (e.g. Sentinel2 L2A MAJA from + THEIA). You can provide a single file with extension + ".lst" (e.g. "filtering.lst") that lists the input + files to process (one input file per line in .lst) + + optional arguments: + -h, --help show this help message and exit + --kernel_size KERNEL_SIZE + Kernel size of the filter function, e.g. 3 means a + square of 3x3 pixels on which the filter function is + computed (default: 8) + -o OUTPUT, --output OUTPUT + Output dir where to store results (by default current + dir) + -ws WINDOW_SIZE, --window_size WINDOW_SIZE + Size of tiles to distribute processing, default: 1024 + -p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}, --pad {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap} + Pad to use around the image, default : edge (see https + ://numpy.org/doc/stable/reference/generated/numpy.pad. + html for more information) + -b BANDS [BANDS ...], --bands BANDS [BANDS ...] + List of bands to compute + -a, --all Compute all bands + + By default only first band is computed. + + + The corresponding API functions that is called by the command line interface is the following : + + .. autofunction:: eolab.rastertools.processing.algo.local_mean + + + Here is an example of the local mean applied to the NDVI of a SENTINEL2 L2A THEIA image cropped to a region of interest. + This raster was previously computed using :ref:`radioindice` on the original SENTINEL2 L2A THEIA image. + + .. code-block:: console + + $ rastertools filter mean --kernel_size 16 "./SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + + .. list-table:: + :widths: 20 20 + :header-rows: 0 + + * - .. centered:: Original + - .. centered:: Filtered by Local mean + + * - .. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg + :align: center + - .. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.jpg + :align: center + +- **Adaptative gaussian** + + .. code-block:: console + + $ rastertools filter adaptive_gaussian --help + usage: rastertools filter adaptive_gaussian [-h] --kernel_size KERNEL_SIZE + --sigma SIGMA [-o OUTPUT] + [-ws WINDOW_SIZE] + [-p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}] + [-b BANDS [BANDS ...]] [-a] + inputs [inputs ...] + + Apply an adaptive (Local gaussian of 3x3) recursive filter on the input image + + positional arguments: + inputs Input file to process (e.g. Sentinel2 L2A MAJA from + THEIA). You can provide a single file with extension + ".lst" (e.g. "filtering.lst") that lists the input + files to process (one input file per line in .lst) + + optional arguments: + -h, --help show this help message and exit + --kernel_size KERNEL_SIZE + Kernel size of the filter function, e.g. 3 means a + square of 3x3 pixels on which the filter function is + computed (default: 8) + --sigma SIGMA Standard deviation of the Gaussian distribution + (sigma) + -o OUTPUT, --output OUTPUT + Output dir where to store results (by default current + dir) + -ws WINDOW_SIZE, --window_size WINDOW_SIZE + Size of tiles to distribute processing, default: 1024 + -p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}, --pad {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap} + Pad to use around the image, default : edge (see https + ://numpy.org/doc/stable/reference/generated/numpy.pad. + html for more information) + -b BANDS [BANDS ...], --bands BANDS [BANDS ...] + List of bands to compute + -a, --all Compute all bands + + By default only first band is computed. + + The corresponding API functions that is called by the command line interface is the following : + + .. autofunction:: eolab.rastertools.processing.algo.adaptive_gaussian - $ rastertools filter median --kernel_size 16 "./SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" - $ rastertools filter mean --kernel_size 16 "./SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" - $ rastertools filter adaptive_gaussian --kernel_size 16 --sigma 1 "./SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + Here is an example of the local mean applied to the NDVI of a SENTINEL2 L2A THEIA image cropped to a region of interest. + This raster was previously computed using :ref:`radioindice` on the original SENTINEL2 L2A THEIA image. -The commands will generate respectively: + .. code-block:: console -- SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.tif + $ rastertools filter adaptive_gaussian --kernel_size 16 --sigma 1 "./SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" -.. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.jpg + .. list-table:: + :widths: 20 20 + :header-rows: 0 -- SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.tif + * - .. centered:: Original + - .. centered:: Filtered by Adaptive gaussian -.. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.jpg + * - .. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg + :align: center + - .. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg + :align: center -- SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.tif -.. image:: ../_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg diff --git a/docs/cli/hillshade.rst b/docs/cli/hillshade.rst index 7823539c..3a618223 100644 --- a/docs/cli/hillshade.rst +++ b/docs/cli/hillshade.rst @@ -15,36 +15,41 @@ computes the shadows of the ground surface (buildings, trees, etc.). [-o OUTPUT] [-ws WINDOW_SIZE] [-p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}] inputs [inputs ...] - - Compute hillshades of a Digital Height Model. - - positional arguments: - inputs Input file to process (i.e. geotiff corresponding to a - Digital Height Model). You can provide a single file - with extension ".lst" (e.g. "filtering.lst") that - lists the input files to process (one input file per - line in .lst) - - optional arguments: - -h, --help show this help message and exit - --elevation ELEVATION - Elevation of the sun in degrees, [0°, 90°] where - 90°=zenith and 0°=horizon - --azimuth AZIMUTH Azimuth of the sun in degrees, [0°, 360°] where - 0°=north, 90°=east, 180°=south and 270°=west - --radius RADIUS Max distance (in pixels) around a point to evaluate - horizontal elevation angle - --resolution RESOLUTION - Pixel resolution in meter - -o OUTPUT, --output OUTPUT - Output dir where to store results (by default current - dir) - -ws WINDOW_SIZE, --window_size WINDOW_SIZE - Size of tiles to distribute processing, default: 1024 - -p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}, --pad {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap} - Pad to use around the image, default : edge (see https - ://numpy.org/doc/stable/reference/generated/numpy.pad. - html for more information) + + Execute the hillshade subcommand on a Digital Height Model (DHM) using the + given solar parameters (elevation, azimuth), resolution, and optional + parameters for processing the raster. + + Arguments: + + inputs TEXT + + Input file to process (i.e. geotiff corresponding to a Digital Height + Model). You can provide a single file with extension ".lst" (e.g. + "hillshade.lst") that lists the input files to process (one input file + per line in .lst) + + Options: + --elevation FLOAT Elevation of the sun in degrees, [0°, 90°] + where 90°=zenith and 0°=horizon [required] + --azimuth FLOAT Azimuth of the sun in degrees, [0°, 360°] + where 0°=north, 90°=east, 180°=south and + 270°=west [required] + --radius INTEGER Maximum distance (in pixels) around a point + to evaluate horizontal elevation angle. If + not set, it is automatically computed from + the range of altitudes in the digital model. + --resolution FLOAT Pixel resolution in meter [required] + -o, --output TEXT Output directory to store results (by + default current directory) + -ws, --window_size INTEGER Size of tiles to distribute processing, + default: 1024 + -p, --pad [none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap] + Pad to use around the image, default : edge (see + https://numpy.org/doc/stable/reference/generated/numpy.pad.html + for more information) + -h, --help Show this message and exit. + .. warning:: This command line does not accept all input raster products as other raster tools (radioindice, zonalstats). diff --git a/docs/cli/radioindice.rst b/docs/cli/radioindice.rst index f89b1d1c..ab763c51 100644 --- a/docs/cli/radioindice.rst +++ b/docs/cli/radioindice.rst @@ -1,4 +1,4 @@ -.. radioindice: +.. _radioindice: radioindice ----------- @@ -8,66 +8,66 @@ radioindice .. code-block:: console $ rastertools radioindice --help - usage: rastertools radioindice [-h] [-o OUTPUT] [-m] [-r ROI] - [-i INDICES [INDICES ...]] [--ndvi] [--tndvi] - [--rvi] [--pvi] [--savi] [--tsavi] [--msavi] - [--msavi2] [--ipvi] [--evi] [--ndwi] [--ndwi2] - [--mndwi] [--ndpi] [--ndti] [--ndbi] [--ri] - [--bi] [--bi2] [-nd band1 band2] - [-ws WINDOW_SIZE] - inputs [inputs ...] - - Compute a list of radiometric indices (NDVI, NDWI, etc.) on a raster image - - positional arguments: - inputs Input file to process (e.g. Sentinel2 L2A MAJA from - THEIA). You can provide a single file with extension - ".lst" (e.g. "radioindice.lst") that lists the input - files to process (one input file per line in .lst) - - optional arguments: - -h, --help show this help message and exit - -o OUTPUT, --output OUTPUT - Output dir where to store results (by default current - dir) - -m, --merge Merge all indices in the same image (i.e. one band per - indice). - -r ROI, --roi ROI Region of interest in the input image (vector) - -ws WINDOW_SIZE, --window_size WINDOW_SIZE - Size of tiles to distribute processing, default: 1024 - - Options to select the indices to compute: - -i INDICES [INDICES ...], --indices INDICES [INDICES ...] - List of indices to computePossible indices are: bi, - bi2, evi, ipvi, mndwi, msavi, msavi2, ndbi, ndpi, - ndti, ndvi, ndwi, ndwi2, pvi, ri, rvi, savi, tndvi, - tsavi - --ndvi Compute ndvi indice - --tndvi Compute tndvi indice - --rvi Compute rvi indice - --pvi Compute pvi indice - --savi Compute savi indice - --tsavi Compute tsavi indice - --msavi Compute msavi indice - --msavi2 Compute msavi2 indice - --ipvi Compute ipvi indice - --evi Compute evi indice - --ndwi Compute ndwi indice - --ndwi2 Compute ndwi2 indice - --mndwi Compute mndwi indice - --ndpi Compute ndpi indice - --ndti Compute ndti indice - --ndbi Compute ndbi indice - --ri Compute ri indice - --bi Compute bi indice - --bi2 Compute bi2 indice - -nd band1 band2, -normalized_difference band1 band2 - Compute the normalized difference of two bands defined - as parameter of this option, e.g. "-nd red nir" will - compute (red-nir)/(red+nir). See - eolab.rastertools.product.rastertype.BandChannel for - the list of bands names. Several nd options can be set - to compute several normalized differences. + Usage: rio georastertools radioindice [OPTIONS] INPUTS... + + Compute the requested radio indices on raster data. + + This command computes various vegetation and environmental indices on + satellite or raster data based on the provided input images and options. The + tool can compute specific indices, merge the results into one image, compute + normalized differences between bands, and apply processing using a region of + interest (ROI) and specified tile/window size. + + Arguments: + + inputs TEXT + + Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). You can + provide a single file with extension ".lst" (e.g. "radioindice.lst") + that lists the input files to process (one input file per line in .lst). + + Options: + -o, --output TEXT Output directory to store results (by + default current directory) + -m, --merge Merge all indices in the same image (i.e. + one band per indice) + -r, --roi TEXT Region of interest in the input image + (vector) + -ws, --window_size INTEGER Size of tiles to distribute processing, + default: 1024 + -i, --indices TEXT List of indices to compute. Possible indices + are: bi, bi2, evi, ipvi, mndwi, msavi, + msavi2, ndbi, ndpi, ndti, ndvi, ndwi, ndwi2, + pvi, ri, rvi, savi, tndvi, tsavi + --bi2 Compute bi2 indice + --bi Compute bi indice + --ri Compute ri indice + --ndbi Compute ndbi indice + --ndti Compute ndti indice + --ndpi Compute ndpi indice + --mndwi Compute mndwi indice + --ndwi2 Compute ndwi2 indice + --ndwi Compute ndwi indice + --evi Compute evi indice + --ipvi Compute ipvi indice + --msavi2 Compute msavi2 indice + --msavi Compute msavi indice + --tsavi Compute tsavi indice + --savi Compute savi indice + --pvi Compute pvi indice + --rvi Compute rvi indice + --tndvi Compute tndvi indice + --ndvi Compute ndvi indice + -nd, --normalized_difference band1 band2 + Compute the normalized difference of two + bands defineda s parameter of this option, + e.g. "-nd red nir" will compute (red- + nir)/(red+nir). See + eolab.rastertools.product.rastertype. + BandChannel for the list of + bands names. Several nd options can be set + to compute several normalized differences. + -h, --help Show this message and exit. If no indice option is explicitly set, NDVI, NDWI and NDWI2 are computed. diff --git a/docs/cli/speed.rst b/docs/cli/speed.rst index 903c4d0a..964b68d2 100644 --- a/docs/cli/speed.rst +++ b/docs/cli/speed.rst @@ -8,28 +8,30 @@ speed .. code-block:: console $ rastertools speed --help - usage: rastertools speed [-h] [-b BANDS [BANDS ...]] [-a] [-o OUTPUT] inputs [inputs ...] - - Compute the speed of radiometric values of several raster images - - positional arguments: - inputs Input file to process (e.g. Sentinel2 L2A MAJA from - THEIA). You can provide a single file with extension - ".lst" (e.g. "speed.lst") that lists the input files - to process (one input file per line in .lst) - - optional arguments: - -h, --help show this help message and exit - -b BANDS [BANDS ...], --bands BANDS [BANDS ...] - List of bands to compute - -a, --all Compute all bands - -o OUTPUT, --output OUTPUT - Output dir where to store results (by default current - dir) - - By default only first band is computed. + + Compute the speed of radiometric values for multiple raster images. + + This command calculates the speed of radiometric values for raster data, + optionally processing specific bands or all bands from the input images. The + results are saved to a specified output directory. + + Arguments: + + inputs TEXT + + Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). You can + provide a single file with extension ".lst" (e.g. "speed.lst") that + lists the input files to process (one input file per line in .lst). + + Options: + -b, --bands INTEGER List of bands to process + -a, --all Process all bands + -o, --output TEXT Output directory to store results (by default current + directory) + -h, --help Show this message and exit. + .. warning:: At least two input rasters must be given. The rasters must match one of the configured raster types, diff --git a/docs/cli/svf.rst b/docs/cli/svf.rst index af886e6c..6c7ef9fe 100644 --- a/docs/cli/svf.rst +++ b/docs/cli/svf.rst @@ -46,37 +46,45 @@ too many points, the "radius" parameter defines the max distance of the pixel to [-o OUTPUT] [-ws WINDOW_SIZE] [-p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}] inputs [inputs ...] - - Compute Sky View Factor of a Digital Height Model. - - positional arguments: - inputs Input file to process (i.e. geotiff corresponding to a - Digital Height Model). You can provide a single file - with extension ".lst" (e.g. "filtering.lst") that - lists the input files to process (one input file per - line in .lst) - - optional arguments: - -h, --help show this help message and exit - --radius RADIUS Max distance (in pixels) around a point to evaluate - horizontal elevation angle - --directions DIRECTIONS - Number of directions on which to compute the horizon - elevation angle - --resolution RESOLUTION - Pixel resolution in meter - --altitude ALTITUDE Reference altitude to use for computing the SVF. If - this option is not specified, SVF is computed for - every point at the altitude of the point - -o OUTPUT, --output OUTPUT - Output dir where to store results (by default current - dir) - -ws WINDOW_SIZE, --window_size WINDOW_SIZE - Size of tiles to distribute processing, default: 1024 - -p {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap}, --pad {none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap} - Pad to use around the image, default : edge (see https - ://numpy.org/doc/stable/reference/generated/numpy.pad. - html for more information) + + Compute the Sky View Factor (SVF) of a Digital Height Model (DHM). + + The Sky View Factor (SVF) is a measure of the visibility of the sky from a + point in a Digital Height Model (DHM). It is calculated by evaluating the + horizontal elevation angle from a given point in multiple directions (as + specified by the user), and is influenced by the topography and surrounding + terrain features. + + Arguments: + + inputs TEXT + + Input file to process (i.e. geotiff corresponding to a Digital Height + Model). You can provide a single file with extension ".lst" (e.g. + "svf.lst") that lists the input files to process (one input file + per line in .lst) + + Options: + --radius INTEGER Maximum distance (in pixels) around a point + to evaluate horizontal elevation angle + [required] + --directions INTEGER Number of directions on which to compute the + horizon elevation angle [required] + --resolution FLOAT Pixel resolution in meter [required] + --altitude INTEGER Reference altitude to use for computing the + SVF. If this option is not specified, SVF is + computed for every point at the altitude of + the point + -o, --output TEXT Output directory to store results (by + default current directory) + -ws, --window_size INTEGER Size of tiles to distribute processing, + default: 1024 + -p, --pad [none,edge,maximum,mean,median,minimum,reflect,symmetric,wrap] + Pad to use around the image, default : edge(see + https://numpy.org/doc/stable/reference/generated/numpy.pad.html + for more information) + -h, --help Show this message and exit. + .. warning:: This command line does not accept all input raster products as other raster tools (radioindice, zonalstats). diff --git a/docs/cli/tiling.rst b/docs/cli/tiling.rst index 9f353d71..e0021c93 100644 --- a/docs/cli/tiling.rst +++ b/docs/cli/tiling.rst @@ -13,46 +13,47 @@ file. [--id ID [ID ...]] [-o OUTPUT] [-n OUTPUT_NAME] [-d SUBDIR_NAME] inputs [inputs ...] - - Generate tiles of an input raster image following the geometries defined by a - given grid - - positional arguments: - inputs Raster files to process. You can provide a single file - with extension ".lst" (e.g. "tiling.lst") that lists - the input files to process (one input file per line in - .lst) - - optional arguments: - -h, --help show this help message and exit - -g GRID_FILE, --grid GRID_FILE - vector-based spatial data file containing the grid to - use to generate the tiles - --id_col ID_COLUMN Name of the column in the grid file used to number the - tiles. When ids are defined, this argument is required - to identify which column corresponds to the defined - ids - --id ID [ID ...] Tiles ids of the grid to export as new tile, default - all - -o OUTPUT, --output OUTPUT - Output dir where to store results (by default current - dir) - -n OUTPUT_NAME, --name OUTPUT_NAME - Basename for the output raster tiles, default: - "{}_tile{}". The basename must be defined as a - formatted string where tile index is at position 1 and - original filename is at position 0. For instance, - tile{1}.tif will generate the filename tile75.tif for - the tile id = 75. - -d SUBDIR_NAME, --dir SUBDIR_NAME - When each tile must be generated in a different - subdir, it defines the naming convention for the - subdir. It is a formatted string with one positional - parameter corresponding to the tile index. For - instance, tile{} will generate the subdir name tile75/ - for the tile id = 75. By default, subdir is not - defined and output files will be generated directly in - the outputdir. + Generate tiles of an input raster image following the geometries defined by + a given grid. + + The tiling command divides a raster image into smaller tiles based on a grid + defined in a vector-based spatial data file. Each tile corresponds to a + specific area within the grid, and tiles can be saved using a customizable + naming convention and optionally placed in subdirectories based on their + tile ID. + + Arguments: + + inputs TEXT + + Raster files to process. You can provide a single file with extension + ".lst" (e.g. "tiling.lst") that lists the input files to process (one + input file per line in .lst) + + Options: + -g, --grid TEXT vector-based spatial data file containing the grid to use + to generate the tiles [required] + --id_col TEXT Name of the column in the grid file used to number the + tiles. When ids are defined, this argument is requiredto + identify which column corresponds to the define ids + --id INTEGER Tiles ids of the grid to export as new tile, default all + -o, --output TEXT Output directory to store results (by default current + directory) + -n, --name TEXT Basename for the output raster tiles, + default:"{}_tile{}". The basename must be defined as a + formatted string where tile index is at position 1 and + original filename is at position 0. For instance, + tile{1}.tif will generate the filename tile75.tif for the + tile id = 75 + -d, --dir TEXT When each tile must be generated in a + different subdirectory, it defines the naming convention + for the subdirectory. It is a formatted string with one + positional parameter corresponding to the tile index. For + instance, tile{} will generate the subdirectory name + tile75/for the tile id = 75. By default, subdirectory is + not defined and output files will be generated directly + in the output directory + -h, --help Show this message and exit. In the next examples, we will be working on a grid of 4 cells (ids 1, 2, 3 and 4): *grid.geojson* and the image: *image.tif*. The grid and the image only overlap on the cells 1 and 2. diff --git a/docs/cli/timeseries.rst b/docs/cli/timeseries.rst index 262a9cf5..510ead6f 100644 --- a/docs/cli/timeseries.rst +++ b/docs/cli/timeseries.rst @@ -21,39 +21,39 @@ and may thus contain the same gaps as the input raster. [-s START_DATE] [-e END_DATE] [-p TIME_PERIOD] [-ws WINDOW_SIZE] inputs [inputs ...] - + Generate a timeseries of images (without gaps) from a set of input images. - Data not present in the input images (no image for the date or masked data) - are interpolated (with linear interpolation) so that all gaps are filled. - - positional arguments: - inputs Input files to process (e.g. Sentinel2 L2A MAJA from - THEIA). You can provide a single file with extension - ".lst" (e.g. "speed.lst") that lists the input files - to process (one input file per line in .lst) - - optional arguments: - -h, --help show this help message and exit - -b BANDS [BANDS ...], --bands BANDS [BANDS ...] - List of bands to compute - -a, --all Compute all bands - -o OUTPUT, --output OUTPUT - Output dir where to store results (by default current - dir) - -s START_DATE, --start_date START_DATE - Start date of the timeseries to generate in the - following format: yyyy-MM-dd - -e END_DATE, --end_date END_DATE - End date of the timeseries to generate in the - following format: yyyy-MM-dd - -p TIME_PERIOD, --time_period TIME_PERIOD - Time period (number of days) between two consecutive - images in the timeseries to generate e.g. 10 = - generate one image every 10 days - -ws WINDOW_SIZE, --window_size WINDOW_SIZE - Size of tiles to distribute processing, default: 1024 - - By default only first band is computed. + Data not present in the input images (e.g., missing images for specific + dates or masked data) are interpolated (with linear interpolation) so that + all gaps in the timeseries are filled. + + This command is useful for generating continuous timeseries data, even when + some input images are missing or contain masked values. + + Arguments: + + inputs TEXT + + Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). You can + provide a single file with extension ".lst" (e.g. "speed.lst") that + lists the input files to process (one input file per line in .lst). + + Options: + -b, --bands LIST List of bands to process + -a, --all Process all bands + -o, --output TEXT Output directory to store results (by default + current directory) + -s, --start_date TEXT Start date of the timeseries to generate in the + following format: yyyy-MM-dd + -e, --end_date TEXT End date of the timeseries to generate in the + following format: yyyy-MM-dd + -p, --time_period INTEGER Time period (number of days) between two + consecutive images in the timeseries to generate + e.g. 10 = generate one image every 10 days + -ws, --window_size INTEGER Size of tiles to distribute processing, default: + 1024 + -h, --help Show this message and exit. + .. warning:: At least two input rasters must be given. The rasters must match one of the configured raster types, diff --git a/docs/cli/zonalstats.rst b/docs/cli/zonalstats.rst index ce0fe32a..5d7c1f9d 100644 --- a/docs/cli/zonalstats.rst +++ b/docs/cli/zonalstats.rst @@ -8,7 +8,7 @@ a vector file (shapefile, geojson, etc.). If no vector file is provided, the sta computed on the whole image. Statistics inside a geometry can be computed for different categories also defined by a vector -file. For instance, is is possible to compute the average height of buildings and vegetation of +file. For instance, it is possible to compute the average height of buildings and vegetation of cities using: - a Digital Height Model (input raster file) @@ -28,77 +28,69 @@ cities using: [--category_index CATEGORY_INDEX] [--category_names CATEGORY_NAMES] inputs [inputs ...] - - Compute zonal statistics of a raster image. Available statistics are: min max - range mean std percentile_x (x in [0, 100]) median mad count valid nodata sum - majority minority unique - - positional arguments: - inputs Raster files to process. You can provide a single file - with extension ".lst" (e.g. "zonalstats.lst") that - lists the input files to process (one input file per - line in .lst) - - optional arguments: - -h, --help show this help message and exit - -o OUTPUT, --output OUTPUT - Output dir where to store results (by default current - dir) - -f OUTPUT_FORMAT, --format OUTPUT_FORMAT - Output format of the results when input geometries are - provided (by default ESRI Shapefile). Possible values - are ESRI Shapefile, GeoJSON, CSV, GPKG, GML - -g GEOMETRIES, --geometry GEOMETRIES - List of geometries where to compute statistics (vector - like a shapefile or geojson) - -w, --within When activated, statistics are computed for the - geometries that are within the raster shape. The - default behaviour otherwise is to compute statistics - for all geometries that intersect the raster shape. - --stats STATS [STATS ...] - List of stats to compute. Possible stats are: min max - range mean std percentile_x (x in [0, 100]) median mad - count valid nodata sum majority minority unique - --categorical If the input raster is categorical (i.e. raster values - represent discrete classes) compute the counts of - every unique pixel values. - --valid_threshold VALID_THRESHOLD - Minimum percentage of valid pixels in a shape to - compute its statistics. - --area Whether to multiply all stats by the area of a cell of - the input raster. - --prefix PREFIX Add a prefix to the keys (default: None). One prefix - per band (e.g. 'band1 band2') - -b BANDS [BANDS ...], --bands BANDS [BANDS ...] - List of bands to compute - -a, --all Compute all bands - - Options to output the outliers: - --sigma SIGMA Distance to the mean value (in sigma) in order to - produce a raster that highlights outliers. - - Options to plot the generated stats: - -c CHARTFILE, --chart CHARTFILE - Generate a chart per stat and per geometry - (x=timestamp of the input products / y=stat value) and - store it in the file defined by this argument - -d, --display Display the chart - -gi GEOM_INDEX, --geometry-index GEOM_INDEX - Name of the geometry index used for the chart - (default='ID') - - Options to compute stats per category in geometry. If activated, the generated geometries will contain stats for every categories present in the geometry: - --category_file CATEGORY_FILE - File (raster or geometries) containing discrete - classes classifying the ROI. - --category_index CATEGORY_INDEX - Column name identifying categories in categroy_file - (only if file format is geometries) - --category_names CATEGORY_NAMES - JSON files containing a dict with classes index as - keys and names to display classes as values. - - By default only first band is computed. + + Compute zonal statistics of a raster image. + + Available statistics are: min, max, range, mean, std, percentile_x (x in [0, + 100]), median, mad, count, valid, nodata, sum, majority, minority, unique. + + By default, only the first band is computed unless specified otherwise. + + Arguments: + + inputs TEXT + + Raster files to process. You can provide a single filewith extension + ".lst" (e.g. "zonalstats.lst") that lists the input files to process + (one input file per line in .lst) + + Options: + -o, --output TEXT Output directory to store results (by default + current directory) + -f, --format TEXT Output format of the results when input + geometries are provided (by default ESRI + Shapefile). Possible values are ESRI Shapefile, + GeoJSON, CSV, GPKG, GML + -g, --geometry TEXT List of geometries where to compute statistics + (vector like a shapefile or geojson) + -w, --within When activated, statistics are computed for the + geometries that are within the raster shape. The + default behaviour otherwise is to compute + statistics for all geometries that intersect the + raster shape. + --stats TEXT List of stats to compute. Possible stats are: + min max range mean std percentile_x (x in [0, + 100]) median mad count valid nodata sum majority + minority unique + --categorical If the input raster is categorical (i.e. raster + values represent discrete classes) compute the + counts of every unique pixel values. + --valid_threshold FLOAT Minimum percentage of valid pixels in a shape to + compute its statistics. + --area Whether to multiply all stats by the area of a + cell of the input raster. + --prefix TEXT Add a prefix to the keys (default: None). One + prefix per band (e.g. 'band1 band2') + -b, --bands INTEGER List of bands to process + -a, --all Process all bands + --sigma TEXT Distance to the mean value (in sigma) in order + to produce a raster that highlights outliers. + -c, --chart TEXT Generate a chart per stat and per geometry + (x=timestamp of the input products / y=stat + value) and store it in the file defined by this + argument + -d, --display Display the chart + -gi, --geometry-index TEXT Name of the geometry index used for the chart + (default='ID') + --category_file TEXT File (raster or geometries) containing discrete + classes classifying the ROI. + --category_index TEXT Column name identifying categories in + categroy_file (only if file format is + geometries) + --category_names TEXT JSON files containing a dict with classes index + as keys and names to display classes as values. + -h, --help Show this message and exit. + When -g option is set with a valid geometries file, ``zonalstats`` generate a new vector file with the following metadata: diff --git a/entry_points.txt b/entry_points.txt new file mode 100644 index 00000000..467c161c --- /dev/null +++ b/entry_points.txt @@ -0,0 +1,2 @@ +[rasterio.rio_plugins] +rastertools = eolab.rastertools.main:rastertools diff --git a/env_test.yml b/env_test.yml deleted file mode 100644 index 238cad92..00000000 --- a/env_test.yml +++ /dev/null @@ -1,11 +0,0 @@ -name: rastertools - -channels: - - conda-forge - -dependencies: - - pytest - - pytest-cov - - sphinx - - sphinx_rtd_theme - diff --git a/env_update.yml b/env_update.yml deleted file mode 100644 index 5aa341d8..00000000 --- a/env_update.yml +++ /dev/null @@ -1,9 +0,0 @@ -name: rastertools - -channels: - - conda-forge - -dependencies: - - pyscaffold - - geopandas ==0.13 - - rasterio ==1.3 diff --git a/environment.yml b/environment.yml deleted file mode 100644 index 414e3d24..00000000 --- a/environment.yml +++ /dev/null @@ -1,10 +0,0 @@ -name: rastertools - -channels: - - conda-forge - -dependencies: - - python ==3.8.13 - - scipy ==1.8 - - gdal ==3.5 - - tqdm ==4.66 diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 2c63dbb2..00000000 --- a/pyproject.toml +++ /dev/null @@ -1,8 +0,0 @@ -[build-system] -# AVOID CHANGING REQUIRES: IT WILL BE UPDATED BY PYSCAFFOLD! -requires = ["setuptools>=46.1.0", "setuptools_scm[toml]>=5", "wheel"] -build-backend = "setuptools.build_meta" - -[tool.setuptools_scm] -# See configuration details in https://github.com/pypa/setuptools_scm -version_scheme = "no-guess-dev" diff --git a/setup.py b/setup.py index 3aafee77..83555265 100644 --- a/setup.py +++ b/setup.py @@ -7,12 +7,50 @@ PyScaffold helps you to put up the scaffold of your new Python project. Learn more under: https://pyscaffold.org/ """ -from setuptools import setup +from setuptools import setup, find_packages if __name__ == "__main__": try: - setup(use_scm_version={"version_scheme": "no-guess-dev"}) - except: # noqa + setup(name='rastertools', + version="0.1.0", + description=u"Collection of tools for raster data", + long_description="", + classifiers=[], + keywords='', + author=u"Olivier Queyrut", + author_email="", + url="https://github.com/CNES/rastertools", + packages=find_packages(exclude=['tests']), + include_package_data=True, + zip_safe=False, + setup_requires = ["setuptools_scm"], + install_requires=[ + 'click', + 'rasterio', + 'pytest>=3.6', + 'rioxarray', + 'dask', + 'pytest-cov', + 'geopandas==0.13', + 'kiwisolver==1.4.5', + 'matplotlib==3.7.3', + 'packaging==24.1', + 'fiona==1.8.21', + 'sphinx_rtd_theme==3.0.1', + 'pip==24.2', + 'sphinx==7.1.2', + 'scipy==1.8', + 'pyscaffold', + 'gdal==3.5.0', + 'tqdm==4.66' + ], + entry_points=""" + [rasterio.rio_plugins] + rastertools=eolab.rastertools.main:rastertools + """, + python_requires='==3.8.13', + use_scm_version={"version_scheme": "no-guess-dev"}) + except: print( "\n\nAn error occurred while building the project, " "please ensure you have the most updated version of setuptools, " diff --git a/src/.coverage b/src/.coverage new file mode 100644 index 00000000..4b165c48 Binary files /dev/null and b/src/.coverage differ diff --git a/src/eolab/rastertools/__init__.py b/src/eolab/rastertools/__init__.py index e357ff68..b6783098 100644 --- a/src/eolab/rastertools/__init__.py +++ b/src/eolab/rastertools/__init__.py @@ -26,7 +26,7 @@ # import rastertool Zonalstats from eolab.rastertools.zonalstats import Zonalstats # import the method to run a rastertool -from eolab.rastertools.main import run_tool, add_custom_rastertypes +from eolab.rastertools.main import rastertools, add_custom_rastertypes __all__ = [ "RastertoolConfigurationException", "Rastertool", "Windowable", diff --git a/src/eolab/rastertools/__pycache__/__init__.cpython-38.pyc b/src/eolab/rastertools/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 3a846ac4..00000000 Binary files a/src/eolab/rastertools/__pycache__/__init__.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/__pycache__/filtering.cpython-38.pyc b/src/eolab/rastertools/__pycache__/filtering.cpython-38.pyc deleted file mode 100644 index 6f4c76fa..00000000 Binary files a/src/eolab/rastertools/__pycache__/filtering.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/__pycache__/hillshade.cpython-38.pyc b/src/eolab/rastertools/__pycache__/hillshade.cpython-38.pyc deleted file mode 100644 index 2be00e7a..00000000 Binary files a/src/eolab/rastertools/__pycache__/hillshade.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/__pycache__/main.cpython-38.pyc b/src/eolab/rastertools/__pycache__/main.cpython-38.pyc deleted file mode 100644 index 553fc271..00000000 Binary files a/src/eolab/rastertools/__pycache__/main.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/__pycache__/radioindice.cpython-38.pyc b/src/eolab/rastertools/__pycache__/radioindice.cpython-38.pyc deleted file mode 100644 index 1fcfd743..00000000 Binary files a/src/eolab/rastertools/__pycache__/radioindice.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/__pycache__/rastertools.cpython-38.pyc b/src/eolab/rastertools/__pycache__/rastertools.cpython-38.pyc deleted file mode 100644 index 5ed690fa..00000000 Binary files a/src/eolab/rastertools/__pycache__/rastertools.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/__pycache__/speed.cpython-38.pyc b/src/eolab/rastertools/__pycache__/speed.cpython-38.pyc deleted file mode 100644 index d8b36d10..00000000 Binary files a/src/eolab/rastertools/__pycache__/speed.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/__pycache__/svf.cpython-38.pyc b/src/eolab/rastertools/__pycache__/svf.cpython-38.pyc deleted file mode 100644 index 95af6676..00000000 Binary files a/src/eolab/rastertools/__pycache__/svf.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/__pycache__/tiling.cpython-38.pyc b/src/eolab/rastertools/__pycache__/tiling.cpython-38.pyc deleted file mode 100644 index 2320617f..00000000 Binary files a/src/eolab/rastertools/__pycache__/tiling.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/__pycache__/timeseries.cpython-38.pyc b/src/eolab/rastertools/__pycache__/timeseries.cpython-38.pyc deleted file mode 100644 index 4a179feb..00000000 Binary files a/src/eolab/rastertools/__pycache__/timeseries.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/__pycache__/utils.cpython-38.pyc b/src/eolab/rastertools/__pycache__/utils.cpython-38.pyc deleted file mode 100644 index cac78742..00000000 Binary files a/src/eolab/rastertools/__pycache__/utils.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/__pycache__/zonalstats.cpython-38.pyc b/src/eolab/rastertools/__pycache__/zonalstats.cpython-38.pyc deleted file mode 100644 index c1c049ca..00000000 Binary files a/src/eolab/rastertools/__pycache__/zonalstats.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/cli/.coverage b/src/eolab/rastertools/cli/.coverage new file mode 100644 index 00000000..4b165c48 Binary files /dev/null and b/src/eolab/rastertools/cli/.coverage differ diff --git a/src/eolab/rastertools/cli/__pycache__/__init__.cpython-38.pyc b/src/eolab/rastertools/cli/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index 7c118f69..00000000 Binary files a/src/eolab/rastertools/cli/__pycache__/__init__.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/cli/__pycache__/filtering.cpython-38.pyc b/src/eolab/rastertools/cli/__pycache__/filtering.cpython-38.pyc deleted file mode 100644 index b1b76334..00000000 Binary files a/src/eolab/rastertools/cli/__pycache__/filtering.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/cli/__pycache__/hillshade.cpython-38.pyc b/src/eolab/rastertools/cli/__pycache__/hillshade.cpython-38.pyc deleted file mode 100644 index ab647f79..00000000 Binary files a/src/eolab/rastertools/cli/__pycache__/hillshade.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/cli/__pycache__/radioindice.cpython-38.pyc b/src/eolab/rastertools/cli/__pycache__/radioindice.cpython-38.pyc deleted file mode 100644 index eb043562..00000000 Binary files a/src/eolab/rastertools/cli/__pycache__/radioindice.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/cli/__pycache__/speed.cpython-38.pyc b/src/eolab/rastertools/cli/__pycache__/speed.cpython-38.pyc deleted file mode 100644 index 15da4ca1..00000000 Binary files a/src/eolab/rastertools/cli/__pycache__/speed.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/cli/__pycache__/svf.cpython-38.pyc b/src/eolab/rastertools/cli/__pycache__/svf.cpython-38.pyc deleted file mode 100644 index ef4769dd..00000000 Binary files a/src/eolab/rastertools/cli/__pycache__/svf.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/cli/__pycache__/tiling.cpython-38.pyc b/src/eolab/rastertools/cli/__pycache__/tiling.cpython-38.pyc deleted file mode 100644 index 623d48bc..00000000 Binary files a/src/eolab/rastertools/cli/__pycache__/tiling.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/cli/__pycache__/timeseries.cpython-38.pyc b/src/eolab/rastertools/cli/__pycache__/timeseries.cpython-38.pyc deleted file mode 100644 index 94d9742d..00000000 Binary files a/src/eolab/rastertools/cli/__pycache__/timeseries.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/cli/__pycache__/zonalstats.cpython-38.pyc b/src/eolab/rastertools/cli/__pycache__/zonalstats.cpython-38.pyc deleted file mode 100644 index 0881ac44..00000000 Binary files a/src/eolab/rastertools/cli/__pycache__/zonalstats.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/cli/filtering.py b/src/eolab/rastertools/cli/filtering.py index 882270ce..8c01b61c 100644 --- a/src/eolab/rastertools/cli/filtering.py +++ b/src/eolab/rastertools/cli/filtering.py @@ -3,92 +3,135 @@ """ CLI definition for the filtering tool """ -import eolab.rastertools.cli as cli from eolab.rastertools import Filtering +from eolab.rastertools.cli.utils_cli import apply_process, pad_opt, win_opt, all_opt, band_opt +import click +import os +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) -def create_argparser(rastertools_parsers): - """Adds the filtering subcommand to the given rastertools subparser + +def create_filtering(output : str, window_size : int, pad : str, argsdict : dict, filter : str, bands : list, kernel_size : int, all_bands : bool) -> Filtering: + """ + This function initializes a `Filtering` tool instance and configures it with specified settings. + + It selects the filter type, kernel size, output settings, and processing bands. If `all_bands` is set + to True, the filter will apply to all bands in the raster; otherwise, it applies only to specified bands. Args: - rastertools_parsers: - The rastertools subparsers to which this subcommand shall be added. + output (str): The path for the filtered output file. - This argument provides from a code like this:: + window_size (int): Size of the processing window used by the filter. - import argparse - main_parser = argparse.ArgumentParser() - rastertools_parsers = main_parser.add_subparsers() - filtering.create_argparser(rastertools_parsers) + pad (str): Padding method used for windowing (default : 'edge'). - Returns: - The rastertools subparsers updated with this subcommand - """ - parser = rastertools_parsers.add_parser( - "filter", aliases=["fi"], - help="Apply a filter to a set of images", - description="Apply a filter to a set of images.") - - # create a subparser to configure each kind of filter - sub_parser = parser.add_subparsers(title='Filters') - - for rasterfilter in Filtering.get_default_filters(): - # new parser for the filter - filterparser = sub_parser.add_parser( - rasterfilter.name, - aliases=rasterfilter.aliases, - help=rasterfilter.help, - description=rasterfilter.description, - epilog="By default only first band is computed.") - - # add argument declared in the filter definition - for argument_name, argument_params in rasterfilter.arguments.items(): - filterparser.add_argument(f"--{argument_name}", **argument_params) - - # add common arguments (inputs, output dir, window size, pad mode) - filterparser.add_argument( - "inputs", - nargs='+', - help="Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). " - "You can provide a single file with extension \".lst\" (e.g. \"filtering.lst\") " - "that lists the input files to process (one input file per line in .lst)") - cli.with_outputdir_arguments(filterparser) - cli.with_window_arguments(filterparser) - cli.with_bands_arguments(filterparser) - - # set the default commmand to run for this filter parser - filterparser.set_defaults(filter=rasterfilter.name) - - # set the function to call when this subcommand is called - parser.set_defaults(func=create_filtering) - - return rastertools_parsers - - -def create_filtering(args) -> Filtering: - """Create and configure a new rastertool "Filtering" according to argparse args + argsdict (dict): Dictionary of additional filter configuration arguments. - Args: - args: args extracted from command line + filter (str): The filter type to apply (must be a valid name in `Filtering` filters). + + bands (list): List of bands to process. If empty and `all_bands` is False, defaults to [1]. + + kernel_size (int): Size of the kernel used by the filter. + + all_bands (bool): Whether to apply the filter to all bands (True) or specific bands (False). Returns: - :obj:`eolab.rastertools.Filtering`: The configured rastertool to run + :obj:`eolab.rastertools.Filtering`: A configured `Filtering` instance ready for execution. """ - argsdict = vars(args) - # get the bands to process - if args.all_bands: + if all_bands: bands = None else: - bands = list(map(int, args.bands)) if args.bands else [1] + bands = list(map(int, bands)) if bands else [1] # create the rastertool object raster_filters_dict = {rf.name: rf for rf in Filtering.get_default_filters()} - tool = Filtering(raster_filters_dict[args.filter], args.kernel_size, bands) + tool = Filtering(raster_filters_dict[filter], kernel_size, bands) # set up config with args values - tool.with_output(args.output) \ - .with_windows(args.window_size, args.pad) \ + tool.with_output(output) \ + .with_windows(window_size, pad) \ .with_filter_configuration(argsdict) return tool + + +def filter_options(options : list): + def wrapper(function): + for option in options: + function = option(function) + return function + return wrapper + + +inpt_arg = click.argument('inputs', type=str, nargs = -1, required = 1) + +ker_opt = click.option('--kernel_size', type=int, help="Kernel size of the filter function, e.g. 3 means a square" + " of 3x3 pixels on which the filter function is computed" + " (default: 8)") + +out_opt = click.option('-o', '--output', default = os.getcwd(), help="Output directory to store results (by default current directory)") + +sigma = click.option('--sigma', type=int, required = True, help="Standard deviation of the Gaussian distribution") + +@click.group(context_settings=CONTEXT_SETTINGS) +@click.pass_context +def filter(ctx): + """ + Apply a filter to a set of images. + """ + ctx.ensure_object(dict) + + +def create_filter(filter_name : str): + + list_opt = [inpt_arg, ker_opt, out_opt, win_opt, pad_opt, band_opt, all_opt] + if filter_name == 'adaptive_gaussian': + list_opt.append(sigma) + + @filter.command(filter_name, context_settings=CONTEXT_SETTINGS) + @filter_options(list_opt) + @click.pass_context + def filter_filtername(ctx, inputs : list, output : str, window_size : int, pad : str, kernel_size : int, bands : list, all_bands : bool, **kwargs): + """ + Execute the requested filter on the input files with the specified parameters. + The `inputs` argument can either be a single file or a `.lst` file containing a list of input files. + + Arguments: + + inputs TEXT + + Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). + You can provide a single file with extension \".lst\" (e.g. \"filtering.lst\") that lists + the input files to process (one input file per line in .lst). + """ + argsdict = {"inputs": inputs} + + if filter_name == 'adaptive_gaussian': + argsdict = {"sigma" : kwargs["sigma"]} + + # Configure the filter tool instance + tool = create_filtering( + output=output, + window_size=window_size, + pad=pad, + argsdict=argsdict, + filter=filter_name, + bands=bands, + kernel_size=kernel_size, + all_bands=all_bands) + + apply_process(ctx, tool, inputs) + + +median = create_filter("median") +mean = create_filter("mean") +sum = create_filter("sum") +adaptive_gaussian = create_filter("adaptive_gaussian") + + + + + + + diff --git a/src/eolab/rastertools/cli/hillshade.py b/src/eolab/rastertools/cli/hillshade.py index 640b3ac7..f4786bcc 100644 --- a/src/eolab/rastertools/cli/hillshade.py +++ b/src/eolab/rastertools/cli/hillshade.py @@ -3,95 +3,58 @@ """ CLI definition for the hillshade tool """ -import eolab.rastertools.cli as cli from eolab.rastertools import Hillshade +from eolab.rastertools.cli.utils_cli import apply_process, pad_opt, win_opt +import click +import os +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) -def create_argparser(rastertools_parsers): - """Adds the hillshade subcommand to the given rastertools subparser - Args: - rastertools_parsers: - The rastertools subparsers to which this subcommand shall be added. +#Hillshade command +@click.command("hillshade",context_settings=CONTEXT_SETTINGS) +@click.argument('inputs', type=str, nargs = -1, required = 1) - This argument provides from a code like this:: +@click.option('--elevation', type=float, required = True, help="Elevation of the sun in degrees, [0°, 90°] where" + " 90°=zenith and 0°=horizon") - import argparse - main_parser = argparse.ArgumentParser() - rastertools_parsers = main_parser.add_subparsers() - hillshade.create_argparser(rastertools_parsers) +@click.option('--azimuth', type=float, required = True, help="Azimuth of the sun in degrees, [0°, 360°] where" + " 0°=north, 90°=east, 180°=south and 270°=west") - Returns: - The rastertools subparsers updated with this subcommand +@click.option('--radius', type=int, help="Maximum distance (in pixels) around a point to evaluate" + " horizontal elevation angle. If not set, it is automatically computed from" + " the range of altitudes in the digital model.") + +@click.option('--resolution', required = True, type=float, help="Pixel resolution in meter") + +@click.option('-o','--output', default = os.getcwd(), help="Output directory to store results (by default current directory)") + +@win_opt +@pad_opt + +@click.pass_context +def hillshade(ctx, inputs : list, elevation : float, azimuth : float, radius : int, resolution : float, output : str, window_size : int, pad : str) : """ - parser = rastertools_parsers.add_parser( - "hillshade", aliases=["hs"], - help="Compute hillshades of a Digital Elevation / Surface / Height Model " - "(a raster containing the height of the point as pixel values)", - description="Compute hillshades of a Digital Elevation / Surface / Height Model.") - - # add specific arguments of the hillshade processing - arguments = { - "elevation": { - "required": True, - "type": float, - "help": "Elevation of the sun in degrees, [0°, 90°] where 90°=zenith and 0°=horizon" - }, - "azimuth": { - "required": True, - "type": float, - "help": "Azimuth of the sun in degrees, [0°, 360°] " - "where 0°=north, 90°=east, 180°=south and 270°=west" - }, - "radius": { - "required": False, - "type": int, - "help": "Max distance (in pixels) around a point to evaluate horizontal" - " elevation angle. If not set, it is automatically computed from" - " the range of altitudes in the digital model." - }, - "resolution": { - "default": 0.5, - "required": True, - "type": float, - "help": "Pixel resolution in meter" - }, - } - # add argument declared in the hillshade processing definition - for argument_name, argument_params in arguments.items(): - parser.add_argument(f"--{argument_name}", **argument_params) - - # add common arguments (inputs, output dir, window size, pad mode) - parser.add_argument( - "inputs", - nargs='+', - help="Input file to process (i.e. geotiff that contains the height " - "of the points as pixel values). " - "You can provide a single file with extension \".lst\" (e.g. \"filtering.lst\") " - "that lists the input files to process (one input file per line in .lst)") - cli.with_outputdir_arguments(parser) - cli.with_window_arguments(parser) - - # set the function to call when this subcommand is called - parser.set_defaults(func=create_hillshade) - - return rastertools_parsers - - -def create_hillshade(args) -> Hillshade: - """Create and configure a new rastertool "Hillshade" according to argparse args - - Args: - args: args extracted from command line - - Returns: - :obj:`eolab.rastertools.Hillshade`: The configured rastertool to run + Execute the hillshade subcommand on a Digital Height Model (DHM) using the given solar + parameters (elevation, azimuth), resolution, and optional parameters for processing the raster. + + Arguments: + + inputs TEXT + + Input file to process (i.e. geotiff corresponding to a + Digital Height Model). You can provide a single file + with extension ".lst" (e.g. "hillshade.lst") that + lists the input files to process (one input file per line in .lst) """ # create the rastertool object - tool = Hillshade(args.elevation, args.azimuth, args.resolution, args.radius) + tool = Hillshade(elevation, azimuth, resolution, radius) # set up config with args values - tool.with_output(args.output) - tool.with_windows(args.window_size, args.pad) + tool.with_output(output) + tool.with_windows(window_size, pad) + + apply_process(ctx, tool, inputs) + + - return tool diff --git a/src/eolab/rastertools/cli/radioindice.py b/src/eolab/rastertools/cli/radioindice.py index 49a75d51..76c3a716 100644 --- a/src/eolab/rastertools/cli/radioindice.py +++ b/src/eolab/rastertools/cli/radioindice.py @@ -3,120 +3,108 @@ """ CLI definition for the radioindice tool """ -import eolab.rastertools.cli as cli +import logging + from eolab.rastertools import RastertoolConfigurationException, Radioindice +from eolab.rastertools.cli.utils_cli import apply_process, win_opt from eolab.rastertools.product import BandChannel from eolab.rastertools.processing import RadioindiceProcessing +import sys +import click +import os + +_logger = logging.getLogger(__name__) + +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) + + +def indices_opt(function): + """ + Create options for all the possible indices + """ + dict_indices = {'--ndvi' : "ndvi", '--tndvi' : "tndvi", '--rvi' : "rvi", '--pvi' : "pvi", '--savi' : "savi", '--tsavi' : "tsavi", + '--msavi' : "msavi", '--msavi2' : "msavi2", '--ipvi' : "ipvi", + '--evi' : "evi", '--ndwi' : "ndwi", '--ndwi2' : "ndwi2", '--mndwi' : "mndwi", + '--ndpi' : "ndpi", '--ndti' : "ndti", '--ndbi' : "ndbi", '--ri' : "ri", '--bi' : "bi", '--bi2' : "bi2"} + + for idc in dict_indices.keys(): + function = click.option(idc, is_flag=True, help=f"Compute " + dict_indices[idc] + " indice")(function) + return function + + +#Radioindice command +@click.command("radioindice",context_settings=CONTEXT_SETTINGS) +@click.argument('inputs', type=str, nargs = -1, required = 1) + +@click.option('-o','--output', default = os.getcwd(), help="Output directory to store results (by default current directory)") +@click.option('-m', '--merge', is_flag = True, help="Merge all indices in the same image (i.e. one band per indice)") -def create_argparser(rastertools_parsers): - """Adds the radioindice subcommand to the given rastertools subparser +@click.option('-r', '--roi', type= str, help="Region of interest in the input image (vector)") - Args: - rastertools_parsers: - The rastertools subparsers to which this subcommand shall be added. +@win_opt - This argument provides from a code like this:: +@click.option('-i', '--indices', type=str, multiple = True, + help=" List of indices to compute. Possible indices are: bi, bi2, evi, ipvi, mndwi, msavi, msavi2, ndbi, ndpi," + " ndti, ndvi, ndwi, ndwi2, pvi, ri, rvi, savi, tndvi, tsavi") - import argparse - main_parser = argparse.ArgumentParser() - rastertools_parsers = main_parser.add_subparsers() - radioindice.create_argparser(rastertools_parsers) - Returns: - The rastertools subparsers updated with this subcommand +@indices_opt + +@click.option('-nd', '--normalized_difference','nd',type=str, + multiple=True, nargs=2, metavar="band1 band2", + help="Compute the normalized difference of two bands defined" + " as parameter of this option, e.g. \"-nd red nir\" will compute (red-nir)/(red+nir). " + "See eolab.rastertools.product.rastertype.BandChannel for the list of bands names. " + "Several nd options can be set to compute several normalized differences.") + + +@click.pass_context +def radioindice(ctx, inputs : list, output : str, indices : list, merge : bool, roi : str, window_size : int, nd : str, **kwargs) : """ - indicenames = ', '.join(sorted([indice.name for indice in Radioindice.get_default_indices()])) - parser = rastertools_parsers.add_parser( - "radioindice", aliases=["ri"], - help="Compute radiometric indices", - description="Compute a list of radiometric indices (NDVI, NDWI, etc.) on a raster image", - epilog="If no indice option is explicitly set, NDVI, NDWI and NDWI2 are computed.") - parser.add_argument( - "inputs", - nargs='+', - help="Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). " - "You can provide a single file with extension \".lst\" (e.g. \"radioindice.lst\") " - "that lists the input files to process (one input file per line in .lst)") - cli.with_outputdir_arguments(parser) - parser.add_argument( - '-m', - '--merge', - dest="merge", - action="store_true", - help="Merge all indices in the same image (i.e. one band per indice).") - parser.add_argument( - '-r', - '--roi', - dest="roi", - help="Region of interest in the input image (vector)") - indices_pc = parser.add_argument_group("Options to select the indices to compute") - indices_pc.add_argument( - '-i', - '--indices', - dest="indices", - nargs="+", - help="List of indices to compute" - f"Possible indices are: {indicenames}") - for indice in Radioindice.get_default_indices(): - indices_pc.add_argument( - f"--{indice.name}", - dest=indice.name, - action="store_true", - help=f"Compute {indice.name} indice") - indices_pc.add_argument( - '-nd', - "-normalized_difference", - nargs=2, - action="append", - metavar=("band1", "band2"), - help="Compute the normalized difference of two bands defined as parameter of this option, " - "e.g. \"-nd red nir\" will compute (red-nir)/(red+nir). " - "See eolab.rastertools.product.rastertype.BandChannel for the list of bands names. " - "Several nd options can be set to compute several normalized differences.") - cli.with_window_arguments(parser, pad=False) - - # set the function to call when this subcommand is called - parser.set_defaults(func=create_radioindice) - - return rastertools_parsers - - -def create_radioindice(args) -> Radioindice: - """Create and configure a new rastertool "Radioindice" according to argparse args - - Args: - args: args extracted from command line - - Returns: - :obj:`eolab.rastertools.Radioindice`: The configured rastertool to run + Compute the requested radio indices on raster data. + + This command computes various vegetation and environmental indices on satellite or raster data based on the + provided input images and options. The tool can compute specific indices, merge the results into one image, + compute normalized differences between bands, and apply processing using a region of interest (ROI) and specified + tile/window size. + + Arguments: + + inputs TEXT + + Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). + You can provide a single file with extension \".lst\" (e.g. \"radioindice.lst\") that lists + the input files to process (one input file per line in .lst). """ + indices_opt = [key for key, value in kwargs.items() if value] indices_to_compute = [] - argsdict = vars(args) # append indices defined with -- indices_to_compute.extend([indice for indice in Radioindice.get_default_indices() - if argsdict[indice.name]]) + if indice.name in indices_opt]) + # append indices defined with --indices - if args.indices: + if indices: indices_dict = {indice.name: indice for indice in Radioindice.get_default_indices()} - for ind in args.indices: + for ind in indices: if ind in indices_dict: indices_to_compute.append(indices_dict[ind]) else: - raise RastertoolConfigurationException(f"Invalid indice name: {ind}") - - if args.nd: - for nd in args.nd: - if nd[0] in BandChannel.__members__ and nd[1] in BandChannel.__members__: - channel1 = BandChannel[nd[0]] - channel2 = BandChannel[nd[1]] - new_indice = RadioindiceProcessing(f"nd[{nd[0]}-{nd[1]}]").with_channels( + _logger.exception(RastertoolConfigurationException(f"Invalid indice name: {ind}")) + sys.exit(2) + + if nd: + for nd_bands in nd: + if nd_bands[0] in BandChannel.__members__ and nd_bands[1] in BandChannel.__members__: + channel1 = BandChannel[nd_bands[0]] + channel2 = BandChannel[nd_bands[1]] + new_indice = RadioindiceProcessing(f"nd[{nd_bands[0]}-{nd_bands[1]}]").with_channels( [channel2, channel1]) indices_to_compute.append(new_indice) else: - raise RastertoolConfigurationException( - f"Invalid band(s) in normalized difference: {nd[0]} and/or {nd[1]}") + _logger.exception(RastertoolConfigurationException(f"Invalid band(s) in normalized difference: {nd_bands[0]} and/or {nd_bands[1]}")) + sys.exit(2) # handle special case: no indice setup if len(indices_to_compute) == 0: @@ -128,8 +116,10 @@ def create_radioindice(args) -> Radioindice: tool = Radioindice(indices_to_compute) # set up config with args values - tool.with_output(args.output, args.merge) - tool.with_roi(args.roi) - tool.with_windows(args.window_size) + tool.with_output(output, merge) + tool.with_roi(roi) + tool.with_windows(window_size) + + apply_process(ctx, tool, inputs) + - return tool diff --git a/src/eolab/rastertools/cli/speed.py b/src/eolab/rastertools/cli/speed.py index b343b4bc..5628fb5c 100644 --- a/src/eolab/rastertools/cli/speed.py +++ b/src/eolab/rastertools/cli/speed.py @@ -3,67 +3,51 @@ """ CLI definition for the speed tool """ -import eolab.rastertools.cli as cli from eolab.rastertools import Speed +from eolab.rastertools.cli.utils_cli import apply_process, band_opt, all_opt +import click +import os +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) -def create_argparser(rastertools_parsers): - """Adds the speed subcommand to the given rastertools subparser - Args: - rastertools_parsers: - The rastertools subparsers to which this subcommand shall be added. +#Speed command +@click.command("speed",context_settings=CONTEXT_SETTINGS) +@click.argument('inputs', type=str, nargs = -1, required = 1) - This argument provides from a code like this:: +@band_opt +@all_opt - import argparse - main_parser = argparse.ArgumentParser() - rastertools_parsers = main_parser.add_subparsers() - speed.create_argparser(rastertools_parsers) +@click.option('-o','--output', default = os.getcwd(), help="Output directory to store results (by default current directory)") - Returns: - The rastertools subparsers updated with this subcommand +@click.pass_context +def speed(ctx, inputs : list, bands : list, all_bands : bool, output : str) : """ - parser = rastertools_parsers.add_parser( - "speed", aliases=["sp"], - help="Compute speed of rasters", - description="Compute the speed of radiometric values of several raster images", - epilog="By default only first band is computed.") - parser.add_argument( - "inputs", - nargs='+', - help="Input files to process (e.g. Sentinel2 L2A MAJA from THEIA). " - "You can provide a single file with extension \".lst\" (e.g. \"speed.lst\") " - "that lists the input files to process (one input file per line in .lst)") - cli.with_bands_arguments(parser) - cli.with_outputdir_arguments(parser) + Compute the speed of radiometric values for multiple raster images. - # set the function to call when this subcommand is called - parser.set_defaults(func=create_speed) + This command calculates the speed of radiometric values for raster data, + optionally processing specific bands or all bands from the input images. + The results are saved to a specified output directory. - return rastertools_parsers + Arguments: + inputs TEXT -def create_speed(args) -> Speed: - """Create and configure a new rastertool "Speed" according to argparse args - - Args: - args: args extracted from command line - - Returns: - :obj:`eolab.rastertools.Speed`: The configured rastertool to run + Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). + You can provide a single file with extension \".lst\" (e.g. \"speed.lst\") that lists + the input files to process (one input file per line in .lst). """ # get the bands to process - if args.all_bands: + if all_bands: bands = None else: - bands = list(map(int, args.bands)) if args.bands else [1] + bands = list(map(int, bands)) if bands else [1] # create the rastertool object tool = Speed(bands) # set up config with args values - tool.with_output(args.output) + tool.with_output(output) - return tool + apply_process(ctx, tool, inputs) diff --git a/src/eolab/rastertools/cli/svf.py b/src/eolab/rastertools/cli/svf.py index 374926b8..23010941 100644 --- a/src/eolab/rastertools/cli/svf.py +++ b/src/eolab/rastertools/cli/svf.py @@ -3,95 +3,57 @@ """ CLI definition for the SVF (Sky View Factor) tool """ -import eolab.rastertools.cli as cli from eolab.rastertools import SVF +from eolab.rastertools.cli.utils_cli import apply_process, pad_opt, win_opt +import click +import os +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) -def create_argparser(rastertools_parsers): - """Adds the SVF subcommand to the given rastertools subparser - Args: - rastertools_parsers: - The rastertools subparsers to which this subcommand shall be added. +#SVF command +@click.command("svf",context_settings=CONTEXT_SETTINGS) +@click.argument('inputs', type=str, nargs = -1, required = 1) - This argument provides from a code like this:: +@click.option('--radius', required = True, type=int, help="Maximum distance (in pixels) around a point to evaluate horizontal elevation angle") - import argparse - main_parser = argparse.ArgumentParser() - rastertools_parsers = main_parser.add_subparsers() - svf.create_argparser(rastertools_parsers) +@click.option('--directions',required = True, type=int, help="Number of directions on which to compute the horizon elevation angle") - Returns: - The rastertools subparsers updated with this subcommand - """ - parser = rastertools_parsers.add_parser( - "svf", - help="Compute Sky View Factor of a Digital Height Model", - description="Compute Sky View Factor of a Digital Height Model.") - - # add specific argument of the svf processing - arguments = { - "radius": { - "default": 16, - "required": True, - "type": int, - "help": "Max distance (in pixels) around a point to evaluate horizontal" - " elevation angle" - }, - "directions": { - "default": 12, - "required": True, - "type": int, - "help": "Number of directions on which to compute the horizon elevation angle" - }, - "resolution": { - "default": 0.5, - "required": True, - "type": float, - "help": "Pixel resolution in meter" - }, - "altitude": { - "type": int, - "help": "Reference altitude to use for computing the SVF. If this option is not" - " specified, SVF is computed for every point at the altitude of the point" - } - } - for argument_name, argument_params in arguments.items(): - parser.add_argument(f"--{argument_name}", **argument_params) - - # add common arguments (inputs, output dir, window size, pad mode) - parser.add_argument( - "inputs", - nargs='+', - help="Input file to process (i.e. geotiff corresponding to a Digital Height Model). " - "You can provide a single file with extension \".lst\" (e.g. \"filtering.lst\") " - "that lists the input files to process (one input file per line in .lst)") - cli.with_outputdir_arguments(parser) - cli.with_window_arguments(parser) - - # set the function to call when this subcommand is called - parser.set_defaults(func=create_svf) - - return rastertools_parsers - - -def create_svf(args) -> SVF: - """Create and configure a new rastertool "SVF" according to argparse args - - Args: - args: args extracted from command line - - Returns: - :obj:`eolab.rastertools.SVF`: The configured rastertool to run +@click.option('--resolution', required = True, type=float, help="Pixel resolution in meter") + +@click.option('--altitude', type=int, help="Reference altitude to use for computing the SVF. If this option is not" + " specified, SVF is computed for every point at the altitude of the point") + +@click.option('-o','--output', default = os.getcwd(), help="Output directory to store results (by default current directory)") + +@win_opt +@pad_opt + +@click.pass_context +def svf(ctx, inputs : list, radius : int, directions : int, resolution : float, altitude : int, output : str, window_size : int, pad : str) : """ + Compute the Sky View Factor (SVF) of a Digital Height Model (DHM). + The Sky View Factor (SVF) is a measure of the visibility of the sky from a point in a Digital Height Model + (DHM). It is calculated by evaluating the horizontal elevation angle from a given point in multiple + directions (as specified by the user), and is influenced by the topography and surrounding terrain features. + + Arguments: + + inputs TEXT + + Input file to process (i.e. geotiff corresponding to a + Digital Height Model). You can provide a single file + with extension ".lst" (e.g. "svf.lst") that + lists the input files to process (one input file per line in .lst) + """ # create the rastertool object - tool = SVF(args.directions, args.radius, args.resolution) + tool = SVF(directions, radius, resolution) # set up config with args values - tool.with_output(args.output) - tool.with_windows(args.window_size, args.pad) - if args.altitude is not None: - tool.with_altitude(args.altitude) + tool.with_output(output) + tool.with_windows(window_size, pad) + if altitude is not None: + tool.with_altitude(altitude) - return tool + apply_process(ctx, tool, inputs) diff --git a/src/eolab/rastertools/cli/tiling.py b/src/eolab/rastertools/cli/tiling.py index 8108b295..41ef1e77 100644 --- a/src/eolab/rastertools/cli/tiling.py +++ b/src/eolab/rastertools/cli/tiling.py @@ -3,100 +3,67 @@ """ CLI definition for the tiling tool """ -import eolab.rastertools.cli as cli from eolab.rastertools import Tiling +from eolab.rastertools.cli.utils_cli import apply_process +import click +import os +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) -def create_argparser(rastertools_parsers): - """Adds the tiling subcommand to the given rastertools subparser - Args: - rastertools_parsers: - The rastertools subparsers to which this subcommand shall be added. +#Tiling command +@click.command("tiling",context_settings=CONTEXT_SETTINGS) +@click.argument('inputs', type=str, nargs = -1, required = 1) - This argument provides from a code like this:: +@click.option('-g','--grid','grid_file',required = True, type=str, help="vector-based spatial data file containing the grid to" + " use to generate the tiles") - import argparse - main_parser = argparse.ArgumentParser() - rastertools_parsers = main_parser.add_subparsers() - tiling.create_argparser(rastertools_parsers) +@click.option('--id_col','id_column', type = str, help="Name of the column in the grid" + " file used to number the tiles. When ids are defined, this argument is required" + " to identify which column corresponds to the define ids") - Returns: - The rastertools subparsers updated with this subcommand +@click.option('--id', type=int, multiple = True, help="Tiles ids of the grid to export as new tile, default all") + +@click.option('-o','--output', default = os.getcwd(), help="Output directory to store results (by default current directory)") + +@click.option('-n','--name','output_name', default="{}_tile{}", help="Basename for the output raster tiles, default:" + " \"{}_tile{}\". The basename must be defined as a formatted string where tile index is at position 1" + " and original filename is at position 0. For instance, tile{1}.tif will generate the filename" + " tile75.tif for the tile id = 75") + +@click.option('-d','--dir','subdir_name', help="When each tile must be generated in a different" + " subdirectory, it defines the naming convention for the subdirectory. It is a formatted string with one positional" + " parameter corresponding to the tile index. For instance, tile{} will generate the subdirectory name tile75/" + " for the tile id = 75. By default, subdirectory is not defined and output files will be generated directly in" + " the output directory") +@click.pass_context +def tiling(ctx, inputs : list, grid_file : str, id_column : str, id : list, output : str, output_name : str, subdir_name : str) : """ - parser = rastertools_parsers.add_parser( - "tiling", aliases=["ti"], - help="Generate image tiles", - description="Generate tiles of an input raster image following the geometries " - "defined by a given grid") - parser.add_argument( - "inputs", - nargs='+', - help="Raster files to process. " - "You can provide a single file with extension \".lst\" (e.g. \"tiling.lst\") " - "that lists the input files to process (one input file per line in .lst)") - parser.add_argument( - '-g', - '--grid', - dest="grid_file", - help="vector-based spatial data file containing the grid to use to generate the tiles", - required=True) - parser.add_argument( - "--id_col", - dest="id_column", - help="Name of the column in the grid file used to number the tiles. When ids are defined," - " this argument is required to identify which column corresponds to the defined ids", - ) - parser.add_argument( - "--id", - dest="id", - help="Tiles ids of the grid to export as new tile, default all", - nargs="+", - type=int - ) - cli.with_outputdir_arguments(parser) - parser.add_argument( - "-n", - "--name", - dest="output_name", - help="Basename for the output raster tiles, default: \"{}_tile{}\". " - "The basename must be defined as a formatted string where tile index is at position 1 " - "and original filename is at position 0. For instance, tile{1}.tif will generate the " - "filename tile75.tif for the tile id = 75.", - default="{}_tile{}" - ) - parser.add_argument( - "-d", - "--dir", - dest="subdir_name", - help="When each tile must be generated in a different subdir, it defines the naming " - "convention for the subdir. It is a formatted string with one positional parameter " - "corresponding to the tile index. For instance, tile{} will generate the subdir " - "name tile75/ for the tile id = 75. By default, subdir is not defined and output " - "files will be generated directly in the outputdir." - ) - - # set the function to call when this subcommand is called - parser.set_defaults(func=create_tiling) - - return rastertools_parsers - - -def create_tiling(args) -> Tiling: - """Create and configure a new rastertool "Tiling" according to argparse args - - Args: - args: args extracted from command line - - Returns: - :obj:`eolab.rastertools.Tiling`: The configured rastertool to run + Generate tiles of an input raster image following the geometries defined by a given grid. + + The tiling command divides a raster image into smaller tiles based on a grid defined in a vector-based spatial + data file. Each tile corresponds to a specific area within the grid, and tiles can be saved using a customizable + naming convention and optionally placed in subdirectories based on their tile ID. + + Arguments: + + inputs TEXT + + Raster files to process. You can provide a single file with extension ".lst" (e.g. "tiling.lst") that lists + the input files to process (one input file per line in .lst) """ + if id == () : + id_ = None + else: + id_ = list(id) # create the rastertool object - tool = Tiling(args.grid_file) + tool = Tiling(grid_file) # set up config with args values - tool.with_output(args.output, args.output_name, args.subdir_name) - tool.with_id_column(args.id_column, args.id) + tool.with_output(output, output_name, subdir_name) + tool.with_id_column(id_column, id_) + + apply_process(ctx, tool, inputs) + - return tool diff --git a/src/eolab/rastertools/cli/timeseries.py b/src/eolab/rastertools/cli/timeseries.py index 4279b97c..b6a48158 100644 --- a/src/eolab/rastertools/cli/timeseries.py +++ b/src/eolab/rastertools/cli/timeseries.py @@ -5,99 +5,79 @@ """ from datetime import datetime -import eolab.rastertools.cli as cli -from eolab.rastertools import RastertoolConfigurationException, Timeseries +from eolab.rastertools import Timeseries +from eolab.rastertools.cli.utils_cli import apply_process, win_opt, all_opt, band_opt +from eolab.rastertools import RastertoolConfigurationException +import click +import sys +import os +import logging +_logger = logging.getLogger(__name__) +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) -def create_argparser(rastertools_parsers): - """Adds the timeseries subcommand to the given rastertools subparser +#Timeseries command +@click.command("timeseries",context_settings=CONTEXT_SETTINGS) +@click.argument('inputs', type=str, nargs = -1, required = 1) - Args: - rastertools_parsers: - The rastertools subparsers to which this subcommand shall be added. +@click.option('-o','--output', default = os.getcwd(), help="Output directory to store results (by default current directory)") - This argument provides from a code like this:: +@click.option("-s","--start_date", help="Start date of the timeseries to generate in the following format: yyyy-MM-dd") - import argparse - main_parser = argparse.ArgumentParser() - rastertools_parsers = main_parser.add_subparsers() - timeseries.create_argparser(rastertools_parsers) +@click.option("-e", "--end_date", help="End date of the timeseries to generate in the following format: yyyy-MM-dd") - Returns: - The rastertools subparsers updated with this subcommand - """ - parser = rastertools_parsers.add_parser( - "timeseries", aliases=["ts"], - help="Temporal gap filling of an image time series", - description="Generate a timeseries of images (without gaps) from a set of input images. " - "Data not present in the input images (no image for the date or masked data) " - "are interpolated (with linear interpolation) so that all gaps are filled.", - epilog="By default only first band is computed.") - parser.add_argument( - "inputs", - nargs='+', - help="Input files to process (e.g. Sentinel2 L2A MAJA from THEIA). " - "You can provide a single file with extension \".lst\" (e.g. \"speed.lst\") " - "that lists the input files to process (one input file per line in .lst)") - cli.with_bands_arguments(parser) - cli.with_outputdir_arguments(parser) - parser.add_argument( - "-s", - "--start_date", - help="Start date of the timeseries to generate in the following format: yyyy-MM-dd") - parser.add_argument( - "-e", - "--end_date", - help="End date of the timeseries to generate in the following format: yyyy-MM-dd") - parser.add_argument( - "-p", - "--time_period", - type=int, - help="Time period (number of days) between two consecutive images in the timeseries " +@click.option("-p", "--time_period",type=int, help="Time period (number of days) between two consecutive images in the timeseries " "to generate e.g. 10 = generate one image every 10 days") - cli.with_window_arguments(parser, pad=False) - # set the function to call when this subcommand is called - parser.set_defaults(func=create_timeseries) +@band_opt +@all_opt +@win_opt +@click.pass_context - return rastertools_parsers +def timeseries(ctx, inputs : list, bands : list, all_bands : bool, output : str, start_date : str, end_date : str, time_period : int, window_size : int) : + """ + Generate a timeseries of images (without gaps) from a set of input images. + Data not present in the input images (e.g., missing images for specific dates or masked data) are interpolated + (with linear interpolation) so that all gaps in the timeseries are filled. + This command is useful for generating continuous timeseries data, even when some input images are missing + or contain masked values. -def create_timeseries(args) -> Timeseries: - """Create and configure a new rastertool "Timeseries" according to argparse args + Arguments: - Args: - args: args extracted from command line + inputs TEXT - Returns: - :obj:`eolab.rastertools.Timeseries`: The configured rastertool to run + Input file to process (e.g. Sentinel2 L2A MAJA from THEIA). + You can provide a single file with extension \".lst\" (e.g. \"speed.lst\") that lists + the input files to process (one input file per line in .lst). """ - # get the bands to process - if args.all_bands: + if all_bands: bands = None else: - bands = list(map(int, args.bands)) if args.bands else [1] + bands = list(map(int, bands)) if bands else [1] # convert start/end dates to datetime try: - start_date = datetime.strptime(args.start_date, "%Y-%m-%d") + start_date = datetime.strptime(start_date, "%Y-%m-%d") except Exception: - raise RastertoolConfigurationException( - f"Invalid format for start date: {args.start_date} (must be %Y-%m-%d)") + _logger.exception(RastertoolConfigurationException( + f"Invalid format for start date: {start_date} (must be %Y-%m-%d)")) + sys.exit(2) # convert start/end dates to datetime try: - end_date = datetime.strptime(args.end_date, "%Y-%m-%d") + end_date = datetime.strptime(end_date, "%Y-%m-%d") except Exception: - raise RastertoolConfigurationException( - f"Invalid format for end date: {args.end_date} (must be %Y-%m-%d)") + _logger.exception(RastertoolConfigurationException( + f"Invalid format for end date: {end_date} (must be %Y-%m-%d)")) + sys.exit(2) # create the rastertool object - tool = Timeseries(start_date, end_date, args.time_period, bands) + tool = Timeseries(start_date, end_date, time_period, bands) # set up config with args values - tool.with_output(args.output) - tool.with_windows(args.window_size) + tool.with_output(output) + tool.with_windows(window_size) - return tool + apply_process(ctx, tool, inputs) \ No newline at end of file diff --git a/src/eolab/rastertools/cli/utils_cli.py b/src/eolab/rastertools/cli/utils_cli.py new file mode 100644 index 00000000..d6c30edb --- /dev/null +++ b/src/eolab/rastertools/cli/utils_cli.py @@ -0,0 +1,104 @@ +from eolab.rastertools import RastertoolConfigurationException +import logging +import sys +import click + +_logger = logging.getLogger(__name__) + +all_opt = click.option('-a', '--all','all_bands', type=bool, is_flag=True, help="Process all bands") + +band_opt = click.option('-b','--bands', type=int, multiple = True, help="List of bands to process") + +win_opt = click.option('-ws', '--window_size', type=int, default = 1024, help="Size of tiles to distribute processing, default: 1024") + +pad_opt = click.option('-p', '--pad',default="edge", type=click.Choice(['none','edge','maximum','mean','median','minimum','reflect','symmetric','wrap']), + help="Pad to use around the image, default : edge" + "(see https://numpy.org/doc/stable/reference/generated/numpy.pad.html" + " for more information)") + +def _extract_files_from_list(cmd_inputs): + """ + Extracts a list of file paths from a command line input. + + If the input is a single file with a `.lst` extension, it reads the file line-by-line and treats each + line as an individual file path, returning the list of paths. If the input is already a + list of file paths, it is returned as-is. + + Args: + cmd_inputs (list of str): + Command line inputs for file paths. If it contains a single `.lst` file, this file + is read to obtain the list of files. Otherwise, it is assumed to be a direct list of files. + + Returns: + list of str: A list of file paths, either extracted from the `.lst` file or passed directly. + + Example: + _extract_files_from_list(["files.lst"]) + + _extract_files_from_list(["file1.tif", "file2.tif"]) + + Notes: + The `.lst` file is expected to have one file path per line. Blank lines in the `.lst` + file will be ignored. + """ + + # handle the input file of type "lst" + if len(cmd_inputs) == 1 and cmd_inputs[0][-4:].lower() == ".lst": + # parse the listing + with open(cmd_inputs[0]) as f: + inputs = f.read().splitlines() + else: + inputs = cmd_inputs + + return inputs + + +def apply_process(ctx, tool, inputs : list): + """ + Apply the chosen process to a set of input files. + + This function extracts input files from a provided list or direct paths, configures the specified tool, + and processes the files through the given tool. Additionally, it handles debug settings (such as storing + intermediate VRT files) and manages any exceptions during the process. If an error occurs, the function + logs the exception and terminates the process with an appropriate exit code. + + Args: + ctx (click.Context): + The context object that contains configuration options. + + tool (Filtering or Hillshade or any raster processing tool): + The configured tool instance that will apply the process to the input files. The tool should have + been properly set up with parameters. + + inputs (list or str): + A list of input file paths or a path to a `.lst` file containing a list of input file paths. + This argument specifies the files that the tool will process. + + Raises: + RastertoolConfigurationException: + If there is a configuration error with the tool or its parameters. + + Exception: + Any other exceptions that occur during the processing of the input files. + """ + try: + # handle the input file of type "lst" + inputs_extracted = _extract_files_from_list(inputs) + + # setup debug mode in which intermediate VRT files are stored to disk or not + tool.with_vrt_stored(ctx.obj.get('keep_vrt')) + + # launch process + tool.process_files(inputs_extracted) + + _logger.info("Done!") + + except RastertoolConfigurationException as rce: + _logger.exception(rce) + sys.exit(2) + + except Exception as err: + _logger.exception(err) + sys.exit(1) + + sys.exit(0) \ No newline at end of file diff --git a/src/eolab/rastertools/cli/zonalstats.py b/src/eolab/rastertools/cli/zonalstats.py index 1f869502..89e822b7 100644 --- a/src/eolab/rastertools/cli/zonalstats.py +++ b/src/eolab/rastertools/cli/zonalstats.py @@ -3,180 +3,98 @@ """ CLI definition for the zonalstats tool """ -import eolab.rastertools.cli as cli from eolab.rastertools import Zonalstats +from eolab.rastertools.cli.utils_cli import apply_process, all_opt, band_opt +import click +import os +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) -def create_argparser(rastertools_parsers): - """Adds the zonalstats subcommand to the given rastertools subparser - Args: - rastertools_parsers: - The rastertools subparsers to which this subcommand shall be added. +#Zonalstats command +@click.command("zonalstats",context_settings=CONTEXT_SETTINGS) +@click.argument('inputs', type=str, nargs = -1, required = 1) - This argument provides from a code like this:: +@click.option('-o','--output', default = os.getcwd(), help="Output directory to store results (by default current directory)") - import argparse - main_parser = argparse.ArgumentParser() - rastertools_parsers = main_parser.add_subparsers() - zonalstats.create_argparser(rastertools_parsers) +@click.option('-f', '--format', "output_format", type = str, help="Output format of the results when input geometries are provided (by default ESRI " + "Shapefile). Possible values are ESRI Shapefile, GeoJSON, CSV, GPKG, GML") - Returns: - The rastertools subparsers updated with this subcommand - """ - parser = rastertools_parsers.add_parser( - "zonalstats", aliases=["zs"], - help="Compute zonal statistics", - description="Compute zonal statistics of a raster image.\n Available statistics are: " - "min max range mean std percentile_x (x in [0, 100]) median mad " - "count valid nodata sum majority minority unique", - epilog="By default only first band is computed.") - parser.add_argument( - "inputs", - nargs='+', - help="Raster files to process. " - "You can provide a single file with extension \".lst\" (e.g. \"zonalstats.lst\") " - "that lists the input files to process (one input file per line in .lst)") - cli.with_outputdir_arguments(parser) - parser.add_argument( - '-f', - '--format', - dest="output_format", - help="Output format of the results when input geometries are provided (by default ESRI " - f"Shapefile). Possible values are {', '.join(Zonalstats.supported_output_formats)}") - parser.add_argument( - '-g', - '--geometry', - dest="geometries", - help="List of geometries where to compute statistics (vector like a shapefile or geojson)") - parser.add_argument( - '-w', - '--within', - dest="within", - action="store_true", - help="When activated, statistics are computed for the geometries that are within " +@click.option('-g','--geometry',"geometries",type = str, help="List of geometries where to compute statistics (vector like a shapefile or geojson)") + +@click.option('-w','--within',is_flag = True, help="When activated, statistics are computed for the geometries that are within " "the raster shape. The default behaviour otherwise is to compute statistics " "for all geometries that intersect the raster shape.") - parser.add_argument( - '--stats', - dest="stats", - nargs="+", - help="List of stats to compute. Possible stats are: " - "min max range mean std percentile_x (x in [0, 100]) median mad " - "count valid nodata sum majority minority unique") - parser.add_argument( - '--categorical', - dest="categorical", - action="store_true", - help="If the input raster is categorical (i.e. raster values represent discrete classes) " + +@click.option('--stats', multiple = True,help="List of stats to compute. Possible stats are: " + "min max range mean std percentile_x (x in [0, 100]) median mad count valid nodata sum majority minority unique") + +@click.option('--categorical',is_flag = True,help="If the input raster is categorical (i.e. raster values represent discrete classes) " "compute the counts of every unique pixel values.") - parser.add_argument( - '--valid_threshold', - dest="valid_threshold", - type=float, - help="Minimum percentage of valid pixels in a shape to compute its statistics.") - parser.add_argument( - '--area', - dest='area', - action="store_true", - help="Whether to multiply all stats by the area of a cell of the input raster." - ) - parser.add_argument( - '--prefix', - dest="prefix", - help="Add a prefix to the keys (default: None). One prefix per band (e.g. 'band1 band2')") - - cli.with_bands_arguments(parser) - - # argument group for the outliers image generation - outliers_pc = parser.add_argument_group("Options to output the outliers") - outliers_pc.add_argument( - '--sigma', - dest="sigma", - help="Distance to the mean value (in sigma) in order to produce a raster " - "that highlights outliers.") - - # argument group for generating stats charts - chart_pc = parser.add_argument_group('Options to plot the generated stats') - chart_pc.add_argument( - '-c', - '--chart', - dest="chartfile", - help="Generate a chart per stat and per geometry " - "(x=timestamp of the input products / y=stat value) and " + +@click.option('--valid_threshold',"valid_threshold",type=float,help="Minimum percentage of valid pixels in a shape to compute its statistics.") + +@click.option('--area',is_flag=True,help="Whether to multiply all stats by the area of a cell of the input raster.") + +@click.option('--prefix', default = None, help="Add a prefix to the keys (default: None). One prefix per band (e.g. 'band1 band2')") + +@click.option('--sigma',help="Distance to the mean value (in sigma) in order to produce a raster that highlights outliers.") + +@click.option('-c','--chart',"chartfile", help="Generate a chart per stat and per geometry (x=timestamp of the input products / y=stat value) and " "store it in the file defined by this argument") - chart_pc.add_argument( - '-d', - '--display', - dest="display", - action="store_true", - help="Display the chart") - chart_pc.add_argument( - '-gi', - '--geometry-index', - dest="geom_index", - default='ID', - help="Name of the geometry index used for the chart (default='ID')") - - # argument group to generate stats per category - group_pc = parser.add_argument_group('Options to compute stats per category in geometry. ' - 'If activated, the generated geometries will contain ' - 'stats for every categories present in the geometry') - group_pc.add_argument( - '--category_file', - help="File (raster or geometries) containing discrete classes classifying the ROI." - ) - group_pc.add_argument( - '--category_index', - help="Column name identifying categories in categroy_file " - "(only if file format is geometries)", - default="Classe" - ) - group_pc.add_argument( - '--category_names', - help="JSON files containing a dict with classes index as keys and names " - "to display classes as values.", - default="" - ) - - # set the function to call when this subcommand is called - parser.set_defaults(func=create_zonalstats) - - return rastertools_parsers - - -def create_zonalstats(args) -> Zonalstats: - """Create and configure a new rastertool "Zonalstats" according to argparse args - - Args: - args: args extracted from command line - - Returns: - :obj:`eolab.rastertools.Zonalstats`: The configured rastertool to run + +@click.option('-d','--display',is_flag=True, help="Display the chart") + +@click.option('-gi','--geometry-index', "geom_index",type = str,default='ID',help="Name of the geometry index used for the chart (default='ID')") + +@click.option('--category_file',type = str, help="File (raster or geometries) containing discrete classes classifying the ROI.") + +@click.option('--category_index',type = str, default="Classe",help="Column name identifying categories in categroy_file (only if file format is geometries)") + +@click.option('--category_names',type = str, default="", help="JSON files containing a dict with classes index as keys and names to display classes as values.") + +@band_opt +@all_opt +@click.pass_context +def zonalstats(ctx, inputs : list, output : str, output_format : str, geometries : str, within : str, stats : list, categorical : bool, valid_threshold : float ,area : bool, prefix, bands : list, all_bands : bool, sigma, chartfile, display : bool, geom_index : str, category_file : str, category_index : str, category_names : str) : + """ + Compute zonal statistics of a raster image. + + Available statistics are: + min, max, range, mean, std, percentile_x (x in [0, 100]), median, mad, count, valid, nodata, sum, majority, minority, unique. + + By default, only the first band is computed unless specified otherwise. + + Arguments: + + inputs TEXT + + Raster files to process. You can provide a single filewith extension ".lst" (e.g. "zonalstats.lst") that + lists the input files to process (one input file per line in .lst) """ # get and check the list of stats to compute - if args.stats: - stats_to_compute = args.stats - elif args.categorical: + if stats: + stats_to_compute = list(stats) + elif categorical: stats_to_compute = [] else: stats_to_compute = ['count', 'min', 'max', 'mean', 'std'] # get the bands to process - if args.all_bands: + if all_bands: bands = None else: - bands = list(map(int, args.bands)) if args.bands else [1] + bands = list(map(int, bands)) if bands else [1] # create the rastertool object - tool = Zonalstats(stats_to_compute, args.categorical, args.valid_threshold, - args.area, args.prefix, bands) + tool = Zonalstats(stats_to_compute, categorical, valid_threshold, + area, prefix, bands) # set up config with args values - tool.with_output(args.output, args.output_format) \ - .with_geometries(args.geometries, args.within) \ - .with_outliers(args.sigma) \ - .with_chart(args.chartfile, args.geom_index, args.display) \ - .with_per_category(args.category_file, args.category_index, args.category_names) + tool.with_output(output, output_format) \ + .with_geometries(geometries, within) \ + .with_outliers(sigma) \ + .with_chart(chartfile, geom_index, display) \ + .with_per_category(category_file, category_index, category_names) - return tool + apply_process(ctx, tool, inputs) diff --git a/src/eolab/rastertools/filtering.py b/src/eolab/rastertools/filtering.py index 6a85ae41..6e9163b6 100644 --- a/src/eolab/rastertools/filtering.py +++ b/src/eolab/rastertools/filtering.py @@ -4,15 +4,17 @@ This module defines a rastertool named Filtering that can apply different kind of filters on raster images. """ -import logging import logging.config from typing import List, Dict from pathlib import Path +import rasterio +from rioxarray import rioxarray + from eolab.rastertools import utils from eolab.rastertools import Rastertool, Windowable from eolab.rastertools.processing import algo -from eolab.rastertools.processing import RasterFilter, compute_sliding +from eolab.rastertools.processing import RasterFilter from eolab.rastertools.product import RasterProduct @@ -24,10 +26,10 @@ class Filtering(Rastertool, Windowable): Predefined filters are available: - - median filter - - local sum - - local mean - - adaptive gaussian filter. + - Median filter + - Local sum + - Local mean + - Adaptive gaussian filter. A filter is applied on a kernel of a configurable size. To set the kernel size, you need to call: @@ -79,7 +81,14 @@ def myalgo(input_data, **kwargs): help="Apply median filter", description="Apply a median filter (see scipy median_filter for more information)" ) - """RasterFilter that computes the median of the kernel""" + """ + Applies a Median Filter to the input data using + `scipy.ndimage.median_filter `_. + The filter computes the median contained in the sliding window determined by kernel_size. + + Returns: + Numpy array containing the input data filtered by the median filter + """ local_sum = RasterFilter( "sum", algo=algo.local_sum @@ -87,7 +96,12 @@ def myalgo(input_data, **kwargs): help="Apply local sum filter", description="Apply a local sum filter using integral image method" ) - """RasterFilter that computes the local sum of the kernel""" + """Computes the local sums of the input data. + Each element is the sum of the pixels contained in the sliding window determined by kernel_size. + + Returns: + Numpy array of the size of input_data containing the computed local sums + """ local_mean = RasterFilter( "mean", algo=algo.local_mean @@ -95,7 +109,12 @@ def myalgo(input_data, **kwargs): help="Apply local mean filter", description="Apply a local mean filter using integral image method", ) - """RasterFilter that computes the local mean of the kernel""" + """Computes the local means of the input data. + Each element is the mean of the pixels contained in the sliding window determined by kernel_size. + + Returns: + Numpy array of the size of input_data containing the computed local means + """ adaptive_gaussian = RasterFilter( "adaptive_gaussian", algo=algo.adaptive_gaussian, per_band_algo=True @@ -110,16 +129,20 @@ def myalgo(input_data, **kwargs): "help": "Standard deviation of the Gaussian distribution (sigma)" }, }) - """RasterFilter that applies an adaptive gaussian filter to the kernel. It has a special - parameter named sigma that defines the standard deviation of the Gaussian distribution.""" + """RasterFilter that applies an adaptive gaussian filter to the kernel. The parameter sigma defines the standard deviation + of the Gaussian distribution. + + Returns: + Numpy array containing the input data filtered by the Gaussian filter. + """ @staticmethod def get_default_filters(): """Get the list of predefined raster filters Returns: - [:obj:`eolab.rastertools.processing.RasterFilter`]: list of predefined - raster filters. + [:obj:`eolab.rastertools.processing.RasterFilter`] List of the predefined + raster filters ([Median, Local sum, Local mean, Adaptive gaussian]) """ return [ Filtering.median_filter, Filtering.local_sum, @@ -139,8 +162,6 @@ def __init__(self, raster_filter: RasterFilter, kernel_size: int, bands: List[in Set None if all bands shall be processed. """ super().__init__() - # initialize default windowing configuration - self.with_windows() # the raster filter processing self._raster_filter = raster_filter self._raster_filter.configure({"kernel_size": kernel_size}) @@ -154,7 +175,7 @@ def bands(self) -> List[int]: @property def raster_filter(self) -> RasterFilter: - """Raster filter to apply""" + """Name of the filter to apply to the raster""" return self._raster_filter def with_filter_configuration(self, argsdict: Dict): @@ -180,17 +201,10 @@ def process_file(self, inputfile: str) -> List[str]: Input image to process Returns: - [str]: A list containing a single element: the generated filtered image. + ([str]) A list of one element containing the path of the generated filtered image. """ _logger.info(f"Processing file {inputfile}") - overlap = (self.raster_filter.kernel_size + 1) // 2 - if overlap >= min(self.window_size) / 2: - raise ValueError("The kernel size (option --kernel_size, " - f"value={self.raster_filter.kernel_size}) " - "must be strictly less than the window size minus 1 " - f"(option --window_size, value={min(self.window_size)})") - # STEP 1: Prepare the input image so that it can be processed with RasterProduct(inputfile, vrt_outputdir=self.vrt_dir) as product: @@ -199,11 +213,27 @@ def process_file(self, inputfile: str) -> List[str]: output_image = outdir.joinpath( f"{utils.get_basename(inputfile)}-{self.raster_filter.name}.tif") - compute_sliding( - product.get_raster(), output_image, self.raster_filter, - window_size=self.window_size, - window_overlap=(self.raster_filter.kernel_size + 1) // 2, - pad_mode=self.pad_mode, - bands=self.bands) + input_image = product.get_raster() + rasterprocessing = self.raster_filter + + with rasterio.Env(GDAL_VRT_ENABLE_PYTHON=True): + with rioxarray.open_rasterio(input_image, chunks=(1,1000,1000)) as src: + # dtype and creation options of output data + dtype = rasterprocessing.dtype or rasterio.float32 + + # check band index and handle all bands options (when bands is an empty list) + bands = self.bands + if bands is None or len(bands) == 0: + bands = src["band"].values + elif min(bands) < 1 or max(bands) > src.shape[0]: + raise ValueError(f"Invalid bands, all values are not in range [1, {src.shape[0]}]") + + src = src.isel(band=slice(0, len(bands))) + src = src.astype(dtype) + + output = rasterprocessing.compute(src).astype(dtype) + + ##Create the file and compute + output.rio.to_raster(output_image) return [output_image.as_posix()] diff --git a/src/eolab/rastertools/hillshade.py b/src/eolab/rastertools/hillshade.py index 2e287a65..38049982 100644 --- a/src/eolab/rastertools/hillshade.py +++ b/src/eolab/rastertools/hillshade.py @@ -4,20 +4,20 @@ This module defines a rastertool named Hillshade which computes the hillshade of a Digital Height Model corresponding to a given solar position (elevation and azimuth). """ -import logging import logging.config +import sys from typing import List from pathlib import Path import numpy as np import rasterio -from rasterio.windows import Window +import rioxarray from eolab.rastertools import utils from eolab.rastertools import Rastertool, Windowable from eolab.rastertools.processing import algo -from eolab.rastertools.processing import RasterProcessing, compute_sliding - +from eolab.rastertools.processing import RasterProcessing +from eolab.rastertools.product import RasterProduct _logger = logging.getLogger(__name__) @@ -50,18 +50,19 @@ class Hillshade(Rastertool, Windowable): """ def __init__(self, elevation: float, azimuth: float, resolution: float, radius: int = None): - """ Constructor + """ Constructor for the Hillshade class. Args: elevation (float): - Elevation of the sun (in degrees), 0 is vertical top + Elevation of the sun (in degrees), 0 is vertical top (zenith). azimuth (float): - Azimuth of the sun (in degrees) + Azimuth of the sun (in degrees), measured clockwise from north. resolution (float): - Resolution of a raster pixel (in meter) - radius (int): - Max distance from current point (in pixels) to consider - for evaluating the hillshade + Resolution of a raster pixel (in meters). + radius (int, optional): + Maximum distance from the current point (in pixels) to consider + for evaluating the hillshade. If None, the radius is calculated + based on the data range. """ super().__init__() self.with_windows() @@ -73,34 +74,38 @@ def __init__(self, elevation: float, azimuth: float, resolution: float, radius: @property def elevation(self): - """Elevation of the sun (in degrees)""" + """Return the elevation of the sun (in degrees)""" return self._elevation @property def azimuth(self): - """Azimuth of the sun (in degrees)""" + """Return the azimuth of the sun (in degrees)""" return self._azimuth @property def resolution(self): - """Resolution of a raster pixel (in meter)""" + """Return the resolution of a raster pixel (in meter)""" return self._resolution @property def radius(self): - """Max distance from current point (in pixels) to consider - for evaluating the max elevation angle""" + """Return the maximum distance from current point (in pixels) + for evaluating the maximum elevation angle""" return self._radius def process_file(self, inputfile: str) -> List[str]: - """Compute Hillshade for the input file + """ + Compute hillshade for the input file. Args: inputfile (str): - Input image to process + Input image file path to process. Returns: - [str]: A list containing a single element: the generated hillshade image. + List[str]: A list containing the file path of the generated hillshade image. + + Raises: + ValueError: If the input file contains more than one band or if the radius exceeds constraints. """ _logger.info(f"Processing file {inputfile}") outdir = Path(self.outputdir) @@ -109,19 +114,16 @@ def process_file(self, inputfile: str) -> List[str]: # compute the radius from data range # radius represents the max distance of buildings that can create a hillshade # considering the sun elevation. - wmax = None - wmin = None - with rasterio.open(inputfile) as src: - if src.count != 1: - raise ValueError("Invalid input file, it must contain a single band.") - for i in range(src.height // self.window_size[0] + 1): - for j in range(src.width // self.window_size[1] + 1): - # Oversized window (out of source bounds) is handled by Window - win = Window(i*self.window_size[0] , j*self.window_size[1] , self.window_size[0] , self.window_size[1]) - data = src.read(1, masked=True, window=win) - if data.size and not np.isnan(data).all(): - wmax = np.maximum(wmax, np.nanmax(data)) if wmax is not None else np.nanmax(data) - wmin = np.minimum(wmin, np.nanmin(data)) if wmin is not None else np.nanmin(data) + + with rioxarray.open_rasterio(inputfile, chunks=True) as src: + if src.shape[0] != 1: + _logger.exception(ValueError("Invalid input file, it must contain a single band.")) + sys.exit(1) + data = src[0] + if data.size and not np.isnan(data).all(): + wmax = np.nanmax(data) + wmin = np.nanmin(data) + delta = int((wmax - wmin) / self.resolution) optimal_radius = abs(int(delta / np.tan(np.radians(self.elevation)))) @@ -133,11 +135,6 @@ def process_file(self, inputfile: str) -> List[str]: f"Oversized radius affects computation time and so radius is set to {self.radius}. " "Result may miss some shadow pixels.") - if self.radius >= min(self.window_size) / 2: - raise ValueError(f"The radius (option --radius, value={self.radius}) must be strictly " - "less than half the size of the window (option --window_size, " - f"value={min(self.window_size)})") - # Configure the processing hillshade = RasterProcessing("hillshade", algo=algo.hillshade, dtype=np.int8, in_dtype=np.float32, nbits=1, compress='lzw', per_band_algo=True) @@ -145,22 +142,37 @@ def process_file(self, inputfile: str) -> List[str]: "elevation": None, "azimuth": None, "resolution": None, - "radius": None + "radius": None, + "pad_mode": None }) # set the configuration of the raster processing hillshade_conf = { "elevation": self.elevation, "azimuth": self.azimuth, "resolution": self.resolution, - "radius": self.radius + "radius": self.radius, + "pad_mode": self.pad_mode } hillshade.configure(hillshade_conf) - # Run the hillshade processing - compute_sliding( - inputfile, output_image, hillshade, - window_size=self.window_size, - window_overlap=self.radius, - pad_mode=self.pad_mode) + # STEP 1: Prepare the input image so that it can be processed + with RasterProduct(inputfile, vrt_outputdir=self.vrt_dir) as product: + + # STEP 2: apply hillshade + outdir = Path(self.outputdir) + output_image = outdir.joinpath( + f"{utils.get_basename(inputfile)}-hillshade.tif") + + with rasterio.Env(GDAL_VRT_ENABLE_PYTHON=True): + with product.open_xarray(chunks=True) as src: + # dtype and creation options of output data + dtype = hillshade.dtype or rasterio.float32 + src = src.astype(dtype) + + # Hillshade computing + output = hillshade.compute(src).astype(dtype) + + #Create the file and compute + output.rio.to_raster(output_image) return [output_image.as_posix()] diff --git a/src/eolab/rastertools/main.py b/src/eolab/rastertools/main.py index d963a365..88bbf0f3 100644 --- a/src/eolab/rastertools/main.py +++ b/src/eolab/rastertools/main.py @@ -10,23 +10,24 @@ rastertools zonalstats --help """ -import argparse import logging import logging.config import os import sys import json - +import click +from eolab.rastertools.cli.filtering import filter +from eolab.rastertools.cli.hillshade import hillshade +from eolab.rastertools.cli.speed import speed +from eolab.rastertools.cli.svf import svf +from eolab.rastertools.cli.tiling import tiling +from eolab.rastertools.cli.timeseries import timeseries +from eolab.rastertools.cli.radioindice import radioindice +from eolab.rastertools.cli.zonalstats import zonalstats from eolab.rastertools import __version__ -from eolab.rastertools import RastertoolConfigurationException -from eolab.rastertools.cli import radioindice, zonalstats, tiling, speed -from eolab.rastertools.cli import filtering, svf, hillshade, timeseries from eolab.rastertools.product import RasterType -_logger = logging.getLogger(__name__) - - def add_custom_rastertypes(rastertypes): """Add definition of new raster types. The json string shall have the following format: @@ -127,154 +128,114 @@ def add_custom_rastertypes(rastertypes): RasterType.add(rastertypes) -def run_tool(args): - """Main entry point allowing external calls - - sys.exit returns: - - - 0: everything runs fine - - 1: processing errors occured - - 2: wrong execution configuration - - Args: - args ([str]): command line parameter list +#Rastertools CLI group +CONTEXT_SETTINGS = dict(help_option_names=['-h', '--help']) + + +# @with_plugins(iter_entry_points('rasterio.plugins')) +@click.group(context_settings=CONTEXT_SETTINGS) +@click.option( + '-t', '--rastertype', + 'rastertype', + default = None, + # Click automatically uses the last argument as the variable name, so "dest" is this last parameter + type=click.Path(exists=True), + help="JSON file defining additional raster types of input files") +@click.option( + '--max_workers', + "max_workers", + type=int, + help="Maximum number of workers for parallel processing. If not given, it will default to " + "the number of processors on the machine. When all processors are not allocated to " + "run rastertools, it is thus recommended to set this option.") +@click.option( + '--debug', + "keep_vrt", + is_flag=True, + help="Store to disk the intermediate VRT images that are generated when handling " + "the input files which can be complex raster product composed of several band files.") +@click.option( + '-v', + '--verbose', + is_flag=True, + help="set loglevel to INFO") +@click.option( + '-vv', + '--very-verbose', + is_flag=True, + help="set loglevel to DEBUG") +@click.version_option(version='rastertools {}'.format(__version__)) # Ensure __version__ is defined +@click.pass_context + +def rastertools(ctx, rastertype : str, max_workers : int, keep_vrt : bool, verbose : bool, very_verbose : bool): """ - parser = argparse.ArgumentParser( - description="Collection of tools on raster data") - # add an argument to define custom raster types - parser.add_argument( - '-t', - '--rastertype', - dest="rastertype", - help="JSON file defining additional raster types of input files") - parser.add_argument( - '--version', - action='version', - version=f'rastertools {__version__}') - parser.add_argument( - '--max_workers', - dest="max_workers", - type=int, - help="Maximum number of workers for parallel processing. If not given, it will default to " - "the number of processors on the machine. When all processors are not allocated to " - "run rastertools, it is thus recommended to set this option.") - parser.add_argument( - '--debug', - dest="keep_vrt", - action="store_true", - help="Store to disk the intermediate VRT images that are generated when handling " - "the input files which can be complex raster product composed of several band files.") - parser.add_argument( - '-v', - '--verbose', - dest="loglevel", - help="set loglevel to INFO", - action='store_const', - const=logging.INFO) - parser.add_argument( - '-vv', - '--very-verbose', - dest="loglevel", - help="set loglevel to DEBUG", - action='store_const', - const=logging.DEBUG) - - rastertools_parsers = parser.add_subparsers(title='Commands') - # add sub parser for filtering - rastertools_parsers = filtering.create_argparser(rastertools_parsers) - # add sub parser for hillshade - rastertools_parsers = hillshade.create_argparser(rastertools_parsers) - # add sub parser for radioindice - rastertools_parsers = radioindice.create_argparser(rastertools_parsers) - # add sub parser for speed - rastertools_parsers = speed.create_argparser(rastertools_parsers) - # add sub parser for svf - rastertools_parsers = svf.create_argparser(rastertools_parsers) - # add sub parser for tiling - rastertools_parsers = tiling.create_argparser(rastertools_parsers) - # add sub parser for timeseries - rastertools_parsers = timeseries.create_argparser(rastertools_parsers) - # add sub parser for zonalstats - rastertools_parsers = zonalstats.create_argparser(rastertools_parsers) - - # analyse arguments - args = parser.parse_args(args) - argsdict = vars(args) - - # setup logging - logformat = "[%(asctime)s] %(levelname)s - %(name)s - %(message)s" - logging.basicConfig(level=args.loglevel, stream=sys.stdout, - format=logformat, datefmt="%Y-%m-%d %H:%M:%S") + Main entry point for the `rastertools` Command Line Interface. - if "RASTERTOOLS_NOTQDM" not in os.environ: - os.environ["RASTERTOOLS_NOTQDM"] = "True" if logging.root.level > logging.INFO else "False" + The `rastertools` CLI provides tools for raster processing and analysis and allows configurable data handling, parallel processing, + and debugging support. - if "RASTERTOOLS_MAXWORKERS" not in os.environ and args.max_workers is not None: - os.environ["RASTERTOOLS_MAXWORKERS"] = f"{args.max_workers}" - - # handle rastertype option - if args.rastertype: - with open(args.rastertype) as json_content: - RasterType.add(json.load(json_content)) + Logging: - # call function corresponding to the subcommand - if "func" in argsdict: - try: - # initialize the rastertool to execute - tool = args.func(args) + - INFO level (`-v`) gives detailed step information. - # handle the input file of type "lst" - inputs = _extract_files_from_list(args.inputs) + - DEBUG level (`-vv`) offers full debug-level tracing. - # setup debug mode in which intermediate VRT files are stored to disk or not - tool.with_vrt_stored(args.keep_vrt) + Environment Variables: - # launch process - tool.process_files(inputs) + - `RASTERTOOLS_NOTQDM`: If the log level is above INFO, sets this to disable progress bars. - _logger.info("Done!") - except RastertoolConfigurationException as rce: - _logger.exception(rce) - sys.exit(2) - except Exception as err: - _logger.exception(err) - sys.exit(1) + - `RASTERTOOLS_MAXWORKERS`: If `max_workers` is set, it defines the max workers for rastertools. + """ + #Saving keep_vrt to use it in the subcommands + ctx.ensure_object(dict) + ctx.obj['keep_vrt'] = keep_vrt + + # Setup logging + if very_verbose: + loglevel = logging.DEBUG + elif verbose: + loglevel = logging.INFO else: - parser.print_help() - - sys.exit(0) - + loglevel = logging.WARNING -def _extract_files_from_list(cmd_inputs): - """Extract the list of files from a file of type ".lst" which - contains one line per file + logformat = "[%(asctime)s] %(levelname)s - %(name)s - %(message)s" + logging.basicConfig(level=loglevel, stream=sys.stdout, format=logformat, datefmt="%Y-%m-%d %H:%M:%S") - Args: - cmd_inputs (str): - Value of the inputs arguments of the command line. Either - a file with a suffix lst from which the list of files shall - be extracted or directly the list of files (in this case, the - list is returned without any change). - - Returns: - The list of input files read from the command line - """ + if "RASTERTOOLS_NOTQDM" not in os.environ: + os.environ["RASTERTOOLS_NOTQDM"] = "True" if loglevel > logging.INFO else "False" - # handle the input file of type "lst" - if len(cmd_inputs) == 1 and cmd_inputs[0][-4:].lower() == ".lst": - # parse the listing - with open(cmd_inputs[0]) as f: - inputs = f.read().splitlines() - else: - inputs = cmd_inputs + if "RASTERTOOLS_MAXWORKERS" not in os.environ and max_workers is not None: + os.environ["RASTERTOOLS_MAXWORKERS"] = f"{max_workers}" - return inputs + # Handle rastertype option + if rastertype: + with open(rastertype) as json_content: + RasterType.add(json.load(json_content)) -def run(): - """Entry point for console_scripts +# Register subcommands from other modules +rastertools.add_command(filter, name = "fi") +rastertools.add_command(filter, name = "filter") +rastertools.add_command(hillshade, name = "hs") +rastertools.add_command(hillshade, name = "hillshade") +rastertools.add_command(radioindice, name = "ri") +rastertools.add_command(radioindice, name = "radioindice") +rastertools.add_command(speed, name = "sp") +rastertools.add_command(speed, name = "speed") +rastertools.add_command(svf, name = "svf") +rastertools.add_command(tiling, name = "ti") +rastertools.add_command(tiling, name = "tiling") +rastertools.add_command(timeseries, name = "ts") +rastertools.add_command(timeseries, name = "timeseries") +rastertools.add_command(zonalstats, name = "zs") +rastertools.add_command(zonalstats, name = "zonalstats") + + +def run(*args, **kwargs): + """ + Entry point for console_scripts """ - run_tool(sys.argv[1:]) + rastertools(*args, **kwargs) if __name__ == "__main__": diff --git a/src/eolab/rastertools/processing/__pycache__/__init__.cpython-38.pyc b/src/eolab/rastertools/processing/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index e5a7a8d0..00000000 Binary files a/src/eolab/rastertools/processing/__pycache__/__init__.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/processing/__pycache__/algo.cpython-38.pyc b/src/eolab/rastertools/processing/__pycache__/algo.cpython-38.pyc deleted file mode 100644 index 9e90156b..00000000 Binary files a/src/eolab/rastertools/processing/__pycache__/algo.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/processing/__pycache__/rasterproc.cpython-38.pyc b/src/eolab/rastertools/processing/__pycache__/rasterproc.cpython-38.pyc deleted file mode 100644 index daa2052c..00000000 Binary files a/src/eolab/rastertools/processing/__pycache__/rasterproc.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/processing/__pycache__/sliding.cpython-38.pyc b/src/eolab/rastertools/processing/__pycache__/sliding.cpython-38.pyc deleted file mode 100644 index acdad337..00000000 Binary files a/src/eolab/rastertools/processing/__pycache__/sliding.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/processing/__pycache__/stats.cpython-38.pyc b/src/eolab/rastertools/processing/__pycache__/stats.cpython-38.pyc deleted file mode 100644 index 65381eae..00000000 Binary files a/src/eolab/rastertools/processing/__pycache__/stats.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/processing/__pycache__/vector.cpython-38.pyc b/src/eolab/rastertools/processing/__pycache__/vector.cpython-38.pyc deleted file mode 100644 index dc48cb39..00000000 Binary files a/src/eolab/rastertools/processing/__pycache__/vector.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/processing/algo.py b/src/eolab/rastertools/processing/algo.py index 14d035fa..f7d2209c 100644 --- a/src/eolab/rastertools/processing/algo.py +++ b/src/eolab/rastertools/processing/algo.py @@ -4,92 +4,171 @@ Algorithms on raster data """ import math +from typing import Union, List +import numpy import numpy as np import numpy.ma as ma +import xarray as xr from scipy import ndimage, signal -def normalized_difference(bands, **kwargs): - """Algorithm that performs a normalized band ratio - -1 <= nd <= 1 +def normalized_difference(bands : Union[np.ndarray, xr.DataArray]) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the Normalized Difference Vegetation Index + The coefficient ranges from -1 to 1 in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + NDVI = \\frac{NIR - RED}{NIR + RED} Args: - bands: list of bands as a numpy ndarray + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. Returns: - The numpy array with the results + Numpy array of the size (number of lines, number of columns) containing the computed TNDVI. """ np.seterr(divide='ignore') - return (bands[1] - bands[0]) / (bands[1] + bands[0]) + res = (bands[1] - bands[0]) / (bands[1] + bands[0]) + return res + + +def tndvi(bands : Union[np.ndarray, xr.DataArray]) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the Transformed Normalized Difference Vegetation Index + The coefficient is positive in each pixel. + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). -def tndvi(bands, **kwargs): - """Transformed Normalized Difference Vegetation Index - TNDVI > 0 + .. math:: + TNDVI = \\sqrt{NDVI + 0.5} Args: - bands: list of bands as a numpy ndarray + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. Returns: - The numpy array with the results + Numpy array of the size (number of lines, number of columns) containing the computed TNDVI. + + References: + `Deering D.W., Rouse J.W., Haas R.H., and Schell J.A., 1975. Measuring forage production + of grazing units from Landsat MSS data. Pages 1169-1178 In: Cook J.J. (Ed.), Proceedings + of the Tenth International Symposium on Remote Sensing of Environment (Ann Arbor, 1975), + Vol. 2, Ann Arbor, Michigan, USA. `_ """ np.seterr(invalid='ignore') ratio = normalized_difference(bands) + 0.5 - ratio[ratio < 0] = 0 + if (isinstance(ratio, np.ndarray) or isinstance(ratio, np.ma.masked_array)): + ratio[ratio < 0] = 0 + else: + if not ratio.isnull().all(): + ratio = ratio.where(ratio >= 0, 0) return np.sqrt(ratio) -def rvi(bands, **kwargs): - """Ratio Vegetation Index - RVI > 0 + +def rvi(bands : Union[np.ndarray, xr.DataArray]) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the Ratio Vegetation Index + The coefficient is positive in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + PVI = \\frac{NIR}{RED} Args: - bands: list of bands as a numpy ndarray + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. Returns: - The numpy array with the results + Numpy array of the size (number of lines, number of columns) containing the computed RVI. + + References: + `Jordan C.F., 1969. Derivation of leaf area index from quality of light on the forest + floor. Ecology 50:663-666 `_ """ np.seterr(divide='ignore') return bands[1] / bands[0] -def pvi(bands, **kwargs): - """Perpendicular Vegetation Index - -1 < PVI < 1 +def pvi(bands : Union[np.ndarray, xr.DataArray]) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the Perpendicular Vegetation Index + The coefficient ranges from -1 to 1 in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + PVI = 0.74 (NIR - 0.90893 RED - 7.46216) Args: - bands: list of bands as a numpy ndarray + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. Returns: - The numpy array with the results + Numpy array of the size (number of lines, number of columns) containing the computed PVI. + + References: + `Richardson A.J., Wiegand C.L., 1977. Distinguishing vegetation from soil background + information. Photogramm Eng Rem S 43-1541-1552 `_ """ return (bands[1] - 0.90893 * bands[0] - 7.46216) * 0.74 -def savi(bands, **kwargs): - """Soil Adjusted Vegetation Index - -1 < SAVI < 1 +def savi(bands : Union[np.ndarray, xr.DataArray]) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the Soil Adjusted Vegetation Index + The coefficient ranges from -1 to 1 in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + SAVI = \\frac{(NIR - RED) (1 + 0.5)}{NIR + RED + 0.5} Args: - bands: list of bands as a numpy ndarray + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. Returns: - The numpy array with the results + Numpy array of the size (number of lines, number of columns) containing the computed SAVI. + + References: + `Huete A.R., 1988. A soil-adjusted vegetation index (SAVI). Remote Sens Environ 25:295-309 `_ """ np.seterr(divide='ignore') return (1. + 0.5) * (bands[1] - bands[0]) / (bands[1] + bands[0] + 0.5) -def tsavi(bands, **kwargs): - """Transformed Soil Adjusted Vegetation Index - -1 < TSAVI < 1 +def tsavi(bands : Union[np.ndarray, xr.DataArray]) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the Transformed Soil Adjusted Vegetation Index + The coefficient ranges from -1 to 1 in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + TSAVI = \\frac{0.7 (NIR - 0.7 RED - 0.9)}{0.7 NIR + RED + 0.08 (1 + 0.7^2)} Args: - bands: list of bands as a numpy ndarray + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. Returns: - The numpy array with the results + Numpy array of the size (number of lines, number of columns) containing the computed TSAVI. + + References: + `Baret F., Guyot G., Major D., 1989. TSAVI: a vegetation index which minimizes soil + brightness effects on LAI or APAR estimation. 12th Canadian Symposium on Remote + Sensing and IGARSS 1990, Vancouver, Canada, 07/10-14. `_ """ np.seterr(divide='ignore') denominator = 0.7 * bands[1] + bands[0] + 0.08 * (1 + 0.7 * 0.7) @@ -97,28 +176,57 @@ def tsavi(bands, **kwargs): return numerator / denominator -def _wdvi(bands, **kwargs): - """Weighted Difference Vegetation Index - Infinite range +def _wdvi(bands : Union[np.ndarray, xr.DataArray]) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the Weighted Difference Vegetation Index of the input data. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + WDVI = NIR - 0.4 RED Args: - bands: list of bands as a numpy ndarray + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. Returns: - The numpy array with the results + Numpy array of the size (number of lines, number of columns) containing the computed WDVI. """ return bands[1] - 0.4 * bands[0] -def msavi(bands, **kwargs): - """Modified Soil Adjusted Vegetation Index - -1 < MSAVI < 1 +def msavi(bands : Union[np.ndarray, xr.DataArray] ) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the Modified Soil Adjusted Vegetation Index of the input data. + The coefficient ranges from -1 to 1 in each pixel. + + grdtbrbr The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). - Args: - bands: list of bands as a numpy ndarray + .. math:: + MSAVI = \\frac{(NIR - RED) (1 + L)} {NIR + RED + L} \\\\ - Returns: - The numpy array with the results + With : :math:`L = 1 - 2 * 0.4 * NDVI * WDVI` + + Parameters + ---------- + input_data : np.ndarray + A 3D numpy array of shape (number of bands, number of lines, number of columns) where number of bands > 1. + + Returns + ------- + np.ndarray + A 2D numpy array of shape (number of lines, number of columns) containing the computed MSAVI values. + + References + ------- + `Qi J., Chehbouni A., Huete A.R., Kerr Y.H., 1994. Modified Soil Adjusted Vegetation + Index (MSAVI). Remote Sens Environ 48:119-126 `_ + + `Qi J., Kerr Y., Chehbouni A., 1994. External factor consideration in vegetation index + development. Proc. of Physical Measurements and Signatures in Remote Sensing, + ISPRS, 723-730. `_ """ np.seterr(divide='ignore') ndvi = normalized_difference(bands) @@ -128,126 +236,201 @@ def msavi(bands, **kwargs): return (1 + dl) * (bands[1] - bands[0]) / denominator -def msavi2(bands, **kwargs): - """Modified Soil Adjusted Vegetation Index - -1 < MSAVI2 < 1 +def msavi2(bands : Union[np.ndarray, xr.DataArray]) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the Modified Soil Adjusted Vegetation Index of the input data. + The coefficient ranges from -1 to 1 in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + MSAVI2 = (2 * NIR + 1)^2 - 8 (NIR - RED) Args: - bands: list of bands as a numpy ndarray + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. Returns: - The numpy array with the results + Numpy array of the size (number of lines, number of columns) containing the computed MSAVI. """ np.seterr(divide='ignore', invalid='ignore') dsqrt = (2. * bands[1] + 1) ** 2 - 8 * (bands[1] - bands[0]) return (2. * bands[1] + 1) - np.sqrt(dsqrt) -def ipvi(bands, **kwargs): - """Infrared Percentage Vegetation Index - 0 < IPVI < 1 +def ipvi(bands : Union[np.ndarray, xr.DataArray]) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the Infrared Percentage Vegetation Index of the input data. + The coefficient ranges from 0 to 1 in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red). + + .. math:: + IPVI = \\frac{NIR}{NIR + RED} Args: - bands: list of bands as a numpy ndarray + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. Returns: - The numpy array with the results + Numpy array of size (number of lines, number of columns) containing the computed IPVI. + + References: + `Crippen, R. E. 1990. Calculating the Vegetation Index Faster, Remote Sensing of + Environment, vol 34., pp. 71-73. `_ """ np.seterr(divide='ignore') return bands[1] / (bands[1] + bands[0]) -def evi(bands, **kwargs): - """Enhanced vegetation index +def evi(bands : Union[np.ndarray, xr.DataArray]) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the Enhanced vegetation index of the input data. + The coefficient ranges from -1 to 1 in each pixel. + + The function considers the bands of the input data in the following order : + Red, NIR (Near Infra-Red), Blue. Args: - bands: list of bands as a numpy ndarray + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 2. Returns: - The numpy array with the results + Numpy array of the size (number of lines, number of columns) containing the computed EVI. + + .. math:: + EVI = \\frac{G (NIR - RED)} {NIR + C1 * RED - C2 * BLUE + L} + + With : + - $L$ : Canopy background adjustment term, it reduces the influence of soil brightness. + - $C1$, $C2$ : Coefficients that correct the influence of aerosol. + - $G$ : A gain factor. The greater is G, the more the EVI is sensitive to vegetation changes. """ - np.seterr(divide='ignore') + np.seterr(divide='ignore') #Ignore divisions by zero return 2.5 * (bands[1] - bands[0]) / ((bands[1] + 6.0 * bands[0] - 7.5 * bands[2]) + 1.0) -def redness_index(bands, **kwargs): - """Redness Index +def redness_index(bands : Union[np.ndarray, xr.DataArray]) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the Redness Index of the input data. + + .. math:: + RI = \\frac{RED^2} {GREEN^3} + + The function considers the bands of the input data in the following order : + Red, Green. Args: - bands: list of bands as a numpy ndarray + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. Returns: - The numpy array with the results + Numpy array of size (number of lines, number of columns) containing the computed Redness Index. """ np.seterr(divide='ignore') return bands[0] ** 2 / bands[1] ** 3 -def brightness_index(bands, **kwargs): - """Brightness Index +def brightness_index(bands : Union[np.ndarray, xr.DataArray]) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the Brightness Index of the input data. + + The function considers the first 2 bands of the input data to be Red and Green. + + .. math:: + BI = \\sqrt{ \\frac{RED^2 + GREEN^2} {2} } Args: - bands: list of bands as a numpy ndarray + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 1. Returns: - The numpy array with the results + Numpy array of the size (number of lines, number of columns) containing the computed Brightness Index. """ np.seterr(invalid='ignore') bi = (bands[0] ** 2 + bands[1] ** 2) / 2 return np.sqrt(bi) -def brightness_index2(bands, **kwargs): - """Brilliance Index +def brightness_index2(bands : Union[np.ndarray, xr.DataArray]) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the Brightness Index of the input data. + + The function considers the first 3 bands of the input data to be Red, Green, Blue. + + .. math:: + BI = \\sqrt{ \\frac{RED^2 + BLUE^2 + GREEN^2} {2} } Args: - bands: list of bands as a numpy ndarray + input_data (np.ndarray) : Numpy array of 3 dimensions (number of bands, number of lines, number of columns) + with number of bands > 2. Returns: - The numpy array with the results + Numpy array of the size (number of lines, number of columns) containing the computed Brightness Index. """ np.seterr(invalid='ignore') bi2 = (bands[0] ** 2 + bands[1] ** 2 + bands[2] ** 2) / 3 return np.sqrt(bi2) -def speed(data0, data1, interval, **kwargs): - """Compute speed for input data +def speed(data0 : Union[np.ndarray, xr.DataArray] , data1 : np.ndarray, interval : float) -> Union[np.ndarray, xr.DataArray] : + """ + Compute the speed of the input data based on the difference between two time points. Args: - data0 (np.ndarray): band value at first date - data1 (np.ndarray): band value at second date - interval (float): time interval between first and second dates + data0 (numpy.ndarray): Numpy array containing the band value(s) at the first date. + Shape must be (number_of_lines, number_of_columns). + + data1 (numpy.ndarray): Numpy array containing the band value(s) at the second date. + Shape must match `data0`. + + interval (float): Time interval (in the same units as the timestamps of the input data) + between the first and second dates. Returns: - The numpy array with the results + numpy.ndarray: Numpy array of shape (number_of_lines, number_of_columns) + containing the computed speed of the sequence. The values represent + the change in band values per unit time. + + Raises: + ValueError: If `data0` and `data1` do not have the same shape, or if `interval` is zero. """ return (data1 - data0) / interval -def interpolated_timeseries(dates, series, output_dates, nodata): - """Interpolate a timeseries of data. Dates and series must - be sorted in ascending order. +def interpolated_timeseries_xarray(dates: xr.DataArray, series: List[xr.DataArray], output_dates: numpy.array, + nodata) -> List[xr.DataArray]: + """ + Interpolate a timeseries of data. Dates and series must be sorted in ascending order. Args: - dates (mumpy.masked_array): - List of dates (timestamps) of the given series of images - series ([numpy.masked_array]): - List of 3-dims numpy masked_array containing the raster bands - at every dates - output_dates ([numpy.array]): - The dates (timestamps) of the rasters to generate - nodata: - No data value to use + dates (numpy.ma.masked_array): A masked array of timestamps (dates) corresponding to + the input series. Should be in ascending order. + + series (numpy.ma.masked_array): A list of 3D masked arrays, each with shape + (bands, height, width), containing the raster data + for each timestamp in `dates`. + + output_dates (numpy.array): A 1D array of timestamps for which to generate the interpolated + rasters. + + nodata (float): Value to use for pixels where input data is NaN or missing. Returns: - numpy.ndarray: the numpy array of the rasters, its shape is - (time, bands, height, width) + numpy.ndarray: A 4D numpy array of shape (time, bands, height, width), containing + the interpolated raster data for each output date. If there are no valid + data points for a specific pixel, the corresponding pixel will be filled with `nodata`. + + Raises: + ValueError: If `series` is empty, or if `dates` and `series` dimensions do not match. """ - # stacked input data: shape is time x band x height x width - stack = ma.stack(series) + # Stack input series into a single masked array (time x band x height x width) + stack = ma.stack([da.data for da in series]) stack_shape = stack.shape - # flatten the stacked data: shape is pixel x time + + # Flatten the stacked data: shape is pixel x time pixel_series = stack.transpose((1, 2, 3, 0)).reshape( stack_shape[1] * stack_shape[2] * stack_shape[3], -1) @@ -265,29 +448,54 @@ def interpolated_timeseries(dates, series, output_dates, nodata): default_val = serie.sum() if serie.count() > 0 else nodata output.append([default_val] * len(output_dates)) + # Reshape the output to match (time, bands, height, width) output = np.array(output) - return output.transpose(1, 0).reshape( - -1, stack_shape[1], stack_shape[2], stack_shape[3]) + output = output.transpose(1, 0).reshape( + -1, stack_shape[1], stack_shape[2], stack_shape[3] + ) + + # Create a list of xr.DataArray, one for each output date + output_xr = [] + coords = series[0].coords + for tim, date in enumerate(output_dates): + da = xr.DataArray( + output[tim], + dims=["band", "y", "x"], + coords={ + "band": coords["band"], + "y": coords["y"], + "x": coords["x"], + "time": date + }, + attrs=series[0].attrs) + output_xr.append(da) + + return output_xr + + + +def _local_sum(data : np.ndarray, kernel_width: int) -> numpy.ndarray : + """ + Computes the local sums of the input data using a sliding window defined by the kernel size. + Each element in the output is the sum of the pixels within the specified kernel size window. + Args: + input_data (np.ndarray): A 3D numpy array of shape (1, number_of_lines, number_of_columns) + containing the Digital Height Model (DHM). + The function only accepts arrays with one band. -def _local_sum(data: np.ndarray, kernel_width: int): - """Compute the local sum of an image of shape width x height. - on a kernel of size: size x size. Output image has a shape of - (width - size) x (height - size) + kernel_size (int): The size of the sliding window used to compute the local sum. - Args: - data (np.ndarray): - 2 or 3 dimension ndarray or maskedarray. If array has 3 dimensions, the - local_sum is computed for the last 2 dims (we consider - first dim as band list) - kernel_width (int): - Kernel size to compute the local sum + If kernel_size = 1 : The output array equals to the input + Otherwise : Sums the pixels belonging to a sliding window of size radius * radius (with radius = (kernel_width + 1) // 2) + The top-left pixel of the window is the current pixel Returns: - np.ndarray: - Output data with same shape as input data. Computed data - have a size minored by the kernel_size and are centered - in the output shape + Numpy array of the size of input_data containing the computed local sums. Computed data have a size minored by the kernel_size + and are centered in the output shape. + + Raises: + ValueError: If `input_data` does not have 3 dimensions or if the first dimension is not of size 1. """ if kernel_width == 1: output = data.copy() @@ -324,54 +532,84 @@ def _local_sum(data: np.ndarray, kernel_width: int): - ii[:-kernel_width, kernel_width:] \ - ii[kernel_width:, :-kernel_width] + if isinstance(data, xr.DataArray): + output = xr.DataArray(output, dims=data.dims, coords=data.coords) + return output.astype(data.dtype) -def median(input_data, **kwargs): - """Median filter computed using scipy.ndimage.median_filter +def median(input_data : Union[numpy.ndarray, xr.DataArray], kernel_size : int) -> Union[numpy.ndarray, xr.DataArray] : + """ + Applies a Median Filter to the input data using `scipy.ndimage.median_filter `_. + The filter computes the median of the values contained within a sliding window determined by the kernel size. Args: - input_data: list of bands as a numpy ndarray of dims 3. - kwargs : parameters of the computing: kernel_size + input_data (np.ndarray): A 3D numpy array of shape (1, number_of_lines, number_of_columns) + containing the Digital Height Model (DHM). The function only accepts arrays with one band. + + kernel_size (int): The size of the sliding window (kernel) used to compute the median. Returns: - The numpy array with the results + np.ndarray: A numpy array of the same shape as `input_data`, containing the filtered data with the median values computed in the specified kernel. + + Raises: + ValueError: If `input_data` does not have 3 dimensions or if the first dimension is not of size 1, + or if `kernel_size` is not a positive odd integer. """ if len(input_data.shape) != 3: - raise ValueError("adaptive_gaussian only accepts 3 dims numpy arrays") + raise ValueError("Median only accepts 3 dims numpy arrays") - kernel_size = kwargs.get('kernel_size', 8) output = ndimage.median_filter(input_data, size=(1, kernel_size, kernel_size)) + + if isinstance(input_data, xr.DataArray): + output = xr.DataArray(output, dims=input_data.dims, coords=input_data.coords)#, dims = ['bands', 'y', 'x']) return output -def local_sum(input_data, **kwargs): - """Local sum computed using integral image + +def local_sum(input_data : Union[numpy.ndarray, xr.DataArray], kernel_size : int = 8) -> Union[numpy.ndarray, xr.DataArray] : + """ + Computes the local sums of the input data using a sliding window defined by the kernel size. + Each element in the output is the sum of the pixels within the specified kernel size window. Args: - bands: list of bands as a numpy ndarray of dims 2 or 3. - kwargs : parameters of the computing: kernel_size + input_data (np.ndarray): A 3D numpy array of shape (1, number_of_lines, number_of_columns) + containing the Digital Height Model (DHM). + The function only accepts arrays with one band. + + kernel_size (int): The size of the sliding window used to compute the local sum. Returns: - The numpy array with the results + np.ndarray: A numpy array of the same size as `input_data` containing the computed local sums. + + Raises: + ValueError: If `input_data` does not have 3 dimensions or if the first dimension is not of size 1. """ - kernel_size = kwargs.get('kernel_size', 8) + + #kernel_size = kwargs.get('kernel_size', 8) # compute local sum of band pixels output = _local_sum(input_data, kernel_size) return output -def local_mean(input_data, **kwargs): - """Local mean computed using integral image +def local_mean(input_data : Union[numpy.ndarray, xr.DataArray], kernel_size : int = 8) -> Union[numpy.ndarray, xr.DataArray] : + """ + Computes the local means of the input data using a sliding window defined by the kernel size. + Each element in the output is the mean of the pixels within the specified kernel size window. Args: - bands: list of bands as a numpy ndarray of dims 2 or 3. - kwargs : parameters of the computing: kernel_size + input_data (np.ndarray): A 3D numpy array of shape (1, number_of_lines, number_of_columns) + containing the Digital Height Model (DHM). + The function only accepts arrays with one band. + + kernel_size (int): The size of the sliding window used to compute the local mean. Returns: - The numpy array with the results + np.ndarray: A numpy array of the same size as `input_data` containing the computed local means. + + Raises: + ValueError: If `input_data` does not have 3 dimensions or if the first dimension is not of size 1. """ - kernel_size = kwargs.get('kernel_size', 8) # compute local sum of band pixels output = _local_sum(input_data, kernel_size) # compute local sum of band mask: number of valid pixels @@ -384,68 +622,124 @@ def local_mean(input_data, **kwargs): return np.divide(output, valid, out=np.zeros_like(output), where=valid != 0) -def adaptive_gaussian(input_data, **kwargs): - """Adaptive Gaussian Filter + +def adaptive_gaussian(input_data : Union[numpy.ndarray, xr.DataArray], kernel_size : int = 8, sigma : int = 1) -> Union[numpy.ndarray, xr.DataArray] : + """ + Applies an Adaptive Gaussian Filter to the input data that smoothes the input while preserving edges. Args: - bands: list of bands as a numpy ndarray of dims 3. First dimension muse be of size 1 - kwargs : parameters of the computing: kernel_size and sigma + input_data (np.ndarray): A 3D numpy array of shape (1, number_of_lines, number_of_columns) + containing the Digital Height Model (DHM). + The function only accepts arrays with one band. + + kernel_size (int): The size of the kernel used for the adaptive filtering. Default is 8. + + sigma (int): The standard deviation of the Gaussian distribution, which controls the level of smoothing. + Default is 1. Returns: - The numpy array with the results + np.ndarray: A numpy array of the same shape as `input_data`, containing the filtered data. + + Raises: + ValueError: If `input_data` does not have 3 dimensions or if the first dimension is not of size 1. """ if len(input_data.shape) != 3: - raise ValueError("adaptive_gaussian only accepts 3 dims numpy arrays") + raise ValueError("adaptive_gaussian only accepts 3 dims arrays") if input_data.shape[0] != 1: - raise ValueError("adaptive_gaussian only accepts numpy arrays with first dim of size 1") + raise ValueError("adaptive_gaussian only accepts arrays with first dim of size 1") - kernel_size = kwargs.get('kernel_size', 8) - sigma = kwargs.get('sigma', 1) dtype = input_data.dtype + input_np = input_data.values - w_1 = (input_data[0, :, :-2] - input_data[0, :, 2:]) ** 2 - w_2 = (input_data[0, :-2, :] - input_data[0, 2:, :]) ** 2 + w_1 = (input_np[0, :, :-2] - input_np[0, :, 2:]) ** 2 + w_2 = (input_np[0, :-2, :] - input_np[0, 2:, :]) ** 2 w = np.exp(-(w_1[1:-1, :] + w_2[:, 1:-1]) / (2 * sigma ** 2)) w_sum = signal.convolve2d(w, np.ones((3, 3), dtype=dtype), boundary='symm', mode='same') w_sum += np.finfo(dtype).eps - out = input_data + + out = np.copy(input_np) + for i in range(kernel_size): - prod = w * out[0, 1:-1, 1:-1] + prod = w * input_np[0, 1:-1, 1:-1] conv = signal.convolve2d(prod, np.ones((3, 3), dtype=dtype), boundary='symm', mode='same') out[0, 1:-1, 1:-1] = conv / w_sum - return out + return xr.DataArray(out, dims=input_data.dims, coords=input_data.coords) +def _pad_dataset_xarray(dataset : xr.DataArray, pad: tuple, pad_mode: str): + """ + Pads a xarray dataset along spatial dimensions (x and y) based on the specified padding values and mode. + Padding can be applied using various modes such as constant, edge, reflect, etc., as supported by xarray. + + Args: + dataset (xarray.Dataset): The input xarray dataset to be padded. + It is expected to have dimensions "band", "y", and "x". + + pad (tuple): A tuple of two integers specifying the number of pixels to pad in the x and y dimensions. + + pad_mode (str): The padding mode to use. Options include "constant", "edge", "reflect", etc., + as supported by xarray's `pad` method. + + Returns: + xarray.Dataset: A new xarray dataset with the specified padding applied to the "x" and "y" dimensions. + The "band" dimension remains unchanged. + + Raises: + ValueError: If the `pad` tuple does not contain exactly two elements or if the padding mode is invalid. + + """ + # pad the dataset if necessary + padx, pady = pad + pad_width = {"band" : (0,0), "y": pady, "x": padx} + pad_dataset = dataset.pad(pad_width=pad_width, mode=pad_mode) + + return pad_dataset -def svf(input_data, **kwargs): - """Sky View Factor computing. The input data consist in a Digital Height Model. +def svf(input_data : Union[numpy.ndarray, xr.DataArray], pad_mode : str, radius : int = 8, directions : int = 12, resolution : float = 0.5, altitude = None) -> Union[numpy.ndarray, xr.DataArray]: + + """ + Computes the Sky View Factor (SVF), which represents the fraction of the visible sky from each point in a Digital Height Model (DHM). + + More information about the Sky View Factor can be found `here `_. Args: - bands: list of bands as a numpy ndarray of dims 3. First dimension is of size 1. - kwargs: parameters of the computing: radius, directions, resolution and altitude. + input_data (np.ndarray): A 3D numpy array of shape (1, number_of_lines, number_of_columns) containing the Digital Height Model (DHM). + The function only accepts arrays with one band (the first dimension must be 1). + + radius (int): The maximum distance (in pixels) around each point to evaluate the horizontal elevation angle. Default is 8. + + direction (int): The number of discrete directions to compute the vertical angle. Default is 12. + + resolution (float): The spatial resolution of the input data in meters. Default is 0.5. + + altitude (Optional[np.ndarray]): A reference altitude to use for computing the SVF. If not specified, SVF is computed using the elevation of each point. Returns: - The numpy array with the results + np.ndarray: A numpy array of the same size as `input_data`, containing the Sky View Factor for each point, + where values range from 0 (no visible sky) to 1 (full sky visibility). + + Raises: + ValueError: If `input_data` does not have 3 dimensions or if the first dimension is not of size 1. + """ if len(input_data.shape) != 3: raise ValueError("svf only accepts 3 dims numpy arrays") if input_data.shape[0] != 1: raise ValueError("svf only accepts numpy arrays with first dim of size 1") - radius = kwargs.get('radius', 8) - nb_directions = kwargs.get('directions', 12) - resolution = kwargs.get('resolution', 0.5) - altitude = kwargs.get('altitude', None) - # initialize output - shape = input_data.shape - out = np.zeros(shape, dtype=np.float32) + out = np.zeros(input_data.shape, dtype=np.float32) - # prevent nodata problem - input_band = np.nan_to_num(input_data[0], copy=False, nan=0) + #Pad the input data + pad = ((radius, radius), (radius, radius)) + pad_src = _pad_dataset_xarray(input_data, pad, pad_mode) + shape = pad_src.shape + + # change the NaN in the input array to 0 + input_band = np.nan_to_num(pad_src[0], copy=False, nan=0) # compute directions - axes = [_bresenham_line(360 * i / nb_directions, radius) - for i in range(nb_directions)] + axes = [_bresenham_line(360 * i / directions, radius) + for i in range(directions)] # get altitude of current point to consider for computing elevation angle if altitude is None: @@ -465,69 +759,28 @@ def svf(input_data, **kwargs): # SVF = (cosinus de l'angle avec la relation : cos² = sqrt(1 / (1+tan²)) ratios = 1 / np.sqrt(ratios**2 + 1) # = np.sin(np.arctan(ratios / self.pixel_size)) - out[0, radius: shape[1] - radius, radius: shape[2] - radius] += ratios + out[0] += ratios - out /= nb_directions - return out + out /= directions + return xr.DataArray(out, dims = input_data.dims, coords = input_data.coords) -def hillshade(input_data, **kwargs): - """Hillshades computing. The input data consist in a Digital Height Model. - Args: - bands: list of bands as a numpy ndarray of dims 3. First dimension is of size 1. - kwargs: parameters of the computing: elevation, azimuth, radius and resolution - - Returns: - The numpy array with the results +def _bresenham_line(theta : int, radius : int) -> tuple : """ - if len(input_data.shape) != 3: - raise ValueError("hillshade only accepts 3 dims numpy arrays") - if input_data.shape[0] != 1: - raise ValueError("hillshade only accepts numpy arrays with first dim of size 1") - - elevation = np.radians(kwargs.get('elevation', 0.0)) - azimuth = kwargs.get('azimuth', 0.0) - radius = kwargs.get('radius', 8) - resolution = kwargs.get('resolution', 0.5) - - # initialize output - shape = input_data.shape - out = np.zeros(shape, dtype=bool) - - # prevent nodata problem - input_band = np.nan_to_num(input_data[0], copy=False, nan=0) - - # compute direction - axe = _bresenham_line(180 - azimuth, radius) - - # identify the largest elevation in the radius - view = input_band[radius: shape[1] - radius, radius: shape[2] - radius] - ratios = np.zeros((shape[1] - 2 * radius, shape[2] - 2 * radius), dtype=np.float32) - for x_tr, y_tr, r in axe: - new_ratios = input_band[radius + x_tr: shape[1] - radius + x_tr, - radius + y_tr: shape[2] - radius + y_tr] - view - # tangente de l'angle - new_ratios /= (r * resolution) - ratios = np.maximum(ratios, new_ratios) - - angles = np.arctan(ratios) - out[0, radius: shape[1] - radius, radius: shape[2] - radius] = angles > elevation - - return out - + Implementation of the `Bresenham's line algorithm `_ -def _bresenham_line(theta, radius): - """Implementation of the Bresenham's line algorithm: - https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm + This function generates points along a line from the origin (0, 0) based on the given angle (theta) + and length (radius). - Params: - theta: theta angle (in degrees) - radius: size of the line + Args: + theta (int): The angle of the line in degrees (0 degrees points to the right, 90 degrees points up). + radius (int): The length of the line in units. If radius is less than or equal to zero, an empty list will be returned. Returns: - Tuple with the coordinates of the line points from point (0, 0) - ((0, 0) is not included). + list: A list of tuples representing the coordinates of the line points in the format + (x, y, r), where (x, y) are the coordinates of the point and r is the distance + from the origin to that point. The origin point (0, 0) is not included. """ x, y = 0, 0 dx = math.cos(math.radians(theta)) @@ -560,3 +813,65 @@ def _bresenham_line(theta, radius): pts.append((x, y, r)) return pts + + +def hillshade(input_data : Union[numpy.ndarray, xr.DataArray], pad_mode : str, elevation : float = 0.0, azimuth : float = 0.0, radius : int = 8, resolution : float = 0.5) -> Union[numpy.ndarray, xr.DataArray] : + """ + Computes a mask of cast shadows in a Digital Height Model (DHM). + + This function calculates the shadows based on the specified elevation and azimuth angles, + and returns a mask indicating where shadows are cast. + + Args: + input_data (np.ndarray): A 3D numpy array of shape (1, number_of_lines, number_of_columns) containing the Digital Height Model (DHM). + The function only accepts arrays with one band. + + elevation (float): The angle (in degrees) between the horizon and the line of sight from an observer to the satellite. + + azimuth (float): The angle (in degrees) between true north and the projection of the satellite's position onto the horizontal plane, + measured in a clockwise direction. + + radius (int): The radius around each pixel to consider when calculating shadows. + + resolution (float): The spatial resolution of the input data, used for scaling calculations. + + Returns: + np.ndarray: A boolean numpy array of the same size as `input_data`, indicating the mask of cast shadows, + where True represents shadowed areas and False represents illuminated areas. + + Raises: + ValueError: If the input_data does not have 3 dimensions or if the first dimension is not of size 1. + """ + if len(input_data.shape) != 3: + raise ValueError("hillshade only accepts 3 dims numpy arrays") + if input_data.shape[0] != 1: + raise ValueError("hillshade only accepts numpy arrays with first dim of size 1") + + # initialize output + out = np.zeros(input_data.shape, dtype=np.float32) + + # Pad the input data + pad = ((radius, radius), (radius, radius)) + pad_src = _pad_dataset_xarray(input_data, pad, pad_mode) + shape = pad_src.shape + + # prevent nodata problem + input_band = np.nan_to_num(pad_src[0], copy=False, nan=0) + + # compute direction + axe = _bresenham_line(180 - azimuth, radius) + + # identify the largest elevation in the radius + view = input_band[radius: shape[1] - radius, radius: shape[2] - radius] + ratios = np.zeros((shape[1] - 2 * radius, shape[2] - 2 * radius), dtype=np.float32) + for x_tr, y_tr, r in axe: + new_ratios = input_band[radius + x_tr: shape[1] - radius + x_tr, + radius + y_tr: shape[2] - radius + y_tr] - view + # tangente de l'angle + new_ratios = (r * resolution) / new_ratios + ratios = np.maximum(ratios, new_ratios) + + angles = np.arctan(ratios) + out[0] = angles > elevation + + return xr.DataArray(out, dims = input_data.dims, coords = input_data.coords) diff --git a/src/eolab/rastertools/processing/rasterproc.py b/src/eolab/rastertools/processing/rasterproc.py index f5fde301..5290287c 100644 --- a/src/eolab/rastertools/processing/rasterproc.py +++ b/src/eolab/rastertools/processing/rasterproc.py @@ -5,14 +5,20 @@ """ from typing import List, Callable, Union +import numpy import numpy as np from eolab.rastertools.processing import algo from eolab.rastertools.product import BandChannel +import xarray as xr class RasterProcessing: - """This class defines a processing on a raster image. + """ + Defines a processing algorithm for raster image data. + + This class allows users to define custom processing operations on raster data + by specifying an algorithm, data types, compression, and other parameters. """ def __init__(self, name: str, @@ -70,7 +76,7 @@ def name(self) -> str: @property def algo(self) -> Callable: - """Processing algo that is called on a multidimensional array of data""" + """Process an algo that is called on a multidimensional array of data""" return self._algo @property @@ -101,7 +107,7 @@ def compress(self) -> str: @property def nbits(self) -> int: - """bits size of the generated data""" + """Bits size of the generated data""" return self._nbits @property @@ -151,9 +157,8 @@ def with_arguments(self, arguments): Args: arguments (Dict[str, Dict]): Dictionary where the keys are the arguments' names and the values are dictionaries - of arguments' properties as defined in ArgumentParser.add_argument - see - https://docs.python.org/3/library/argparse.html#argparse.ArgumentParser. - The properties dictionaries are used to configure the command line 'rastertools'. + of arguments' properties as defined in `ArgumentParser.add_argument `_ . + The properties dictionaries are used to configure the command line 'rastertools'.* The possible keys are: action, nargs, const, default, type, choices, required, help, metavar and dest @@ -173,7 +178,8 @@ def configure(self, argsdict): [setattr(self, argument, argsdict[argument]) for argument in self.arguments if argument in argsdict] - def compute(self, input_data: Union[List[np.ndarray], np.ndarray]): + + def compute(self, input_data: Union[List[np.ndarray], np.ndarray, List[xr.DataArray], xr.DataArray]) -> Union[numpy.ndarray, xr.DataArray]: """Compute the output from the different bands of the input data. Output data are supposed to be the same size as input_data. @@ -183,7 +189,7 @@ def compute(self, input_data: Union[List[np.ndarray], np.ndarray]): with all bands Returns: - Output data + Numpy array or list of numpy arrays of the size of input data """ if self.algo is not None: argparameters = {arg: getattr(self, arg, None) for arg in self.arguments} @@ -212,7 +218,7 @@ def channels(self) -> List[BandChannel]: """List of channels necessary to compute the radiometric indice""" return self._channels - def with_channels(self, channels: List[BandChannel]): + def with_channels(self, channels: List[BandChannel]) : """Set the BandChannels necessary to compute the radiometric indice Args: diff --git a/src/eolab/rastertools/processing/sliding.py b/src/eolab/rastertools/processing/sliding.py index 0c5c2614..0ccb3264 100644 --- a/src/eolab/rastertools/processing/sliding.py +++ b/src/eolab/rastertools/processing/sliding.py @@ -4,7 +4,6 @@ This module defines a method to run a RasterProcessing on sliding windows. """ from itertools import repeat -import logging import logging.config import os from typing import List @@ -19,73 +18,84 @@ from eolab.rastertools import utils from eolab.rastertools.processing import RasterProcessing - _logger = logging.getLogger(__name__) def compute_sliding(input_image: str, output_image: str, rasterprocessing: RasterProcessing, window_size: tuple = (1024, 1024), window_overlap: int = 0, pad_mode: str = "edge", bands: List[int] = None): - """Run a given raster processing on an input image and produce the output image + """ + Apply a sliding window raster processing operation on an input image and save the result. + + This function processes a raster image in small sliding windows, allowing efficient + memory management for large datasets by processing chunks. The specified `rasterprocessing` + operation is applied to each window, with options for padding and overlapping windows. Args: - input_image (str): - Path of the raster to compute - output_image (str): - Path of the output raster image - rasterprocessing ([:obj:`eolab.rastertools.processing.RasterProcessing`]): - Processing to apply on input image - window_size (tuple(int, int), optional, default=(1024, 1024)): - Size of windows for splitting the processed image in small parts - window_overlap (int, optional, default=0): - Number of pixels in the window that shall overlap previous (or next) window - pad_mode (str, optional, default="edge"): - Mode for padding data around the windows that are on the edge of the image - (See https://numpy.org/doc/stable/reference/generated/numpy.pad.html) - bands ([int], optional, default=None): - List of bands to process. None if all bands shall be processed + input_image (str): Path to the input raster image file to be processed. + output_image (str): Path to save the output raster image after processing. + rasterprocessing (RasterProcessing): A processing object defining the algorithm and + parameters to apply on each window of the input image. + window_size (tuple(int, int), optional): Size of each window for processing, + default is (1024, 1024). + window_overlap (int, optional): Number of pixels to overlap between consecutive windows, + default is 0. + pad_mode (str, optional, default="edge"): Padding mode for the edges of the windows, default is "edge". + Refer to `numpy.pad src.count: - raise ValueError(f"Invalid bands, all values are not in range [1, {src.count}]") - - # setup profile for output image - profile.update(driver='GTiff', blockxsize=blockxsize, blockysize=blockysize, - tiled=True, dtype=dtype, nbits=nbits, compress=compress, - nodata=nodata, count=len(bands)) - - with rasterio.open(output_image, "w", **profile): - # file is created - pass - - # create the generator of sliding windows - sliding_gen = _sliding_windows((src.width, src.height), - window_size, window_overlap) - if rasterprocessing.per_band_algo: - sliding_windows_bands = [(w, [b]) for w in sliding_gen for b in bands] - else: - sliding_windows_bands = [(w, bands) for w in sliding_gen] + src = rasterio.open(input_image) + profile = src.profile + + # set block size + blockxsize, blockysize = window_size + if src.width < blockxsize: + blockxsize = utils.highest_power_of_2(src.width) + if src.height < blockysize: + blockysize = utils.highest_power_of_2(src.height) + + # dtype and creation options of output data + dtype = rasterprocessing.dtype or rasterio.float32 + in_dtype = rasterprocessing.in_dtype or dtype + nbits = rasterprocessing.nbits + compress = rasterprocessing.compress or src.compression or 'lzw' + nodata = rasterprocessing.nodata or src.nodata + + # check band index and handle all bands options (when bands is an empty list) + if bands is None or len(bands) == 0: + bands = src.indexes + elif min(bands) < 1 or max(bands) > src.count: + raise ValueError(f"Invalid bands, all values are not in range [1, {src.count}]") + + # setup profile for output image + profile.update(driver='GTiff', blockxsize=blockxsize, blockysize=blockysize, + tiled=True, dtype=dtype, nbits=nbits, compress=compress, + nodata=nodata, count=len(bands)) + + with rasterio.open(output_image, "w", **profile): + # file is created + pass + + # create the generator of sliding windows + sliding_gen = _sliding_windows((src.width, src.height), + window_size, window_overlap) + + if rasterprocessing.per_band_algo: + sliding_windows_bands = [(w, [b]) for w in sliding_gen for b in bands] + else: + sliding_windows_bands = [(w, bands) for w in sliding_gen] + src.close() m = multiprocessing.Manager() write_lock = m.Lock() diff --git a/src/eolab/rastertools/processing/stats.py b/src/eolab/rastertools/processing/stats.py index b4ae720b..0abbbe49 100644 --- a/src/eolab/rastertools/processing/stats.py +++ b/src/eolab/rastertools/processing/stats.py @@ -9,13 +9,13 @@ import datetime import numpy as np +import rioxarray from scipy.stats import median_abs_deviation import pandas as pd import geopandas as gpd import matplotlib import matplotlib.pyplot as plt import rasterio -from rasterio import features from tqdm import tqdm from eolab.rastertools.utils import get_metadata_name @@ -26,141 +26,203 @@ def compute_zonal_stats(geoms: gpd.GeoDataFrame, image: str, bands: List[int] = [1], stats: List[str] = ["min", "max", "mean", "std"], categorical: bool = False) -> List[List[Dict[str, float]]]: - """Compute the statistics of an input image for each feature in the shapefile + """ + Compute zonal statistics for an input raster image over specified geometries. + + This function calculates statistical summaries (e.g., min, max, mean, standard deviation) + for each feature in the provided geometries (GeoDataFrame) using the specified raster image. + If the raster is categorical, the function can compute counts of unique values. Args: - geoms (GeoDataFrame): - Geometries where to compute stats - image (str): - Filename of the input image to process - bands ([int], optional, default=[1]): - List of bands to process in the input image - stats ([str], optional, default=["min", "max","mean", "std"]): - List of stats to computed - categorical (bool, optional, default=False): - Whether to treat the input raster as categorical + geoms (GeoDataFrame): Geometries where to compute stats + image (str): Filename of the input image to process + bands (list, optional, default=[1]): List of bands to process in the input image + stats (list, optional, default=["min", "max", "mean", "std"]): List of stats to computed + categorical (bool, optional, default=False): Whether to treat the input raster as categorical Returns: - statistics: a list of list of dictionnaries. First list on ROI, second on bands. - Dict associates the stat names and the stat values. + statistics: a list of lists of dictionaries. The first list corresponds to the geometries, the second corresponds to the bands. + Each dictionary associates the stat names and the stat values. """ - statistics = [] - nb_geoms = len(geoms) - with rasterio.open(image) as src: - geom_gen = (geoms.iloc[i].geometry for i in range(nb_geoms)) - geom_windows = ((geom, features.geometry_window(src, [geom])) for geom in geom_gen) + with rasterio.Env(GDAL_VRT_ENABLE_PYTHON=True): + # Open the raster image using rioxarray + raster = rioxarray.open_rasterio(image, masked=True) + # Initialize statistics list statistics = [] + # Prepare progress bar disable = os.getenv("RASTERTOOLS_NOTQDM", 'False').lower() in ['true', '1'] - for geom, window in tqdm(geom_windows, total=nb_geoms, disable=disable, desc="zonalstats"): - data = src.read(bands, window=window) - transform = src.window_transform(window) - - s = _compute_stats((data, transform, [geom], window), - src.nodata, stats, categorical) - statistics.append(s) + # Iterate through geometries + for _, geom in tqdm(geoms.iterrows(), total=len(geoms), disable=disable, desc="zonalstats"): + geom = geom.geometry + # # Calculate the bounds and clip the raster + minx, miny, maxx, maxy = geom.bounds + window_raster = raster.sel( + x=slice(minx, maxx), + y=slice(maxy, miny), # Inverted y for correct orientation + ) + # Make sure the expanded geometry is in the same CRS as the raster + + # Mask the raster to the geometry + clipped = window_raster.rio.clip([geom], geoms.crs, drop=False) + clipped_data = clipped.sel(band=bands) + # Compute statistics for each band + band_stat = [] + for band_data in clipped_data.values: + # Compute the statistics + feature_stats = _compute_stats(band_data, clipped_data.rio.nodata, stats, categorical) + + band_stat.append(feature_stats) + + # Append the computed statistics for the current geometry + statistics.append(band_stat) return statistics +def _compute_stats(data, nodata : int, stats: List[str], categorical: bool = False, prefix_stats: str = "") -> Dict[str, float]: + """Compute the statistics for a single band (numpy array). + + Args: + data: numpy array (masked or not) containing the raster values for the current geometry. + stats: List of statistics to compute (e.g., "mean", "min", "max", etc.). + categorical: Whether to compute categorical statistics (default False). + + Returns: + Dictionary with statistics for the current data array (band). + """ + + feature_stats = {} + + # List of functions for computing statistics + functions = { + 'min': np.min, + 'max': np.max, + 'mean': np.mean, + 'sum': np.ma.sum, + 'std': np.std, + 'median': np.ma.median, + } + + # Mask for nodata + if nodata is not None and np.isnan(nodata): + mask = np.isnan(data) + else: + mask = (data == nodata) | np.isnan(data) + + # Create a masked array + dataset = np.ma.MaskedArray(data, mask=mask) + # Calculate the requested statistics + for stat in stats: + if stat in functions: + feature_stats[f'{prefix_stats}{stat}'] = float(functions[stat](dataset)) + + # Compute range if required (max - min) + if 'range' in stats: + feature_stats[f'{prefix_stats}range'] = float(feature_stats.get('max', np.max(dataset)) - feature_stats.get('min', np.min(dataset))) + + # Compute percentiles if requested + for pctile in [s for s in stats if s.startswith('percentile_')]: + q = float(pctile.replace("percentile_", '')) + feature_stats[f'{prefix_stats}{pctile}'] = np.nanpercentile(dataset.compressed(), q) + if 'mad' in stats: + feature_stats[f'{prefix_stats}mad'] = median_abs_deviation(dataset.compressed().flatten()) + + count = dataset.count() + # generate the counting stats + if "count" in stats: + feature_stats[f'{prefix_stats}count'] = count + if 'valid' in stats or 'nodata' in stats: + all_count = np.count_nonzero(~mask) + if 'nodata' in stats: + feature_stats[f'{prefix_stats}nodata'] = all_count - count + if 'valid' in stats: + valid = 1.0 * count / (all_count + 1e-5) + feature_stats[f'{prefix_stats}valid'] = valid + + feature_stats.update(_gen_stats_cat(dataset, nodata, stats, categorical, prefix_stats)) + return feature_stats + + def compute_zonal_stats_per_category(geoms: gpd.GeoDataFrame, image: str, bands: List[int] = [1], stats: List[str] = ["min", "max", "mean", "std"], categories: gpd.GeoDataFrame = None, category_index: str = 'Classe', category_labels: Dict[str, str] = None): - """Compute the statistics of an input image for each feature in the shapefile + """ + Compute zonal statistics for an input raster image, categorized by specified subregions. + + This function calculates statistical metrics for a raster image over a set of geometries + (e.g., polygons) provided in `geoms`. If a set of categories (subregions within each geometry) + is provided, statistics are computed separately for each category within each geometry. Args: geoms (GeoDataFrame): - Geometries where to compute stats + A GeoDataFrame containing the input geometries (e.g., polygons) to compute + statistics over. image (str): - Filename of the input image to process - bands ([int], optional, default=[1]): - List of bands to process in the input image - stats ([str], optional, default=["min", "max", "mean", "std"]): - List of stats to computed - categories (GeoDataFrame, optional, default=None): - The geometries defining the categories. - category_index (str, optional, default='Classe'): - Name of the column in category file (when it is a vector) that - contains the category index - category_labels (Dict[str, str], optional, default=None): - Dict that associates the category values and category names + The file path to the input raster image. + bands (List[int], optional): + A list of raster band indices to process. Defaults to [1] (the first band). + stats (List[str], optional): + A list of statistical metrics to compute. Supported values include: + - "min": Minimum value within the geometry. + - "max": Maximum value within the geometry. + - "mean": Mean value within the geometry. + - "std": Standard deviation within the geometry. + Defaults to ["min", "max", "mean", "std"]. + categories (GeoDataFrame, optional): + A GeoDataFrame containing category geometries that define subregions of the + input geometries. Defaults to None. + category_index (str, optional): + The column in the `categories` GeoDataFrame that identifies category labels + for each geometry. Defaults to 'Classe'. + category_labels (Dict[str, str], optional): + A dictionary mapping category values (from `category_index`) to human-readable + labels. If provided, these labels replace category values in the output. + Defaults to None. Returns: - statistics ([[Dict[str, float]]]): a list of list of dictionnaries. - First list on ROI, second on bands. Dict associates the stat names and the stat values. - + List[List[Dict[str, float]]]: + A nested list of dictionaries containing the computed statistics: + - Outer list corresponds to each input geometry in `geoms`. + - Inner list corresponds to each raster band being processed. + - Each dictionary maps statistic names to their respective values. """ - def _get_list_of_polygons(geom): - """Get the list of polygons from the geometry""" - polygons = None - if geom.geom_type == 'MultiPolygon': - polygons = list(geom.geoms) - elif geom.geom_type == 'Polygon': - polygons = list([geom]) - else: - raise IOError('Shape is not a polygon.') - return polygons - statistics = [] # Process geometries one by one nb_geoms = len(geoms) - nb_bands = len(bands) - - with rasterio.open(image) as src: - # each input geometry is split following the categorical geometries. - # geom_by_class contains the list of categorical geometries (one list of categorical - # geometries per input geometry) - geom_gen = (geoms.iloc[[i]] for i in range(nb_geoms)) - geom_by_class = [filter_dissolve(roi, categories, id=category_index) - for roi in geom_gen] - - # Compute the number of categorical geometries for each input geometry - nb_class_roi = [geom_by_class.shape[0] for geom_by_class in geom_by_class] - - # compute stats prefix - index_list_roi = [str(el) - for geom_by_class in geom_by_class - for el in geom_by_class[category_index]] - - # change index_list_roi names if a dict is given - if category_labels: - index_list_roi = [category_labels[el] if el in category_labels else el - for el in index_list_roi] - - # Generator to creates windows associated with each category - # geom_window_gen is a generator whose elements are list of geometries per class and per roi - geom_windows = [(_get_list_of_polygons(geom), - features.geometry_window(src, _get_list_of_polygons(geom))) - for geom_by_class in geom_by_class - for geom in geom_by_class.geometry] - - substats = [] - disable = os.getenv("RASTERTOOLS_NOTQDM", 'False').lower() in ['true', '1'] - for geom_window, stats_prefix in tqdm(zip(geom_windows, index_list_roi), - disable=disable, desc="zonalstats"): - """Read input raster and compute stats""" - geom, window = geom_window - data = src.read(bands, window=window) - transform = src.window_transform(window) + # Open raster using rioxarray + with rioxarray.open_rasterio(image, masked=True) as src: + # Loop over geometries (ROIs) + for i in range(nb_geoms): + roi_geom = geoms.iloc[[i]] # Select the current geometry - s = _compute_stats((data, transform, geom, window), - src.nodata, stats, False, stats_prefix) - substats.append(s) + # Clip the raster to the current geometry + roi_raster = src.rio.clip(roi_geom.geometry) - offset = 0 - # re-order output so that all stats of catagorical geometries that correspond - # to the same input geometry are concatenated in the same list - for i in range(nb_geoms): - results_roi = [{}] * nb_bands - [results_roi[u].update(substats[v + offset][u]) - for u in range(nb_bands) - for v in range(nb_class_roi[i])] - offset = offset + nb_class_roi[i] - statistics.append(results_roi) + roi_statistics = {} + category_geoms = filter_dissolve(roi_geom, categories, id=category_index) + + prefix_stats = [str(cat[category_index]) for _, cat in category_geoms.iterrows()] + + # change index_list_roi names if a dict is given + if category_labels: + prefix_stats = [category_labels[el] if el in category_labels else el + for el in prefix_stats] + + for prefix, (_, cat_geom) in zip(prefix_stats, category_geoms.iterrows()): + # Clip the raster to categorical geometry provided + cat_raster = roi_raster.rio.clip([cat_geom.geometry], drop=True) + + # Compute stats for each band + for band in bands: + band_data = cat_raster.sel(band=band) + roi_statistics.update(_compute_stats(band_data.values, cat_raster.rio.nodata, stats, prefix_stats = prefix)) + + statistics.append([roi_statistics]) return statistics @@ -214,19 +276,63 @@ def extract_zonal_outliers(geoms: gpd.GeoDataFrame, image: str, outliers_image: def plot_stats(chartfile: str, stats_per_date: Dict[datetime.datetime, gpd.GeoDataFrame], stats: List[str] = ["min", "max", "mean", "std"], index_name: str = 'ID', display: bool = False): - """Plot the statistics. + """ + Plot temporal statistics for geometries across multiple dates. + + This function visualizes the evolution of specified statistics (e.g., "min", "mean") + over time for different zones defined in the input GeoDataFrames. The output is + saved as a chart file, and optionally displayed. Args: chartfile (str): - Name of the chartfile to generate + Path to the file where the generated chart will be saved. stats_per_date (Dict[datetime.datetime, gpd.GeoDataFrame]): - A dict that associates a date and the statistics for this date - stats ([str], optional, default=["min", "max", "mean", "std"]): - List of stats to plot - index_name (str, optional, default='ID'): - List of bands to process in the input image - display (bool, optional, default=False): - Whether to display the generated plot + A dictionary mapping each date to a GeoDataFrame containing the statistics + for that date. Each GeoDataFrame should include the specified `index_name` + column and relevant statistics columns. + stats (List[str], optional): + A list of statistics to plot (e.g., "min", "max", "mean", "std"). Defaults + to ["min", "max", "mean", "std"]. + index_name (str, optional): + Name of the column in the GeoDataFrames that uniquely identifies the zones + (e.g., region IDs). Defaults to 'ID'. + display (bool, optional): + If `True`, the generated plot is displayed after saving. Defaults to `False`. + + Raises: + ValueError: + If the specified `index_name` is not present in the combined GeoDataFrame. + + Notes: + - The `stats_per_date` dictionary must be ordered or sortable by date to ensure + proper time-series plotting. + - Each GeoDataFrame in `stats_per_date` should have columns named in the format + `.` (e.g., "temperature.mean"). + + Example: + ``` + import geopandas as gpd + import datetime + from plot_tools import plot_stats + + # Example input + stats_per_date = { + datetime.datetime(2023, 1, 1): gpd.GeoDataFrame({...}), + datetime.datetime(2023, 2, 1): gpd.GeoDataFrame({...}), + } + + plot_stats( + chartfile="output_chart.png", + stats_per_date=stats_per_date, + stats=["mean", "std"], + index_name="RegionID", + display=True + ) + ``` + + Output: + - Saves a time-series plot of the specified statistics as `chartfile`. + - Optionally displays the plot if `display=True`. """ # convert dates to datenumber format @@ -271,127 +377,7 @@ def plot_stats(chartfile: str, stats_per_date: Dict[datetime.datetime, gpd.GeoDa plt.show() -def _compute_stats(pack, nodata, stats: List[str] = None, - categorical: bool = False, prefix_stats: str = ""): - """Compute the statistics. - - Args: - pack: - A quadruplet containing an array of data (1 per band), the geo transform, the geometry - where to compute stats, and the window corresponding to the geometry - nodata: - The value that corresponds to nodata - stats: - The list of stats to compute - categorical: - Whether to consider the input raster as categorical - prefix_stats: - A prefix to name the stats - - Returns: - A list of statistics (one item per band). Statistics are provided as a dict that associates - the stats names and the stats values. - """ - datas, transform, geom, window = pack - - # prepare the mask to apply to input dataset: any pixel outside the geom shall be masked - all_geoms = [(g, 1) for g in geom] - mask = features.rasterize(shapes=all_geoms, - fill=0, out_shape=rasterio.windows.shape(window), - transform=transform, - dtype=rasterio.uint8).astype(bool) - - # list of stats computed, one item per band - all_stats = [] - # for every bands - for data in datas: - # create the dataset on which stats will be computed - if nodata and np.isnan(nodata): - dataset = np.ma.MaskedArray(data, mask=(np.isnan(data) | ~mask)) - else: - dataset = np.ma.MaskedArray(data, mask=((data == nodata) | ~mask)) - - count = dataset.count() - if count == 0: - # nothing here, fill with None and move on - feature_stats = dict([(stat, None) for stat in stats]) - else: - # generate the statistics - feature_stats = _gen_stats(dataset, stats, categorical, prefix_stats) - # generate the categorical statistics - feature_stats.update(_gen_stats_cat(dataset, stats, categorical, prefix_stats)) - - # generate the counting stats - if "count" in stats: - feature_stats[f'{prefix_stats}count'] = count - if 'valid' in stats or 'nodata' in stats: - all_count = np.count_nonzero(mask) - if 'nodata' in stats: - feature_stats[f'{prefix_stats}nodata'] = all_count - count - if 'valid' in stats: - valid = 1.0 * count / (all_count + 1e-5) - feature_stats[f'{prefix_stats}valid'] = valid - - # append the generated stats to the structure that contains the stats for all bands - all_stats.append(feature_stats) - return all_stats - - -def _gen_stats(dataset, stats: List[str] = None, - categorical: bool = False, prefix_stats: str = ""): - """Generates the statistics - - Args: - dataset: - The dataset (numpy MaskedArray) from which stats are computed - stats: - The stats to compute - categorical: - Whether to consider the input raster as categorical - prefix_stats: - A prefix to name the stats - - Returns: - The list of statistics for the input dataset as a dict that associates the - stats names and the stats values. - - """ - feature_stats = dict() - - # compute stats - functions = { - 'min': np.ma.min, - 'max': np.ma.max, - 'mean': np.ma.mean, - 'sum': np.ma.sum, - 'std': np.ma.std, - 'median': np.ma.median - } - - for key, function in functions.items(): - if key in stats: - feature_stats[f'{prefix_stats}{key}'] = float(function(dataset)) - - if 'range' in stats: - min_key = f'{prefix_stats}min' - rmin = feature_stats[min_key] if min_key in feature_stats.keys() else float(dataset.min()) - max_key = f'{prefix_stats}max' - rmax = feature_stats[max_key] if max_key in feature_stats.keys() else float(dataset.max()) - feature_stats[f'{prefix_stats}range'] = rmax - rmin - - # compute percentiles on the compressed dataset (i.e. the numpy array without the masked values) - # because np.ma has no percentile computation capabilities - dataset_com = dataset.compressed() - for pctile in [s for s in stats if s.startswith('percentile_')]: - q = float(pctile.replace("percentile_", '')) - feature_stats[f'{prefix_stats}{pctile}'] = np.percentile(dataset_com, q) - if 'mad' in stats: - feature_stats[f'{prefix_stats}mad'] = median_abs_deviation(dataset_com.flatten()) - - return feature_stats - - -def _gen_stats_cat(dataset, stats: List[str] = None, +def _gen_stats_cat(dataset, nodata, stats: List[str] = None, categorical: bool = False, prefix_stats: str = ""): """Generates the statistics @@ -414,10 +400,15 @@ def _gen_stats_cat(dataset, stats: List[str] = None, # if categorical stats is requested, extract all unique values from the dataset if categorical or 'majority' in stats or 'minority' in stats or 'unique' in stats: keys, counts = np.unique(dataset.compressed(), return_counts=True) + # Filter out nan + if nodata in keys : + keys, counts = keys[~nodata], counts[~nodata] + # pixel_count is a dict that associates a unique value with the number # of occurrences in the dataset pixel_count = dict(zip([k.item() for k in keys], [c.item() for c in counts])) + # del pixel_count[nodata] # initialize the feature_stats dict feature_stats = dict(pixel_count) if categorical else {} diff --git a/src/eolab/rastertools/processing/vector.py b/src/eolab/rastertools/processing/vector.py index 22b0b1de..a7fad4c7 100644 --- a/src/eolab/rastertools/processing/vector.py +++ b/src/eolab/rastertools/processing/vector.py @@ -10,10 +10,12 @@ import numpy as np import pandas as pd import geopandas as gpd +import rioxarray import shapely.geometry from osgeo import gdal import rasterio -from rasterio import features, warp, windows +from rasterio import features, warp +from shapely.geometry import shape from eolab.rastertools import utils @@ -70,7 +72,7 @@ def filter(geoms: Union[gpd.GeoDataFrame, Path, str], raster: Union[Path, str], l, b, r, t = dataset.bounds px, py = ([l, l, r, r], [b, t, t, b]) - if(geoms_crs != dataset.crs): + if (geoms_crs != dataset.crs): px, py = warp.transform(dataset.crs, geoms_crs, [l, l, r, r], [b, t, t, b]) polygon = shapely.geometry.Polygon([(x, y) for x, y in zip(px, py)]) @@ -120,7 +122,7 @@ def clip(geoms: Union[gpd.GeoDataFrame, Path, str], raster: Union[Path, str], l, b, r, t = dataset.bounds px, py = ([l, l, r, r], [b, t, t, b]) - if(geoms_crs != dataset.crs): + if (geoms_crs != dataset.crs): # reproject bounds in geoms crs px, py = warp.transform(dataset.crs, geoms_crs, [l, l, r, r], [b, t, t, b]) @@ -132,33 +134,29 @@ def clip(geoms: Union[gpd.GeoDataFrame, Path, str], raster: Union[Path, str], outfile = output.as_posix() if isinstance(output, Path) else output clipped_geoms.to_file(outfile, driver=driver) - return clipped_geoms + return clipped_geoms def reproject(geoms: Union[gpd.GeoDataFrame, Path, str], raster: Union[Path, str], - output: Union[Path, str] = None, driver: str = 'GeoJSON') -> gpd.GeoDataFrame: - """Reproject the geometries in the raster CRS + output: Union[Path, str] = None, driver: str = 'GeoJSON') -> gpd.GeoDataFrame: + """ + Reproject the geometries to match the CRS of the raster. Args: - geoms (str or Path or :obj:`gpd.GeoDataFrame`): - Filename of the vector data (if str) or GeoDataFrame - raster (str or Path): - Raster image - output (str or Path, optional, default=None): - File where to save the reprojected geoms - If None, nothing written to disk (only in memory) - driver (str, optional, default="GeoJSON"): - Driver to write the output + geoms (str, Path, or gpd.GeoDataFrame): Vector data (filename or GeoDataFrame). + raster (str or Path): Raster file. + output (str or Path, optional): File to save reprojected geometries. + driver (str, optional): File format for saving the output (default is "GeoJSON"). Returns: - :obj:`gpd.GeoDataFrame`: The geometries in the raster CRS + gpd.GeoDataFrame: Reprojected geometries in raster CRS. """ geometries = _get_geoms(geoms) geoms_crs = _get_geoms_crs(geometries) file = raster.as_posix() if isinstance(raster, Path) else raster with rasterio.open(file) as dataset: - if(geoms_crs != dataset.crs): + if (geoms_crs != dataset.crs): reprojected_geoms = geometries.to_crs(dataset.crs) else: reprojected_geoms = geometries @@ -216,22 +214,30 @@ def get_raster_shape(raster: Union[Path, str], output: Union[Path, str] = None, :obj:`gpd.GeoDataFrame`: The geometries in the raster CRS """ file = raster.as_posix() if isinstance(raster, Path) else raster - with rasterio.open(file) as src: - geoms = [] - for band in range(1, src.count + 1): - mask = src.read_masks(band) - data = (mask > 0).astype(np.int16) - features_gen = features.shapes(data, mask, transform=src.transform) - for geom, val in features_gen: - if val > 0: - # transform geojson like dict to shapely geometry object - geoms.append(shapely.geometry.shape(geom)) + src = rioxarray.open_rasterio(file, masked=True) + + # Initialize a list to store the geometries + geoms = [] + + # Loop through each band in the raster + for band in range(1, src.shape[0] + 1): + # Read the mask for the current band + mask = src.isel(band=band - 1).notnull().astype("uint8") + + # Convert the mask to geometries using rasterio features + features_gen = features.shapes(mask.values, mask=mask.values, transform=src.rio.transform()) + + # Collect the geometries where the value is greater than 0 + for geom, val in features_gen: + if val > 0: + # Transform the geojson-like geometry to a Shapely geometry object + geoms.append(shapely.geometry.shape(geom)) # create geo data frame df = pd.DataFrame({'geometry': geoms}) gdf = gpd.GeoDataFrame(df, geometry='geometry') # set crs - gdf.crs = src.crs + gdf.crs = src.rio.crs # dissolve all shapes per band in one shape gdf['COMMON'] = 0 raster_shape = gdf.dissolve(by='COMMON', as_index=False) @@ -294,6 +300,7 @@ def rasterize(geoms: Union[gpd.GeoDataFrame, Path, str], raster: Union[Path, str return burned + def crop(input_image: Union[Path, str], roi: Union[gpd.GeoDataFrame, Path, str], output_image: Union[Path, str]): """Crops an input image to the roi bounds. @@ -306,31 +313,31 @@ def crop(input_image: Union[Path, str], roi: Union[gpd.GeoDataFrame, Path, str], output_image (pathlib.Path or str): Filename of the generated raster image """ - pinput = input_image.as_posix() if isinstance(input_image, Path) else input_image poutput = output_image.as_posix() if isinstance(output_image, Path) else output_image geometries = reproject(dissolve(roi), pinput) geom_bounds = geometries.total_bounds - with rasterio.open(pinput) as raster: - rst_bounds = raster.bounds - bounds = (math.floor(max(rst_bounds[0], geom_bounds[0])), - math.floor(max(rst_bounds[1], geom_bounds[1])), - math.ceil(min(rst_bounds[2], geom_bounds[2])), - math.ceil(min(rst_bounds[3], geom_bounds[3]))) - geotransform = raster.get_transform() - width = np.abs(geotransform[1]) - height = np.abs(geotransform[5]) - - ds = gdal.Warp(destNameOrDestDS=poutput, - srcDSOrSrcDSTab=pinput, - outputBounds=bounds, targetAlignedPixels=True, - cutlineDSName=roi, - cropToCutline=False, - xRes=width, yRes=height, - format="VRT") - del ds + raster = rasterio.open(pinput) + rst_bounds = raster.bounds + bounds = (math.floor(max(rst_bounds[0], geom_bounds[0])), + math.floor(max(rst_bounds[1], geom_bounds[1])), + math.ceil(min(rst_bounds[2], geom_bounds[2])), + math.ceil(min(rst_bounds[3], geom_bounds[3]))) + geotransform = raster.get_transform() + width = np.abs(geotransform[1]) + height = np.abs(geotransform[5]) + + ds = gdal.Warp(destNameOrDestDS=poutput, + srcDSOrSrcDSTab=pinput, + outputBounds=bounds, targetAlignedPixels=True, + cutlineDSName=roi, + cropToCutline=False, + xRes=width, yRes=height, + format="VRT") + del ds + raster.close() def vectorize(category_raster: Union[Path, str], raster: Union[Path, str], @@ -349,33 +356,45 @@ def vectorize(category_raster: Union[Path, str], raster: Union[Path, str], Returns: :obj:`gpd.GeoDataFrame`: The geometries generated by the vectorization in the category crs """ - file = raster.as_posix() if isinstance(raster, Path) else raster + # Open raster and category raster using rioxarray + raster_path = raster.as_posix() if isinstance(raster, Path) else raster + category_raster_path = category_raster.as_posix() if isinstance(category_raster, Path) else category_raster - with rasterio.open(file) as dataset: - with rasterio.open(category_raster) as category_dataset: - # get the raster bounds in the classif crs - l, b, r, t = dataset.bounds - if(category_dataset.crs != dataset.crs): - # reproject bounds in classif crs - l, b, r, t = warp.transform_bounds(dataset.crs, category_dataset.crs, - *dataset.bounds) - - # Compute window bounds for crop - window = windows.from_bounds(l, b, r, t, category_dataset.transform) - # After reading portion of file, rasterio looses georeferencing - # Thus, we record the georef and update it to match the cropped portion - transform_offset = category_dataset.window_transform(window) - # Now, read and vectorize crop - extract = category_dataset.read(1, window=window) - new_shapes = rasterio.features.shapes(extract, transform=transform_offset) - # Store this vectorization in a GeoDataFrame - geo_df = gpd.GeoDataFrame.from_records(new_shapes, - columns=['geometry', category_column]) - geo_df['geometry'] = geo_df['geometry'].apply(lambda x: shapely.geometry.shape(x)) - geo_df[category_column] = geo_df[category_column].apply(lambda x: int(x)) - geo_df = geo_df.set_geometry("geometry") - geo_df.crs = category_dataset.crs - return geo_df + with rioxarray.open_rasterio(raster_path, masked=True) as raster_ds, \ + rioxarray.open_rasterio(category_raster_path, masked=True) as category_ds: + + # Ensure both rasters are in the same CRS + if category_ds.rio.crs != raster_ds.rio.crs: + category_ds = category_ds.rio.reproject_match(raster_ds) + + # Get the bounds of the raster and crop the category raster to these bounds + raster_bounds = raster_ds.rio.bounds() + category_ds_cropped = category_ds.rio.clip_box(*raster_bounds) + + # Read the first band for processing + category_array = category_ds_cropped[0].data + + # Vectorize the raster categories + shapes_generator = rasterio.features.shapes( + category_array, + transform=category_ds_cropped.rio.transform(), + ) + + # Convert shapes to a GeoDataFrame + geometries = [] + categories = [] + + for geom, value in shapes_generator: + if value is not None: # Exclude nodata or invalid values + geometries.append(shape(geom)) + categories.append(int(value)) + + geo_df = gpd.GeoDataFrame( + {category_column: categories, "geometry": geometries}, + crs=category_ds_cropped.rio.crs + ) + + return geo_df def filter_dissolve(geom: gpd.GeoDataFrame, cat_geom: gpd.GeoDataFrame, diff --git a/src/eolab/rastertools/product/__pycache__/__init__.cpython-38.pyc b/src/eolab/rastertools/product/__pycache__/__init__.cpython-38.pyc deleted file mode 100644 index c4888005..00000000 Binary files a/src/eolab/rastertools/product/__pycache__/__init__.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/product/__pycache__/rasterproduct.cpython-38.pyc b/src/eolab/rastertools/product/__pycache__/rasterproduct.cpython-38.pyc deleted file mode 100644 index ee60c65b..00000000 Binary files a/src/eolab/rastertools/product/__pycache__/rasterproduct.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/product/__pycache__/rastertype.cpython-38.pyc b/src/eolab/rastertools/product/__pycache__/rastertype.cpython-38.pyc deleted file mode 100644 index e4da0555..00000000 Binary files a/src/eolab/rastertools/product/__pycache__/rastertype.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/product/__pycache__/vrt.cpython-38.pyc b/src/eolab/rastertools/product/__pycache__/vrt.cpython-38.pyc deleted file mode 100644 index 00f04445..00000000 Binary files a/src/eolab/rastertools/product/__pycache__/vrt.cpython-38.pyc and /dev/null differ diff --git a/src/eolab/rastertools/product/rasterproduct.py b/src/eolab/rastertools/product/rasterproduct.py index 573fe00b..79cd37d0 100644 --- a/src/eolab/rastertools/product/rasterproduct.py +++ b/src/eolab/rastertools/product/rasterproduct.py @@ -15,11 +15,13 @@ from osgeo import gdal import rasterio +from rioxarray import rioxarray from eolab.rastertools import utils from eolab.rastertools.product import RasterType from eolab.rastertools.product.vrt import add_masks_to_vrt, set_band_descriptions from eolab.rastertools.processing.vector import crop +import xarray as xr __author__ = "Olivier Queyrut" __copyright__ = "Copyright 2019, CNES" @@ -112,7 +114,9 @@ def __exit__(self, *args): self.free_in_memory_vrts() def free_in_memory_vrts(self): - """Free in memory vrts""" + """ + Free in-memory VRTs by closing all MemoryFile objects. + """ for vrt in self._in_memory_vrts: gdal.Unlink(vrt.as_posix()) self._in_memory_vrts = [] @@ -207,9 +211,18 @@ def open(self, bands: Union[str, List[str]] = "all", masks: Union[str, List[str]] = "all", roi: Union[Path, str] = None): - """Proxy method to rasterio.open(rasterproduct.get_raster(...))""" return rasterio.open(self.get_raster(bands=bands, masks=masks, roi=roi)) + def open_xarray(self, + bands: Union[str, List[str]] = "all", + masks: Union[str, List[str]] = "all", + roi: Union[Path, str] = None, + chunks: Union[int, Tuple, Dict] = True): + """Proxy method to xarray.open_rasterio(rasterproduct.get_raster(...))""" + raster = self.get_raster(bands=bands, masks=masks, roi=roi, create_maskband=True) + ds = rioxarray.open_rasterio(raster, masked=True, chunks=chunks) + return ds + def get_raster(self, bands: Union[str, List[str]] = "all", masks: Union[str, List[str]] = "all", @@ -282,7 +295,6 @@ def get_raster(self, set_band_descriptions(masked_image, band_descriptions) rasterfile = masked_image - return rasterfile.as_posix() def __get_bands(self, bands: Union[str, List[str]] = "all"): @@ -414,6 +426,7 @@ def __create_vrt(self, del ds return rasterfile + def __wrap(self, input_vrt: Path, roi: Path, uuid: str = "") -> Path: """Clip the image to the given ROI. diff --git a/src/eolab/rastertools/radioindice.py b/src/eolab/rastertools/radioindice.py index 1666932a..9a61ce10 100644 --- a/src/eolab/rastertools/radioindice.py +++ b/src/eolab/rastertools/radioindice.py @@ -4,18 +4,15 @@ This module defines a command line named radioindice that computes radiometric indices on raster images: ndvi, ndwi, etc.. """ -import logging import logging.config -import os from pathlib import Path from typing import List -import threading - +import numpy as np import rasterio -import numpy.ma as ma -from tqdm import tqdm +import rioxarray from eolab.rastertools import utils +import xarray as xr from eolab.rastertools import Rastertool, Windowable from eolab.rastertools.processing import algo from eolab.rastertools.processing import RadioindiceProcessing @@ -74,10 +71,10 @@ class Radioindice(Rastertool, Windowable): \\end{eqnarray} References: - Deering D.W., Rouse J.W., Haas R.H., and Schell J.A., 1975. Measuring forage production + `Deering D.W., Rouse J.W., Haas R.H., and Schell J.A., 1975. Measuring forage production of grazing units from Landsat MSS data. Pages 1169-1178 In: Cook J.J. (Ed.), Proceedings of the Tenth International Symposium on Remote Sensing of Environment (Ann Arbor, 1975), - Vol. 2, Ann Arbor, Michigan, USA. + Vol. 2, Ann Arbor, Michigan, USA. `_ """ @@ -91,8 +88,8 @@ class Radioindice(Rastertool, Windowable): rvi = \\frac{nir}{red} References: - Jordan C.F., 1969. Derivation of leaf area index from quality of light on the forest - floor. Ecology 50:663-666 + `Jordan C.F., 1969. Derivation of leaf area index from quality of light on the forest + floor. Ecology 50:663-666 `_ """ # Vegetation indices: pvi @@ -105,8 +102,8 @@ class Radioindice(Rastertool, Windowable): pvi = (nir - 0.90893 * red - 7.46216) * 0.74 References: - Richardson A.J., Wiegand C.L., 1977. Distinguishing vegetation from soil background - information. Photogramm Eng Rem S 43-1541-1552 + `Richardson A.J., Wiegand C.L., 1977. Distinguishing vegetation from soil background + information. Photogramm Eng Rem S 43-1541-1552 `_ """ # Vegetation indices: savi @@ -119,7 +116,7 @@ class Radioindice(Rastertool, Windowable): savi = \\frac{(nir - red) * (1. + 0.5)}{nir + red + 0.5} References: - Huete A.R., 1988. A soil-adjusted vegetation index (SAVI). Remote Sens Environ 25:295-309 + `Huete A.R., 1988. A soil-adjusted vegetation index (SAVI). Remote Sens Environ 25:295-309 `_ """ # Vegetation indices: tsavi @@ -132,9 +129,9 @@ class Radioindice(Rastertool, Windowable): tsavi = \\frac{0.7 * (nir - 0.7 * red - 0.9)}{0.7 * nir + red + 0.08 * (1 + 0.7^2)} References: - Baret F., Guyot G., Major D., 1989. TSAVI: a vegetation index which minimizes soil + `Baret F., Guyot G., Major D., 1989. TSAVI: a vegetation index which minimizes soil brightness effects on LAI or APAR estimation. 12th Canadian Symposium on Remote - Sensing and IGARSS 1990, Vancouver, Canada, 07/10-14 + Sensing and IGARSS 1990, Vancouver, Canada, 07/10-14. `_ """ # Vegetation indices: msavi @@ -153,12 +150,12 @@ class Radioindice(Rastertool, Windowable): \\end{eqnarray} References: - Qi J., Chehbouni A., Huete A.R., Kerr Y.H., 1994. Modified Soil Adjusted Vegetation - Index (MSAVI). Remote Sens Environ 48:119-126 + `Qi J., Chehbouni A., Huete A.R., Kerr Y.H., 1994. Modified Soil Adjusted Vegetation + Index (MSAVI). Remote Sens Environ 48:119-126 `_ - Qi J., Kerr Y., Chehbouni A., 1994. External factor consideration in vegetation index + `Qi J., Kerr Y., Chehbouni A., 1994. External factor consideration in vegetation index development. Proc. of Physical Measurements and Signatures in Remote Sensing, - ISPRS, 723-730. + ISPRS, 723-730. `_ """ # Vegetation indices: msavi2 @@ -184,8 +181,8 @@ class Radioindice(Rastertool, Windowable): ipvi = \\frac{nir}{nir + red} References: - Crippen, R. E. 1990. Calculating the Vegetation Index Faster, Remote Sensing of - Environment, vol 34., pp. 71-73. + `Crippen, R. E. 1990. Calculating the Vegetation Index Faster, Remote Sensing of + Environment, vol 34., pp. 71-73. `_ """ # Vegetation indices: evi @@ -272,7 +269,7 @@ class Radioindice(Rastertool, Windowable): ndbi = RadioindiceProcessing("ndbi").with_channels( [BandChannel.nir, BandChannel.mir]) """Normalized Difference Built Up Index (nir, mir channels) - + .. math:: ndbi = \\frac{mir - nir}{mir + nir} @@ -404,7 +401,7 @@ def process_file(self, inputfile: str) -> List[str]: outdir = Path(self.outputdir) - # STEP 1: Prepare the input image so that it can be processed + # Prepare the input image so that it can be processed with RasterProduct(inputfile, vrt_outputdir=self.vrt_dir) as product: _logger.debug(f"Raster product is : {product}") @@ -451,13 +448,16 @@ def process_file(self, inputfile: str) -> List[str]: # return the list of generated files return outputs - def compute_indices(input_image: str, image_channels: List[BandChannel], indice_image: str, indices: List[RadioindiceProcessing], window_size: tuple = (1024, 1024)): - """Compute the indices on the input image and produce a multiple bands + """ + Compute the indices on the input image and produce a multiple bands image (one band per indice) + The possible indices are the following : + ndvi, tndvi, rvi, pvi, savi, tsavi, msavi, msavi2, ipvi, evi, ndwi, ndwi2, mndwi, ndpi, ndti, ndbi, ri, bi, bi2 + Args: input_image (str): Path of the raster to compute @@ -471,55 +471,57 @@ def compute_indices(input_image: str, image_channels: List[BandChannel], Size of windows for splitting the processed image in small parts """ with rasterio.Env(GDAL_VRT_ENABLE_PYTHON=True): - with rasterio.open(input_image) as src: - profile = src.profile - # set block size to the configured window_size of first indice - blockxsize, blockysize = window_size - if src.width < blockxsize: - blockxsize = utils.highest_power_of_2(src.width) - if src.height < blockysize: - blockysize = utils.highest_power_of_2(src.height) + with rioxarray.open_rasterio(input_image, masked=True, chunks=True, cache=False, lock = False) as src_array: # dtype of output data dtype = indices[0].dtype or rasterio.float32 + src_array.load() + src_array = src_array.astype(dtype) + nodata = -10000 + crs = src_array.rio.crs + #Replace nodata values with np.nan + src_array = src_array.where(src_array != nodata, other=np.nan) + + # Prepare an empty DataArray for the result + result = xr.DataArray( + np.zeros((len(indices), src_array.shape[1], src_array.shape[2]), dtype=dtype), + dims=["band", "y", "x"], + coords={"band": [indice.name for indice in indices], + "y": src_array.coords["y"], + "x": src_array.coords["x"]}) + + # compute every indices + for i, indice in enumerate(indices, 1): + # Get the bands necessary to compute the indice + bands = [image_channels.index(channel) + 1 for channel in indice.channels] + + res = indice.algo(src_array.sel(band=bands)).astype(dtype) + res = res.where(~res.isnull(), other=-2) + result.loc[{"band": indice.name}] = res + + # Create the file and compute + result.rio.write_crs(crs, inplace=True) + result.rio.to_raster(indice_image, nodata=-2, dtype=dtype) + + # Attach statistics to the raster using Rasterio + with rasterio.open(indice_image, "r+") as dataset: + + dataset.nodata = -2.0 + for band_idx in range(1, dataset.count + 1): + + band = dataset.read(band_idx, masked=True) + band = np.ma.masked_invalid(band) # Handle NaN values + + # Calculate statistics + stats = { + "STATISTICS_MINIMUM": float(np.nanmin(band)), + "STATISTICS_MAXIMUM": float(np.nanmax(band)), + "STATISTICS_MEAN": float(np.nanmean(band)), + "STATISTICS_STDDEV": float(np.nanstd(band)) + } + + # Write metadata to the band + dataset.update_tags(band_idx, **stats) - # setup profile for output image - profile.update(driver='GTiff', - blockxsize=blockysize, blockysize=blockxsize, tiled=True, - dtype=dtype, nodata=indices[0].nodata, - count=len(indices)) - - with rasterio.open(indice_image, "w", **profile) as dst: - # Materialize a list of destination block windows - windows = [window for ij, window in dst.block_windows()] - - # disable status of tqdm progress bar - disable = os.getenv("RASTERTOOLS_NOTQDM", 'False').lower() in ['true', '1'] - - # compute every indices - for i, indice in enumerate(indices, 1): - # Get the bands necessary to compute the indice - bands = [image_channels.index(channel) + 1 for channel in indice.channels] - - read_lock = threading.Lock() - write_lock = threading.Lock() - - def process(window): - """Read input raster, compute indice and write output raster""" - with read_lock: - src_array = src.read(bands, window=window, masked=True) - src_array[src_array == src.nodata] = ma.masked - src_array = src_array.astype(dtype) - - # The computation can be performed concurrently - result = indice.algo(src_array).astype(dtype).filled(indice.nodata) - - with write_lock: - dst.write_band(i, result, window=window) - - # compute using concurrent.futures.ThreadPoolExecutor and tqdm - for window in tqdm(windows, disable=disable, desc=f"{indice.name}"): - process(window) - dst.set_band_description(i, indice.name) diff --git a/src/eolab/rastertools/rastertools.py b/src/eolab/rastertools/rastertools.py index 1f8b23d6..574dd745 100644 --- a/src/eolab/rastertools/rastertools.py +++ b/src/eolab/rastertools/rastertools.py @@ -13,9 +13,12 @@ """ from abc import ABC from typing import List +import logging +import sys from eolab.rastertools import utils +_logger = logging.getLogger(__name__) class RastertoolConfigurationException(Exception): """This class defines an exception that is raised when the configuration of the raster tool @@ -41,7 +44,7 @@ def __init__(self): @property def outputdir(self) -> str: - """Output dir where to store results""" + """Path of the output directory where are stored the results""" return self._outputdir @property @@ -66,8 +69,10 @@ def with_output(self, outputdir: str = "."): possible to chain the with... calls (fluent API) """ if outputdir and not utils.is_dir(outputdir): - raise RastertoolConfigurationException( - f"Output directory \"{str(outputdir)}\" does not exist.") + _logger.exception( + RastertoolConfigurationException(f"Output directory \"{str(outputdir)}\" does not exist.")) + sys.exit(2) + self._outputdir = outputdir return self @@ -99,7 +104,7 @@ def process_files(self, inputfiles: List[str]): inputfiles ([str]): Input images to process Returns: - [str]: List of generated files + ([str]) The list of the generated files """ all_outputs = [] for filename in inputfiles: @@ -107,8 +112,9 @@ def process_files(self, inputfiles: List[str]): if outputs: all_outputs.extend(outputs) - # add a postprocessing call + # add a postprocessing call of the corresponding class outputs = self.postprocess_files(inputfiles, all_outputs) + if outputs: all_outputs.extend(outputs) return all_outputs @@ -167,8 +173,10 @@ def window_size(self) -> int: @property def pad_mode(self) -> str: - """Mode for padding the image when windows are on the edge of the image - (See https://numpy.org/doc/stable/reference/generated/numpy.pad.html)""" + """ + Mode used to `pad `_ the image when the window is on the edge of the image + The mode can be self defined or among [constant (default), edge, linear_ramp, maximum, mean, median, minimum, reflect, symmetric, wrap, empty]. + """ return self._pad_mode def with_windows(self, window_size: int = 1024, pad_mode: str = "edge"): diff --git a/src/eolab/rastertools/speed.py b/src/eolab/rastertools/speed.py index b30862b3..e7aea45f 100644 --- a/src/eolab/rastertools/speed.py +++ b/src/eolab/rastertools/speed.py @@ -5,15 +5,11 @@ of the radiometry of the input rasters. """ from datetime import datetime -import logging import logging.config -import os from pathlib import Path -import threading from typing import List import rasterio -from tqdm.contrib.concurrent import thread_map from eolab.rastertools import utils from eolab.rastertools import Rastertool @@ -128,51 +124,31 @@ def compute_speed(date0: datetime, date1: datetime, interval = (date1 - date0).total_seconds() # open input images - with product0.open() as src0, product1.open() as src1: - if src1.count != src0.count: - raise ValueError(f"Number of bands in images {product0} and {product1}" - " are not the same") - if src1.width != src0.width or src1.height != src0.height: - raise ValueError(f"Images {product0} and {product1} have different sizes") - if src1.transform != src0.transform: - raise ValueError(f"Images {product0} and {product1} are not fully" - " geographically overlapping") - - profile = src0.profile - dtype = rasterio.float32 + with product0.open_xarray(chunks = (1,400,400)) as src0, product1.open_xarray(chunks = (1,400,400)) as src1: - # set block size - blockysize = 1024 if src0.width > 1024 else utils.highest_power_of_2(src0.width) - blockxsize = 1024 if src0.height > 1024 else utils.highest_power_of_2(src0.height) + if src1.shape[0] != src0.shape[0]: + raise ValueError(f"Number of bands in images {src1.shape[0]} and {src1.shape[0]}" + " are not the same") + if src1.shape[1] != src0.shape[1] or src1.shape[2] != src0.shape[2]: + raise ValueError(f"All images have not the same size") + if src1.rio.transform() != src0.rio.transform() : + raise ValueError(f"Images {product0} and {product1} are not fully" + " geographically overlapping") # check band index and handle all bands options (when bands is an empty list) if bands is None or len(bands) == 0: - bands = src1.indexes - elif min(bands) < 1 or max(bands) > src1.count: - raise ValueError(f"Invalid bands, all values are not in range [1, {src1.count}]") + bands = src1["band"].values + elif min(bands) < 1 or max(bands) > src1.shape[0]: + raise ValueError(f"Invalid bands, all values are not in range [1, {src1.shape[0]}]") - profile.update(driver="GTiff", - blockxsize=blockysize, blockysize=blockxsize, tiled=True, - dtype=dtype, count=len(bands)) - - with rasterio.open(speed_image, "w", **profile) as dst: - # Materialize a list of destination block windows - windows = [window for ij, window in dst.block_windows()] - - read_lock = threading.Lock() - write_lock = threading.Lock() - - def process(window): - """Read input rasters, compute speed and write output raster""" - with read_lock: - data0 = src0.read(bands, window=window, masked=True).astype(dtype) - data1 = src1.read(bands, window=window, masked=True).astype(dtype) + dtype = rasterio.float32 + src0 = src0.isel(band=slice(0, len(bands))).astype(dtype) + src1 = src1.isel(band=slice(0, len(bands))).astype(dtype) - # The computation can be performed concurrently - result = algo.speed(data0, data1, interval).astype(dtype).filled(src0.nodata) + result = algo.speed(src0, src1, interval).astype(dtype) + result = result.where(~result.isnull(), other=-2) - with write_lock: - dst.write(result, window=window) + ##Create the file and compute + result.rio.write_nodata(-2, inplace=True) + result.rio.to_raster(speed_image) - disable = os.getenv("RASTERTOOLS_NOTQDM", 'False').lower() in ['true', '1'] - thread_map(process, windows, disable=disable, desc="speed") diff --git a/src/eolab/rastertools/svf.py b/src/eolab/rastertools/svf.py index 4e83dfa4..b5eaec3a 100644 --- a/src/eolab/rastertools/svf.py +++ b/src/eolab/rastertools/svf.py @@ -4,16 +4,16 @@ This module defines a rastertool named SVF (Sky View Factor) which computes the SVF of a Digital Height Model. """ -import logging import logging.config from pathlib import Path import numpy as np +import rasterio from eolab.rastertools import utils from eolab.rastertools import Rastertool, Windowable from eolab.rastertools.processing import algo -from eolab.rastertools.processing import RasterProcessing, compute_sliding - +from eolab.rastertools.processing import RasterProcessing +from eolab.rastertools.product import RasterProduct _logger = logging.getLogger(__name__) @@ -141,21 +141,37 @@ def process_file(self, inputfile: str): "radius": None, "directions": None, "resolution": None, - "altitude": None + "altitude": None, + "pad_mode": None }) # set the configuration of the raster processing svf.configure({ "radius": self.radius, "directions": self.nb_directions, "resolution": self.resolution, - "altitude": self.altitude + "altitude": self.altitude, + "pad_mode": self.pad_mode }) - # Run the SVF processing - compute_sliding( - inputfile, output_image, svf, - window_size=self.window_size, - window_overlap=self.radius, - pad_mode=self.pad_mode) + # STEP 1: Prepare the input image so that it can be processed + with RasterProduct(inputfile, vrt_outputdir=self.vrt_dir) as product: + + # STEP 2: apply svf + outdir = Path(self.outputdir) + output_image = outdir.joinpath( + f"{utils.get_basename(inputfile)}-svf.tif") + + + with rasterio.Env(GDAL_VRT_ENABLE_PYTHON=True): + with product.open_xarray(chunks= True) as src: + # dtype and creation options of output data + dtype = svf.dtype or rasterio.float32 + src = src.astype(dtype) + + #SVF computing + output = svf.compute(src).astype(dtype) + + ##Create the file and compute + output.rio.to_raster(output_image) return [output_image.as_posix()] diff --git a/src/eolab/rastertools/tiling.py b/src/eolab/rastertools/tiling.py index 4461a16f..dceed171 100644 --- a/src/eolab/rastertools/tiling.py +++ b/src/eolab/rastertools/tiling.py @@ -11,12 +11,14 @@ import rasterio import rasterio.mask import geopandas as gpd +from rioxarray.exceptions import NoDataInBounds +import sys from eolab.rastertools import utils from eolab.rastertools import Rastertool, RastertoolConfigurationException from eolab.rastertools.processing import vector from eolab.rastertools.product import RasterProduct - +from eolab.rastertools.utils import xarray_crop _logger = logging.getLogger(__name__) @@ -119,21 +121,24 @@ def with_id_column(self, id_column: str, ids: List[int]): # Test if id_column is defined when ids are set if id_column is not None: if id_column not in self._grid.columns: - raise RastertoolConfigurationException( - f"Invalid id column named \"{id_column}\": it does not exist in the grid") + _logger.exception(RastertoolConfigurationException( + f"Invalid id column named \"{id_column}\": it does not exist in the grid")) + sys.exit(2) self._grid = self._grid.set_index(id_column) if ids is not None: if id_column is None: - raise RastertoolConfigurationException( - "Ids cannot be specified when id_col is not defined") + _logger.exception(RastertoolConfigurationException( + "Ids cannot be specified when id_col is not defined")) + sys.exit(2) self._grid = self._grid[self._grid.index.isin(ids)] if self._grid.empty: # if no id common between grid and given ids - raise RastertoolConfigurationException( + _logger.exception(RastertoolConfigurationException( f"No value in the grid column \"{id_column}\" are matching " - f"the given list of ids {str(ids)}") + f"the given list of ids {str(ids)}")) + sys.exit(2) else: invalid_ids = [i for i in ids if i not in self._grid.index] if len(invalid_ids) > 0: @@ -157,44 +162,54 @@ def process_file(self, inputfile: str): # STEP 1: Prepare the input image so that it can be processed with RasterProduct(inputfile, vrt_outputdir=self.vrt_dir) as product: + # Load raster as xarray.DataArray + raster = product.open_xarray(chunks = (1,400,400)) + crs = raster.rio.crs + + with rasterio.open(product.get_raster()) as src: + out_meta = src.meta + + output_paths = [] + # STEP 2: Prepare grid (reproject it to raster's CRS) - grid = vector.reproject(self.grid, inputfile) - - # STEP 3: apply tiling - outputs = [] - with product.open() as dataset: - out_meta = dataset.meta - - # Crop and export every tiles - for shape, i in zip(grid.geometry, grid.index): - _logger.info("Crop and export tile " + str(i) + "...") - try: - # generate crop image - image, transform = rasterio.mask.mask(dataset, [shape], - crop=True, all_touched=True) - - # output location - output = Path(self.outputdir) - - if self.output_subdir is not None: # if we need to export in a subdirectory - output = output.joinpath(self.output_subdir.format(i)) - if not output.is_dir(): - output.mkdir() - - basename = utils.get_basename(inputfile) - output = output.joinpath(self.output_basename.format(basename, i) + ".tif") - - # export - out_meta.update({"height": image.shape[1], - "width": image.shape[2], - "transform": transform}) - - with rasterio.open(output, 'w', **out_meta) as dst: - dst.write(image) - - outputs.append(output.as_posix()) - _logger.info("Tile " + str(i) + " exported to " + str(output)) - except ValueError: # if no overlap - _logger.error("Input shape " + str(i) + " does not overlap raster") - - return outputs + grid = vector.reproject(self.grid, product.get_raster()) + + for shape, i in zip(grid.geometry, grid.index): + _logger.info("Crop and export tile " + str(i) + "...") + + try: + # Generate mask to crop the raster to the geometry + masked_raster = raster.rio.clip([shape], crs, from_disk=True, all_touched=True, drop=False) + + # Replacing the crop = True option + masked_raster = xarray_crop(raster = masked_raster, shape = shape) + + # Get the original raster's transform and resolution + original_transform = raster.rio.transform() + # Update the clipped raster with the original resolution + masked_raster = masked_raster.rio.write_transform(original_transform) + + # output location + output = Path(self.outputdir) + + if self.output_subdir is not None: # if we need to export in a subdirectory + output = output.joinpath(self.output_subdir.format(i)) + if not output.is_dir(): + output.mkdir() + + basename = utils.get_basename(inputfile) + output = output.joinpath(self.output_basename.format(basename, i) + ".tif") + + + # Save the cropped raster + masked_raster.rio.write_crs(crs, inplace=True) + masked_raster.rio.to_raster(output, meta=out_meta, recalc_transform = False) + output_paths.append(output.as_posix()) + + _logger.info("Tile " + str(i) + " exported to " + str(output_paths)) + + except NoDataInBounds: # if no overlap + _logger.error("Input shape " + str(i) + " does not overlap raster") + + return output_paths + diff --git a/src/eolab/rastertools/timeseries.py b/src/eolab/rastertools/timeseries.py index 626b984a..13ceadaf 100644 --- a/src/eolab/rastertools/timeseries.py +++ b/src/eolab/rastertools/timeseries.py @@ -7,24 +7,19 @@ thus enabling to fill gaps. """ from datetime import datetime, timedelta -from itertools import repeat -import logging import logging.config -import multiprocessing -import os from pathlib import Path + +import rioxarray from typing import Dict, List import numpy as np import rasterio -from tqdm.contrib.concurrent import process_map - from eolab.rastertools import utils from eolab.rastertools import Rastertool, Windowable from eolab.rastertools.processing import algo from eolab.rastertools.product import RasterProduct - _logger = logging.getLogger(__name__) @@ -125,25 +120,26 @@ def postprocess_files(self, inputfiles: List[str], outputfiles: List[str]) -> Li # STEP 3: Generate timeseries # create the list of output files outdir = Path(self.outputdir) - timeseries_images = [] + + times_img = [] for date in dates: img_name = f"{template_name.format(date.strftime(reftype.date_format))}-timeseries.tif" - timeseries_images.append(outdir.joinpath(img_name).as_posix()) + times_img.append(outdir.joinpath(img_name).as_posix()) # compute the timeseries - compute_timeseries(products_per_date, timestamps, timeseries_images, - self.bands, self.window_size) + compute_timeseries(products_per_date, timestamps, times_img, + self.bands) # free resources for product in products_per_date.values(): product.free_in_memory_vrts() - return timeseries_images + return times_img -def compute_timeseries(products_per_date: Dict[float, RasterProduct], timeseries_dates: List[float], +def compute_timeseries(products_per_date: Dict[float, RasterProduct], timeseries_dates: np.ndarray, timeseries_images: List[str], - bands: List[int] = None, window_size: tuple = (1024, 1024)): + bands: List[int] = None): """Generate the timeseries Args: @@ -165,92 +161,56 @@ def compute_timeseries(products_per_date: Dict[float, RasterProduct], timeseries for i, date in enumerate(products_dates): product = products_per_date[date] - with product.open() as src: + with product.open_xarray() as src: # check if srcs have same size and are geographically overlapping if i == 0: - refcount = src.count - refindexes = src.indexes - refwidth = src.width - refheight = src.height - reftransform = src.transform - refprofile = src.profile - descriptions = src.descriptions + refcount = src.shape[0] + refindexes = src["band"].values + refwidth = src.shape[2] + refheight = src.shape[1] + reftransform = src.rio.transform() else: - if src.count != refcount: + if src.shape[0] != refcount: raise ValueError(f"All images have not the same number of bands") - if src.width != refwidth or src.height != refheight: + if src.shape[2] != refwidth or src.shape[1] != refheight : raise ValueError(f"All images have not the same size") - if src.transform != reftransform: + if src.rio.transform() != reftransform: raise ValueError(f"All images are not fully" " geographically overlapping") - # set block size - blockxsize, blockysize = window_size - if refwidth < blockxsize: - blockxsize = utils.highest_power_of_2(refwidth) - if refheight < blockysize: - blockysize = utils.highest_power_of_2(refheight) - # check band index and handle all bands options (when bands is an empty list) if bands is None or len(bands) == 0: bands = refindexes elif min(bands) < 1 or max(bands) > refcount: raise ValueError(f"Invalid bands, all values are not in range [1, {refcount}]") - # update the profile to use for opening output files - refprofile.update(driver="GTiff", - blockxsize=blockysize, blockysize=blockxsize, tiled=True, - count=len(bands)) - dtype = refprofile.get("dtype") - nodata = refprofile.get("nodata") + nodata = src.rio.nodata - # create empty output files with correct metadata - for i, img in enumerate(timeseries_images): - with rasterio.open(img, mode="w", **refprofile) as dst: - if i == 0: - # with rasterio.open(timeseries_images[0], mode="w", **profile) as dst: - windows = [window for ij, window in dst.block_windows()] - for j, band in enumerate(bands, 1): - dst.set_band_description(j, descriptions[band - 1]) - - m = multiprocessing.Manager() - write_lock = m.Lock() - - kwargs = { - "total": len(windows), - "disable": os.getenv("RASTERTOOLS_NOTQDM", 'False').lower() in ['true', '1'] - } - max_workers = os.getenv("RASTERTOOLS_MAXWORKERS") - if max_workers is not None: - kwargs["max_workers"] = int(max_workers) - process_map(_interpolate, - repeat(products_dates), repeat(products_per_date), - repeat(timeseries_dates), repeat(timeseries_images), - windows, repeat(bands), - repeat(dtype), repeat(nodata), - repeat(write_lock), - **kwargs) - - -def _interpolate(products_dates, products_per_date, - timeseries_dates, timeseries_images, - window, bands, - dtype, nodata, - write_lock): + _interpolate_xarray(products_dates, products_per_date, + timeseries_dates, timeseries_images, bands, nodata) + + + +def _interpolate_xarray(products_dates, products_per_date, + timeseries_dates, timeseries_images, bands, nodata): """Internal method that performs the interpolation for a specific window. This method can be called safely by several processes thanks to the locks that prevent from reading / writing files simultaneously. """ datas = list() for date in products_dates: - product = products_per_date[date] - with product.open() as src: - data = src.read(bands, window=window, masked=True) - datas.append(data) + src = rioxarray.open_rasterio(products_per_date[date].get_raster(), masked=False, chunks=(1,500,500)) + dtype = src.dtype or rasterio.float32 + band_data = src.isel(band=slice(0, len(bands))) # Select the desired bands + crs = src.rio.crs + datas.append(band_data) + + + output = algo.interpolated_timeseries_xarray(products_dates, datas, timeseries_dates, nodata) - output = algo.interpolated_timeseries(products_dates, datas, timeseries_dates, nodata) + for i, img in enumerate(timeseries_images): + output[i] = output[i].where(~datas[0].isnull(), other=-2) + output[i].rio.write_crs(crs, inplace=True) + output[i].rio.write_nodata(-2, inplace=True) + output[i].rio.to_raster(img, nodata=-2, dtype=dtype) - with write_lock: - for i, img in enumerate(timeseries_images): - with rasterio.open(img, mode="r+") as dst: - dst.write(output[i].astype(dtype), window=window) diff --git a/src/eolab/rastertools/utils.py b/src/eolab/rastertools/utils.py index 7dd9b145..02dc7546 100644 --- a/src/eolab/rastertools/utils.py +++ b/src/eolab/rastertools/utils.py @@ -10,6 +10,7 @@ """ import math from pathlib import Path +import xarray def to_tuple(val): @@ -109,3 +110,29 @@ def slices_2d(window_size, shift, stop, start=0): return ((r_min, r_max, c_min, c_max) for r_min, r_max in window_r for c_min, c_max in window_c) + +def xarray_crop(raster : xarray.DataArray, shape): + """ + Replacing the crop = True option that is not supported by raster.rio.clip() + """ + resolution_x, resolution_y = raster.rio.resolution() + bbox = shape.bounds + + # Compute the target number of rows and columns + num_cols = math.ceil((bbox[2] - bbox[0]) / resolution_x) + num_rows = math.ceil((bbox[3] - bbox[1]) / abs(resolution_y)) + + # Adjust the bounds to align with the resolution + aligned_bbox = ( + bbox[0], # MinX + bbox[1], # MinY + bbox[0] + num_cols * resolution_x, # MaxX + bbox[1] + num_rows * abs(resolution_y) # MaxY + ) + + # Slice the raster using the adjusted bounding box + masked_raster = raster.sel( + x=slice(aligned_bbox[0], aligned_bbox[2]), # Adjusted X range + y=slice(aligned_bbox[3], aligned_bbox[1]) # Adjusted Y range + ) + return masked_raster \ No newline at end of file diff --git a/src/eolab/rastertools/zonalstats.py b/src/eolab/rastertools/zonalstats.py index 04e24513..4e412c37 100644 --- a/src/eolab/rastertools/zonalstats.py +++ b/src/eolab/rastertools/zonalstats.py @@ -17,12 +17,12 @@ """ from typing import List, Dict import datetime -import logging import logging.config from pathlib import Path import json import numpy as np import geopandas as gpd +import sys import rasterio @@ -33,12 +33,12 @@ from eolab.rastertools.processing import vector from eolab.rastertools.product import RasterProduct - _logger = logging.getLogger(__name__) class Zonalstats(Rastertool): - """Raster tool that computes zonal statistics of a raster product. + """ + Raster tool that computes zonal statistics of a raster product. """ supported_output_formats = { @@ -123,7 +123,7 @@ def generated_stats_per_date(self): that contains the statistics for each inputfile's date: - keys are timestamps - - values are the statistics at the corresponding timestam + - values are the statistics at the corresponding timestamp Warning: When the timestamp of the input raster cannot be retrieved, the dictionary does not @@ -163,7 +163,7 @@ def valid_threshold(self) -> float: @property def area(self) -> bool: - """Whether to compute stats multiplied by the pixel area""" + """Whether to compute the statistics multiplied by the pixel area""" return self._area @property @@ -275,9 +275,10 @@ def with_output(self, outputdir: str = ".", output_format: str = "ESRI Shapefile self._output_format = output_format or 'ESRI Shapefile' # check if output_format exists if self._output_format not in Zonalstats.supported_output_formats: - raise RastertoolConfigurationException( + _logger.exception(RastertoolConfigurationException( f"Unrecognized output format {output_format}. " - f"Possible values are {', '.join(Zonalstats.supported_output_formats)}") + f"Possible values are {', '.join(Zonalstats.supported_output_formats)}")) + sys.exit(2) return self def with_geometries(self, geometries: str, within: bool = False): @@ -405,21 +406,24 @@ def process_file(self, inputfile: str) -> List[str]: # open raster to get metadata raster = product.get_raster() - with rasterio.open(raster) as rst: - bound = int(rst.count) - indexes = rst.indexes - descr = rst.descriptions - geotransform = rst.get_transform() - width = np.abs(geotransform[1]) - height = np.abs(geotransform[5]) - area_square_meter = width * height + rst = rasterio.open(raster) + bound = int(rst.count) + indexes = rst.indexes + descr = rst.descriptions + + geotransform = rst.get_transform() + width = np.abs(geotransform[1]) + height = np.abs(geotransform[5]) + area_square_meter = width * height + rst.close() date_str = product.get_date_string('%Y%m%d-%H%M%S') + # check band index and handle all bands options (when bands is None) if self.bands is None or len(self.bands) == 0: - bands = indexes + bands = list(indexes) else: bands = self.bands if min(bands) < 1 or max(bands) > bound: @@ -439,8 +443,7 @@ def process_file(self, inputfile: str) -> List[str]: geometries = vector.get_raster_shape(raster) # STEP 3: Compute the statistics - geom_stats = self.compute_stats(raster, bands, geometries, - descr, date_str, area_square_meter) + geom_stats = self.compute_stats(raster, bands, geometries, descr, date_str, area_square_meter) self._generated_stats.append(geom_stats) if date_str: @@ -493,7 +496,7 @@ def compute_stats(self, raster: str, bands: List[int], geometries: gpd.GeoDataFrame, descr: List[str], date: str, area_square_meter: int) -> List[List[Dict[str, float]]]: - """Compute the stats + """Compute the statistics of the input data. [Minimum, Maximum, Mean, Standard deviation] Args: raster (str): @@ -511,8 +514,8 @@ def compute_stats(self, raster: str, bands: List[int], Area represented by a pixel Returns: - [[{str: float}]]: a list of list of dictionnaries. Dict associates - the stat names and the stat values. + list[list[dict]] + The dictionnary associates the name of the statistics to its value. """ _logger.info("Compute statistics") # Compute zonal statistics @@ -535,8 +538,7 @@ def compute_stats(self, raster: str, bands: List[int], bands=bands, stats=self.stats, categories=class_geom, - category_index=self.category_index, - category_labels=self.category_labels) + category_index=self.category_index) else: statistics = compute_zonal_stats( geometries, raster, @@ -544,6 +546,7 @@ def compute_stats(self, raster: str, bands: List[int], stats=self.stats, categorical=self.categorical) + # apply area if self.area: [d.update({key: area_square_meter * val}) @@ -574,9 +577,10 @@ def __stats_to_geoms(self, statistics_data: List[List[Dict[str, float]]], Returns: GeoDataFrame: The updated geometries with statistics saved in metadata of the following form: b{band_number}.{metadata_name} where metadata_name is - sucessively the band name, the date and the stats names (min, mean, max, median, std) + successively the band name, the date and the statistics names (min, mean, max, median, std) """ prefix = self.prefix or [""] * len(bands) + for i, band in enumerate(bands): # add general metadata to geometries if descr and descr[i]: @@ -584,6 +588,8 @@ def __stats_to_geoms(self, statistics_data: List[List[Dict[str, float]]], if date: geometries[utils.get_metadata_name(band, prefix[i], "date")] = date + + # get all statistics names since additional statistics coming from categorical # option may have been computed stats = self.stats.copy() diff --git a/src/rastertools.egg-info/PKG-INFO b/src/rastertools.egg-info/PKG-INFO index 4a06ec9c..71c7b194 100644 --- a/src/rastertools.egg-info/PKG-INFO +++ b/src/rastertools.egg-info/PKG-INFO @@ -1,8 +1,8 @@ Metadata-Version: 2.1 Name: rastertools -Version: 0.5.0.post1.dev66+g24a07c4.d20240523 -Summary: Compute radiometric indices and zonal statistics on rasters -Home-page: https://github.com/cnes/rastertools +Version: 0.1.0 +Summary: Collection of tools for raster data +Home-page: https://github.com/CNES/rastertools Author: Olivier Queyrut Author-email: olivier.queyrut@cnes.fr License: apache v2 @@ -12,10 +12,28 @@ Project-URL: Issues, https://github.com/cnes/rastertools/issues Platform: any Classifier: Development Status :: 5 - Production/Stable Classifier: Programming Language :: Python +Requires-Python: ==3.8.13 Description-Content-Type: text/x-rst; charset=UTF-8 License-File: LICENSE.txt License-File: AUTHORS.rst -Requires-Dist: importlib-metadata; python_version < "3.8" +Requires-Dist: click +Requires-Dist: rasterio +Requires-Dist: pytest>=3.6 +Requires-Dist: rioxarray +Requires-Dist: dask +Requires-Dist: pytest-cov +Requires-Dist: geopandas==0.13 +Requires-Dist: kiwisolver==1.4.5 +Requires-Dist: matplotlib==3.7.3 +Requires-Dist: packaging==24.1 +Requires-Dist: fiona==1.8.21 +Requires-Dist: sphinx_rtd_theme==3.0.1 +Requires-Dist: pip==24.2 +Requires-Dist: sphinx==7.1.2 +Requires-Dist: scipy==1.8 +Requires-Dist: pyscaffold +Requires-Dist: gdal==3.5.0 +Requires-Dist: tqdm==4.66 Provides-Extra: testing Requires-Dist: setuptools; extra == "testing" Requires-Dist: pytest; extra == "testing" diff --git a/src/rastertools.egg-info/SOURCES.txt b/src/rastertools.egg-info/SOURCES.txt index 6fcb80a2..b79796e0 100644 --- a/src/rastertools.egg-info/SOURCES.txt +++ b/src/rastertools.egg-info/SOURCES.txt @@ -1,19 +1,20 @@ -.coveragerc -.dockerignore .gitignore -.readthedocs.yml AUTHORS.rst CHANGELOG.rst Dockerfile LICENSE.txt +METADATA README.rst -env_test.yml -env_update.yml -environment.yml -pyproject.toml +RECORD +WHEEL +entry_points.txt setup.cfg setup.py tox.ini +.github/workflows/cd.yml +.github/workflows/ci.yml +continuous_integration/scripts/check_mccabe_complexity.sh +docs/.coverage docs/Makefile docs/authors.rst docs/changelog.rst @@ -26,6 +27,1391 @@ docs/private_api.rst docs/rasterproduct.rst docs/requirements.txt docs/usage.rst +docs/_build/doctrees/authors.doctree +docs/_build/doctrees/changelog.doctree +docs/_build/doctrees/cli.doctree +docs/_build/doctrees/environment.pickle +docs/_build/doctrees/index.doctree +docs/_build/doctrees/install.doctree +docs/_build/doctrees/license.doctree +docs/_build/doctrees/private_api.doctree +docs/_build/doctrees/rasterproduct.doctree +docs/_build/doctrees/usage.doctree +docs/_build/doctrees/api/eolab.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.adaptive_gaussian.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.bands.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.get_default_filters.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.keep_vrt.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.local_mean.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.local_sum.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.median_filter.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.outputdir.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.pad_mode.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.postprocess_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.process_file.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.process_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.raster_filter.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.vrt_dir.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.window_size.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.with_filter_configuration.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.with_output.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.with_vrt_stored.doctree +docs/_build/doctrees/api/eolab.rastertools.Filtering.with_windows.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.azimuth.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.elevation.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.keep_vrt.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.outputdir.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.pad_mode.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.postprocess_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.process_file.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.process_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.radius.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.resolution.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.vrt_dir.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.window_size.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.with_output.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.with_vrt_stored.doctree +docs/_build/doctrees/api/eolab.rastertools.Hillshade.with_windows.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.bi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.bi2.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.evi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.get_default_indices.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.indices.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.ipvi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.keep_vrt.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.merge.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.mndwi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.msavi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.msavi2.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndbi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndpi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndti.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndvi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndwi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.ndwi2.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.outputdir.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.pad_mode.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.postprocess_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.process_file.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.process_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.pvi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.ri.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.roi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.rvi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.savi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.tndvi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.tsavi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.vrt_dir.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.window_size.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_output.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_roi.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_vrt_stored.doctree +docs/_build/doctrees/api/eolab.rastertools.Radioindice.with_windows.doctree +docs/_build/doctrees/api/eolab.rastertools.Rastertool.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.Rastertool.doctree +docs/_build/doctrees/api/eolab.rastertools.Rastertool.keep_vrt.doctree +docs/_build/doctrees/api/eolab.rastertools.Rastertool.outputdir.doctree +docs/_build/doctrees/api/eolab.rastertools.Rastertool.postprocess_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Rastertool.process_file.doctree +docs/_build/doctrees/api/eolab.rastertools.Rastertool.process_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Rastertool.vrt_dir.doctree +docs/_build/doctrees/api/eolab.rastertools.Rastertool.with_output.doctree +docs/_build/doctrees/api/eolab.rastertools.Rastertool.with_vrt_stored.doctree +docs/_build/doctrees/api/eolab.rastertools.RastertoolConfigurationException.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.altitude.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.keep_vrt.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.nb_directions.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.outputdir.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.pad_mode.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.postprocess_files.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.process_file.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.process_files.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.radius.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.resolution.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.vrt_dir.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.window_size.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.with_altitude.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.with_output.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.with_vrt_stored.doctree +docs/_build/doctrees/api/eolab.rastertools.SVF.with_windows.doctree +docs/_build/doctrees/api/eolab.rastertools.Speed.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.Speed.bands.doctree +docs/_build/doctrees/api/eolab.rastertools.Speed.doctree +docs/_build/doctrees/api/eolab.rastertools.Speed.keep_vrt.doctree +docs/_build/doctrees/api/eolab.rastertools.Speed.outputdir.doctree +docs/_build/doctrees/api/eolab.rastertools.Speed.postprocess_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Speed.process_file.doctree +docs/_build/doctrees/api/eolab.rastertools.Speed.process_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Speed.vrt_dir.doctree +docs/_build/doctrees/api/eolab.rastertools.Speed.with_output.doctree +docs/_build/doctrees/api/eolab.rastertools.Speed.with_vrt_stored.doctree +docs/_build/doctrees/api/eolab.rastertools.Tiling.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.Tiling.doctree +docs/_build/doctrees/api/eolab.rastertools.Tiling.grid.doctree +docs/_build/doctrees/api/eolab.rastertools.Tiling.keep_vrt.doctree +docs/_build/doctrees/api/eolab.rastertools.Tiling.output_basename.doctree +docs/_build/doctrees/api/eolab.rastertools.Tiling.output_subdir.doctree +docs/_build/doctrees/api/eolab.rastertools.Tiling.outputdir.doctree +docs/_build/doctrees/api/eolab.rastertools.Tiling.postprocess_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Tiling.process_file.doctree +docs/_build/doctrees/api/eolab.rastertools.Tiling.process_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Tiling.vrt_dir.doctree +docs/_build/doctrees/api/eolab.rastertools.Tiling.with_id_column.doctree +docs/_build/doctrees/api/eolab.rastertools.Tiling.with_output.doctree +docs/_build/doctrees/api/eolab.rastertools.Tiling.with_vrt_stored.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.bands.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.end_date.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.keep_vrt.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.outputdir.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.pad_mode.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.period.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.postprocess_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.process_file.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.process_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.start_date.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.vrt_dir.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.window_size.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.with_output.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.with_vrt_stored.doctree +docs/_build/doctrees/api/eolab.rastertools.Timeseries.with_windows.doctree +docs/_build/doctrees/api/eolab.rastertools.Windowable.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.Windowable.doctree +docs/_build/doctrees/api/eolab.rastertools.Windowable.pad_mode.doctree +docs/_build/doctrees/api/eolab.rastertools.Windowable.window_size.doctree +docs/_build/doctrees/api/eolab.rastertools.Windowable.with_windows.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.area.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.bands.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.categorical.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_file.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_file_type.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_index.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.category_labels.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.chart_file.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.compute_stats.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.display_chart.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.generated_stats.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.generated_stats_dates.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.generated_stats_per_date.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.geometries.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.geometry_index.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.keep_vrt.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.output_format.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.outputdir.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.postprocess_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.prefix.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.process_file.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.process_files.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.sigma.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.stats.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.supported_output_formats.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.valid_stats.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.valid_threshold.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.vrt_dir.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_chart.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_geometries.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_outliers.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_output.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_per_category.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.with_vrt_stored.doctree +docs/_build/doctrees/api/eolab.rastertools.Zonalstats.within.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.filtering.create_argparser.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.filtering.create_filter.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.filtering.create_filtering.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.filtering.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.filtering.filter_options.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.filtering.handle_result.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.create_filter.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.create_filtering.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.filter_options.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.filtering_dyn.handle_result.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.hillshade.create_argparser.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.hillshade.create_hillshade.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.hillshade.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.create_argparser.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.create_radioindice.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.radioindice.indices_opt.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.speed.create_argparser.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.speed.create_speed.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.speed.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.svf.create_argparser.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.svf.create_svf.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.svf.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.tiling.create_argparser.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.tiling.create_tiling.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.tiling.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.timeseries.create_argparser.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.timeseries.create_timeseries.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.timeseries.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.utils_cli.apply_process.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.utils_cli.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.with_bands_arguments.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.with_outputdir_arguments.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.with_window_arguments.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.zonalstats.create_argparser.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.zonalstats.create_zonalstats.doctree +docs/_build/doctrees/api/eolab.rastertools.cli.zonalstats.doctree +docs/_build/doctrees/api/eolab.rastertools.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.adaptive_gaussian.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.brightness_index.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.brightness_index2.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.evi.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.hillshade.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.interpolated_timeseries.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.ipvi.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.local_mean.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.local_sum.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.median.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.msavi.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.msavi2.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.normalized_difference.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.pvi.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.redness_index.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.rvi.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.savi.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.speed.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.svf.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.tndvi.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.algo.tsavi.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.rasterproc.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.sliding.compute_sliding.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.sliding.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.stats.compute_zonal_stats.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.stats.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.stats.extract_zonal_outliers.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.stats.plot_stats.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.vector.clip.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.vector.crop.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.vector.dissolve.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.vector.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.vector.filter.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.vector.filter_dissolve.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.vector.get_raster_shape.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.vector.rasterize.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.vector.reproject.doctree +docs/_build/doctrees/api/eolab.rastertools.processing.vector.vectorize.doctree +docs/_build/doctrees/api/eolab.rastertools.product.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.create_in_memory_vrt.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rasterproduct.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.description.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.Band.identifier.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.blue.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.green.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.mir.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.nir.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.BandChannel.swir.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.__init__.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.accept.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.add.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.channels.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.date_format.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.find.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_date.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_group.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.has_channel.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.has_channels.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.has_mask.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.masknodata.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.name.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.nodata.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.doctree +docs/_build/doctrees/api/eolab.rastertools.product.rastertype.doctree +docs/_build/doctrees/api/eolab.rastertools.product.s2_maja_mask.doctree +docs/_build/doctrees/api/eolab.rastertools.product.vrt.add_masks_to_vrt.doctree +docs/_build/doctrees/api/eolab.rastertools.product.vrt.doctree +docs/_build/doctrees/api/eolab.rastertools.product.vrt.set_band_descriptions.doctree +docs/_build/doctrees/api/modules.doctree +docs/_build/doctrees/cli/filtering.doctree +docs/_build/doctrees/cli/hillshade.doctree +docs/_build/doctrees/cli/radioindice.doctree +docs/_build/doctrees/cli/speed.doctree +docs/_build/doctrees/cli/svf.doctree +docs/_build/doctrees/cli/tiling.doctree +docs/_build/doctrees/cli/timeseries.doctree +docs/_build/doctrees/cli/zonalstats.doctree +docs/_build/html/.buildinfo +docs/_build/html/authors.html +docs/_build/html/changelog.html +docs/_build/html/cli.html +docs/_build/html/genindex.html +docs/_build/html/index.html +docs/_build/html/install.html +docs/_build/html/license.html +docs/_build/html/objects.inv +docs/_build/html/private_api.html +docs/_build/html/py-modindex.html +docs/_build/html/rasterproduct.html +docs/_build/html/search.html +docs/_build/html/searchindex.js +docs/_build/html/usage.html +docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-grn.jpg +docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg +docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg.aux.xml +docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-geoms.jpg +docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.jpg +docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.jpg +docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats.jpg +docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats2.jpg +docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.jpg +docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.png +docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg +docs/_build/html/_images/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi_cropped.jpg +docs/_build/html/_images/dsm-hillshade1.jpg +docs/_build/html/_images/dsm-hillshade2.jpg +docs/_build/html/_images/dsm-hillshade3.jpg +docs/_build/html/_images/dsm-svf.jpg +docs/_build/html/_images/dsm-svf0.jpg +docs/_build/html/_images/dsm.jpg +docs/_build/html/_images/oso-stats.jpg +docs/_build/html/_images/speed_ndvi.jpg +docs/_build/html/_modules/index.html +docs/_build/html/_modules/eolab/rastertools/cli.html +docs/_build/html/_modules/eolab/rastertools/filtering.html +docs/_build/html/_modules/eolab/rastertools/hillshade.html +docs/_build/html/_modules/eolab/rastertools/main.html +docs/_build/html/_modules/eolab/rastertools/product.html +docs/_build/html/_modules/eolab/rastertools/radioindice.html +docs/_build/html/_modules/eolab/rastertools/rastertools.html +docs/_build/html/_modules/eolab/rastertools/speed.html +docs/_build/html/_modules/eolab/rastertools/svf.html +docs/_build/html/_modules/eolab/rastertools/tiling.html +docs/_build/html/_modules/eolab/rastertools/timeseries.html +docs/_build/html/_modules/eolab/rastertools/utils.html +docs/_build/html/_modules/eolab/rastertools/zonalstats.html +docs/_build/html/_modules/eolab/rastertools/cli/filtering.html +docs/_build/html/_modules/eolab/rastertools/cli/filtering_dyn.html +docs/_build/html/_modules/eolab/rastertools/cli/hillshade.html +docs/_build/html/_modules/eolab/rastertools/cli/radioindice.html +docs/_build/html/_modules/eolab/rastertools/cli/speed.html +docs/_build/html/_modules/eolab/rastertools/cli/svf.html +docs/_build/html/_modules/eolab/rastertools/cli/tiling.html +docs/_build/html/_modules/eolab/rastertools/cli/timeseries.html +docs/_build/html/_modules/eolab/rastertools/cli/utils_cli.html +docs/_build/html/_modules/eolab/rastertools/cli/zonalstats.html +docs/_build/html/_modules/eolab/rastertools/processing/algo.html +docs/_build/html/_modules/eolab/rastertools/processing/rasterproc.html +docs/_build/html/_modules/eolab/rastertools/processing/sliding.html +docs/_build/html/_modules/eolab/rastertools/processing/stats.html +docs/_build/html/_modules/eolab/rastertools/processing/vector.html +docs/_build/html/_modules/eolab/rastertools/product/rasterproduct.html +docs/_build/html/_modules/eolab/rastertools/product/rastertype.html +docs/_build/html/_modules/eolab/rastertools/product/vrt.html +docs/_build/html/_sources/authors.rst.txt +docs/_build/html/_sources/changelog.rst.txt +docs/_build/html/_sources/cli.rst.txt +docs/_build/html/_sources/index.rst.txt +docs/_build/html/_sources/install.rst.txt +docs/_build/html/_sources/license.rst.txt +docs/_build/html/_sources/private_api.rst.txt +docs/_build/html/_sources/rasterproduct.rst.txt +docs/_build/html/_sources/usage.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.adaptive_gaussian.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.bands.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.get_default_filters.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.keep_vrt.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.local_mean.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.local_sum.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.median_filter.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.outputdir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.pad_mode.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.postprocess_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.process_file.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.process_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.raster_filter.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.vrt_dir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.window_size.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_filter_configuration.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_output.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_vrt_stored.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Filtering.with_windows.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.azimuth.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.elevation.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.keep_vrt.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.outputdir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.pad_mode.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.postprocess_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.process_file.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.process_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.radius.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.resolution.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.vrt_dir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.window_size.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.with_output.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.with_vrt_stored.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Hillshade.with_windows.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.bi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.bi2.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.evi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.get_default_indices.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.indices.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ipvi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.keep_vrt.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.merge.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.mndwi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.msavi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.msavi2.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndbi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndpi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndti.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndvi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndwi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ndwi2.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.outputdir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.pad_mode.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.postprocess_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.process_file.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.process_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.pvi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.ri.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.roi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.rvi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.savi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.tndvi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.tsavi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.vrt_dir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.window_size.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_output.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_roi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_vrt_stored.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Radioindice.with_windows.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Rastertool.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Rastertool.keep_vrt.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Rastertool.outputdir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Rastertool.postprocess_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Rastertool.process_file.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Rastertool.process_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Rastertool.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Rastertool.vrt_dir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Rastertool.with_output.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Rastertool.with_vrt_stored.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.RastertoolConfigurationException.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.altitude.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.keep_vrt.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.nb_directions.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.outputdir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.pad_mode.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.postprocess_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.process_file.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.process_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.radius.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.resolution.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.vrt_dir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.window_size.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.with_altitude.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.with_output.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.with_vrt_stored.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.SVF.with_windows.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Speed.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Speed.bands.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Speed.keep_vrt.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Speed.outputdir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Speed.postprocess_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Speed.process_file.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Speed.process_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Speed.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Speed.vrt_dir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Speed.with_output.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Speed.with_vrt_stored.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Tiling.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Tiling.grid.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Tiling.keep_vrt.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Tiling.output_basename.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Tiling.output_subdir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Tiling.outputdir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Tiling.postprocess_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Tiling.process_file.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Tiling.process_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Tiling.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Tiling.vrt_dir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Tiling.with_id_column.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Tiling.with_output.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Tiling.with_vrt_stored.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.bands.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.end_date.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.keep_vrt.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.outputdir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.pad_mode.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.period.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.postprocess_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.process_file.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.process_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.start_date.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.vrt_dir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.window_size.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.with_output.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.with_vrt_stored.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Timeseries.with_windows.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Windowable.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Windowable.pad_mode.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Windowable.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Windowable.window_size.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Windowable.with_windows.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.area.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.bands.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.categorical.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_file.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_file_type.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_index.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.category_labels.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.chart_file.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.compute_stats.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.display_chart.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.generated_stats.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.generated_stats_dates.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.generated_stats_per_date.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.geometries.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.geometry_index.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.keep_vrt.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.output_format.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.outputdir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.postprocess_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.prefix.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.process_file.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.process_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.sigma.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.stats.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.supported_output_formats.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.valid_stats.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.valid_threshold.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.vrt_dir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_chart.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_geometries.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_outliers.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_output.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_per_category.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.with_vrt_stored.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.Zonalstats.within.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.create_argparser.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.create_filter.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.create_filtering.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.filter_options.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.handle_result.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.filtering.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.create_filter.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.create_filtering.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.filter_options.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.handle_result.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.filtering_dyn.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.hillshade.create_argparser.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.hillshade.create_hillshade.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.hillshade.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.create_argparser.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.create_radioindice.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.indices_opt.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.radioindice.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.speed.create_argparser.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.speed.create_speed.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.speed.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.svf.create_argparser.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.svf.create_svf.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.svf.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.tiling.create_argparser.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.tiling.create_tiling.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.tiling.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.timeseries.create_argparser.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.timeseries.create_timeseries.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.timeseries.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.utils_cli.apply_process.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.utils_cli.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.with_bands_arguments.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.with_outputdir_arguments.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.with_window_arguments.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.zonalstats.create_argparser.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.zonalstats.create_zonalstats.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.cli.zonalstats.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.adaptive_gaussian.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.brightness_index.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.brightness_index2.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.evi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.hillshade.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.interpolated_timeseries.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.ipvi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.local_mean.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.local_sum.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.median.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.msavi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.msavi2.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.normalized_difference.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.pvi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.redness_index.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.rvi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.savi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.speed.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.svf.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.tndvi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.algo.tsavi.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rasterproc.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.sliding.compute_sliding.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.sliding.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.stats.compute_zonal_stats.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.stats.extract_zonal_outliers.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.stats.plot_stats.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.stats.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.vector.clip.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.vector.crop.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.vector.dissolve.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.vector.filter.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.vector.filter_dissolve.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.vector.get_raster_shape.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.vector.rasterize.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.vector.reproject.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.vector.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.processing.vector.vectorize.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.create_in_memory_vrt.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.RasterProduct.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rasterproduct.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.description.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.identifier.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.Band.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.blue.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.green.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.mir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.nir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.BandChannel.swir.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.__init__.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.accept.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.add.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.channels.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.date_format.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.find.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_date.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_group.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.has_channel.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.has_channels.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.has_mask.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.masknodata.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.name.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.nodata.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.RasterType.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rastertype.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.s2_maja_mask.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.vrt.add_masks_to_vrt.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.vrt.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.product.vrt.set_band_descriptions.rst.txt +docs/_build/html/_sources/api/eolab.rastertools.rst.txt +docs/_build/html/_sources/api/eolab.rst.txt +docs/_build/html/_sources/api/modules.rst.txt +docs/_build/html/_sources/cli/filtering.rst.txt +docs/_build/html/_sources/cli/hillshade.rst.txt +docs/_build/html/_sources/cli/radioindice.rst.txt +docs/_build/html/_sources/cli/speed.rst.txt +docs/_build/html/_sources/cli/svf.rst.txt +docs/_build/html/_sources/cli/tiling.rst.txt +docs/_build/html/_sources/cli/timeseries.rst.txt +docs/_build/html/_sources/cli/zonalstats.rst.txt +docs/_build/html/_static/Image collée (2).png +docs/_build/html/_static/Image collée.png +docs/_build/html/_static/Logo-Eolab-Anglais.png +docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-grn.jpg +docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg +docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-geoms.jpg +docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.jpg +docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.jpg +docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats.jpg +docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats2.jpg +docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.jpg +docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.png +docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg +docs/_build/html/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi_cropped.jpg +docs/_build/html/_static/_sphinx_javascript_frameworks_compat.js +docs/_build/html/_static/basic.css +docs/_build/html/_static/doctools.js +docs/_build/html/_static/documentation_options.js +docs/_build/html/_static/dsm-hillshade1.jpg +docs/_build/html/_static/dsm-hillshade2.jpg +docs/_build/html/_static/dsm-hillshade3.jpg +docs/_build/html/_static/dsm-svf.jpg +docs/_build/html/_static/dsm-svf0.jpg +docs/_build/html/_static/dsm.jpg +docs/_build/html/_static/file.png +docs/_build/html/_static/jquery.js +docs/_build/html/_static/language_data.js +docs/_build/html/_static/minus.png +docs/_build/html/_static/oso-stats.jpg +docs/_build/html/_static/plus.png +docs/_build/html/_static/pygments.css +docs/_build/html/_static/searchtools.js +docs/_build/html/_static/speed_ndvi.jpg +docs/_build/html/_static/sphinx_highlight.js +docs/_build/html/_static/style.css +docs/_build/html/_static/css/badge_only.css +docs/_build/html/_static/css/theme.css +docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff +docs/_build/html/_static/css/fonts/Roboto-Slab-Bold.woff2 +docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff +docs/_build/html/_static/css/fonts/Roboto-Slab-Regular.woff2 +docs/_build/html/_static/css/fonts/fontawesome-webfont.eot +docs/_build/html/_static/css/fonts/fontawesome-webfont.svg +docs/_build/html/_static/css/fonts/fontawesome-webfont.ttf +docs/_build/html/_static/css/fonts/fontawesome-webfont.woff +docs/_build/html/_static/css/fonts/fontawesome-webfont.woff2 +docs/_build/html/_static/css/fonts/lato-bold-italic.woff +docs/_build/html/_static/css/fonts/lato-bold-italic.woff2 +docs/_build/html/_static/css/fonts/lato-bold.woff +docs/_build/html/_static/css/fonts/lato-bold.woff2 +docs/_build/html/_static/css/fonts/lato-normal-italic.woff +docs/_build/html/_static/css/fonts/lato-normal-italic.woff2 +docs/_build/html/_static/css/fonts/lato-normal.woff +docs/_build/html/_static/css/fonts/lato-normal.woff2 +docs/_build/html/_static/fonts/Lato/lato-bold.eot +docs/_build/html/_static/fonts/Lato/lato-bold.ttf +docs/_build/html/_static/fonts/Lato/lato-bold.woff +docs/_build/html/_static/fonts/Lato/lato-bold.woff2 +docs/_build/html/_static/fonts/Lato/lato-bolditalic.eot +docs/_build/html/_static/fonts/Lato/lato-bolditalic.ttf +docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff +docs/_build/html/_static/fonts/Lato/lato-bolditalic.woff2 +docs/_build/html/_static/fonts/Lato/lato-italic.eot +docs/_build/html/_static/fonts/Lato/lato-italic.ttf +docs/_build/html/_static/fonts/Lato/lato-italic.woff +docs/_build/html/_static/fonts/Lato/lato-italic.woff2 +docs/_build/html/_static/fonts/Lato/lato-regular.eot +docs/_build/html/_static/fonts/Lato/lato-regular.ttf +docs/_build/html/_static/fonts/Lato/lato-regular.woff +docs/_build/html/_static/fonts/Lato/lato-regular.woff2 +docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot +docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf +docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff +docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 +docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot +docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf +docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff +docs/_build/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 +docs/_build/html/_static/js/badge_only.js +docs/_build/html/_static/js/theme.js +docs/_build/html/_static/js/versions.js +docs/_build/html/api/eolab.html +docs/_build/html/api/eolab.rastertools.Filtering.__init__.html +docs/_build/html/api/eolab.rastertools.Filtering.adaptive_gaussian.html +docs/_build/html/api/eolab.rastertools.Filtering.bands.html +docs/_build/html/api/eolab.rastertools.Filtering.get_default_filters.html +docs/_build/html/api/eolab.rastertools.Filtering.html +docs/_build/html/api/eolab.rastertools.Filtering.keep_vrt.html +docs/_build/html/api/eolab.rastertools.Filtering.local_mean.html +docs/_build/html/api/eolab.rastertools.Filtering.local_sum.html +docs/_build/html/api/eolab.rastertools.Filtering.median_filter.html +docs/_build/html/api/eolab.rastertools.Filtering.outputdir.html +docs/_build/html/api/eolab.rastertools.Filtering.pad_mode.html +docs/_build/html/api/eolab.rastertools.Filtering.postprocess_files.html +docs/_build/html/api/eolab.rastertools.Filtering.process_file.html +docs/_build/html/api/eolab.rastertools.Filtering.process_files.html +docs/_build/html/api/eolab.rastertools.Filtering.raster_filter.html +docs/_build/html/api/eolab.rastertools.Filtering.vrt_dir.html +docs/_build/html/api/eolab.rastertools.Filtering.window_size.html +docs/_build/html/api/eolab.rastertools.Filtering.with_filter_configuration.html +docs/_build/html/api/eolab.rastertools.Filtering.with_output.html +docs/_build/html/api/eolab.rastertools.Filtering.with_vrt_stored.html +docs/_build/html/api/eolab.rastertools.Filtering.with_windows.html +docs/_build/html/api/eolab.rastertools.Hillshade.__init__.html +docs/_build/html/api/eolab.rastertools.Hillshade.azimuth.html +docs/_build/html/api/eolab.rastertools.Hillshade.elevation.html +docs/_build/html/api/eolab.rastertools.Hillshade.html +docs/_build/html/api/eolab.rastertools.Hillshade.keep_vrt.html +docs/_build/html/api/eolab.rastertools.Hillshade.outputdir.html +docs/_build/html/api/eolab.rastertools.Hillshade.pad_mode.html +docs/_build/html/api/eolab.rastertools.Hillshade.postprocess_files.html +docs/_build/html/api/eolab.rastertools.Hillshade.process_file.html +docs/_build/html/api/eolab.rastertools.Hillshade.process_files.html +docs/_build/html/api/eolab.rastertools.Hillshade.radius.html +docs/_build/html/api/eolab.rastertools.Hillshade.resolution.html +docs/_build/html/api/eolab.rastertools.Hillshade.vrt_dir.html +docs/_build/html/api/eolab.rastertools.Hillshade.window_size.html +docs/_build/html/api/eolab.rastertools.Hillshade.with_output.html +docs/_build/html/api/eolab.rastertools.Hillshade.with_vrt_stored.html +docs/_build/html/api/eolab.rastertools.Hillshade.with_windows.html +docs/_build/html/api/eolab.rastertools.Radioindice.__init__.html +docs/_build/html/api/eolab.rastertools.Radioindice.bi.html +docs/_build/html/api/eolab.rastertools.Radioindice.bi2.html +docs/_build/html/api/eolab.rastertools.Radioindice.evi.html +docs/_build/html/api/eolab.rastertools.Radioindice.get_default_indices.html +docs/_build/html/api/eolab.rastertools.Radioindice.html +docs/_build/html/api/eolab.rastertools.Radioindice.indices.html +docs/_build/html/api/eolab.rastertools.Radioindice.ipvi.html +docs/_build/html/api/eolab.rastertools.Radioindice.keep_vrt.html +docs/_build/html/api/eolab.rastertools.Radioindice.merge.html +docs/_build/html/api/eolab.rastertools.Radioindice.mndwi.html +docs/_build/html/api/eolab.rastertools.Radioindice.msavi.html +docs/_build/html/api/eolab.rastertools.Radioindice.msavi2.html +docs/_build/html/api/eolab.rastertools.Radioindice.ndbi.html +docs/_build/html/api/eolab.rastertools.Radioindice.ndpi.html +docs/_build/html/api/eolab.rastertools.Radioindice.ndti.html +docs/_build/html/api/eolab.rastertools.Radioindice.ndvi.html +docs/_build/html/api/eolab.rastertools.Radioindice.ndwi.html +docs/_build/html/api/eolab.rastertools.Radioindice.ndwi2.html +docs/_build/html/api/eolab.rastertools.Radioindice.outputdir.html +docs/_build/html/api/eolab.rastertools.Radioindice.pad_mode.html +docs/_build/html/api/eolab.rastertools.Radioindice.postprocess_files.html +docs/_build/html/api/eolab.rastertools.Radioindice.process_file.html +docs/_build/html/api/eolab.rastertools.Radioindice.process_files.html +docs/_build/html/api/eolab.rastertools.Radioindice.pvi.html +docs/_build/html/api/eolab.rastertools.Radioindice.ri.html +docs/_build/html/api/eolab.rastertools.Radioindice.roi.html +docs/_build/html/api/eolab.rastertools.Radioindice.rvi.html +docs/_build/html/api/eolab.rastertools.Radioindice.savi.html +docs/_build/html/api/eolab.rastertools.Radioindice.tndvi.html +docs/_build/html/api/eolab.rastertools.Radioindice.tsavi.html +docs/_build/html/api/eolab.rastertools.Radioindice.vrt_dir.html +docs/_build/html/api/eolab.rastertools.Radioindice.window_size.html +docs/_build/html/api/eolab.rastertools.Radioindice.with_output.html +docs/_build/html/api/eolab.rastertools.Radioindice.with_roi.html +docs/_build/html/api/eolab.rastertools.Radioindice.with_vrt_stored.html +docs/_build/html/api/eolab.rastertools.Radioindice.with_windows.html +docs/_build/html/api/eolab.rastertools.Rastertool.__init__.html +docs/_build/html/api/eolab.rastertools.Rastertool.html +docs/_build/html/api/eolab.rastertools.Rastertool.keep_vrt.html +docs/_build/html/api/eolab.rastertools.Rastertool.outputdir.html +docs/_build/html/api/eolab.rastertools.Rastertool.postprocess_files.html +docs/_build/html/api/eolab.rastertools.Rastertool.process_file.html +docs/_build/html/api/eolab.rastertools.Rastertool.process_files.html +docs/_build/html/api/eolab.rastertools.Rastertool.vrt_dir.html +docs/_build/html/api/eolab.rastertools.Rastertool.with_output.html +docs/_build/html/api/eolab.rastertools.Rastertool.with_vrt_stored.html +docs/_build/html/api/eolab.rastertools.RastertoolConfigurationException.html +docs/_build/html/api/eolab.rastertools.SVF.__init__.html +docs/_build/html/api/eolab.rastertools.SVF.altitude.html +docs/_build/html/api/eolab.rastertools.SVF.html +docs/_build/html/api/eolab.rastertools.SVF.keep_vrt.html +docs/_build/html/api/eolab.rastertools.SVF.nb_directions.html +docs/_build/html/api/eolab.rastertools.SVF.outputdir.html +docs/_build/html/api/eolab.rastertools.SVF.pad_mode.html +docs/_build/html/api/eolab.rastertools.SVF.postprocess_files.html +docs/_build/html/api/eolab.rastertools.SVF.process_file.html +docs/_build/html/api/eolab.rastertools.SVF.process_files.html +docs/_build/html/api/eolab.rastertools.SVF.radius.html +docs/_build/html/api/eolab.rastertools.SVF.resolution.html +docs/_build/html/api/eolab.rastertools.SVF.vrt_dir.html +docs/_build/html/api/eolab.rastertools.SVF.window_size.html +docs/_build/html/api/eolab.rastertools.SVF.with_altitude.html +docs/_build/html/api/eolab.rastertools.SVF.with_output.html +docs/_build/html/api/eolab.rastertools.SVF.with_vrt_stored.html +docs/_build/html/api/eolab.rastertools.SVF.with_windows.html +docs/_build/html/api/eolab.rastertools.Speed.__init__.html +docs/_build/html/api/eolab.rastertools.Speed.bands.html +docs/_build/html/api/eolab.rastertools.Speed.html +docs/_build/html/api/eolab.rastertools.Speed.keep_vrt.html +docs/_build/html/api/eolab.rastertools.Speed.outputdir.html +docs/_build/html/api/eolab.rastertools.Speed.postprocess_files.html +docs/_build/html/api/eolab.rastertools.Speed.process_file.html +docs/_build/html/api/eolab.rastertools.Speed.process_files.html +docs/_build/html/api/eolab.rastertools.Speed.vrt_dir.html +docs/_build/html/api/eolab.rastertools.Speed.with_output.html +docs/_build/html/api/eolab.rastertools.Speed.with_vrt_stored.html +docs/_build/html/api/eolab.rastertools.Tiling.__init__.html +docs/_build/html/api/eolab.rastertools.Tiling.grid.html +docs/_build/html/api/eolab.rastertools.Tiling.html +docs/_build/html/api/eolab.rastertools.Tiling.keep_vrt.html +docs/_build/html/api/eolab.rastertools.Tiling.output_basename.html +docs/_build/html/api/eolab.rastertools.Tiling.output_subdir.html +docs/_build/html/api/eolab.rastertools.Tiling.outputdir.html +docs/_build/html/api/eolab.rastertools.Tiling.postprocess_files.html +docs/_build/html/api/eolab.rastertools.Tiling.process_file.html +docs/_build/html/api/eolab.rastertools.Tiling.process_files.html +docs/_build/html/api/eolab.rastertools.Tiling.vrt_dir.html +docs/_build/html/api/eolab.rastertools.Tiling.with_id_column.html +docs/_build/html/api/eolab.rastertools.Tiling.with_output.html +docs/_build/html/api/eolab.rastertools.Tiling.with_vrt_stored.html +docs/_build/html/api/eolab.rastertools.Timeseries.__init__.html +docs/_build/html/api/eolab.rastertools.Timeseries.bands.html +docs/_build/html/api/eolab.rastertools.Timeseries.end_date.html +docs/_build/html/api/eolab.rastertools.Timeseries.html +docs/_build/html/api/eolab.rastertools.Timeseries.keep_vrt.html +docs/_build/html/api/eolab.rastertools.Timeseries.outputdir.html +docs/_build/html/api/eolab.rastertools.Timeseries.pad_mode.html +docs/_build/html/api/eolab.rastertools.Timeseries.period.html +docs/_build/html/api/eolab.rastertools.Timeseries.postprocess_files.html +docs/_build/html/api/eolab.rastertools.Timeseries.process_file.html +docs/_build/html/api/eolab.rastertools.Timeseries.process_files.html +docs/_build/html/api/eolab.rastertools.Timeseries.start_date.html +docs/_build/html/api/eolab.rastertools.Timeseries.vrt_dir.html +docs/_build/html/api/eolab.rastertools.Timeseries.window_size.html +docs/_build/html/api/eolab.rastertools.Timeseries.with_output.html +docs/_build/html/api/eolab.rastertools.Timeseries.with_vrt_stored.html +docs/_build/html/api/eolab.rastertools.Timeseries.with_windows.html +docs/_build/html/api/eolab.rastertools.Windowable.__init__.html +docs/_build/html/api/eolab.rastertools.Windowable.html +docs/_build/html/api/eolab.rastertools.Windowable.pad_mode.html +docs/_build/html/api/eolab.rastertools.Windowable.window_size.html +docs/_build/html/api/eolab.rastertools.Windowable.with_windows.html +docs/_build/html/api/eolab.rastertools.Zonalstats.__init__.html +docs/_build/html/api/eolab.rastertools.Zonalstats.area.html +docs/_build/html/api/eolab.rastertools.Zonalstats.bands.html +docs/_build/html/api/eolab.rastertools.Zonalstats.categorical.html +docs/_build/html/api/eolab.rastertools.Zonalstats.category_file.html +docs/_build/html/api/eolab.rastertools.Zonalstats.category_file_type.html +docs/_build/html/api/eolab.rastertools.Zonalstats.category_index.html +docs/_build/html/api/eolab.rastertools.Zonalstats.category_labels.html +docs/_build/html/api/eolab.rastertools.Zonalstats.chart_file.html +docs/_build/html/api/eolab.rastertools.Zonalstats.compute_stats.html +docs/_build/html/api/eolab.rastertools.Zonalstats.display_chart.html +docs/_build/html/api/eolab.rastertools.Zonalstats.generated_stats.html +docs/_build/html/api/eolab.rastertools.Zonalstats.generated_stats_dates.html +docs/_build/html/api/eolab.rastertools.Zonalstats.generated_stats_per_date.html +docs/_build/html/api/eolab.rastertools.Zonalstats.geometries.html +docs/_build/html/api/eolab.rastertools.Zonalstats.geometry_index.html +docs/_build/html/api/eolab.rastertools.Zonalstats.html +docs/_build/html/api/eolab.rastertools.Zonalstats.keep_vrt.html +docs/_build/html/api/eolab.rastertools.Zonalstats.output_format.html +docs/_build/html/api/eolab.rastertools.Zonalstats.outputdir.html +docs/_build/html/api/eolab.rastertools.Zonalstats.postprocess_files.html +docs/_build/html/api/eolab.rastertools.Zonalstats.prefix.html +docs/_build/html/api/eolab.rastertools.Zonalstats.process_file.html +docs/_build/html/api/eolab.rastertools.Zonalstats.process_files.html +docs/_build/html/api/eolab.rastertools.Zonalstats.sigma.html +docs/_build/html/api/eolab.rastertools.Zonalstats.stats.html +docs/_build/html/api/eolab.rastertools.Zonalstats.supported_output_formats.html +docs/_build/html/api/eolab.rastertools.Zonalstats.valid_stats.html +docs/_build/html/api/eolab.rastertools.Zonalstats.valid_threshold.html +docs/_build/html/api/eolab.rastertools.Zonalstats.vrt_dir.html +docs/_build/html/api/eolab.rastertools.Zonalstats.with_chart.html +docs/_build/html/api/eolab.rastertools.Zonalstats.with_geometries.html +docs/_build/html/api/eolab.rastertools.Zonalstats.with_outliers.html +docs/_build/html/api/eolab.rastertools.Zonalstats.with_output.html +docs/_build/html/api/eolab.rastertools.Zonalstats.with_per_category.html +docs/_build/html/api/eolab.rastertools.Zonalstats.with_vrt_stored.html +docs/_build/html/api/eolab.rastertools.Zonalstats.within.html +docs/_build/html/api/eolab.rastertools.cli.filtering.create_argparser.html +docs/_build/html/api/eolab.rastertools.cli.filtering.create_filter.html +docs/_build/html/api/eolab.rastertools.cli.filtering.create_filtering.html +docs/_build/html/api/eolab.rastertools.cli.filtering.filter_options.html +docs/_build/html/api/eolab.rastertools.cli.filtering.handle_result.html +docs/_build/html/api/eolab.rastertools.cli.filtering.html +docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.create_filter.html +docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.create_filtering.html +docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.filter_options.html +docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.handle_result.html +docs/_build/html/api/eolab.rastertools.cli.filtering_dyn.html +docs/_build/html/api/eolab.rastertools.cli.hillshade.create_argparser.html +docs/_build/html/api/eolab.rastertools.cli.hillshade.create_hillshade.html +docs/_build/html/api/eolab.rastertools.cli.hillshade.html +docs/_build/html/api/eolab.rastertools.cli.html +docs/_build/html/api/eolab.rastertools.cli.radioindice.create_argparser.html +docs/_build/html/api/eolab.rastertools.cli.radioindice.create_radioindice.html +docs/_build/html/api/eolab.rastertools.cli.radioindice.html +docs/_build/html/api/eolab.rastertools.cli.radioindice.indices_opt.html +docs/_build/html/api/eolab.rastertools.cli.speed.create_argparser.html +docs/_build/html/api/eolab.rastertools.cli.speed.create_speed.html +docs/_build/html/api/eolab.rastertools.cli.speed.html +docs/_build/html/api/eolab.rastertools.cli.svf.create_argparser.html +docs/_build/html/api/eolab.rastertools.cli.svf.create_svf.html +docs/_build/html/api/eolab.rastertools.cli.svf.html +docs/_build/html/api/eolab.rastertools.cli.tiling.create_argparser.html +docs/_build/html/api/eolab.rastertools.cli.tiling.create_tiling.html +docs/_build/html/api/eolab.rastertools.cli.tiling.html +docs/_build/html/api/eolab.rastertools.cli.timeseries.create_argparser.html +docs/_build/html/api/eolab.rastertools.cli.timeseries.create_timeseries.html +docs/_build/html/api/eolab.rastertools.cli.timeseries.html +docs/_build/html/api/eolab.rastertools.cli.utils_cli.apply_process.html +docs/_build/html/api/eolab.rastertools.cli.utils_cli.html +docs/_build/html/api/eolab.rastertools.cli.with_bands_arguments.html +docs/_build/html/api/eolab.rastertools.cli.with_outputdir_arguments.html +docs/_build/html/api/eolab.rastertools.cli.with_window_arguments.html +docs/_build/html/api/eolab.rastertools.cli.zonalstats.create_argparser.html +docs/_build/html/api/eolab.rastertools.cli.zonalstats.create_zonalstats.html +docs/_build/html/api/eolab.rastertools.cli.zonalstats.html +docs/_build/html/api/eolab.rastertools.html +docs/_build/html/api/eolab.rastertools.processing.algo.adaptive_gaussian.html +docs/_build/html/api/eolab.rastertools.processing.algo.brightness_index.html +docs/_build/html/api/eolab.rastertools.processing.algo.brightness_index2.html +docs/_build/html/api/eolab.rastertools.processing.algo.evi.html +docs/_build/html/api/eolab.rastertools.processing.algo.hillshade.html +docs/_build/html/api/eolab.rastertools.processing.algo.html +docs/_build/html/api/eolab.rastertools.processing.algo.interpolated_timeseries.html +docs/_build/html/api/eolab.rastertools.processing.algo.ipvi.html +docs/_build/html/api/eolab.rastertools.processing.algo.local_mean.html +docs/_build/html/api/eolab.rastertools.processing.algo.local_sum.html +docs/_build/html/api/eolab.rastertools.processing.algo.median.html +docs/_build/html/api/eolab.rastertools.processing.algo.msavi.html +docs/_build/html/api/eolab.rastertools.processing.algo.msavi2.html +docs/_build/html/api/eolab.rastertools.processing.algo.normalized_difference.html +docs/_build/html/api/eolab.rastertools.processing.algo.pvi.html +docs/_build/html/api/eolab.rastertools.processing.algo.redness_index.html +docs/_build/html/api/eolab.rastertools.processing.algo.rvi.html +docs/_build/html/api/eolab.rastertools.processing.algo.savi.html +docs/_build/html/api/eolab.rastertools.processing.algo.speed.html +docs/_build/html/api/eolab.rastertools.processing.algo.svf.html +docs/_build/html/api/eolab.rastertools.processing.algo.tndvi.html +docs/_build/html/api/eolab.rastertools.processing.algo.tsavi.html +docs/_build/html/api/eolab.rastertools.processing.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.html +docs/_build/html/api/eolab.rastertools.processing.rasterproc.html +docs/_build/html/api/eolab.rastertools.processing.sliding.compute_sliding.html +docs/_build/html/api/eolab.rastertools.processing.sliding.html +docs/_build/html/api/eolab.rastertools.processing.stats.compute_zonal_stats.html +docs/_build/html/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.html +docs/_build/html/api/eolab.rastertools.processing.stats.extract_zonal_outliers.html +docs/_build/html/api/eolab.rastertools.processing.stats.html +docs/_build/html/api/eolab.rastertools.processing.stats.plot_stats.html +docs/_build/html/api/eolab.rastertools.processing.vector.clip.html +docs/_build/html/api/eolab.rastertools.processing.vector.crop.html +docs/_build/html/api/eolab.rastertools.processing.vector.dissolve.html +docs/_build/html/api/eolab.rastertools.processing.vector.filter.html +docs/_build/html/api/eolab.rastertools.processing.vector.filter_dissolve.html +docs/_build/html/api/eolab.rastertools.processing.vector.get_raster_shape.html +docs/_build/html/api/eolab.rastertools.processing.vector.html +docs/_build/html/api/eolab.rastertools.processing.vector.rasterize.html +docs/_build/html/api/eolab.rastertools.processing.vector.reproject.html +docs/_build/html/api/eolab.rastertools.processing.vector.vectorize.html +docs/_build/html/api/eolab.rastertools.product.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.create_in_memory_vrt.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.html +docs/_build/html/api/eolab.rastertools.product.rasterproduct.html +docs/_build/html/api/eolab.rastertools.product.rastertype.Band.__init__.html +docs/_build/html/api/eolab.rastertools.product.rastertype.Band.description.html +docs/_build/html/api/eolab.rastertools.product.rastertype.Band.html +docs/_build/html/api/eolab.rastertools.product.rastertype.Band.identifier.html +docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.blue.html +docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.html +docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.green.html +docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.html +docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.mir.html +docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.html +docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.nir.html +docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.html +docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red.html +docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.html +docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.html +docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.html +docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.html +docs/_build/html/api/eolab.rastertools.product.rastertype.BandChannel.swir.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.__init__.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.accept.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.add.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.channels.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.date_format.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.find.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_date.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_group.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.has_channel.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.has_channels.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.has_mask.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.masknodata.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.name.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.nodata.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.html +docs/_build/html/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.html +docs/_build/html/api/eolab.rastertools.product.rastertype.html +docs/_build/html/api/eolab.rastertools.product.s2_maja_mask.html +docs/_build/html/api/eolab.rastertools.product.vrt.add_masks_to_vrt.html +docs/_build/html/api/eolab.rastertools.product.vrt.html +docs/_build/html/api/eolab.rastertools.product.vrt.set_band_descriptions.html +docs/_build/html/api/modules.html +docs/_build/html/cli/filtering.html +docs/_build/html/cli/hillshade.html +docs/_build/html/cli/radioindice.html +docs/_build/html/cli/speed.html +docs/_build/html/cli/svf.html +docs/_build/html/cli/tiling.html +docs/_build/html/cli/timeseries.html +docs/_build/html/cli/zonalstats.html docs/_static/Logo-Eolab-Anglais.png docs/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-grn.jpg docs/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-adaptive_gaussian.jpg @@ -34,6 +1420,7 @@ docs/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-mean.jpg docs/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-median.jpg docs/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats.jpg docs/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats2.jpg +docs/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-sum.jpg docs/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.jpg docs/_static/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi_cropped.jpg docs/_static/dsm-hillshade1.jpg @@ -50,6 +1437,382 @@ docs/_templates/layout.html docs/_templates/autosummary/base.rst docs/_templates/autosummary/class.rst docs/_templates/autosummary/module.rst +docs/api/eolab.rastertools.Filtering.__init__.rst +docs/api/eolab.rastertools.Filtering.adaptive_gaussian.rst +docs/api/eolab.rastertools.Filtering.bands.rst +docs/api/eolab.rastertools.Filtering.get_default_filters.rst +docs/api/eolab.rastertools.Filtering.keep_vrt.rst +docs/api/eolab.rastertools.Filtering.local_mean.rst +docs/api/eolab.rastertools.Filtering.local_sum.rst +docs/api/eolab.rastertools.Filtering.median_filter.rst +docs/api/eolab.rastertools.Filtering.outputdir.rst +docs/api/eolab.rastertools.Filtering.pad_mode.rst +docs/api/eolab.rastertools.Filtering.postprocess_files.rst +docs/api/eolab.rastertools.Filtering.process_file.rst +docs/api/eolab.rastertools.Filtering.process_files.rst +docs/api/eolab.rastertools.Filtering.raster_filter.rst +docs/api/eolab.rastertools.Filtering.rst +docs/api/eolab.rastertools.Filtering.vrt_dir.rst +docs/api/eolab.rastertools.Filtering.window_size.rst +docs/api/eolab.rastertools.Filtering.with_filter_configuration.rst +docs/api/eolab.rastertools.Filtering.with_output.rst +docs/api/eolab.rastertools.Filtering.with_vrt_stored.rst +docs/api/eolab.rastertools.Filtering.with_windows.rst +docs/api/eolab.rastertools.Hillshade.__init__.rst +docs/api/eolab.rastertools.Hillshade.azimuth.rst +docs/api/eolab.rastertools.Hillshade.elevation.rst +docs/api/eolab.rastertools.Hillshade.keep_vrt.rst +docs/api/eolab.rastertools.Hillshade.outputdir.rst +docs/api/eolab.rastertools.Hillshade.pad_mode.rst +docs/api/eolab.rastertools.Hillshade.postprocess_files.rst +docs/api/eolab.rastertools.Hillshade.process_file.rst +docs/api/eolab.rastertools.Hillshade.process_files.rst +docs/api/eolab.rastertools.Hillshade.radius.rst +docs/api/eolab.rastertools.Hillshade.resolution.rst +docs/api/eolab.rastertools.Hillshade.rst +docs/api/eolab.rastertools.Hillshade.vrt_dir.rst +docs/api/eolab.rastertools.Hillshade.window_size.rst +docs/api/eolab.rastertools.Hillshade.with_output.rst +docs/api/eolab.rastertools.Hillshade.with_vrt_stored.rst +docs/api/eolab.rastertools.Hillshade.with_windows.rst +docs/api/eolab.rastertools.Radioindice.__init__.rst +docs/api/eolab.rastertools.Radioindice.bi.rst +docs/api/eolab.rastertools.Radioindice.bi2.rst +docs/api/eolab.rastertools.Radioindice.evi.rst +docs/api/eolab.rastertools.Radioindice.get_default_indices.rst +docs/api/eolab.rastertools.Radioindice.indices.rst +docs/api/eolab.rastertools.Radioindice.ipvi.rst +docs/api/eolab.rastertools.Radioindice.keep_vrt.rst +docs/api/eolab.rastertools.Radioindice.merge.rst +docs/api/eolab.rastertools.Radioindice.mndwi.rst +docs/api/eolab.rastertools.Radioindice.msavi.rst +docs/api/eolab.rastertools.Radioindice.msavi2.rst +docs/api/eolab.rastertools.Radioindice.ndbi.rst +docs/api/eolab.rastertools.Radioindice.ndpi.rst +docs/api/eolab.rastertools.Radioindice.ndti.rst +docs/api/eolab.rastertools.Radioindice.ndvi.rst +docs/api/eolab.rastertools.Radioindice.ndwi.rst +docs/api/eolab.rastertools.Radioindice.ndwi2.rst +docs/api/eolab.rastertools.Radioindice.outputdir.rst +docs/api/eolab.rastertools.Radioindice.pad_mode.rst +docs/api/eolab.rastertools.Radioindice.postprocess_files.rst +docs/api/eolab.rastertools.Radioindice.process_file.rst +docs/api/eolab.rastertools.Radioindice.process_files.rst +docs/api/eolab.rastertools.Radioindice.pvi.rst +docs/api/eolab.rastertools.Radioindice.ri.rst +docs/api/eolab.rastertools.Radioindice.roi.rst +docs/api/eolab.rastertools.Radioindice.rst +docs/api/eolab.rastertools.Radioindice.rvi.rst +docs/api/eolab.rastertools.Radioindice.savi.rst +docs/api/eolab.rastertools.Radioindice.tndvi.rst +docs/api/eolab.rastertools.Radioindice.tsavi.rst +docs/api/eolab.rastertools.Radioindice.vrt_dir.rst +docs/api/eolab.rastertools.Radioindice.window_size.rst +docs/api/eolab.rastertools.Radioindice.with_output.rst +docs/api/eolab.rastertools.Radioindice.with_roi.rst +docs/api/eolab.rastertools.Radioindice.with_vrt_stored.rst +docs/api/eolab.rastertools.Radioindice.with_windows.rst +docs/api/eolab.rastertools.Rastertool.__init__.rst +docs/api/eolab.rastertools.Rastertool.keep_vrt.rst +docs/api/eolab.rastertools.Rastertool.outputdir.rst +docs/api/eolab.rastertools.Rastertool.postprocess_files.rst +docs/api/eolab.rastertools.Rastertool.process_file.rst +docs/api/eolab.rastertools.Rastertool.process_files.rst +docs/api/eolab.rastertools.Rastertool.rst +docs/api/eolab.rastertools.Rastertool.vrt_dir.rst +docs/api/eolab.rastertools.Rastertool.with_output.rst +docs/api/eolab.rastertools.Rastertool.with_vrt_stored.rst +docs/api/eolab.rastertools.RastertoolConfigurationException.rst +docs/api/eolab.rastertools.SVF.__init__.rst +docs/api/eolab.rastertools.SVF.altitude.rst +docs/api/eolab.rastertools.SVF.keep_vrt.rst +docs/api/eolab.rastertools.SVF.nb_directions.rst +docs/api/eolab.rastertools.SVF.outputdir.rst +docs/api/eolab.rastertools.SVF.pad_mode.rst +docs/api/eolab.rastertools.SVF.postprocess_files.rst +docs/api/eolab.rastertools.SVF.process_file.rst +docs/api/eolab.rastertools.SVF.process_files.rst +docs/api/eolab.rastertools.SVF.radius.rst +docs/api/eolab.rastertools.SVF.resolution.rst +docs/api/eolab.rastertools.SVF.rst +docs/api/eolab.rastertools.SVF.vrt_dir.rst +docs/api/eolab.rastertools.SVF.window_size.rst +docs/api/eolab.rastertools.SVF.with_altitude.rst +docs/api/eolab.rastertools.SVF.with_output.rst +docs/api/eolab.rastertools.SVF.with_vrt_stored.rst +docs/api/eolab.rastertools.SVF.with_windows.rst +docs/api/eolab.rastertools.Speed.__init__.rst +docs/api/eolab.rastertools.Speed.bands.rst +docs/api/eolab.rastertools.Speed.keep_vrt.rst +docs/api/eolab.rastertools.Speed.outputdir.rst +docs/api/eolab.rastertools.Speed.postprocess_files.rst +docs/api/eolab.rastertools.Speed.process_file.rst +docs/api/eolab.rastertools.Speed.process_files.rst +docs/api/eolab.rastertools.Speed.rst +docs/api/eolab.rastertools.Speed.vrt_dir.rst +docs/api/eolab.rastertools.Speed.with_output.rst +docs/api/eolab.rastertools.Speed.with_vrt_stored.rst +docs/api/eolab.rastertools.Tiling.__init__.rst +docs/api/eolab.rastertools.Tiling.grid.rst +docs/api/eolab.rastertools.Tiling.keep_vrt.rst +docs/api/eolab.rastertools.Tiling.output_basename.rst +docs/api/eolab.rastertools.Tiling.output_subdir.rst +docs/api/eolab.rastertools.Tiling.outputdir.rst +docs/api/eolab.rastertools.Tiling.postprocess_files.rst +docs/api/eolab.rastertools.Tiling.process_file.rst +docs/api/eolab.rastertools.Tiling.process_files.rst +docs/api/eolab.rastertools.Tiling.rst +docs/api/eolab.rastertools.Tiling.vrt_dir.rst +docs/api/eolab.rastertools.Tiling.with_id_column.rst +docs/api/eolab.rastertools.Tiling.with_output.rst +docs/api/eolab.rastertools.Tiling.with_vrt_stored.rst +docs/api/eolab.rastertools.Timeseries.__init__.rst +docs/api/eolab.rastertools.Timeseries.bands.rst +docs/api/eolab.rastertools.Timeseries.end_date.rst +docs/api/eolab.rastertools.Timeseries.keep_vrt.rst +docs/api/eolab.rastertools.Timeseries.outputdir.rst +docs/api/eolab.rastertools.Timeseries.pad_mode.rst +docs/api/eolab.rastertools.Timeseries.period.rst +docs/api/eolab.rastertools.Timeseries.postprocess_files.rst +docs/api/eolab.rastertools.Timeseries.process_file.rst +docs/api/eolab.rastertools.Timeseries.process_files.rst +docs/api/eolab.rastertools.Timeseries.rst +docs/api/eolab.rastertools.Timeseries.start_date.rst +docs/api/eolab.rastertools.Timeseries.vrt_dir.rst +docs/api/eolab.rastertools.Timeseries.window_size.rst +docs/api/eolab.rastertools.Timeseries.with_output.rst +docs/api/eolab.rastertools.Timeseries.with_vrt_stored.rst +docs/api/eolab.rastertools.Timeseries.with_windows.rst +docs/api/eolab.rastertools.Windowable.__init__.rst +docs/api/eolab.rastertools.Windowable.pad_mode.rst +docs/api/eolab.rastertools.Windowable.rst +docs/api/eolab.rastertools.Windowable.window_size.rst +docs/api/eolab.rastertools.Windowable.with_windows.rst +docs/api/eolab.rastertools.Zonalstats.__init__.rst +docs/api/eolab.rastertools.Zonalstats.area.rst +docs/api/eolab.rastertools.Zonalstats.bands.rst +docs/api/eolab.rastertools.Zonalstats.categorical.rst +docs/api/eolab.rastertools.Zonalstats.category_file.rst +docs/api/eolab.rastertools.Zonalstats.category_file_type.rst +docs/api/eolab.rastertools.Zonalstats.category_index.rst +docs/api/eolab.rastertools.Zonalstats.category_labels.rst +docs/api/eolab.rastertools.Zonalstats.chart_file.rst +docs/api/eolab.rastertools.Zonalstats.compute_stats.rst +docs/api/eolab.rastertools.Zonalstats.display_chart.rst +docs/api/eolab.rastertools.Zonalstats.generated_stats.rst +docs/api/eolab.rastertools.Zonalstats.generated_stats_dates.rst +docs/api/eolab.rastertools.Zonalstats.generated_stats_per_date.rst +docs/api/eolab.rastertools.Zonalstats.geometries.rst +docs/api/eolab.rastertools.Zonalstats.geometry_index.rst +docs/api/eolab.rastertools.Zonalstats.keep_vrt.rst +docs/api/eolab.rastertools.Zonalstats.output_format.rst +docs/api/eolab.rastertools.Zonalstats.outputdir.rst +docs/api/eolab.rastertools.Zonalstats.postprocess_files.rst +docs/api/eolab.rastertools.Zonalstats.prefix.rst +docs/api/eolab.rastertools.Zonalstats.process_file.rst +docs/api/eolab.rastertools.Zonalstats.process_files.rst +docs/api/eolab.rastertools.Zonalstats.rst +docs/api/eolab.rastertools.Zonalstats.sigma.rst +docs/api/eolab.rastertools.Zonalstats.stats.rst +docs/api/eolab.rastertools.Zonalstats.supported_output_formats.rst +docs/api/eolab.rastertools.Zonalstats.valid_stats.rst +docs/api/eolab.rastertools.Zonalstats.valid_threshold.rst +docs/api/eolab.rastertools.Zonalstats.vrt_dir.rst +docs/api/eolab.rastertools.Zonalstats.with_chart.rst +docs/api/eolab.rastertools.Zonalstats.with_geometries.rst +docs/api/eolab.rastertools.Zonalstats.with_outliers.rst +docs/api/eolab.rastertools.Zonalstats.with_output.rst +docs/api/eolab.rastertools.Zonalstats.with_per_category.rst +docs/api/eolab.rastertools.Zonalstats.with_vrt_stored.rst +docs/api/eolab.rastertools.Zonalstats.within.rst +docs/api/eolab.rastertools.cli.filtering.create_filter.rst +docs/api/eolab.rastertools.cli.filtering.create_filtering.rst +docs/api/eolab.rastertools.cli.filtering.filter_options.rst +docs/api/eolab.rastertools.cli.filtering.rst +docs/api/eolab.rastertools.cli.hillshade.rst +docs/api/eolab.rastertools.cli.radioindice.indices_opt.rst +docs/api/eolab.rastertools.cli.radioindice.rst +docs/api/eolab.rastertools.cli.rst +docs/api/eolab.rastertools.cli.speed.rst +docs/api/eolab.rastertools.cli.svf.rst +docs/api/eolab.rastertools.cli.tiling.rst +docs/api/eolab.rastertools.cli.timeseries.rst +docs/api/eolab.rastertools.cli.utils_cli.apply_process.rst +docs/api/eolab.rastertools.cli.utils_cli.rst +docs/api/eolab.rastertools.cli.with_bands_arguments.rst +docs/api/eolab.rastertools.cli.with_outputdir_arguments.rst +docs/api/eolab.rastertools.cli.with_window_arguments.rst +docs/api/eolab.rastertools.cli.zonalstats.rst +docs/api/eolab.rastertools.processing.algo.adaptive_gaussian.rst +docs/api/eolab.rastertools.processing.algo.brightness_index.rst +docs/api/eolab.rastertools.processing.algo.brightness_index2.rst +docs/api/eolab.rastertools.processing.algo.evi.rst +docs/api/eolab.rastertools.processing.algo.hillshade.rst +docs/api/eolab.rastertools.processing.algo.interpolated_timeseries.rst +docs/api/eolab.rastertools.processing.algo.ipvi.rst +docs/api/eolab.rastertools.processing.algo.local_mean.rst +docs/api/eolab.rastertools.processing.algo.local_sum.rst +docs/api/eolab.rastertools.processing.algo.median.rst +docs/api/eolab.rastertools.processing.algo.msavi.rst +docs/api/eolab.rastertools.processing.algo.msavi2.rst +docs/api/eolab.rastertools.processing.algo.normalized_difference.rst +docs/api/eolab.rastertools.processing.algo.pvi.rst +docs/api/eolab.rastertools.processing.algo.redness_index.rst +docs/api/eolab.rastertools.processing.algo.rst +docs/api/eolab.rastertools.processing.algo.rvi.rst +docs/api/eolab.rastertools.processing.algo.savi.rst +docs/api/eolab.rastertools.processing.algo.speed.rst +docs/api/eolab.rastertools.processing.algo.svf.rst +docs/api/eolab.rastertools.processing.algo.tndvi.rst +docs/api/eolab.rastertools.processing.algo.tsavi.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.__init__.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.algo.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.aliases.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.arguments.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.channels.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compress.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.compute.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.configure.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.description.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.dtype.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.help.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.in_dtype.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.name.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nbits.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.nodata.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.per_band_algo.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_arguments.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_channels.rst +docs/api/eolab.rastertools.processing.rasterproc.RadioindiceProcessing.with_documentation.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.__init__.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.algo.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.aliases.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.arguments.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.compress.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.compute.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.configure.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.description.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.dtype.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.help.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.in_dtype.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.name.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.nbits.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.nodata.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.per_band_algo.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_arguments.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterFilter.with_documentation.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.__init__.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.algo.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.aliases.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.arguments.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compress.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.compute.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.configure.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.description.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.dtype.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.help.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.in_dtype.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.name.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nbits.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.nodata.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.per_band_algo.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_arguments.rst +docs/api/eolab.rastertools.processing.rasterproc.RasterProcessing.with_documentation.rst +docs/api/eolab.rastertools.processing.rasterproc.rst +docs/api/eolab.rastertools.processing.rst +docs/api/eolab.rastertools.processing.sliding.compute_sliding.rst +docs/api/eolab.rastertools.processing.sliding.rst +docs/api/eolab.rastertools.processing.stats.compute_zonal_stats.rst +docs/api/eolab.rastertools.processing.stats.compute_zonal_stats_per_category.rst +docs/api/eolab.rastertools.processing.stats.extract_zonal_outliers.rst +docs/api/eolab.rastertools.processing.stats.plot_stats.rst +docs/api/eolab.rastertools.processing.stats.rst +docs/api/eolab.rastertools.processing.vector.clip.rst +docs/api/eolab.rastertools.processing.vector.crop.rst +docs/api/eolab.rastertools.processing.vector.dissolve.rst +docs/api/eolab.rastertools.processing.vector.filter.rst +docs/api/eolab.rastertools.processing.vector.filter_dissolve.rst +docs/api/eolab.rastertools.processing.vector.get_raster_shape.rst +docs/api/eolab.rastertools.processing.vector.rasterize.rst +docs/api/eolab.rastertools.processing.vector.reproject.rst +docs/api/eolab.rastertools.processing.vector.rst +docs/api/eolab.rastertools.processing.vector.vectorize.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.__init__.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.bands_files.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.channels.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.file.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.free_in_memory_vrts.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_date_string.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_raster.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_relative_orbit.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_satellite.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.get_tile.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.is_archive.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.masks_files.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.open.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.rastertype.rst +docs/api/eolab.rastertools.product.rasterproduct.RasterProduct.rst +docs/api/eolab.rastertools.product.rasterproduct.rst +docs/api/eolab.rastertools.product.rastertype.Band.__init__.rst +docs/api/eolab.rastertools.product.rastertype.Band.description.rst +docs/api/eolab.rastertools.product.rastertype.Band.identifier.rst +docs/api/eolab.rastertools.product.rastertype.Band.rst +docs/api/eolab.rastertools.product.rastertype.BandChannel.blue.rst +docs/api/eolab.rastertools.product.rastertype.BandChannel.blue_60m.rst +docs/api/eolab.rastertools.product.rastertype.BandChannel.green.rst +docs/api/eolab.rastertools.product.rastertype.BandChannel.mir.rst +docs/api/eolab.rastertools.product.rastertype.BandChannel.mir_60m.rst +docs/api/eolab.rastertools.product.rastertype.BandChannel.nir.rst +docs/api/eolab.rastertools.product.rastertype.BandChannel.nir_60m.rst +docs/api/eolab.rastertools.product.rastertype.BandChannel.red.rst +docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge1.rst +docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge2.rst +docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge3.rst +docs/api/eolab.rastertools.product.rastertype.BandChannel.red_edge4.rst +docs/api/eolab.rastertools.product.rastertype.BandChannel.rst +docs/api/eolab.rastertools.product.rastertype.BandChannel.swir.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.__init__.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.accept.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.add.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.bands_pattern.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.channels.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.date_format.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.find.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.get.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_description.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_descriptions.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_id.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.get_band_ids.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.get_bands_regexp.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.get_date.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.get_group.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask_descriptions.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask_ids.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.get_mask_regexp.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.has_channel.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.has_channels.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.has_mask.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.maskfunc.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.masknodata.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.name.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.nodata.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.product_pattern.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.rastertypes.rst +docs/api/eolab.rastertools.product.rastertype.RasterType.rst +docs/api/eolab.rastertools.product.rastertype.rst +docs/api/eolab.rastertools.product.rst +docs/api/eolab.rastertools.product.s2_maja_mask.rst +docs/api/eolab.rastertools.product.vrt.add_masks_to_vrt.rst +docs/api/eolab.rastertools.product.vrt.rst +docs/api/eolab.rastertools.product.vrt.set_band_descriptions.rst +docs/api/eolab.rastertools.rst +docs/api/eolab.rst +docs/api/modules.rst docs/cli/filtering.rst docs/cli/hillshade.rst docs/cli/radioindice.rst @@ -58,6 +1821,9 @@ docs/cli/svf.rst docs/cli/tiling.rst docs/cli/timeseries.rst docs/cli/zonalstats.rst +src/.coverage +src/eolab/georastertools/rastertools.py +src/eolab/georastertools/cli/.coverage src/eolab/rastertools/__init__.py src/eolab/rastertools/filtering.py src/eolab/rastertools/hillshade.py @@ -70,6 +1836,19 @@ src/eolab/rastertools/tiling.py src/eolab/rastertools/timeseries.py src/eolab/rastertools/utils.py src/eolab/rastertools/zonalstats.py +src/eolab/rastertools/__pycache__/__init__.cpython-38.pyc +src/eolab/rastertools/__pycache__/filtering.cpython-38.pyc +src/eolab/rastertools/__pycache__/hillshade.cpython-38.pyc +src/eolab/rastertools/__pycache__/main.cpython-38.pyc +src/eolab/rastertools/__pycache__/radioindice.cpython-38.pyc +src/eolab/rastertools/__pycache__/rastertools.cpython-38.pyc +src/eolab/rastertools/__pycache__/speed.cpython-38.pyc +src/eolab/rastertools/__pycache__/svf.cpython-38.pyc +src/eolab/rastertools/__pycache__/tiling.cpython-38.pyc +src/eolab/rastertools/__pycache__/timeseries.cpython-38.pyc +src/eolab/rastertools/__pycache__/utils.cpython-38.pyc +src/eolab/rastertools/__pycache__/zonalstats.cpython-38.pyc +src/eolab/rastertools/cli/.coverage src/eolab/rastertools/cli/__init__.py src/eolab/rastertools/cli/filtering.py src/eolab/rastertools/cli/hillshade.py @@ -78,18 +1857,38 @@ src/eolab/rastertools/cli/speed.py src/eolab/rastertools/cli/svf.py src/eolab/rastertools/cli/tiling.py src/eolab/rastertools/cli/timeseries.py +src/eolab/rastertools/cli/utils_cli.py src/eolab/rastertools/cli/zonalstats.py +src/eolab/rastertools/cli/__pycache__/__init__.cpython-38.pyc +src/eolab/rastertools/cli/__pycache__/filtering.cpython-38.pyc +src/eolab/rastertools/cli/__pycache__/hillshade.cpython-38.pyc +src/eolab/rastertools/cli/__pycache__/radioindice.cpython-38.pyc +src/eolab/rastertools/cli/__pycache__/speed.cpython-38.pyc +src/eolab/rastertools/cli/__pycache__/svf.cpython-38.pyc +src/eolab/rastertools/cli/__pycache__/tiling.cpython-38.pyc +src/eolab/rastertools/cli/__pycache__/timeseries.cpython-38.pyc +src/eolab/rastertools/cli/__pycache__/zonalstats.cpython-38.pyc src/eolab/rastertools/processing/__init__.py src/eolab/rastertools/processing/algo.py src/eolab/rastertools/processing/rasterproc.py src/eolab/rastertools/processing/sliding.py src/eolab/rastertools/processing/stats.py src/eolab/rastertools/processing/vector.py +src/eolab/rastertools/processing/__pycache__/__init__.cpython-38.pyc +src/eolab/rastertools/processing/__pycache__/algo.cpython-38.pyc +src/eolab/rastertools/processing/__pycache__/rasterproc.cpython-38.pyc +src/eolab/rastertools/processing/__pycache__/sliding.cpython-38.pyc +src/eolab/rastertools/processing/__pycache__/stats.cpython-38.pyc +src/eolab/rastertools/processing/__pycache__/vector.cpython-38.pyc src/eolab/rastertools/product/__init__.py src/eolab/rastertools/product/rasterproduct.py src/eolab/rastertools/product/rastertype.py src/eolab/rastertools/product/rastertypes.json src/eolab/rastertools/product/vrt.py +src/eolab/rastertools/product/__pycache__/__init__.cpython-38.pyc +src/eolab/rastertools/product/__pycache__/rasterproduct.cpython-38.pyc +src/eolab/rastertools/product/__pycache__/rastertype.cpython-38.pyc +src/eolab/rastertools/product/__pycache__/vrt.cpython-38.pyc src/rastertools.egg-info/PKG-INFO src/rastertools.egg-info/SOURCES.txt src/rastertools.egg-info/dependency_links.txt @@ -97,6 +1896,7 @@ src/rastertools.egg-info/entry_points.txt src/rastertools.egg-info/not-zip-safe src/rastertools.egg-info/requires.txt src/rastertools.egg-info/top_level.txt +tests/.coverage tests/__init__.py tests/cmptools.py tests/conftest.py @@ -113,6 +1913,76 @@ tests/test_utils.py tests/test_vector.py tests/test_zonalstats.py tests/utils4test.py +tests/__pycache__/__init__.cpython-38.pyc +tests/__pycache__/cmptools.cpython-38.pyc +tests/__pycache__/conftest.cpython-38-pytest-8.0.0.pyc +tests/__pycache__/test_algo.cpython-38-pytest-8.0.0.pyc +tests/__pycache__/test_radioindice.cpython-38-pytest-8.0.0.pyc +tests/__pycache__/test_rasterproc.cpython-38-pytest-8.0.0.pyc +tests/__pycache__/test_rasterproduct.cpython-38-pytest-8.0.0.pyc +tests/__pycache__/test_rastertools.cpython-38-pytest-8.0.0.pyc +tests/__pycache__/test_rastertype.cpython-38-pytest-8.0.0.pyc +tests/__pycache__/test_speed.cpython-38-pytest-8.0.0.pyc +tests/__pycache__/test_stats.cpython-38-pytest-8.0.0.pyc +tests/__pycache__/test_tiling.cpython-38-pytest-8.0.0.pyc +tests/__pycache__/test_utils.cpython-38-pytest-8.0.0.pyc +tests/__pycache__/test_vector.cpython-38-pytest-8.0.0.pyc +tests/__pycache__/test_zonalstats.cpython-38-pytest-8.0.0.pyc +tests/__pycache__/utils4test.cpython-38.pyc +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-mask.vrt +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.vrt +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_ATB_R1.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_ATB_R2.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B11.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B12.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B2.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B3.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B4.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B5.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B6.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B7.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8A.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MTD_ALL.xml +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_QKL_ALL.jpg +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B11.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B12.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B2.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B3.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B4.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B5.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B6.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B7.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B8.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B8A.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R1.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R2.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DFP_R1.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DFP_R2.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D01.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D02.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D03.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D04.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D05.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D06.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D07.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D01.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D02.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D03.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D04.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D05.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D06.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D07.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R1.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R2.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_IAB_R1.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_IAB_R2.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MG2_R1.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MG2_R2.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R1.tif +tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R2.tif +tests/tests_data/.coverage tests/tests_data/COMMUNE_32001.dbf tests/tests_data/COMMUNE_32001.prj tests/tests_data/COMMUNE_32001.qpj @@ -130,29 +2000,92 @@ tests/tests_data/OSO_2017_classification_dep59.shx tests/tests_data/OSO_nomenclature_2017.json tests/tests_data/OSO_nomenclature_2017_wrong.json tests/tests_data/RGB_TIF_20170105_013442_test.tif +tests/tests_data/RGB_TIF_20170105_013442_test.tif.aux.xml tests/tests_data/S2A_MSIL2A_20190116T105401_N0211_R051_T30TYP_20190116T120806.vrt tests/tests_data/S2A_MSIL2A_20190116T105401_N0211_R051_T30TYP_20190116T120806.zip tests/tests_data/S2B_MSIL1C_20191008T105029_N0208_R051_T30TYP_20191008T125041.zip tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif +tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif.aux.xml tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndwi.tif +tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndwi.tif.aux.xml tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndwi.tif tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_tar.tar tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_targz.TAR.GZ +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_targz.TAR.GZ.properties tests/tests_data/SPOT6_2018_France-Ortho_NC_DRS-MS_SPOT6_2018_FRANCE_ORTHO_NC_GEOSUD_MS_82.tar.gz +tests/tests_data/SPOT6_2018_France-Ortho_NC_DRS-MS_SPOT6_2018_FRANCE_ORTHO_NC_GEOSUD_MS_82.tar.gz.properties tests/tests_data/additional_rastertypes.json tests/tests_data/grid.geojson -tests/tests_data/listing.lst -tests/tests_data/listing2.lst -tests/tests_data/listing3.lst tests/tests_data/tif_file.tif tests/tests_data/toulouse-mnh.tif +tests/tests_data/toulouse-mnh.tif.aux.xml +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_ATB_R1.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_ATB_R2.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B11.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B12.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B2.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B3.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B4.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B5.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B6.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B7.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8A.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MTD_ALL.xml +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_QKL_ALL.jpg +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B11.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B12.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B2.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B3.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B4.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B5.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B6.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B7.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B8.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B8A.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R1.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R1.tif.aux.xml +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R2.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DFP_R1.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DFP_R2.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D01.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D02.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D03.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D04.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D05.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D06.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D07.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D01.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D02.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D03.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D04.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D05.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D06.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D07.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R1.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R2.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_IAB_R1.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_IAB_R2.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MG2_R1.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MG2_R2.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R1.tif +tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R2.tif +tests/tests_refs/tif_file_tile0.tif +tests/tests_refs/tif_file_tile3.tif +tests/tests_refs/tif_file_tile77.tif +tests/tests_refs/tif_file_tile93.tif +tests/tests_refs/tiletif_file.tif tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi-speed-20180928-105515.tif +tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi-speed-20180928-105515.tif.aux.xml tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif +tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif.aux.xml tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndwi-speed-20180928-105515.tif +tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndwi-speed-20180928-105515.tif.aux.xml tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndwi.tif +tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndwi.tif.aux.xml tests/tests_refs/test_rasterproduct/S2A_MSIL2A_20190116T105401_N0211_R051_T30TYP_20190116T120806.vrt tests/tests_refs/test_rasterproduct/S2B_MSIL1C_20191008T105029_N0208_R051_T30TYP_20191008T125041-clipped.vrt tests/tests_refs/test_rasterproduct/S2B_MSIL1C_20191008T105029_N0208_R051_T30TYP_20191008T125041.vrt @@ -171,10 +2104,15 @@ tests/tests_refs/test_rasterproduct/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_ tests/tests_refs/test_rasterproduct/SPOT6_2018_France-Ortho_NC_DRS-MS_SPOT6_2018_FRANCE_ORTHO_NC_GEOSUD_MS_82.vrt tests/tests_refs/test_stats/zonal_stats.geojson tests/tests_refs/test_tiling/tif_file_tile77.tif +tests/tests_refs/test_tiling/tif_file_tile77.tif.aux.xml tests/tests_refs/test_tiling/tif_file_tile93.tif +tests/tests_refs/test_tiling/tif_file_tile93.tif.aux.xml tests/tests_refs/test_timeseries/SENTINEL2A_20180926-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif +tests/tests_refs/test_timeseries/SENTINEL2A_20180926-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif.aux.xml tests/tests_refs/test_timeseries/SENTINEL2A_20181016-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif +tests/tests_refs/test_timeseries/SENTINEL2A_20181016-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif.aux.xml tests/tests_refs/test_timeseries/SENTINEL2A_20181105-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif +tests/tests_refs/test_timeseries/SENTINEL2A_20181105-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif.aux.xml tests/tests_refs/test_vector/clip.geojson tests/tests_refs/test_vector/raster_outline.geojson tests/tests_refs/test_vector/reproject_dissolve.geojson diff --git a/src/rastertools.egg-info/entry_points.txt b/src/rastertools.egg-info/entry_points.txt index 4366a5f5..467c161c 100644 --- a/src/rastertools.egg-info/entry_points.txt +++ b/src/rastertools.egg-info/entry_points.txt @@ -1,2 +1,2 @@ -[console_scripts] -rastertools = eolab.rastertools.main:run +[rasterio.rio_plugins] +rastertools = eolab.rastertools.main:rastertools diff --git a/src/rastertools.egg-info/requires.txt b/src/rastertools.egg-info/requires.txt index a5ca8f7c..f6bfd83e 100644 --- a/src/rastertools.egg-info/requires.txt +++ b/src/rastertools.egg-info/requires.txt @@ -1,6 +1,21 @@ - -[:python_version < "3.8"] -importlib-metadata +click +rasterio +pytest>=3.6 +rioxarray +dask +pytest-cov +geopandas==0.13 +kiwisolver==1.4.5 +matplotlib==3.7.3 +packaging==24.1 +fiona==1.8.21 +sphinx_rtd_theme==3.0.1 +pip==24.2 +sphinx==7.1.2 +scipy==1.8 +pyscaffold +gdal==3.5.0 +tqdm==4.66 [testing] setuptools diff --git a/tests/.coverage b/tests/.coverage new file mode 100644 index 00000000..8761aa26 Binary files /dev/null and b/tests/.coverage differ diff --git a/tests/__pycache__/__init__.cpython-38.pyc b/tests/__pycache__/__init__.cpython-38.pyc index bdf34c83..4dc7c67b 100644 Binary files a/tests/__pycache__/__init__.cpython-38.pyc and b/tests/__pycache__/__init__.cpython-38.pyc differ diff --git a/tests/__pycache__/cmptools.cpython-38.pyc b/tests/__pycache__/cmptools.cpython-38.pyc index e7274e51..a24ee3e3 100644 Binary files a/tests/__pycache__/cmptools.cpython-38.pyc and b/tests/__pycache__/cmptools.cpython-38.pyc differ diff --git a/tests/__pycache__/utils4test.cpython-38.pyc b/tests/__pycache__/utils4test.cpython-38.pyc index 0c8ef922..80b7172b 100644 Binary files a/tests/__pycache__/utils4test.cpython-38.pyc and b/tests/__pycache__/utils4test.cpython-38.pyc differ diff --git a/tests/cmptools.py b/tests/cmptools.py index b63f451a..5ee763f9 100644 --- a/tests/cmptools.py +++ b/tests/cmptools.py @@ -7,7 +7,7 @@ from osgeo_utils import gdalcompare -def cmp_geojson(golden, new, tolerance=1e-9): +def cmp_geojson(golden, new, column_sortby = None, tolerance=1e-9): # Load GeoJSON files gld_gj = json.load(open(golden)) new_gj = json.load(open(new)) @@ -16,6 +16,10 @@ def cmp_geojson(golden, new, tolerance=1e-9): gld_gdf = gpd.GeoDataFrame.from_features(gld_gj["features"]) new_gdf = gpd.GeoDataFrame.from_features(new_gj["features"]) + if column_sortby : + gld_gdf = gld_gdf.sort_values(by=column_sortby) + new_gdf = new_gdf.sort_values(by=column_sortby) + equals = True # Compare each geometry using Hausdorff distance for gld_geom, new_geom in zip(gld_gdf.geometry, new_gdf.geometry): @@ -108,7 +112,7 @@ def cmp_vrt(golden, new, tolerance=1e-9): def cmp_tif(golden, new, tolerance=1e-2): gld_ds = gdal.Open(golden, gdal.GA_ReadOnly) new_ds = gdal.Open(new, gdal.GA_ReadOnly) - d_count = gdalcompare.compare_db(gld_ds, new_ds) + d_count = gdalcompare.compare_db(gld_ds, new_ds, options= ['SKIP_METADATA']) p_count = gld_ds.RasterCount * gld_ds.RasterXSize * gld_ds.RasterYSize return d_count *100. / p_count < tolerance diff --git a/tests/test_algo.py b/tests/test_algo.py index 5071e555..8826000d 100644 --- a/tests/test_algo.py +++ b/tests/test_algo.py @@ -1,17 +1,31 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +from datetime import datetime, timedelta +from pathlib import Path import numpy as np import numpy.ma as ma +import rasterio +import pytest +import xarray as xr +from rioxarray import rioxarray +from eolab.rastertools import utils from eolab.rastertools.processing import algo +from eolab.rastertools.product import RasterProduct __author__ = "Olivier Queyrut" __copyright__ = "Copyright 2019, CNES" __license__ = "Apache v2.0" - def test_local_sum(): + """ + Test the local sum filter with varying kernel sizes. + + This function verifies that the local sum filter correctly applies to a + 5x5 matrix with kernel sizes ranging from 1 to 5, comparing each output + to expected results. + """ results = [ np.array( [[0, 1, 2, 3, 4], @@ -65,7 +79,10 @@ def test_local_sum(): def test_local_mean(): - + """ + Test the local mean filter with a kernel size of 2. + This test verifies the local mean filter by comparing its output on a 5x5 matrix to an expected result matrix. + """ result = np.array( [[1, 1.5, 2.5, 3.5, 4], [3, 3.5, 4.5, 5.5, 6], @@ -94,7 +111,8 @@ def test_local_mean(): ) mask = np.pad(mask, (radius, radius), mode="edge") - array = ma.array(band, mask=mask) + array = ma.array(band, mask=mask) # masks the band array + # ie. removes the first line and first column of band # output shape is array shape - kernel_width output = algo.local_mean(array, kernel_size=kernel_width) @@ -106,7 +124,13 @@ def test_local_mean(): def test_bresenham_line(): + """ + Test the Bresenham's line algorithm for angles from 0° to 360° in 15° increments. + This function verifies that the Bresenham line algorithm generates accurate + line coordinates for a given radius across multiple theta values. Each angle + is tested against an expected list of coordinates. + """ results = [ # 0° [(1, 0), (2, 0), (3, 0), (4, 0), (5, 0)], diff --git a/tests/test_radioindice.py b/tests/test_radioindice.py index ba2385f6..96e431cb 100644 --- a/tests/test_radioindice.py +++ b/tests/test_radioindice.py @@ -1,8 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +import os -import pytest -import filecmp import logging from eolab.rastertools import Radioindice from eolab.rastertools.processing.rasterproc import RadioindiceProcessing @@ -14,29 +13,62 @@ __copyright__ = "Copyright 2019, CNES" __license__ = "Apache v2.0" +from .utils4test import RastertoolsTestsData __refdir = utils4test.get_refdir("test_radioindice/") def test_radioindice_process_file_merge(): + ''' + This function tests the Radioindice class's ability to generate a merged output file containing multiple indices. The indices generated + include: + + NDVI, TNDVI, RVI, PVI, SAVI, TSAVI, MSAVI, MSAVI2, IPVI, EVI, NDWI, NDWI2, + MNDVI, NDPI, NDTI, NDBI, RI, BI, BI2. + + The function compares the generated output to an expected output file. + + Asserts: + - The generated output file is named correctly and matches the expected filename. + + Clears the output directory at the end of the test. + ''' # create output dir and clear its content if any utils4test.create_outdir() - inputfile = utils4test.indir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip" + origin_path = RastertoolsTestsData.tests_input_data_dir + "/".split(os.getcwd() + "/")[-1] + + inputfile = origin_path + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip" indices = [indice for indice in Radioindice.get_default_indices()] tool = Radioindice(indices) - tool.with_output(utils4test.outdir, merge=True) - tool.with_roi(utils4test.indir + "COMMUNE_32001.shp") + shapefile = RastertoolsTestsData.tests_input_data_dir + "/COMMUNE_32001.shp" + tool.with_output(RastertoolsTestsData.tests_output_data_dir , merge=True) + tool.with_roi(shapefile) outputs = tool.process_file(inputfile) assert outputs == [ - utils4test.outdir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-indices.tif"] + RastertoolsTestsData.tests_output_data_dir + "/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-indices.tif"] utils4test.clear_outdir() -def test_radioindice_process_file_separate(compare, save_gen_as_ref): +def test_radioindice_process_file_separate(compare : bool, save_gen_as_ref : bool): + """ + Test the Radioindice class by generating individual files for each indice. + + This function verifies the generation of separate output files for NDVI and NDWI. + The results can be compared with reference files or saved as new references if desired. + + Parameters: + - compare (bool): If True, compares the generated files to reference files. + - save_gen_as_ref (bool): If True, saves the generated files as new reference files. + + Asserts: + - The output files match the reference files. + + Clears the output directory at the end of the test. + """ # create output dir and clear its content if any utils4test.create_outdir() @@ -44,17 +76,17 @@ def test_radioindice_process_file_separate(compare, save_gen_as_ref): indices = [Radioindice.ndvi, Radioindice.ndwi] tool = Radioindice(indices) - tool.with_output(utils4test.outdir, merge=False) + tool.with_output(RastertoolsTestsData.tests_output_data_dir , merge=False) tool.with_vrt_stored(False) - outputs = tool.process_file(utils4test.indir + inputfile + ".zip") + outputs = tool.process_file(RastertoolsTestsData.tests_input_data_dir + "/" + inputfile + ".zip") # check outputs - assert outputs == [utils4test.outdir + inputfile + "-ndvi.tif", - utils4test.outdir + inputfile + "-ndwi.tif"] + assert outputs == [RastertoolsTestsData.tests_output_data_dir + "/" + inputfile + "-ndvi.tif", + RastertoolsTestsData.tests_output_data_dir + "/" + inputfile + "-ndwi.tif"] gen_files = [inputfile + "-ndvi.tif", inputfile + "-ndwi.tif"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(RastertoolsTestsData.tests_output_data_dir , __refdir, gen_files) assert len(match) == 2 assert len(mismatch) == 0 assert len(err) == 0 @@ -66,35 +98,61 @@ def test_radioindice_process_file_separate(compare, save_gen_as_ref): def test_radioindice_process_files(): + ''' + Test the Radioindice class by processing multiple files and merging results. + + This function applies the NDVI and NDWI to a list of Sentinel-2 datasets. + The function generates a merged output file for each input file. Results are verified by comparing to tif files containing the expected results. + + Asserts: + - The generated output files match the expected names for merged indices. + + Clears the output directory at the end of the test. + ''' # create output dir and clear its content if any utils4test.create_outdir() - inputfiles = [utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip", - utils4test.indir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip"] + inputfiles = [RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip", + RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip"] indices = [Radioindice.ndvi, Radioindice.ndwi] tool = Radioindice(indices) - tool.with_output(utils4test.outdir, merge=True) - tool.with_roi(utils4test.indir + "COMMUNE_32001.shp") + tool.with_output(RastertoolsTestsData.tests_output_data_dir, merge=True) + tool.with_roi(RastertoolsTestsData.tests_input_data_dir + "/COMMUNE_32001.shp") outputs = tool.process_files(inputfiles) assert outputs == [ - utils4test.outdir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-indices.tif", - utils4test.outdir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-indices.tif"] + RastertoolsTestsData.tests_output_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-indices.tif", + RastertoolsTestsData.tests_output_data_dir + "/" + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-indices.tif"] utils4test.clear_outdir() def test_radioindice_incompatible_indice_rastertype(caplog): + """ + Test handling of incompatible indices and raster types in the Radioindice class. + + This function verifies that the Radioindice class correctly handles cases where the + raster file lacks the required bands for a specified index. + + Parameters: + - caplog: pytest fixture for capturing log output within the test. + + Asserts: + - No output files are generated (output list is empty). + - An error log entry is recorded with details about the missing bands. + + Clears the output directory at the end of the test. + """ # create output dir and clear its content if any utils4test.create_outdir() file = "SPOT6_2018_France-Ortho_NC_DRS-MS_SPOT6_2018_FRANCE_ORTHO_NC_GEOSUD_MS_82.tar.gz" - inputfile = utils4test.indir + file + inputfile = RastertoolsTestsData.tests_input_data_dir + "/" + file indice = RadioindiceProcessing("my_indice").with_channels([BandChannel.mir, BandChannel.swir]) tool = Radioindice([indice]) - tool.with_output(utils4test.outdir) + tool.with_output(RastertoolsTestsData.tests_output_data_dir) caplog.set_level(logging.ERROR) outputs = tool.process_file(inputfile) diff --git a/tests/test_rasterproc.py b/tests/test_rasterproc.py index ad560087..aa68cc63 100644 --- a/tests/test_rasterproc.py +++ b/tests/test_rasterproc.py @@ -11,26 +11,49 @@ __copyright__ = "Copyright 2019, CNES" __license__ = "Apache v2.0" +from .utils4test import RastertoolsTestsData __refdir = utils4test.get_refdir("test_rasterproc/") def algo2D(bands): + """ + Apply a scaling factor to each band independently. + + Parameters: + bands (numpy.ndarray): A 2D array containing a single band of raster data. + + Returns: + numpy.ndarray: An array with each element scaled by a factor of 2. + """ out = 2. * bands return out def algo3D(bands): + """ + Apply a scaling factor to all bands simultaneously. + + Parameters: + bands (numpy.ndarray): A 3D array containing multiple bands of raster data. + + Returns: + numpy.ndarray: An array with each element in all bands scaled by a factor of 2. + """ out = 2. * bands return out def test_compute_sliding(): + """ + Test the compute_sliding function with 2D and 3D raster data. + It verifies that the computed output matches the expected transformation. + """ # create output dir and clear its content if any utils4test.create_outdir() - input_image = utils4test.indir + "RGB_TIF_20170105_013442_test.tif" - output_image = utils4test.outdir + "RGB_TIF_20170105_013442_test-out.tif" + input_image = RastertoolsTestsData.tests_input_data_dir + "/" + "RGB_TIF_20170105_013442_test.tif" + output_image = RastertoolsTestsData.tests_output_data_dir + "/" + "RGB_TIF_20170105_013442_test-out.tif" # Test 2D proc2D = RasterProcessing("Processing per band", algo=algo2D, per_band_algo=True) diff --git a/tests/test_rasterproduct.py b/tests/test_rasterproduct.py index 83162d03..4aeb98de 100644 --- a/tests/test_rasterproduct.py +++ b/tests/test_rasterproduct.py @@ -1,8 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- - import pytest -import filecmp +import os import zipfile from pathlib import Path from datetime import datetime @@ -11,28 +10,44 @@ from eolab.rastertools.product import RasterType, BandChannel from eolab.rastertools.product import RasterProduct - from . import utils4test __author__ = "Olivier Queyrut" __copyright__ = "Copyright 2019, CNES" __license__ = "Apache v2.0" +from .utils4test import RastertoolsTestsData -__refdir = utils4test.get_refdir("test_rasterproduct/") +__refdir = RastertoolsTestsData.tests_ref_data_dir.replace(os.getcwd() + "/", "") + "/test_rasterproduct/" def test_rasterproduct_valid_parameters(): + """ + Test the initialization and properties of `RasterProduct` with valid parameters. + + This test case verifies the proper creation and expected properties of `RasterProduct` + objects from various supported file formats and structures: + - Sentinel-2 L1C archive with one file per band. + - SPOT6 archive with one file for all bands. + - Standard raster file with multiple channels. + + Assertions: + - `file` path, raster type, and channels match expected values. + - Band and mask files are correctly listed. + - Archive status and extracted metadata (e.g., date, tile, orbit, and satellite) match + expected values based on the input files. + """ # archive with one file per band basename = "S2B_MSIL1C_20191008T105029_N0208_R051_T30TYP_20191008T125041" + origin_path = RastertoolsTestsData.tests_input_data_dir + "/".split(os.getcwd() + "/")[-1] file = Path( - utils4test.indir + basename + ".zip") + origin_path + basename + ".zip") prod = RasterProduct(file) assert prod.file == file assert prod.rastertype == RasterType.get("S2_L1C") assert prod.channels == RasterType.get("S2_L1C").channels - band_format = f"/vsizip/tests/tests_data/{basename}.zip/" + band_format = f"/vsizip/" + origin_path + f"{basename}.zip/" band_format += f"{basename}.SAFE/GRANULE/L1C_T30TYP_A013519_20191008T105335/IMG_DATA/" band_format += "T30TYP_20191008T105029_{}.jp2" assert prod.bands_files == {b: band_format.format(b) for b in prod.rastertype.get_band_ids()} @@ -46,13 +61,13 @@ def test_rasterproduct_valid_parameters(): # archive with one file for all bands basename = "SPOT6_2018_France-Ortho_NC_DRS-MS_SPOT6_2018_FRANCE_ORTHO_NC_GEOSUD_MS_82" - file = utils4test.indir + basename + ".tar.gz" + file = origin_path + basename + ".tar.gz" prod = RasterProduct(file) assert prod.file == Path(file) assert prod.rastertype == RasterType.get("SPOT67_GEOSUD") assert prod.channels == [BandChannel.red, BandChannel.green, BandChannel.blue, BandChannel.nir] - band = f"/vsitar/tests/tests_data/{basename}.tar.gz/SPOT6_2018_FRANCE_ORTHO_NC_GEOSUD_MS_82/" + band = f"/vsitar/" + origin_path + f"{basename}.tar.gz/SPOT6_2018_FRANCE_ORTHO_NC_GEOSUD_MS_82/" band += "PROD_SPOT6_001/VOL_SPOT6_001_A/IMG_SPOT6_MS_001_A/" band += "IMG_SPOT6_MS_201805111031189_ORT_SPOT6_20180517_1333011n1b80qobn5ex_1_R1C1.TIF" assert prod.bands_files == {"all": band} @@ -66,7 +81,7 @@ def test_rasterproduct_valid_parameters(): # regular raster file basename = "RGB_TIF_20170105_013442_test.tif" - file = utils4test.indir + basename + file = RastertoolsTestsData.tests_input_data_dir + "/" + basename prod = RasterProduct(file) assert prod.file == Path(file) @@ -83,51 +98,78 @@ def test_rasterproduct_valid_parameters(): def test_rasterproduct_invalid_parameters(): + """ + Test the handling of invalid parameters when creating a `RasterProduct`. + + This test case verifies: + - Passing `None` as a file parameter raises a `ValueError`. + - Unrecognized raster type in input file raises a `ValueError`. + - Unsupported file types raise `ValueError` with appropriate error messages. + + Assertions: + - Each invalid parameter triggers a `ValueError` with a specific message indicating + the type of parameter issue. + """ with pytest.raises(ValueError) as exc: RasterProduct(None) assert "'file' cannot be None" in str(exc.value) - file = utils4test.indir + "InvalidName.zip" + file = RastertoolsTestsData.tests_input_data_dir + "/" + "InvalidName.zip" with pytest.raises(ValueError) as exc: RasterProduct(file) assert f"Unrecognized raster type for input file {file}" in str(exc.value) - file = utils4test.indir + "grid.geojson" + file = RastertoolsTestsData.tests_input_data_dir + "/" + "grid.geojson" with pytest.raises(ValueError) as exc: RasterProduct(file) assert f"Unsupported input file {file}" in str(exc.value) def test_create_product_S2_L2A_MAJA(compare, save_gen_as_ref): + """ + Test the creation and processing of a Sentinel-2 L2A MAJA `RasterProduct`. + + Parameters: + compare (bool): If True, compares generated files to reference files. + save_gen_as_ref (bool): If True, saves generated files as new reference files. + + Assertions: + - Generated file paths match expected paths. + - Comparison or saving of reference files completes without errors. + - Raster data can be opened without errors. + """ + data_path = RastertoolsTestsData.tests_input_data_dir.replace(os.getcwd() + "/", "") + "/" + out_path = RastertoolsTestsData.tests_output_data_dir.replace(os.getcwd() + "/", "") + "/" + # create output dir and clear its content if any utils4test.create_outdir() # unzip SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip - file = utils4test.indir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip" + file = data_path + "/" + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip" with zipfile.ZipFile(file) as myzip: - myzip.extractall(utils4test.outdir) + myzip.extractall(out_path) # creation of S2 L2A MAJA products - files = [Path(utils4test.indir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip"), - Path(utils4test.indir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_tar.tar"), - Path(utils4test.indir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_targz.TAR.GZ"), - Path(utils4test.outdir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9")] + files = [Path(data_path + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip"), + Path(data_path + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_tar.tar"), + Path(data_path + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_targz.TAR.GZ"), + Path(out_path + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9")] for file in files: - with RasterProduct(file, vrt_outputdir=Path(utils4test.outdir)) as prod: - raster = prod.get_raster(roi=Path(utils4test.indir + "COMMUNE_32001.shp"), + with RasterProduct(file, vrt_outputdir=Path(out_path)) as prod: + raster = prod.get_raster(roi=Path(data_path + "COMMUNE_32001.shp"), masks="all") assert Path(raster).exists() - assert raster == utils4test.outdir + utils4test.basename(file) + "-mask.vrt" + assert raster == out_path + utils4test.basename(file) + "-mask.vrt" ref = [utils4test.basename(file) + ".vrt", utils4test.basename(file) + "-clipped.vrt", utils4test.basename(file) + "-mask.vrt"] if compare: - print(f"compare {utils4test.outdir} ,{__refdir}, {ref}") - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, ref) + print(f"compare {out_path} ,{__refdir}, {ref}") + match, mismatch, err = utils4test.cmpfiles(out_path, __refdir, ref) assert len(match) == len(ref) assert len(mismatch) == 0 assert len(err) == 0 @@ -142,26 +184,47 @@ def test_create_product_S2_L2A_MAJA(compare, save_gen_as_ref): utils4test.clear_outdir(subdirs=False) # delete the dir resulting from unzip - utils4test.delete_dir(utils4test.outdir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9") + utils4test.delete_dir(out_path + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9") + def test_create_product_S2_L1C(compare, save_gen_as_ref): + """ + Test the creation and processing of a Sentinel-2 L1C `RasterProduct`. + + This test case verifies: + - Creation of a single file for the L1C product and generation of clipped output. + - Comparison of generated files against reference files or saving as new references. + - Loading the generated raster using `rasterio` to confirm proper creation. + + Parameters: + compare (bool): If True, compares generated files to reference files. + save_gen_as_ref (bool): If True, saves generated files as new reference files. + + Assertions: + - Generated file paths and metadata match expected values. + - Reference comparison or saving completes as expected. + - Raster data can be loaded and accessed without errors. + """ + data_path = RastertoolsTestsData.tests_input_data_dir.replace(os.getcwd() + "/", "") + "/" + out_path = RastertoolsTestsData.tests_output_data_dir.replace(os.getcwd() + "/", "") + "/" + # create output dir and clear its content if any utils4test.create_outdir() # creation of S2 L1C product - infile = utils4test.indir + "S2B_MSIL1C_20191008T105029_N0208_R051_T30TYP_20191008T125041.zip" + infile = data_path + "S2B_MSIL1C_20191008T105029_N0208_R051_T30TYP_20191008T125041.zip" - with RasterProduct(infile, vrt_outputdir=utils4test.outdir) as prod: - raster = prod.get_raster(roi=utils4test.indir + "/COMMUNE_32001.shp", + with RasterProduct(infile, vrt_outputdir= out_path) as prod: + raster = prod.get_raster(roi= data_path + "/COMMUNE_32001.shp", masks="all") assert Path(raster).exists() - assert raster == utils4test.outdir + utils4test.basename(infile) + "-clipped.vrt" + assert raster == out_path + utils4test.basename(infile) + "-clipped.vrt" gen_files = [utils4test.basename(infile) + ".vrt", utils4test.basename(infile) + "-clipped.vrt"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(out_path, __refdir, gen_files) assert len(match) == 2 assert len(mismatch) == 0 assert len(err) == 0 @@ -177,20 +240,40 @@ def test_create_product_S2_L1C(compare, save_gen_as_ref): def test_create_product_S2_L2A_SEN2CORE(compare, save_gen_as_ref): + """ + Test the creation of a Sentinel-2 L2A SEN2CORE `RasterProduct`. + + This test case verifies: + - Creation of the raster and VRT files. + - Comparison of generated files with reference files or saving as new references if needed. + - Loading the generated VRT to ensure accessibility with `rasterio`. + + Parameters: + compare (bool): If True, compares generated files to reference files. + save_gen_as_ref (bool): If True, saves generated files as new reference files. + + Assertions: + - VRT file path and metadata match expected output. + - Reference file operations are successful. + - The VRT file can be accessed with `rasterio` without issues. + """ + data_path = RastertoolsTestsData.tests_input_data_dir.replace(os.getcwd() + "/", "") + "/" + out_path = RastertoolsTestsData.tests_output_data_dir.replace(os.getcwd() + "/", "") + "/" + # create output dir and clear its content if any utils4test.create_outdir() # creation of S2 L2A SEN2CORE product - infile = utils4test.indir + "S2A_MSIL2A_20190116T105401_N0211_R051_T30TYP_20190116T120806.zip" - with RasterProduct(infile, vrt_outputdir=utils4test.outdir) as prod: + infile = data_path + "S2A_MSIL2A_20190116T105401_N0211_R051_T30TYP_20190116T120806.zip" + with RasterProduct(infile, vrt_outputdir= out_path) as prod: raster = prod.get_raster() assert Path(raster).exists() - assert raster == utils4test.outdir + utils4test.basename(infile) + ".vrt" + assert raster == out_path + utils4test.basename(infile) + ".vrt" gen_files = [utils4test.basename(infile) + ".vrt"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(out_path, __refdir, gen_files) assert len(match) == 1 assert len(mismatch) == 0 assert len(err) == 0 @@ -206,20 +289,40 @@ def test_create_product_S2_L2A_SEN2CORE(compare, save_gen_as_ref): def test_create_product_SPOT67(compare, save_gen_as_ref): + """ + Test the creation of a SPOT6/7 `RasterProduct`. + + This test case verifies: + - Creation of the product using SPOT6 input archive. + - Comparison of generated files with reference files or saving as new references if specified. + - Loading the raster using `rasterio` to verify successful file generation. + + Parameters: + compare (bool): If True, compares generated files to reference files. + save_gen_as_ref (bool): If True, saves generated files as new reference files. + + Assertions: + - Output paths and contents match expected values. + - Reference file comparison and saving are correctly performed. + - Raster data opens without errors in `rasterio`. + """ + data_path = RastertoolsTestsData.tests_input_data_dir.replace(os.getcwd() + "/", "") + "/" + out_path = RastertoolsTestsData.tests_output_data_dir.replace(os.getcwd() + "/", "") + "/" + # create output dir and clear its content if any utils4test.create_outdir() # creation of SPOT67 product infile = "SPOT6_2018_France-Ortho_NC_DRS-MS_SPOT6_2018_FRANCE_ORTHO_NC_GEOSUD_MS_82.tar.gz" - with RasterProduct(utils4test.indir + infile, vrt_outputdir=utils4test.outdir) as prod: + with RasterProduct(data_path + infile, vrt_outputdir= out_path) as prod: raster = prod.get_raster() assert Path(raster).exists() - assert raster == utils4test.outdir + utils4test.basename(infile) + ".vrt" + assert raster == out_path + utils4test.basename(infile) + ".vrt" gen_files = [utils4test.basename(infile) + ".vrt"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(out_path, __refdir, gen_files) assert len(match) == 1 assert len(mismatch) == 0 assert len(err) == 0 @@ -235,11 +338,23 @@ def test_create_product_SPOT67(compare, save_gen_as_ref): def test_create_product_special_cases(): + """ + Test special cases in `RasterProduct` creation, including in-memory, directory, and VRT handling. + + This test case covers: + - Creation of products in memory (with and without masks). + - Handling of product creation from VRT and directory inputs. + - Loading raster data via `rasterio` to ensure correct accessibility. + + Assertions: + - VRT and in-memory files are correctly created. + - Directory input processing and band masking work as expected. + - Raster files can be opened without errors in `rasterio`. + """ # SUPPORTED CASES - # creation in memory (without masks) file = "S2B_MSIL1C_20191008T105029_N0208_R051_T30TYP_20191008T125041.zip" - with RasterProduct(utils4test.indir + file) as prod: + with RasterProduct(RastertoolsTestsData.tests_input_data_dir + "/" + file) as prod: assert prod.get_raster(masks=None).endswith(utils4test.basename(file) + ".vrt") # check if product can be opened by rasterio dataset = prod.open() @@ -247,8 +362,8 @@ def test_create_product_special_cases(): # creation in memory (with masks) file = "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_tar.tar" - with RasterProduct(utils4test.indir + file) as prod: - raster = prod.get_raster(roi=Path(utils4test.indir + "COMMUNE_32001.shp"), + with RasterProduct(RastertoolsTestsData.tests_input_data_dir + "/" + file) as prod: + raster = prod.get_raster(roi=Path(RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_32001.shp"), bands=prod.rastertype.get_band_ids(), masks=prod.rastertype.get_mask_ids()) @@ -256,31 +371,29 @@ def test_create_product_special_cases(): # check if product can be opened by rasterio with rasterio.Env(GDAL_VRT_ENABLE_PYTHON=True): - with rasterio.open(raster) as dataset: - data = dataset.read([1], masked=True) - # pixel corresponding to a value > 0 for a band mask => masked value - assert data.mask[0][350][250] + dataset = rasterio.open(raster) + data = dataset.read([1], masked=True) + # pixel corresponding to a value > 0 for a band mask => masked value + assert data.mask[0][350][250] # creation from a vrt file = "S2A_MSIL2A_20190116T105401_N0211_R051_T30TYP_20190116T120806.vrt" - with RasterProduct(utils4test.indir + file) as prod: + with RasterProduct(RastertoolsTestsData.tests_input_data_dir + "/" + file) as prod: raster = prod.get_raster() - assert raster == utils4test.indir + utils4test.basename(file) + ".vrt" + assert raster == RastertoolsTestsData.tests_input_data_dir + "/" + utils4test.basename(file) + ".vrt" assert prod.rastertype == RasterType.get("S2_L2A_SEN2CORE") # check if product can be opened by rasterio dataset = rasterio.open(raster) dataset.close() # creation from a directory - # unzip S2B_MSIL1C_20191008T105029_N0208_R051_T30TYP_20191008T125041.zip - file = utils4test.indir + "S2B_MSIL1C_20191008T105029_N0208_R051_T30TYP_20191008T125041.zip" + file = RastertoolsTestsData.tests_input_data_dir + "/" + "S2B_MSIL1C_20191008T105029_N0208_R051_T30TYP_20191008T125041.zip" with zipfile.ZipFile(file) as myzip: - myzip.extractall(utils4test.outdir) - dirname = "S2B_MSIL1C_20191008T105029_N0208_R051_T30TYP_20191008T125041.SAFE" + myzip.extractall(RastertoolsTestsData.tests_output_data_dir + "/") - with RasterProduct(file, vrt_outputdir=Path(utils4test.outdir)) as prod: + with RasterProduct(file, vrt_outputdir=Path(RastertoolsTestsData.tests_output_data_dir + "/")) as prod: raster = prod.get_raster() - assert raster == utils4test.outdir + utils4test.basename(file) + ".vrt" + assert raster == RastertoolsTestsData.tests_output_data_dir + "/" + utils4test.basename(file) + ".vrt" # check if product can be opened by rasterio dataset = rasterio.open(raster) dataset.close() @@ -291,7 +404,7 @@ def test_create_product_special_cases(): # file = "SPOT6_2018_France-Ortho_NC_DRS-MS_SPOT6_2018_FRANCE_ORTHO_NC_GEOSUD_MS_82.tar.gz" # channels = [BandChannel.red, BandChannel.green, BandChannel.blue, BandChannel.swir] # with pytest.raises(ValueError) as exc: - # prod = RasterProduct(utils4test.indir + file, + # prod = RasterProduct(RastertoolsTestsData.tests_input_data_dir + "/" + file, # RasterType.get("SPOT67_GEOSUD"), # channels) # msg = f"RasterType does not contain all the channels in {channels}" @@ -299,7 +412,7 @@ def test_create_product_special_cases(): # creation of a product with bands that do not exist in the product (but that # do exist in rastertype) - file = utils4test.indir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip" + file = RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip" with zipfile.ZipFile(file) as myzip: names = myzip.namelist() selection = [] @@ -309,9 +422,9 @@ def test_create_product_special_cases(): n.endswith("FRE_B4.tif") or \ n.endswith("CLM_R1.tif"): selection.append(n) - myzip.extractall(utils4test.outdir, selection) + myzip.extractall(RastertoolsTestsData.tests_output_data_dir + "/", selection) - file = Path(utils4test.outdir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9") + file = Path(RastertoolsTestsData.tests_output_data_dir + "/" + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9") with pytest.raises(ValueError) as exc: prod = RasterProduct(file) diff --git a/tests/test_rastertools.py b/tests/test_rastertools.py index 49731998..6faa6226 100644 --- a/tests/test_rastertools.py +++ b/tests/test_rastertools.py @@ -1,11 +1,13 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import pytest import logging -import filecmp +import os + +from click.testing import CliRunner from pathlib import Path -from eolab.rastertools import run_tool + +from eolab.rastertools import rastertools from eolab.rastertools.product import RasterType from . import utils4test @@ -14,6 +16,8 @@ __copyright__ = "Copyright 2019, CNES" __license__ = "Apache v2.0" +from .utils4test import RastertoolsTestsData + class TestCase: __test__ = False @@ -87,27 +91,29 @@ def with_refdir(self, refdir): def run_test(self, caplog=None, loglevel=logging.ERROR, check_outputs=True, check_sys_exit=True, check_logs=True, compare=False, save_gen_as_ref=False): + + runner = CliRunner() if caplog is not None: caplog.set_level(loglevel) else: check_logs = False - # run rastertools - with pytest.raises(SystemExit) as wrapped_exception: - run_tool(args=self._args) + try: + rastertools(self.args) - # check sys_exit - if check_sys_exit: - assert wrapped_exception.type == SystemExit - assert wrapped_exception.value.code == self._sys_exit + except SystemExit as wrapped_exception: + if check_sys_exit: + # Check if the exit code matches the expected value + assert wrapped_exception.code == self._sys_exit, (f"Expected exit code {self._sys_exit}, but got {wrapped_exception.code}") # check list of outputs if check_outputs: - outdir = Path(utils4test.outdir) + outdir = Path(RastertoolsTestsData.tests_output_data_dir + "/") assert sorted([x.name for x in outdir.iterdir()]) == sorted(self._outputs) if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, self._refdir, self._outputs) + match, mismatch, err = utils4test.cmpfiles(RastertoolsTestsData.tests_output_data_dir + "/", self._refdir, self._outputs) + assert len(match) == 3 assert len(mismatch) == 0 assert len(err) == 0 @@ -124,11 +130,12 @@ def run_test(self, caplog=None, loglevel=logging.ERROR, check_outputs=True, chec if caplog is not None: caplog.clear() - # clear output dir + #clear output dir utils4test.clear_outdir() def test_rastertools_command_line_info(): + tests = [ TestCase("--help"), TestCase("-h"), @@ -154,22 +161,33 @@ def test_rastertools_command_line_info(): for test in tests: test.run_test() +def generate_lst_file(file_list, output_file): + + with open(output_file,"w") as lst_file: + for f in file_list: + lst_file.write(RastertoolsTestsData.tests_input_data_dir + "/" + f.split('/')[-1] + "\n") + def test_radioindice_command_line_default(): # create output dir and clear its content if any utils4test.create_outdir() + lst_file_path = f"{RastertoolsTestsData.tests_input_data_dir}/listing.lst" + generate_lst_file(["SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip", + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip"], + lst_file_path) + # list of commands to test argslist = [ # no indice defined - " -v ri -o tests/tests_out tests/tests_data/listing.lst", + f" -v ri -o {RastertoolsTestsData.tests_output_data_dir} {lst_file_path}", # two indices with their own options, merge - "-v ri --pvi --savi -o tests/tests_out -m tests/tests_data/listing.lst", + f"-v ri --pvi --savi -o {RastertoolsTestsData.tests_output_data_dir} -m {lst_file_path}", # indices option, roi - "--verbose ri --indices pvi savi -nd nir red --roi tests/tests_data/COMMUNE_32001.shp" - " --output tests/tests_out" - " tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip" - " tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip" + f"--verbose ri --indices pvi --indices savi -nd nir red --roi {RastertoolsTestsData.tests_input_data_dir}/COMMUNE_32001.shp" + f" --output {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip" ] # get list of expected outputs indices_list = ["ndvi ndwi ndwi2", "indices", "pvi savi nd[nir-red]"] @@ -192,8 +210,8 @@ def test_radioindice_additional_type(): # list of commands to test argslist = [ # add rastertypes to handle new data product - "-t tests/tests_data/additional_rastertypes.json -v" - " ri -o tests/tests_out --ndvi tests/tests_data/RGB_TIF_20170105_013442_test.tif" + f"-t {RastertoolsTestsData.tests_input_data_dir}/additional_rastertypes.json -v" + f" ri -o {RastertoolsTestsData.tests_output_data_dir} --ndvi {RastertoolsTestsData.tests_input_data_dir}/RGB_TIF_20170105_013442_test.tif" ] # get list of expected outputs indices_list = "ndvi" @@ -217,28 +235,28 @@ def test_radioindice_command_line_errors(caplog): # missing positional argument "ri --ndvi", # unkwnow indice - "ri tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip --indices strange", + f"ri {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip --indices strange", # unknown raster type: unrecognized raster type - "-v ri --ndvi -o tests/tests_out tests/tests_data/OCS_2017_CESBIO_extract.tif", + f"-v ri --ndvi -o {RastertoolsTestsData.tests_output_data_dir} {RastertoolsTestsData.tests_input_data_dir}/OCS_2017_CESBIO_extract.tif", # unknown raster type: unsupported extension - "-v ri --ndvi -o tests/tests_out tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.aaa", + f"-v ri --ndvi -o {RastertoolsTestsData.tests_output_data_dir} {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.aaa", # output dir does not exist - "-v ri -o ./toto --ndvi tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip", + f"-v ri -o ./toto --ndvi {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip", # unknown band in normalized difference - "-v ri -nd unknown red tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip" + f"-v ri -nd unknown red {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip" ] # expected logs logslist = [ [], - [("eolab.rastertools.main", logging.ERROR, "Invalid indice name: strange")], - [("eolab.rastertools.main", logging.ERROR, - "Unsupported input file, no matching raster type identified to handle the file")], - [("eolab.rastertools.main", logging.ERROR, - "Unsupported input file tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.aaa")], - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.cli.radioindice", logging.ERROR, "Invalid indice name: strange")], + [("eolab.rastertools.cli.utils_cli", logging.ERROR, + "Unsupported input file, no matching raster type identified to handle the file")], + [("eolab.rastertools.cli.utils_cli", logging.ERROR, + f"Unsupported input file {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.aaa")], + [("eolab.rastertools.rastertools", logging.ERROR, "Output directory \"./toto\" does not exist.")], - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.cli.radioindice", logging.ERROR, "Invalid band(s) in normalized difference: unknown and/or red")] ] sysexitlist = [2, 2, 1, 1, 2, 2] @@ -256,14 +274,19 @@ def test_speed_command_line_default(): # create output dir and clear its content if any utils4test.create_outdir() + lst_file_path = f"{RastertoolsTestsData.tests_input_data_dir}/listing.lst" + generate_lst_file(["SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip", + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip"], + lst_file_path) + # list of commands to test argslist = [ # default with a listing of S2A products - "-v sp -b 1 -o tests/tests_out tests/tests_data/listing.lst", + f"-v sp -b 1 -o {RastertoolsTestsData.tests_output_data_dir} {lst_file_path}", # default with a list of files - "--verbose speed --output tests/tests_out" - " tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" - " tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif" + f"--verbose speed --output {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif" ] speed_filenames = [ ["SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-speed-20180928-105515.tif"], @@ -277,30 +300,36 @@ def test_speed_command_line_default(): # execute test cases with logging level set to INFO for test in tests: test.run_test() + os.remove(lst_file_path) def test_speed_command_line_errors(caplog): # create output dir and clear its content if any utils4test.create_outdir() + lst_file_path = f"{RastertoolsTestsData.tests_input_data_dir}/listing2.lst" + generate_lst_file(["SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif", + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif"], + lst_file_path) + # list of commands to test argslist = [ # output dir does not exist - "-v sp -o ./toto tests/tests_data/listing2.lst", + f"-v sp -o ./toto {lst_file_path}", # missing one file for speed - "-v sp -o tests/tests_out tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip", + f"-v sp -o {RastertoolsTestsData.tests_output_data_dir} {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip", # different types for input files - "-v sp -a -o tests/tests_out" - " tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip" - " tests/tests_data/S2A_MSIL2A_20190116T105401_N0211_R051_T30TYP_20190116T120806.zip" + f"-v sp -a -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip" + f" {RastertoolsTestsData.tests_input_data_dir}/S2A_MSIL2A_20190116T105401_N0211_R051_T30TYP_20190116T120806.zip" ] # expected logs logslist = [ - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.rastertools", logging.ERROR, "Output directory \"./toto\" does not exist.")], - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.cli.utils_cli", logging.ERROR, "Can not compute speed with 1 input image. Provide at least 2 images.")], - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.cli.utils_cli", logging.ERROR, "Speed can only be computed with images of the same type")] ] sysexitlist = [2, 1, 1] @@ -312,6 +341,7 @@ def test_speed_command_line_errors(caplog): # execute test cases with logging level set to INFO for test in tests: test.run_test(caplog, check_outputs=False) + os.remove(lst_file_path) def test_timeseries_command_line_default(compare, save_gen_as_ref): @@ -321,9 +351,9 @@ def test_timeseries_command_line_default(compare, save_gen_as_ref): # list of commands to test argslist = [ # default with a list of files - "--verbose ts --output tests/tests_out" - " tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" - " tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif" + f"--verbose ts --output {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif" " -s 2018-09-26 -e 2018-11-07 -p 20 -ws 512" ] timeseries_filenames = [ @@ -347,45 +377,49 @@ def test_timeseries_command_line_errors(caplog): # create output dir and clear its content if any utils4test.create_outdir() + lst_file_path = f"{RastertoolsTestsData.tests_input_data_dir}/listing2.lst" + generate_lst_file(["SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif", + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif"], + lst_file_path) + period = " -s 2018-09-26 -e 2018-11-07 -p 20" # list of commands to test argslist = [ # output dir does not exist - "-v ts -o ./toto tests/tests_data/listing2.lst" + period, + f"-v ts -o ./toto {lst_file_path}" + period, # missing one file for timeseries - "-v ts -o tests/tests_out tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + period, + f"-v ts -o {RastertoolsTestsData.tests_output_data_dir} {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + period, # unknown raster type - "-v ts -o tests/tests_out -a" - " tests/tests_data/DSM_PHR_Dunkerque.tif" - " tests/tests_data/S2A_MSIL2A_20190116T105401_N0211_R051_T30TYP_20190116T120806.zip" + period, + f"-v ts -o {RastertoolsTestsData.tests_output_data_dir} -a" + f" {RastertoolsTestsData.tests_input_data_dir}/DSM_PHR_Dunkerque.tif" + f" {RastertoolsTestsData.tests_input_data_dir}/S2A_MSIL2A_20190116T105401_N0211_R051_T30TYP_20190116T120806.zip" + period, # different types for input files - "-v ts -o tests/tests_out" - " tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip" - " tests/tests_data/S2A_MSIL2A_20190116T105401_N0211_R051_T30TYP_20190116T120806.zip" + period, + f"-v ts -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip" + f" {RastertoolsTestsData.tests_input_data_dir}/S2A_MSIL2A_20190116T105401_N0211_R051_T30TYP_20190116T120806.zip" + period, # invalid date format - "-v ts --o tests/tests_out" - " tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" - " tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif" + f"-v ts -o {RastertoolsTestsData.tests_output_data_dir} {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif" " -s 20180926 -e 2018-11-07 -p 20", # invalid date format - "-v ts --o tests/tests_out" - " tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" - " tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif" + f"-v ts -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif" " -s 2018-09-26 -e 20181107 -p 20" ] # expected logs logslist = [ - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.rastertools", logging.ERROR, "Output directory \"./toto\" does not exist.")], - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.cli.utils_cli", logging.ERROR, "Can not compute a timeseries with 1 input image. Provide at least 2 images.")], - [("eolab.rastertools.main", logging.ERROR, - "Unknown rastertype for input file tests/tests_data/DSM_PHR_Dunkerque.tif")], - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.cli.utils_cli", logging.ERROR, + f"Unknown rastertype for input file {RastertoolsTestsData.tests_input_data_dir}/DSM_PHR_Dunkerque.tif")], + [("eolab.rastertools.cli.utils_cli", logging.ERROR, "Timeseries can only be computed with images of the same type")], - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.cli.timeseries", logging.ERROR, "Invalid format for start date: 20180926 (must be %Y-%m-%d)")], - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.cli.timeseries", logging.ERROR, "Invalid format for end date: 20181107 (must be %Y-%m-%d)")] ] sysexitlist = [2, 1, 1, 1, 2, 2] @@ -397,23 +431,31 @@ def test_timeseries_command_line_errors(caplog): # execute test cases with logging level set to INFO for test in tests: test.run_test(caplog, check_outputs=False) + os.remove(lst_file_path) + def test_zonalstats_command_line_default(): # create output dir and clear its content if any utils4test.create_outdir() + lst_file_path = f"{RastertoolsTestsData.tests_input_data_dir}/listing2.lst" + generate_lst_file(["SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif", + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif"], + lst_file_path) + # list of commands to test + # There is no more window_size, therefore the third test has been removed argslist = [ # specify stats to compute and sigma, 1st band computed - "-v zs -o tests/tests_out -f GeoJSON" - " -g tests/tests_data/COMMUNE_32xxx.geojson --stats min max --sigma 1.0" - " tests/tests_data/listing2.lst", + f"-v zs -o {RastertoolsTestsData.tests_output_data_dir} -f GeoJSON" + f" -g {RastertoolsTestsData.tests_input_data_dir}/COMMUNE_32xxx.geojson --stats min --stats max --sigma 1.0" + f" {lst_file_path}", # default stats, all bands computed - "-v zs -o tests/tests_out -f GeoJSON" - " --all -g tests/tests_data/COMMUNE_32xxx.geojson" - " tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" - " tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif" + f"-v zs -o {RastertoolsTestsData.tests_output_data_dir} -f GeoJSON" + f" --all -g {RastertoolsTestsData.tests_input_data_dir}/COMMUNE_32xxx.geojson" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif" ] files = ["SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi", "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi"] @@ -426,7 +468,7 @@ def test_zonalstats_command_line_default(): # execute test cases for test in tests: test.run_test() - + os.remove(lst_file_path) def test_zonalstats_command_line_product(): utils4test.create_outdir() @@ -434,9 +476,9 @@ def test_zonalstats_command_line_product(): # list of commands to test argslist = [ # input file is a S2A product - "-v zs -o tests/tests_out -f GeoJSON" - " --all -g tests/tests_data/COMMUNE_32xxx.geojson" - " tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip" + f"-v zs -o {RastertoolsTestsData.tests_output_data_dir} -f GeoJSON" + f" --all -g {RastertoolsTestsData.tests_input_data_dir}/COMMUNE_32xxx.geojson" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip" ] files = ["SENTINEL2A_20180928-105515-685_L2A_T30TYP_D"] @@ -454,8 +496,8 @@ def test_zonalstats_command_line_categorical(): # list of commands to test argslist = [ # input file is a S2A product - "-v zs -o tests/tests_out -f GeoJSON --categorical" - " tests/tests_data/OCS_2017_CESBIO_extract.tif" + f"-v zs -o {RastertoolsTestsData.tests_output_data_dir} -f GeoJSON --categorical" + f" {RastertoolsTestsData.tests_input_data_dir}/OCS_2017_CESBIO_extract.tif" ] files = ["OCS_2017_CESBIO_extract"] @@ -471,27 +513,32 @@ def test_zonalstats_command_line_errors(): # create output dir and clear its content if any utils4test.create_outdir() + lst_file_path = f"{RastertoolsTestsData.tests_input_data_dir}/listing2.lst" + generate_lst_file(["SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif", + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif"], + lst_file_path) + # list of commands to test argslist = [ # output dir does not exist - "-v zs tests/tests_data/listing2.lst -o ./toto -f GeoJSON" - " -g tests/tests_data/COMMUNE_32xxx.geojson --stats mean" + f"-v zs {lst_file_path} -o ./toto -f GeoJSON" + f" -g {RastertoolsTestsData.tests_input_data_dir}/COMMUNE_32xxx.geojson --stats mean" " -b 0", # band 0 does not exist - "-v zs tests/tests_data/listing2.lst -o tests/tests_out -f GeoJSON" - " -g tests/tests_data/COMMUNE_32xxx.geojson --stats mean" + f"-v zs {lst_file_path} -o {RastertoolsTestsData.tests_output_data_dir} -f GeoJSON" + f" -g {RastertoolsTestsData.tests_input_data_dir}/COMMUNE_32xxx.geojson --stats mean" " -b 0", # invalid format - "-v zs -o tests/tests_out -f Truc tests/tests_data/listing2.lst", + f"-v zs -o {RastertoolsTestsData.tests_output_data_dir} -f Truc {lst_file_path}", # invalid geometry index name - "-v zs -o tests/tests_out -f GeoJSON --stats mean" - " -g tests/tests_data/COMMUNE_32xxx.geojson -gi truc" - " -c tests/tests_out/chart.png" - " tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip", + f"-v zs -o {RastertoolsTestsData.tests_output_data_dir} -f GeoJSON --stats mean" + f" -g {RastertoolsTestsData.tests_input_data_dir}/COMMUNE_32xxx.geojson -gi truc" + f" -c {RastertoolsTestsData.tests_output_data_dir}/chart.png" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip", # invalid prefix length - "-v zs -o tests/tests_out -f GeoJSON --prefix band1" - " --all -g tests/tests_data/COMMUNE_32xxx.geojson" - " tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip" + f"-v zs -o {RastertoolsTestsData.tests_output_data_dir} -f GeoJSON --prefix band1" + f" --all -g {RastertoolsTestsData.tests_input_data_dir}/COMMUNE_32xxx.geojson" + f" {RastertoolsTestsData.tests_input_data_dir}/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip" ] logslist = [ @@ -517,24 +564,29 @@ def test_zonalstats_command_line_errors(): # execute test cases for test in tests: test.run_test(check_outputs=False) + os.remove(lst_file_path) def test_tiling_command_line_default(): # create output dir and clear its content if any utils4test.create_outdir() + lst_file_path = f"{RastertoolsTestsData.tests_input_data_dir}/listing3.lst" + generate_lst_file(["tif_file.tif"], + lst_file_path) + # list of commands to test argslist = [ # default case with listing of input files - "-v ti -o tests/tests_out -g tests/tests_data/grid.geojson tests/tests_data/listing3.lst", + f"-v ti -o {RastertoolsTestsData.tests_output_data_dir} -g {RastertoolsTestsData.tests_input_data_dir}/grid.geojson {lst_file_path}", # default case with input file - "--verbose ti -o tests/tests_out -g tests/tests_data/grid.geojson" - " tests/tests_data/tif_file.tif", + f"--verbose ti -o {RastertoolsTestsData.tests_output_data_dir} -g {RastertoolsTestsData.tests_input_data_dir}/grid.geojson" + f" {RastertoolsTestsData.tests_input_data_dir}/tif_file.tif", # specify specific ids - "-v ti -o tests/tests_out -g tests/tests_data/grid.geojson --id 77 93 --id_col id" - " tests/tests_data/tif_file.tif" + f"-v ti -o {RastertoolsTestsData.tests_output_data_dir} -g {RastertoolsTestsData.tests_input_data_dir}/grid.geojson --id 77 --id 93 --id_col id" + f" {RastertoolsTestsData.tests_input_data_dir}/tif_file.tif" ] - input_filenames = ["tests/tests_data/tif_file.tif"] + input_filenames = [f"{RastertoolsTestsData.tests_input_data_dir}/tif_file.tif"] # generate test cases tests = [TestCase(args).ti_output(input_filenames, [77, 93]) for args in argslist] @@ -545,19 +597,20 @@ def test_tiling_command_line_default(): # Additional tests to check naming and subdir options # specify naming convention - args = ("-v ti -o tests/tests_out -g tests/tests_data/grid.geojson -n tile{}" - " --id_col id tests/tests_data/tif_file.tif") + args = (f"-v ti -o {RastertoolsTestsData.tests_output_data_dir} -g {RastertoolsTestsData.tests_input_data_dir}/grid.geojson -n tile{{}}" + f" --id_col id {RastertoolsTestsData.tests_input_data_dir}/tif_file.tif") test = TestCase(args).ti_output(input_filenames, [77, 93], name="tile{}") test.run_test(check_outputs=False) # specify subdir naming convetion - args = ("-v ti -o tests/tests_out -g tests/tests_data/grid.geojson -d tile{}" - " --id_col id tests/tests_data/tif_file.tif") + args = (f"-v ti -o {RastertoolsTestsData.tests_output_data_dir} -g {RastertoolsTestsData.tests_input_data_dir}/grid.geojson -d tile{{}}" + f" --id_col id {RastertoolsTestsData.tests_input_data_dir}/tif_file.tif") test = TestCase(args).ti_output(input_filenames, [77, 93], subdir="tile{}") # create one subdir to check if it is not re-created - subdir = Path("tests/tests_out/tile77") + subdir = Path(f"{RastertoolsTestsData.tests_output_data_dir}/tile77") subdir.mkdir() test.run_test(check_outputs=False) + os.remove(lst_file_path) def test_tiling_command_line_special_case(caplog): @@ -567,11 +620,11 @@ def test_tiling_command_line_special_case(caplog): # list of commands to test argslist = [ # some invalid ids - "-v ti -o tests/tests_out -g tests/tests_data/grid.geojson --id 1 2 93 --id_col id" - " tests/tests_data/tif_file.tif", + f"-v ti -o {RastertoolsTestsData.tests_output_data_dir} -g {RastertoolsTestsData.tests_input_data_dir}/grid.geojson --id 1 --id 2 --id 93 --id_col id" + f" {RastertoolsTestsData.tests_input_data_dir}/tif_file.tif", # a geometry does not overlap raster - "-v ti -o tests/tests_out -g tests/tests_data/grid.geojson --id 78 93 --id_col id" - " tests/tests_data/tif_file.tif" + f"-v ti -o {RastertoolsTestsData.tests_output_data_dir} -g {RastertoolsTestsData.tests_input_data_dir}/grid.geojson --id 78 --id 93 --id_col id" + f" {RastertoolsTestsData.tests_input_data_dir}/tif_file.tif" ] # expected logs @@ -597,28 +650,27 @@ def test_tiling_command_line_errors(caplog): # list of commands to test argslist = [ # ids without id_col - "-v ti --id 77 93 -o tests/tests_out -g tests/tests_data/grid.geojson" - " tests/tests_data/tif_file.tif", + f"-v ti --id 77 93 -o {RastertoolsTestsData.tests_output_data_dir} -g {RastertoolsTestsData.tests_input_data_dir}/grid.geojson" + f" {RastertoolsTestsData.tests_input_data_dir}/tif_file.tif", # invalid id column - "-v ti -o tests/tests_out -g tests/tests_data/grid.geojson --id 77 93 --id_col truc" - " tests/tests_data/tif_file.tif", + f"-v ti -o {RastertoolsTestsData.tests_output_data_dir} -g {RastertoolsTestsData.tests_input_data_dir}/grid.geojson --id 77 --id 93 --id_col truc" + f" {RastertoolsTestsData.tests_input_data_dir}/tif_file.tif", # output dir does not exist - "-v ti -o tests/truc -g tests/tests_data/grid.geojson" - " tests/tests_data/tif_file.tif", + f"-v ti -o tests/truc -g {RastertoolsTestsData.tests_input_data_dir}/grid.geojson {RastertoolsTestsData.tests_input_data_dir}/tif_file.tif", # all invalid ids - "-v ti -o tests/tests_out -g tests/tests_data/grid.geojson --id 1 2 --id_col id" - " tests/tests_data/tif_file.tif" + f"-v ti -o {RastertoolsTestsData.tests_output_data_dir} -g {RastertoolsTestsData.tests_input_data_dir}/grid.geojson --id 1 --id 2 --id_col id" + f" {RastertoolsTestsData.tests_input_data_dir}/tif_file.tif" ] # expected logs logslist = [ - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.tiling", logging.ERROR, "Ids cannot be specified when id_col is not defined")], - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.tiling", logging.ERROR, "Invalid id column named \"truc\": it does not exist in the grid")], - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.rastertools", logging.ERROR, "Output directory \"tests/truc\" does not exist.")], - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.tiling", logging.ERROR, "No value in the grid column \"id\" are matching the given list of ids [1, 2]")] ] sysexitlist = [2, 2, 2, 2] @@ -639,17 +691,17 @@ def test_filtering_command_line_default(): # list of commands to test argslist = [ # default case: median - "-v --max_workers 1 fi median -a --kernel_size 8 -o tests/tests_out" - " tests/tests_data/RGB_TIF_20170105_013442_test.tif", + f"-v --max_workers 1 fi median -a --kernel_size 8 -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/RGB_TIF_20170105_013442_test.tif", # default case: local sum - "-v fi sum -b 1 2 --kernel_size 8 -o tests/tests_out" - " tests/tests_data/RGB_TIF_20170105_013442_test.tif", + f"-v fi sum -b 1 -b 2 --kernel_size 8 -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/RGB_TIF_20170105_013442_test.tif", # default case: local mean - "-v fi mean -b 1 --kernel_size 8 -o tests/tests_out" - " tests/tests_data/RGB_TIF_20170105_013442_test.tif", + f"-v fi mean -b 1 --kernel_size 8 -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/RGB_TIF_20170105_013442_test.tif", # default case: adaptive gaussian - "-v fi adaptive_gaussian -b 1 --kernel_size 32 --sigma 1 -o tests/tests_out" - " tests/tests_data/RGB_TIF_20170105_013442_test.tif", + f"-v fi adaptive_gaussian -b 1 --kernel_size 32 --sigma 1 -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/RGB_TIF_20170105_013442_test.tif", ] input_filenames = ["RGB_TIF_20170105_013442_test-{}.tif"] names = ["median", "sum", "mean", "adaptive_gaussian"] @@ -670,26 +722,20 @@ def test_filtering_command_line_errors(caplog): # list of commands to test argslist = [ # output dir does not exist - "-v fi median --kernel_size 8 -o tests/truc" - " tests/tests_data/tif_file.tif", + "-v filter median --kernel_size 8 -o tests/truc" + f" {RastertoolsTestsData.tests_input_data_dir}/tif_file.tif", # missing required argument - "-v fi adaptive_gaussian --kernel_size 32 -o tests/tests_out" - " tests/tests_data/RGB_TIF_20170105_013442_test.tif", - # kernel_size > window_size - "-v fi median -a --kernel_size 15 --window_size 16 -o tests/tests_out" - " tests/tests_data/RGB_TIF_20170105_013442_test.tif", + f"-v filter adaptive_gaussian --kernel_size 32 -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/RGB_TIF_20170105_013442_test.tif", ] # expected logs logslist = [ - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.rastertools", logging.ERROR, "Output directory \"tests/truc\" does not exist.")], [], - [("eolab.rastertools.main", logging.ERROR, - "The kernel size (option --kernel_size, value=15) must be strictly less than the " - "window size minus 1 (option --window_size, value=16)")] ] - sysexitlist = [2, 2, 1] + sysexitlist = [2, 2] # generate test cases tests = [TestCase(args).with_logs(logs).with_sys_exit(sysexit) @@ -707,11 +753,11 @@ def test_svf_command_line_default(): # list of commands to test argslist = [ # default case: svf at the point height - "-v svf --radius 50 --directions 16 --resolution 0.5 -o tests/tests_out" - " tests/tests_data/toulouse-mnh.tif", + f"-v svf --radius 50 --directions 16 --resolution 0.5 -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/toulouse-mnh.tif", # default case: svf on ground - "-v svf --radius 50 --directions 16 --resolution 0.5 --altitude 0 -o tests/tests_out" - " tests/tests_data/toulouse-mnh.tif", + f"-v svf --radius 50 --directions 16 --resolution 0.5 --altitude 0 -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/toulouse-mnh.tif", ] output_filenames = ["toulouse-mnh-svf.tif"] @@ -732,21 +778,21 @@ def test_svf_command_line_errors(caplog): argslist = [ # output dir does not exist "-v svf --radius 50 --directions 16 --resolution 0.5 -o tests/truc" - " tests/tests_data/toulouse-mnh.tif", + f" {RastertoolsTestsData.tests_input_data_dir}/toulouse-mnh.tif", # missing required argument - "-v svf --directions 16 --resolution 0.5 -o tests/tests_out" - " tests/tests_data/toulouse-mnh.tif", + f"-v svf --directions 16 --resolution 0.5 -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/toulouse-mnh.tif", # radius > window_size / 2 "-v svf --radius 100 --window_size 128 --directions 16 --resolution 0.5" - " --altitude 0 -o tests/tests_out tests/tests_data/toulouse-mnh.tif", + f" --altitude 0 -o {RastertoolsTestsData.tests_output_data_dir} {RastertoolsTestsData.tests_input_data_dir}/toulouse-mnh.tif", ] # expected logs logslist = [ - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.rastertools", logging.ERROR, "Output directory \"tests/truc\" does not exist.")], [], - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.cli.utils_cli", logging.ERROR, "The radius (option --radius, value=100) must be strictly less than half the" " size of the window (option --window_size, value=128)")] ] @@ -769,17 +815,17 @@ def test_hillshade_command_line_default(): # elevation / azimuth are retrieved from https://www.sunearthtools.com/dp/tools/pos_sun.php argslist = [ # default case: hillshade at Toulouse the September, 21 solar noon - "-v hs --elevation 46.81 --azimuth 180.0 --resolution 0.5 -o tests/tests_out" - " tests/tests_data/toulouse-mnh.tif", + f"-v hs --elevation 27.2 --azimuth 82.64 --resolution 0.5 -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/toulouse-mnh.tif", # default case: hillshade at Toulouse the June, 21, solar 6PM - "-v hs --elevation 25.82 --azimuth 278.58 --resolution 0.5 -o tests/tests_out" - " tests/tests_data/toulouse-mnh.tif", + f"-v hs --elevation 25.82 --azimuth 278.58 --resolution 0.5 -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/toulouse-mnh.tif", # default case: hillshade at Toulouse the June, 21, solar noon - "-v hs --elevation 69.83 --azimuth 180 --resolution 0.5 -o tests/tests_out" - " tests/tests_data/toulouse-mnh.tif", + f"-v hs --elevation 69.83 --azimuth 180 --resolution 0.5 -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/toulouse-mnh.tif", # default case: hillshade at Toulouse the June, 21, solar 8AM - "-v hs --elevation 27.2 --azimuth 82.64 --resolution 0.5 -o tests/tests_out" - " tests/tests_data/toulouse-mnh.tif", + f"-v hs --elevation 27.2 --azimuth 82.64 --resolution 0.5 -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/toulouse-mnh.tif", ] output_filenames = ["toulouse-mnh-hillshade.tif"] @@ -797,34 +843,28 @@ def test_hillshade_command_line_errors(caplog): utils4test.create_outdir() # list of commands to test + # There is no more window_size, therefore the forth test has been removed argslist = [ # output dir does not exist "-v hs --elevation 46.81 --azimuth 180.0 --resolution 0.5 -o tests/truc" - " tests/tests_data/toulouse-mnh.tif", + f" {RastertoolsTestsData.tests_input_data_dir}/toulouse-mnh.tif", # missing required argument - "-v hs --elevation 46.81 --resolution 0.5 -o tests/tests_out" - " tests/tests_data/toulouse-mnh.tif", + "-v hs --elevation 46.81 --resolution 0.5 " + f" {RastertoolsTestsData.tests_input_data_dir}/toulouse-mnh.tif", # input file has more than 1 band - "-v hs --elevation 46.81 --azimuth 180.0 --resolution 0.5 -o tests/tests_out" - " tests/tests_data/S2A_MSIL2A_20190116T105401_N0211_R051_T30TYP_20190116T120806.vrt", - # radius > window_size / 2 - "-v hs --elevation 27.2 --azimuth 82.64 --resolution 0.5" - " --radius 100 --window_size 128 -o tests/tests_out" - " tests/tests_data/toulouse-mnh.tif", + f"-v hs --elevation 46.81 --azimuth 180.0 --resolution 0.5 -o {RastertoolsTestsData.tests_output_data_dir}" + f" {RastertoolsTestsData.tests_input_data_dir}/S2A_MSIL2A_20190116T105401_N0211_R051_T30TYP_20190116T120806.vrt", ] # expected logs logslist = [ - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.rastertools", logging.ERROR, "Output directory \"tests/truc\" does not exist.")], [], - [("eolab.rastertools.main", logging.ERROR, + [("eolab.rastertools.hillshade", logging.ERROR, "Invalid input file, it must contain a single band.")], - [("eolab.rastertools.main", logging.ERROR, - "The radius (option --radius, value=100) must be strictly less than half" - " the size of the window (option --window_size, value=128)")] ] - sysexitlist = [2, 2, 1, 1] + sysexitlist = [2, 2, 1] # generate test cases tests = [TestCase(args).with_logs(logs).with_sys_exit(sysexit) diff --git a/tests/test_rastertype.py b/tests/test_rastertype.py index b0611741..0b367491 100644 --- a/tests/test_rastertype.py +++ b/tests/test_rastertype.py @@ -7,12 +7,13 @@ from datetime import datetime from eolab.rastertools import add_custom_rastertypes from eolab.rastertools.product import RasterType, BandChannel -from . import utils4test __author__ = "Olivier Queyrut" __copyright__ = "Copyright 2019, CNES" __license__ = "Apache v2.0" +from .utils4test import RastertoolsTestsData + def test_rastertype_valid_parameters(): # S2 L1C @@ -352,7 +353,7 @@ def test_rastertype_SPOT67(): def test_rastertype_additional(): - file = utils4test.indir + "additional_rastertypes.json" + file = RastertoolsTestsData.tests_input_data_dir + "/" + "additional_rastertypes.json" with open(file) as json_content: RasterType.add(json.load(json_content)) diff --git a/tests/test_speed.py b/tests/test_speed.py index 9bbe0d26..bc1347f7 100644 --- a/tests/test_speed.py +++ b/tests/test_speed.py @@ -1,8 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import pytest -import filecmp from eolab.rastertools import Speed from eolab.rastertools.product import RasterType @@ -12,11 +10,15 @@ __copyright__ = "Copyright 2019, CNES" __license__ = "Apache v2.0" +from .utils4test import RastertoolsTestsData __refdir = utils4test.get_refdir("test_radioindice/") -def test_speed_process_files(compare, save_gen_as_ref): +def test_speed_process_files(compare : bool, save_gen_as_ref : bool): + """ + + """ # create output dir and clear its content if any utils4test.create_outdir() @@ -25,19 +27,19 @@ def test_speed_process_files(compare, save_gen_as_ref): date1 = RasterType.get("S2_L2A_MAJA").get_date(name1) - files = [utils4test.indir + name1 + "-ndvi.tif", - utils4test.indir + name2 + "-ndvi.tif"] + files = [RastertoolsTestsData.tests_input_data_dir + "/" + name1 + "-ndvi.tif", + RastertoolsTestsData.tests_input_data_dir + "/" + name2 + "-ndvi.tif"] tool = Speed() - tool.with_output(utils4test.outdir) + tool.with_output(RastertoolsTestsData.tests_output_data_dir + "/") outputs = tool.process_files(files) exp_outs = [name2 + "-ndvi-speed-" + date1.strftime('%Y%m%d-%H%M%S') + ".tif"] - assert outputs == [utils4test.outdir + exp_out for exp_out in exp_outs] + assert outputs == [RastertoolsTestsData.tests_output_data_dir + "/" + exp_out for exp_out in exp_outs] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, exp_outs) + match, mismatch, err = utils4test.cmpfiles(RastertoolsTestsData.tests_output_data_dir + "/", __refdir, exp_outs) assert len(match) == 1 assert len(mismatch) == 0 assert len(err) == 0 diff --git a/tests/test_stats.py b/tests/test_stats.py index 692a1b3b..7c6ec26b 100644 --- a/tests/test_stats.py +++ b/tests/test_stats.py @@ -8,6 +8,7 @@ __copyright__ = "Copyright 2019, CNES" __license__ = "Apache v2.0" +from .utils4test import RastertoolsTestsData __refdir = utils4test.get_refdir("test_stats/") @@ -16,8 +17,8 @@ def test_compute_zonal_default_stats(): - raster = utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" - geojson = utils4test.indir + "COMMUNE_32xxx.geojson" + raster = RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + geojson = RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_32xxx.geojson" stats_to_compute = DEFAULT_STATS categorical = False bands = [1] @@ -49,7 +50,7 @@ def test_compute_zonal_default_stats(): [{'count': 64186, 'min': -1.0, 'max': 1.0, 'mean': 0.698426, 'std': 0.210732}], [{'count': 83063, 'min': -1.0, 'max': 1.0, 'mean': 0.699223, 'std': 0.213408}], [{'count': 4038, 'min': -0.206738, 'max': 1.0, 'mean': 0.734667, 'std': 0.230044}], - [{'count': 29232, 'min': -0.83908, 'max': 1.0, 'mean': 0.602069, 'std': 0.217282}], + [{'count': 29232, 'min': -0.83908, 'max': 1.0, 'mean': 0.60207, 'std': 0.217282}], [{'count': 177106, 'min': -1.0, 'max': 1.0, 'mean': 0.548052, 'std': 0.261178}], [{'count': 17772, 'min': 0.038081, 'max': 1.0, 'mean': 0.61795, 'std': 0.269253}], [{'count': 169829, 'min': -1.0, 'max': 1.0, 'mean': 0.525915, 'std': 0.258398}], @@ -63,8 +64,8 @@ def test_compute_zonal_default_stats(): def test_compute_zonal_extra_stats(): - raster = utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" - geojson = utils4test.indir + "COMMUNE_32xxx.geojson" + raster = RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + geojson = RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_32xxx.geojson" stats_to_compute = EXTRA_STATS + ["valid"] categorical = False bands = [1] @@ -167,8 +168,8 @@ def test_compute_zonal_extra_stats(): def test_compute_zonal_categorical(): - raster = utils4test.indir + "OCS_2017_CESBIO_extract.tif" - geojson = utils4test.indir + "COMMUNE_59xxx.geojson" + raster = RastertoolsTestsData.tests_input_data_dir + "/" + "OCS_2017_CESBIO_extract.tif" + geojson = RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_59xxx.geojson" stats_to_compute = ['count'] categorical = True bands = [1] @@ -205,10 +206,10 @@ def test_compute_zonal_categorical(): def test_compute_zonal_stats_per_category(): - raster = utils4test.indir + "DSM_PHR_Dunkerque.tif" - geojson = utils4test.indir + "COMMUNE_59xxx.geojson" - catgeojson = utils4test.indir + "OSO_2017_classification_dep59.shp" - catlabels = utils4test.indir + "OSO_nomenclature_2017.json" + raster = RastertoolsTestsData.tests_input_data_dir + "/" + "DSM_PHR_Dunkerque.tif" + geojson = RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_59xxx.geojson" + catgeojson = RastertoolsTestsData.tests_input_data_dir + "/" + "OSO_2017_classification_dep59.shp" + catlabels = RastertoolsTestsData.tests_input_data_dir + "/" + "OSO_nomenclature_2017.json" stats_to_compute = DEFAULT_STATS bands = [1] geometries = vector.reproject(vector.filter(geojson, raster), raster) @@ -219,7 +220,7 @@ def test_compute_zonal_stats_per_category(): stats=stats_to_compute, categories=categories, category_index="Classe") - print(f"{statistics}") + # statistics is a list of list of dict. # First list iterates over geometries # Second list iterates over bands. @@ -231,12 +232,12 @@ def test_compute_zonal_stats_per_category(): for geom_stats in statistics for d in geom_stats for key, val in d.items()] # ref is the following - ref = [[{'11min': 40.407368, '11max': 44.083961, '11mean': 42.293809, '11count': 244, '11std': 0.849256, + ref = [[{'11min': 40.407368, '11max': 44.083961, '11mean': 42.293813, '11count': 244, '11std': 0.849256, '31min': 40.224247, '31max': 68.915146, '31mean': 46.435981, '31count': 12347, '31std': 4.744863, '32min': 38.825829, '32max': 46.798634, '32mean': 42.545211, '32count': 6657, '32std': 1.33232, '42min': 38.214043, '42max': 59.93272, '42mean': 43.375167, '42count': 2716, '42std': 1.595453, - '43min': 38.214043, '43max': 45.618088, '43mean': 42.273938, '43count': 875, '43std': 1.241663}], - [{'11min': 38.475033, '11max': 45.613518, '11mean': 42.386634, '11count': 73437, '11std': 1.090365, + '43min': 38.214043, '43max': 45.618088, '43mean': 42.273933, '43count': 875, '43std': 1.241663}], + [{'11min': 38.475033, '11max': 45.613518, '11mean': 42.386638, '11count': 73437, '11std': 1.090365, '12min': 39.241253, '12max': 43.433277, '12mean': 41.991684, '12count': 17339, '12std': 0.313978, '31min': 33.781662, '31max': 60.81406, '31mean': 44.562402, '31count': 12743, '31std': 3.051407, '32min': 37.670204, '32max': 64.120644, '32mean': 44.396163, '32count': 18284, '32std': 2.749989, @@ -258,6 +259,7 @@ def test_compute_zonal_stats_per_category(): category_index="Classe", category_labels=labels) + # statistics is a list of list of dict. # First list iterates over geometries # Second list iterates over bands. @@ -269,12 +271,12 @@ def test_compute_zonal_stats_per_category(): for geom_stats in statistics for d in geom_stats for key, val in d.items()] # ref is the following - ref = [[{'cetemin': 40.407368, 'cetemax': 44.083961, 'cetemean': 42.293809, 'cetecount': 244, 'cetestd': 0.849256, + ref = [[{'cetemin': 40.407368, 'cetemax': 44.083961, 'cetemean': 42.293813, 'cetecount': 244, 'cetestd': 0.849256, 'feumin': 40.224247, 'feumax': 68.915146, 'feumean': 46.435981, 'feucount': 12347, 'feustd': 4.744863, 'conmin': 38.825829, 'conmax': 46.798634, 'conmean': 42.545211, 'concount': 6657, 'constd': 1.33232, 'udimin': 38.214043, 'udimax': 59.93272, 'udimean': 43.375167, 'udicount': 2716, 'udistd': 1.595453, - 'zicmin': 38.214043, 'zicmax': 45.618088, 'zicmean': 42.273938, 'ziccount': 875, 'zicstd': 1.241663}], - [{'cetemin': 38.475033, 'cetemax': 45.613518, 'cetemean': 42.386634, 'cetecount': 73437, 'cetestd': 1.090365, + 'zicmin': 38.214043, 'zicmax': 45.618088, 'zicmean': 42.273933, 'ziccount': 875, 'zicstd': 1.241663}], + [{'cetemin': 38.475033, 'cetemax': 45.613518, 'cetemean': 42.386638, 'cetecount': 73437, 'cetestd': 1.090365, 'chivmin': 39.241253, 'chivmax': 43.433277, 'chivmean': 41.991684, 'chivcount': 17339, 'chivstd': 0.313978, 'feumin': 33.781662, 'feumax': 60.81406, 'feumean': 44.562402, 'feucount': 12743, 'feustd': 3.051407, 'conmin': 37.670204, 'conmax': 64.120644, 'conmean': 44.396163, 'concount': 18284, 'constd': 2.749989, diff --git a/tests/test_tiling.py b/tests/test_tiling.py index 54180919..213e1737 100644 --- a/tests/test_tiling.py +++ b/tests/test_tiling.py @@ -1,7 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import filecmp from eolab.rastertools import Tiling from . import utils4test @@ -10,6 +9,7 @@ __copyright__ = "Copyright 2019, CNES" __license__ = "Apache v2.0" +from .utils4test import RastertoolsTestsData __refdir = utils4test.get_refdir("test_tiling/") @@ -21,14 +21,14 @@ def test_tiling_process_file(compare, save_gen_as_ref): inputfile = "tif_file" geometryfile = "grid.geojson" - tool = Tiling(utils4test.indir + geometryfile) - tool.with_output(utils4test.outdir) + tool = Tiling(RastertoolsTestsData.tests_input_data_dir + "/" + geometryfile) + tool.with_output(RastertoolsTestsData.tests_output_data_dir + "/") tool.with_id_column("id", [77, 93]) - tool.process_file(utils4test.indir + inputfile + ".tif") + tool.process_file(RastertoolsTestsData.tests_input_data_dir + "/" + inputfile + ".tif") gen_files = [inputfile + "_tile77.tif", inputfile + "_tile93.tif"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(RastertoolsTestsData.tests_output_data_dir + "/", __refdir, gen_files) assert len(match) == 2 assert len(mismatch) == 0 assert len(err) == 0 diff --git a/tests/test_vector.py b/tests/test_vector.py index a8661393..79fb4276 100644 --- a/tests/test_vector.py +++ b/tests/test_vector.py @@ -1,7 +1,6 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -import filecmp import geopandas as gpd from pathlib import Path @@ -13,6 +12,7 @@ __copyright__ = "Copyright 2019, CNES" __license__ = "Apache v2.0" +from .utils4test import RastertoolsTestsData __refdir = utils4test.get_refdir("test_vector/") @@ -22,41 +22,41 @@ def test_reproject_filter(compare, save_gen_as_ref): utils4test.create_outdir() reproj_geoms = vector.reproject( - utils4test.indir + "COMMUNE_32xxx.geojson", - utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif") + RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_32xxx.geojson", + RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif") filtered_geoms = vector.filter( reproj_geoms, - utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif") + RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif") assert len(filtered_geoms) == 19 filtered_geoms = vector.filter( reproj_geoms, - utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif", + RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif", within=True) assert len(filtered_geoms) == 2 geoms = vector.reproject( - vector.filter(utils4test.indir + "COMMUNE_32xxx.geojson", - utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif"), - utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif") + vector.filter(RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_32xxx.geojson", + RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif"), + RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif") assert len(geoms) == 19 geoms = vector.reproject( - vector.filter(utils4test.indir + "COMMUNE_32xxx.geojson", - utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif", + vector.filter(RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_32xxx.geojson", + RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif", within=True), - utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif") + RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif") assert len(geoms) == 2 geoms = vector.reproject( - vector.filter(Path(utils4test.indir + "COMMUNE_32xxx.geojson"), - Path(utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif")), - Path(utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif"), - output=Path(utils4test.outdir + "reproject_filter.geojson")) + vector.filter(Path(RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_32xxx.geojson"), + Path(RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif")), + Path(RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif"), + output=Path(RastertoolsTestsData.tests_output_data_dir + "/" + "reproject_filter.geojson")) assert len(geoms) == 19 gen_files = ["reproject_filter.geojson"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(RastertoolsTestsData.tests_output_data_dir + "/", __refdir, gen_files, tolerance = 1.e-8) assert len(match) == 1 assert len(mismatch) == 0 assert len(err) == 0 @@ -64,16 +64,16 @@ def test_reproject_filter(compare, save_gen_as_ref): # save the generated files in the refdir => make them the new refs. utils4test.copy_to_ref(gen_files, __refdir) - geometries = gpd.read_file(utils4test.indir + "COMMUNE_32xxx.geojson") + geometries = gpd.read_file(RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_32xxx.geojson") geoms = vector.reproject( vector.filter(geometries, - Path(utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif")), - Path(utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif"), - output=Path(utils4test.outdir + "reproject_filter.geojson")) + Path(RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif")), + Path(RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif"), + output=Path(RastertoolsTestsData.tests_output_data_dir + "/" + "reproject_filter.geojson")) assert len(geoms) == 19 gen_files = ["reproject_filter.geojson"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(RastertoolsTestsData.tests_output_data_dir + "/", __refdir, gen_files, tolerance = 1.e-8) assert len(match) == 1 assert len(mismatch) == 0 assert len(err) == 0 @@ -89,18 +89,18 @@ def test_reproject_dissolve(compare, save_gen_as_ref): utils4test.create_outdir() geoms = vector.reproject( - vector.dissolve(utils4test.indir + "COMMUNE_32xxx.geojson"), - utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif") + vector.dissolve(RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_32xxx.geojson"), + RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif") assert len(geoms) == 1 geoms = vector.reproject( - vector.dissolve(Path(utils4test.indir + "COMMUNE_32xxx.geojson")), - utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif", - output=Path(utils4test.outdir + "reproject_dissolve.geojson")) + vector.dissolve(Path(RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_32xxx.geojson")), + RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif", + output=Path(RastertoolsTestsData.tests_output_data_dir + "/" + "reproject_dissolve.geojson")) assert len(geoms) == 1 gen_files = ["reproject_dissolve.geojson"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(RastertoolsTestsData.tests_output_data_dir + "/", __refdir, gen_files, tolerance = 1.e-8) assert len(match) == 1 assert len(mismatch) == 0 assert len(err) == 0 @@ -115,18 +115,18 @@ def test_clip(compare, save_gen_as_ref): # create output dir and clear its content if any utils4test.create_outdir() - geoms = vector.clip(utils4test.indir + "COMMUNE_32xxx.geojson", - utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif") + geoms = vector.clip(RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_32xxx.geojson", + RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif") assert len(geoms) == 19 geoms = vector.clip( - Path(utils4test.indir + "COMMUNE_32xxx.geojson"), - Path(utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif"), - output=Path(utils4test.outdir + "clip.geojson")) + Path(RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_32xxx.geojson"), + Path(RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif"), + output=Path(RastertoolsTestsData.tests_output_data_dir + "/" + "clip.geojson")) assert len(geoms) == 19 gen_files = ["clip.geojson"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(RastertoolsTestsData.tests_output_data_dir + "/", __refdir, gen_files, tolerance = 1.e-8, column_sortby = 'ID') assert len(match) == 1 assert len(mismatch) == 0 assert len(err) == 0 @@ -142,16 +142,16 @@ def test_get_raster_shape(compare, save_gen_as_ref): utils4test.create_outdir() geoms = vector.get_raster_shape( - utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif") + RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif") assert len(geoms) == 1 geoms = vector.get_raster_shape( - Path(utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif"), - Path(utils4test.outdir + "raster_outline.geojson")) + Path(RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif"), + Path(RastertoolsTestsData.tests_output_data_dir + "/" + "raster_outline.geojson")) assert len(geoms) == 1 gen_files = ["raster_outline.geojson"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(RastertoolsTestsData.tests_output_data_dir + "/", __refdir, gen_files) assert len(match) == 1 assert len(mismatch) == 0 assert len(err) == 0 diff --git a/tests/test_zonalstats.py b/tests/test_zonalstats.py index 906b5bac..bdbbc3a4 100644 --- a/tests/test_zonalstats.py +++ b/tests/test_zonalstats.py @@ -1,9 +1,8 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- +import os import pytest -import filecmp -from pathlib import Path from eolab.rastertools import Zonalstats from eolab.rastertools import RastertoolConfigurationException @@ -13,6 +12,7 @@ __copyright__ = "Copyright 2019, CNES" __license__ = "Apache v2.0" +from .utils4test import RastertoolsTestsData __refdir = utils4test.get_refdir("test_zonalstats/") @@ -22,20 +22,20 @@ def test_zonalstats_global(compare, save_gen_as_ref): utils4test.create_outdir() # cas 1 - inputfile = utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + inputfile = RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" outformat = "ESRI Shapefile" statistics = "min max mean std count range sum".split() categorical = False tool = Zonalstats(statistics, categorical) - tool.with_output(utils4test.outdir, output_format=outformat) + tool.with_output(RastertoolsTestsData.tests_output_data_dir + "/", output_format=outformat) tool.with_outliers(1.0) tool.process_file(inputfile) gen_files = ["SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats.shp", "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats-outliers.tif"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(RastertoolsTestsData.tests_output_data_dir + "/", __refdir, gen_files) assert len(match) == 2 assert len(mismatch) == 0 assert len(err) == 0 @@ -44,18 +44,18 @@ def test_zonalstats_global(compare, save_gen_as_ref): utils4test.copy_to_ref(gen_files, __refdir) # cas 2 - inputfile = utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" + inputfile = RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif" outformat = "GeoJSON" statistics = "median majority minority unique percentile_10 percentile_90".split() categorical = False tool = Zonalstats(statistics, categorical) - tool.with_output(utils4test.outdir, output_format=outformat) + tool.with_output(RastertoolsTestsData.tests_output_data_dir + "/", output_format=outformat) tool.process_file(inputfile) gen_files = ["SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi-stats.geojson"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(RastertoolsTestsData.tests_output_data_dir + "/", __refdir, gen_files) assert len(match) == 1 assert len(mismatch) == 0 assert len(err) == 0 @@ -64,13 +64,13 @@ def test_zonalstats_global(compare, save_gen_as_ref): utils4test.copy_to_ref(gen_files, __refdir) # cas 3 : unrecognized rastertype that disables charting capability, no output file for stats - inputfile = utils4test.indir + "toulouse-mnh.tif" + inputfile = RastertoolsTestsData.tests_input_data_dir + "/" + "toulouse-mnh.tif" statistics = "mean std".split() categorical = False tool = Zonalstats(statistics, categorical) tool.with_output(None) - tool.with_chart(utils4test.outdir + "chart.png") + tool.with_chart(RastertoolsTestsData.tests_output_data_dir + "/" + "chart.png") tool.process_file(inputfile) assert len(tool.generated_stats) == 1 assert len(tool.generated_stats_per_date) == 0 @@ -83,21 +83,21 @@ def test_zonalstats_zonal(compare, save_gen_as_ref): utils4test.create_outdir() # cas 1 - inputfile = utils4test.indir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif" + inputfile = RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif" outformat = "ESRI Shapefile" statistics = "min max mean std count range sum".split() categorical = False tool = Zonalstats(statistics, categorical) - tool.with_output(utils4test.outdir, output_format=outformat) - tool.with_geometries(geometries=utils4test.indir + "COMMUNE_32xxx.geojson") + tool.with_output(RastertoolsTestsData.tests_output_data_dir + "/", output_format=outformat) + tool.with_geometries(geometries=RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_32xxx.geojson") tool.with_outliers(sigma=1.0) tool.process_file(inputfile) gen_files = ["SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi-stats.shp", "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi-stats-outliers.tif"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(RastertoolsTestsData.tests_output_data_dir + "/", __refdir, gen_files, tolerance = 1.e-8) assert len(match) == 2 assert len(mismatch) == 0 assert len(err) == 0 @@ -106,19 +106,19 @@ def test_zonalstats_zonal(compare, save_gen_as_ref): utils4test.copy_to_ref(gen_files, __refdir) # cas 2 - inputfile = utils4test.indir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif" + inputfile = RastertoolsTestsData.tests_input_data_dir + "/" + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif" outformat = "GeoJSON" statistics = "median majority minority unique percentile_10 percentile_90".split() categorical = False tool = Zonalstats(statistics, categorical) - tool.with_output(utils4test.outdir, output_format=outformat) - tool.with_geometries(geometries=utils4test.indir + "COMMUNE_32xxx.geojson") + tool.with_output(RastertoolsTestsData.tests_output_data_dir + "/", output_format=outformat) + tool.with_geometries(geometries=RastertoolsTestsData.tests_input_data_dir + "/" + "COMMUNE_32xxx.geojson") tool.process_file(inputfile) gen_files = ["SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi-stats.geojson"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(RastertoolsTestsData.tests_output_data_dir + "/", __refdir, gen_files, tolerance = 1.e-8) assert len(match) == 1 assert len(mismatch) == 0 assert len(err) == 0 @@ -131,55 +131,50 @@ def test_zonalstats_zonal(compare, save_gen_as_ref): def test_zonalstats_process_files(compare, save_gen_as_ref): # create output dir and clear its content if any + data_path = RastertoolsTestsData.tests_input_data_dir.replace(os.getcwd() + "/", "") + "/" + out_path = RastertoolsTestsData.tests_output_data_dir.replace(os.getcwd() + "/", "") + "/" + utils4test.create_outdir() - inputfiles = [utils4test.indir + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif", - utils4test.indir + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif"] + inputfiles = [data_path + "SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif", + data_path + "SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif"] outformat = "GeoJSON" statistics = "min max mean std count range sum".split() tool = Zonalstats(statistics, prefix="indice") tool.with_output(None, output_format=outformat) - tool.with_geometries(geometries=utils4test.indir + "COMMUNE_32xxx.geojson") - tool.with_chart(chart_file=utils4test.outdir + "chart.png") + tool.with_geometries(geometries=data_path + "COMMUNE_32xxx.geojson") + tool.with_chart(chart_file=out_path + "chart.png") tool.process_files(inputfiles) - gen_files = ["chart.png"] - assert Path(utils4test.outdir + "chart.png").exists() - if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) - assert len(match) == 1 - assert len(mismatch) == 0 - assert len(err) == 0 - elif save_gen_as_ref: - # save the generated files in the refdir => make them the new refs. - utils4test.copy_to_ref(gen_files, __refdir) - utils4test.clear_outdir() def test_zonalstats_category(compare, save_gen_as_ref): # create output dir and clear its content if any + data_path = RastertoolsTestsData.tests_input_data_dir.replace(os.getcwd() + "/", "") + "/" + out_path = RastertoolsTestsData.tests_output_data_dir.replace(os.getcwd() + "/", "") + "/" + utils4test.create_outdir() # cas 1 - classif shapefile sur une ROI composée de plusieurs géométries - inputfile = utils4test.indir + "DSM_PHR_Dunkerque.tif" + inputfile = data_path + "DSM_PHR_Dunkerque.tif" outformat = "GeoJSON" statistics = "min max mean std count range sum".split() # Category inputs - categoryfile = utils4test.indir + "OSO_2017_classification_dep59.shp" - categorydic = utils4test.indir + "OSO_nomenclature_2017.json" + categoryfile = data_path + "OSO_2017_classification_dep59.shp" + categorydic = data_path + "OSO_nomenclature_2017.json" tool = Zonalstats(statistics, area=True) - tool.with_output(utils4test.outdir, output_format=outformat) - tool.with_geometries(geometries=utils4test.indir + "COMMUNE_59xxx.geojson") + tool.with_output(out_path, output_format=outformat) + tool.with_geometries(geometries=data_path + "COMMUNE_59xxx.geojson") tool.with_per_category(category_file=categoryfile, category_index="Classe", category_labels_json=categorydic) tool.process_file(inputfile) gen_files = ["DSM_PHR_Dunkerque-stats.geojson"] if compare: - match, mismatch, err = utils4test.cmpfiles(utils4test.outdir, __refdir, gen_files) + match, mismatch, err = utils4test.cmpfiles(out_path, __refdir, gen_files, tolerance= 1e-8) assert len(match) == 1 assert len(mismatch) == 0 assert len(err) == 0 @@ -188,13 +183,13 @@ def test_zonalstats_category(compare, save_gen_as_ref): utils4test.copy_to_ref(gen_files, __refdir) # cas 2 - classif raster sur l'emprise globale du DSM - inputfile = utils4test.indir + "DSM_PHR_Dunkerque.tif" + inputfile = data_path + "DSM_PHR_Dunkerque.tif" outformat = "GeoJSON" - categoryfile = utils4test.indir + "OCS_2017_CESBIO_extract.tif" - categorydic = utils4test.indir + "OSO_nomenclature_2017.json" + categoryfile = data_path + "OCS_2017_CESBIO_extract.tif" + categorydic = data_path + "OSO_nomenclature_2017.json" tool = Zonalstats(statistics, area=True) - tool.with_output(utils4test.outdir, output_format=outformat) + tool.with_output(out_path, output_format=outformat) tool.with_per_category(category_file=categoryfile, category_index="Classe", category_labels_json=categorydic) tool.process_file(inputfile) @@ -213,6 +208,7 @@ def test_zonalstats_category(compare, save_gen_as_ref): utils4test.clear_outdir() + def test_zonalstats_errors(): # create output dir and clear its content if any utils4test.create_outdir() @@ -238,8 +234,8 @@ def test_zonalstats_category_errors(): # cas 1 - Invalid category file statistics = "min max mean std count range sum".split() # Category inputs - categoryfile = utils4test.indir + "unknown.tif" - categorydic = utils4test.indir + "OSO_nomenclature_2017.json" + categoryfile = RastertoolsTestsData.tests_input_data_dir + "/" + "unknown.tif" + categorydic = RastertoolsTestsData.tests_input_data_dir + "/" + "OSO_nomenclature_2017.json" tool = Zonalstats(statistics) with pytest.raises(RastertoolConfigurationException) as err: @@ -248,8 +244,8 @@ def test_zonalstats_category_errors(): assert f"File {categoryfile} cannot be read: check format and existence" in str(err.value) # cas 2 - invalid category dictionary - categoryfile = utils4test.indir + "OCS_2017_CESBIO_extract.tif" - categorydic = utils4test.indir + "OSO_nomenclature_2017_wrong.json" + categoryfile = RastertoolsTestsData.tests_input_data_dir + "/" + "OCS_2017_CESBIO_extract.tif" + categorydic = RastertoolsTestsData.tests_input_data_dir + "/" + "OSO_nomenclature_2017_wrong.json" tool = Zonalstats(statistics) with pytest.raises(RastertoolConfigurationException) as err: diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt new file mode 100644 index 00000000..bc388e7b --- /dev/null +++ b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt @@ -0,0 +1,163 @@ + + PROJCS["WGS 84 / UTM zone 30N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32630"]] + 7.4478000000000000e+05, 1.0000000000000000e+01, 0.0000000000000000e+00, 4.8474100000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+01 + + PIXEL + + + Band 2 (490nm) + -10000 + + + Band 3 (560nm) + -10000 + + + Band 4 (665nm) + -10000 + + + Band 8 (842nm) + -10000 + + + Band 11 (1610nm) + -10000 + + + Band 12 (2190nm) + -10000 + + + Band 5 (705nm) + -10000 + + + Band 6 (740nm) + -10000 + + + Band 7 (783nm) + -10000 + + + Band 8a (865nm) + -10000 + + + CLM_R1 + 0 + + + SAT_R1 + 0 + + + EDG_R1 + 0 + + 512 + 128 + + 6.71089e+07 + NearestNeighbour + Int16 + + + SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.vrt + + + 0.125 + + + 742900,10,0,4848620,0,-10 + -74290,0.100000000000000006,0,484862,0,-0.100000000000000006 + 744780,10,0,4847410,0,-10 + -74478,0.100000000000000006,0,484741,0,-0.100000000000000006 + + + + + + + -10000 + 0 + -10000 + 0 + + + -10000 + 0 + -10000 + 0 + + + -10000 + 0 + -10000 + 0 + + + -10000 + 0 + -10000 + 0 + + + -10000 + 0 + -10000 + 0 + + + -10000 + 0 + -10000 + 0 + + + -10000 + 0 + -10000 + 0 + + + -10000 + 0 + -10000 + 0 + + + -10000 + 0 + -10000 + 0 + + + -10000 + 0 + -10000 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + 0 + 0 + + + MULTIPOLYGON (((1047.84148452307 506.998028926435,1047.36765075517 507.77535507147,1046.89381701994 508.552681144094,1046.41998331742 509.330007144599,1045.94614964761 510.107333072694,1045.47231601049 510.88465892867,1044.66791292337 511.476504988212,1043.86350992534 512.068351013178,1043.05910701644 512.660197003977,1042.25470419665 513.252042960434,1041.45030146596 513.843888882431,1040.6458988244 514.435734770319,1039.84149627194 515.02758062369,1039.03709380858 515.619426442776,1038.23269143437 516.211272227578,1037.42828914925 516.803117978096,1036.62388695325 517.394963694038,1035.81948484636 517.986809375696,1035.0150828286 518.578655023186,1034.21068089994 519.170500636275,1033.40627906044 519.762346215255,1032.60187731001 520.354191759659,1031.79747564874 520.946037269896,1030.84534902277 521.220644307032,1029.89322248548 521.495251375309,1028.94109603684 521.769858475018,1027.98896967684 522.044465606101,1027.03684340551 522.319072768558,1026.08471722282 522.593679962389,1025.13259112877 522.868287187302,1024.18046512335 523.142894443474,1023.22833920659 523.417501731194,1022.27621337847 523.692109050462,1021.32408763898 523.966716400697,1020.37196198813 524.241323782306,1019.41983642592 524.515931195463,1018.46771095235 524.790538639645,1017.51558556739 525.065146115492,1016.56346027108 525.339753622422,1015.61133506338 525.6143611609,1014.65920994434 525.888968730578,1013.70708491388 526.16357633163,1012.75495997208 526.438183963997,1011.80283511888 526.712791627971,1010.85071035434 526.987399323087,1009.8985856784 527.262007049634,1008.94646109105 527.536614807497,1007.99433659234 527.811222596443,1007.04221218225 528.085830417054,1006.09008786078 528.360438269156,1005.13796362792 528.635046152398,1004.18583948366 528.909654066956,1003.233715428 529.184262013121,1002.28159146095 529.458869990194,1001.32946758252 529.733477999049,1000.37734379269 530.008086039103,999.907934451548 530.709863916738,999.438525143763 531.411641735293,998.469279090423 531.425930868427,997.500033094911 531.440220070712,996.530787157229 531.454509341798,995.561541277377 531.468798681803,994.767481108764 531.805218464404,993.973421010989 532.141638254339,993.179360984039 532.478058051202,992.476103421723 533.117680798052,991.772845932035 533.757303498103,991.069588515005 534.396926151181,990.36633117059 535.036548757169,989.663073898802 535.676171316067,988.959816699658 536.31579382834,988.256559573158 536.955416293524,987.6018005675 536.736585308972,986.947041562875 536.517754370056,986.292282559327 536.298923476308,985.885707002511 535.516758481564,985.479131371423 534.734593490837,985.072555666105 533.952428504417,984.665979886529 533.170263522305,984.25940403268 532.388098544208,983.852828104616 531.605933570303,983.44625210228 530.823768600589,983.039676025728 530.041603635298,982.327510617964 530.670585611078,981.615345284124 531.299567542097,980.903180024165 531.928549428354,980.191014838099 532.557531269907,979.478849725929 533.186513066525,978.766684687653 533.815494818497,978.054519723286 534.444476525648,977.342354832799 535.073458188388,976.630190016222 535.702439805958,975.751687436001 536.10434802965,974.873184944998 536.506256256951,973.994682543213 536.908164488617,973.11618023066 537.310072724242,972.237678007325 537.711980963591,971.359175873193 538.113889206841,970.480673828308 538.515797454573,969.74318009078 539.118801060657,969.005686430741 539.721804627916,968.268192848191 540.324808156001,967.573132855367 541.004057489685,966.878072934749 541.683306769177,966.183013086367 542.362555994361,965.487953310192 543.041805165354,964.792893606224 543.721054281574,964.097833974476 544.400303343544,963.402774414964 545.079552351381,962.707714927659 545.75880130491,962.01265551259 546.43805020384,961.317596169756 547.11729904887,960.622536899158 547.796547839418,959.927477700752 548.475796575192,959.232418574597 549.155045257125,958.537359520662 549.834293884691,957.842300538978 550.513542457949,957.147241629529 551.192790976609,956.452182792287 551.872039441078,955.75712402731 552.55128785118,955.062065334569 553.230536207324,954.367006714048 553.909784508578,953.671948165778 554.589032755932,952.976889689759 555.268280948978,952.281831285974 555.947529087542,951.586772954426 556.626777171856,950.826070883006 557.112269452075,950.06536888743 557.597761714424,949.30466696767 558.083253958786,948.54396512371 558.568746184988,947.78326335561 559.054238393321,947.022561663325 559.539730583783,946.26186004687 560.025222756318,945.501158506246 560.510714910633,944.740457041422 560.996207047254,943.874603205477 561.275109002076,943.008749445624 561.554010978958,942.142895761848 561.832912977785,941.277042154179 562.111814998265,940.411188622602 562.390717040806,939.687853046926 562.959238373674,938.96451754494 563.527759672841,938.241182116602 564.096280938247,937.517846761926 564.664802170068,936.794511480941 565.233323368418,936.071176273588 565.801844532834,935.420247468195 566.473219165578,934.769318726889 567.144593744131,934.118390049698 567.815968269075,933.467461436594 568.487342740409,932.81653288762 569.158717158018,932.165604402733 569.830091521784,931.514675981976 570.501465831592,930.863747625306 571.172840087675,930.464118513613 571.981423848076,930.064489421246 572.79000753304,929.664860348203 573.598591142509,929.265231294543 574.40717467654,928.865602260208 575.215758135426,928.465973245213 576.024341518525,927.747277403323 576.683993629995,927.028581637554 577.343645691406,926.309885947892 578.003297702759,925.591190334337 578.662949664111,924.872494796931 579.322601575579,924.153799335618 579.982253436698,923.43510395044 580.641905248223,922.716408641383 581.301557009574,921.997713408447 581.961208721041,921.279018251633 582.620860382449,920.560323170954 583.280511994089,919.976080418477 584.042961403145,919.391837718809 584.805410741421,918.80759507195 585.567860009032,918.2233524779 586.330309205921,917.639109936659 587.092758332088,917.054867448242 587.855207387358,916.470625012633 588.617656371905,915.886382629862 589.380105285672,915.3021402999 590.142554128601,914.717898022747 590.90500290104,914.408118959662 591.838627266116,914.09833989419 592.772251538467,913.788560826375 593.705875718559,913.478781756174 594.639499805926,913.1690026836 595.573123800452,913.088067707169 596.475466722681,913.007132693936 597.377809575177,912.926197643916 598.280152358289,912.845262557137 599.182495072251,912.764327433528 600.084837716422,912.683392273189 600.987180291442,912.602457076035 601.889522796962,912.521521842107 602.791865233041,912.763970778949 603.490932407847,913.006419664816 604.189999570372,912.712966608975 605.113886050764,912.419513548521 606.037772441457,912.126060483468 606.961658742046,911.83260741386 607.885544952995,911.539154339684 608.809431074071,911.245701260908 609.733317105274,910.952248177564 610.65720304678,910.658795089636 611.581088898238,910.365341997152 612.504974659765,910.071888900115 613.428860331944,909.778435798464 614.352745913668,909.484982692273 615.276631406043,909.191529581512 616.200516808487,908.898076466197 617.124402120942,908.604623346284 618.048287343467,908.311170221859 618.972172476118,908.017717092865 619.896057519305,907.724263959302 620.819942472386,907.43081082117 621.743827335536,907.137357678512 622.667712108756,906.493067324438 623.310257724486,905.84877703285 623.952803291089,905.204486803763 624.595348809089,904.560196637118 625.237894278078,903.915906533002 625.880439698405,903.271616491329 626.522985070013,902.627326512171 627.165530392667,901.983036595499 627.808075666602,901.338746741312 628.450620891876,900.694456949641 629.093166068429,900.197096665725 629.86219870334,899.69973641909 630.631231267063,899.202376209767 631.400263759657,898.705016037711 632.169296181353,898.207655902923 632.938328531571,897.710295805402 633.707360810658,897.212935745207 634.476393018733,896.454100225033 635.004086554283,895.695264782742 635.531780065037,894.936429418376 636.059473550646,894.177594131892 636.587167011108,893.418758923333 637.114860446833,892.659923792686 637.642553857702,891.901088739949 638.170247243484,891.01316342791 638.593028141535,890.125238208449 639.01580904104,889.237313081598 639.438589942176,888.349388047325 639.861370844825,887.461463105632 640.284151748987,886.573538256533 640.706932654663,885.685613500027 641.129713562084,884.79768883613 641.552494471136,883.909764264798 641.975275381701,883.021839786044 642.398056293838,882.1339153999 642.820837207488,881.245991106305 643.243618122826,880.566192926955 643.948191689327,879.88639481776 644.652765196632,879.20659677872 645.357338645204,878.526798809835 646.061912034231,877.84700091109 646.766485364176,877.167203082543 647.471058635041,876.487405324122 648.175631846534,875.807607635899 648.880204999063,875.127810017802 649.584778092219,874.80302923327 650.519972737005,874.478248449086 651.455167287961,874.153467665295 652.39036174491,873.828686881825 653.325556108146,873.503906098762 654.260750377551,873.179125316034 655.195944553125,872.854344533713 656.131138634926,872.529563751727 657.066332622664,872.204782970148 658.001526516629,871.880002188933 658.936720316939,871.555221408096 659.871914023301,871.230440627638 660.807107635657,870.905659847573 661.742301154183,870.46562360604 662.603184774285,870.025587389318 663.464068308182,869.585551197393 664.32495175628,869.14551503025 665.185835118114,868.705478887918 666.046718393976,868.265442770382 666.907601583807,867.825406677657 667.768484687782,867.385370609743 668.629367705609,866.945334566626 669.490250637347,866.505298548305 670.351133483171,866.065262554839 671.212016243197,865.625226586155 672.072898916958,865.471577435295 672.960156851623,865.317928259945 673.847414712887,865.164279060074 674.73467250017,865.010629835655 675.62193021382,864.856980586759 676.509187853895,864.703331313314 677.396445419872,864.549682015393 678.283702912508,864.396032692966 679.170960331685,864.242383346005 680.05821767688,864.246721150746 680.972189726541,864.25105890556 681.886161713453,864.255396610475 682.800133638084,864.259734265492 683.714105499967,864.264071870581 684.628077299567,864.268409425786 685.542049036419,863.945280687491 686.477227671305,863.622151949341 687.412406212534,863.299023211308 688.347584659932,862.97589447342 689.282763013616,862.652765735678 690.217941273353,862.329636998111 691.153119439317,862.00650826066 692.088297511509,861.486791142554 692.760701994412,860.967074066444 693.433106422133,860.447357032361 694.105510795023,859.92764004026 694.777915112849,859.407923090155 695.45031937561,858.586496466829 695.969493045239,857.765069931789 696.48866669531,856.943643485036 697.007840325357,856.122217126554 697.527013935673,855.30079085636 698.04618752643,854.479364674466 698.565361097455,853.657938580815 699.084534648398,852.836512575479 699.603708180017,852.015086658401 700.122881691495,851.193660829638 700.642055183533,850.372235089148 701.161228655721,849.550809436943 701.680402108235,848.729383873011 702.199575540959,847.907958397365 702.718748953892,847.086533010021 703.237922347384,846.265107710948 703.757095720794,845.350590317263 704.046737603436,844.436073007964 704.336379511748,843.521555783023 704.626021445321,842.60703864244 704.915663404623,841.692521586228 705.205305389361,840.778004614403 705.494947400002,839.863487726936 705.784589435905,838.948970923826 706.074231497478,838.034454205103 706.363873584662,837.09236837861 706.48479454394,836.150282620787 706.605715555837,835.208196931664 706.726636620588,834.266111311168 706.847557737201,833.324025759342 706.968478906609,832.381940276187 707.089400128461,831.439854861688 707.210321402352,830.497769515874 707.331242729328,829.555684238687 707.452164108399,828.61359903017 707.573085540149,827.671513890251 707.694007024053,826.729428819046 707.814928560867,826.161632684612 707.245327234443,825.593836501241 706.675725946086,825.026040268873 706.106124695565,824.458243987596 705.536523482762,823.890447657381 704.966922308551,823.172985244149 705.603110921569,822.455522906312 706.239299489243,821.738060643882 706.87548801105,821.020598456846 707.511676487862,820.303136345217 708.147864919039,819.585674308968 708.784053304465,818.868212348127 709.420241644606,818.150750462708 710.056429939228,817.645130816847 710.870640847425,817.139511209141 711.684851675935,816.633891639605 712.499062425224,816.128272108253 713.313273095584,815.622652615057 714.127483686316,815.117033160059 714.941694197943,814.611413743231 715.755904630467,814.105794364572 716.57011498342,813.600175024112 717.38432525727,812.70838225745 717.631051559176,811.816589567301 717.877777890651,810.924796953623 718.124504251464,810.033004416429 718.37123064202,809.046249451931 718.326651688898,808.059494537985 718.28207281424,807.072739674637 718.237494018395,806.085984861871 718.192915300722,805.099230099702 718.148336661689,804.112475388101 718.103758101526,803.125720727068 718.059179619886,802.138966116603 718.014601216535,801.152211556706 717.970022891706,800.165457047391 717.925444645807,799.178702588644 717.880866478197,798.191948180436 717.836288389168,797.205193822811 717.791710378777,796.218439515724 717.747132446792,795.231685259219 717.702554593387,794.244931053239 717.65797681862,793.264475019139 717.858635956654,792.28401906896 718.059295141196,791.303563202659 718.25995437213,790.323107420321 718.460613649222,789.34265172189 718.661272972822,788.362196107366 718.861932342872,787.381740576777 719.062591759488,786.401285130094 719.263251222263,785.449611719887 719.277495620074,784.497938365021 719.291740085057,783.546265065495 719.305984616745,782.594591821267 719.320229214965,781.64291863238 719.334473880066,780.691245498805 719.348718611989,779.739572420527 719.362963410735,778.787899397605 719.377208276361,779.165733960966 720.203827875841,779.543568445355 721.030447471305,779.921402850799 721.857067062869,780.299237177242 722.683686649776,780.67707142471 723.510306233075,781.054905593206 724.336925812124,781.432739682728 725.16354538739,781.810573693263 725.990164958406,782.188407624824 726.816784525465,782.17860152098 727.81035769335,782.168795360514 728.803930785216,782.158989143485 729.797503801761,781.640306057438 730.429713952239,781.12162301327 731.061924054637,780.60294001094 731.694134108257,780.08425705049 732.326344113681,779.565574131891 732.958554070443,779.332569257705 733.795343916921,779.099564374992 734.632133691572,778.866559483737 735.468923394161,778.633554583968 736.305713025562,778.400549675658 737.142502584727,778.167544758806 737.97929207253,777.934539833441 738.816081488389,777.763916208976 739.682623631845,777.59329256443 740.549165703356,777.422668899744 741.415707702923,777.252045214933 742.282249630429,777.081421510054 743.148791486106,776.910797785036 744.015333269897,776.740174039951 744.881874981802,776.769821804221 745.763633985247,776.799469518868 746.645392933104,776.829117183908 747.527151825372,776.858764799312 748.408910661994,776.888412365064 749.290669443144,776.918059881194 750.172428168531,776.947707347688 751.054186838213,777.794017162756 751.106684647501,778.640327013039 751.159182515927,779.486636898597 751.211680443084,780.332946819413 751.264178429963,781.117087145874 751.762555726687,781.901227434792 752.26093309687,782.685367686208 752.759310541209,783.46950790011 753.257688058889,784.253648076468 753.756065650377,785.037788215297 754.254443315556,785.821928316611 754.75282105431,786.606068380381 755.251198866637,786.273687199544 756.152134714532,785.941306022723 757.0530704743,785.608924849919 757.954006145766,785.276543681146 758.854941728991,784.944162516389 759.755877223855,784.611781355678 760.656812630303,784.279400198968 761.557747948624,783.947019046333 762.458683178818,783.614637897685 763.359618320479,783.282256753111 764.260553374188,782.949875612539 765.161488339538,782.617494476028 766.062423216412,782.285113343547 766.963358005276,781.952732215141 767.864292705955,781.620351090751 768.765227318276,781.287969970406 769.666161842062,780.838350444581 770.431637613103,780.388730948223 771.197113314352,779.461261065779 771.233376736927,778.533791238922 771.269640220795,777.606321467698 771.305903765548,776.678851752062 771.342167371185,775.769929551476 771.614350776712,774.861007432526 771.886534209712,773.952085395256 772.158717670944,773.043163439637 772.430901159882,772.134241565655 772.703084676235,771.225319773337 772.975268220762,770.31639806267 773.247451792937,769.407476433655 773.519635392702,768.49855488629 773.791819020698,767.589633420561 774.064002676168,766.680712036483 774.336186359345,765.771790734056 774.608370070695,764.86286951325 774.880553809518,763.95394837411 775.152737576514,763.045027316592 775.424921371043,762.136106340724 775.697105193278,761.227185446493 775.969289043511,760.342007032974 775.967313363391,759.456828665236 775.965337742353,758.571650343292 775.963362181268,757.686472067129 775.961386679264,756.801293836732 775.959411236923,755.916115652173 775.957435854129,755.030937513351 775.955460530473,754.145759420324 775.953485266655,753.303512506362 775.442375588405,752.461265553618 774.931265994324,751.619018562065 774.420156484935,750.776771531717 773.909047059773,749.934524462587 773.397937719245,749.205166435291 774.013694196241,748.475808484916 774.629450632317,747.746450611463 775.245207027125,747.017092814931 775.860963380488,746.287735095335 776.476719693048,745.558377452646 777.092475964106,744.829019886907 777.708232194069,745.429249487584 778.424936778261,746.029479014192 779.141641401744,746.629708466688 779.858346064284,747.22993784507 780.575050765241,747.830167149354 781.291755505372,748.430396379539 782.008460284676,749.030625535583 782.725165102398,749.630854617557 783.44186995941,750.231083625375 784.158574855304,750.831312559108 784.875279790256,751.431541418729 785.591984763916,751.948437769432 786.435129531834,752.465334028137 787.278274317156,752.982230194801 788.121419120289,753.499126269424 788.964563941117,754.016022252021 789.807708779525,754.532918142548 790.650853635452,755.049813941063 791.493998508959,755.566709647523 792.337143400277,756.083605261942 793.18028830929,756.600500784334 794.023433235998,757.278840230705 794.740265437576,757.957179600358 795.457097692299,758.635518893221 796.173930000048,759.313858109308 796.890762360941,759.992197248619 797.60759477492,760.670536311169 798.3244272421,761.348875296928 799.041259762074,762.027214205926 799.7580923356,762.705553038148 800.474924962095,763.38389179355 801.1917576415,764.062230472206 801.908590373932,764.740569074056 802.6254231598,765.488916879753 803.230324774981,766.237264628318 803.835226458265,766.985612319724 804.440128209302,767.733959954014 805.045030028617,768.482307531158 805.649931915454,769.230655051157 806.254833870451,769.979002514025 806.859735893144,770.809629614479 807.038758132141,771.640256731087 807.21778043831,772.470883863862 807.396802812058,773.301511012818 807.575825252803,773.973777349034 808.275201236829,774.64604361185 808.9745772733,775.318309801267 809.67395336245,775.990575917298 810.373329503986,776.662841959915 811.072705697909,777.335107929146 811.772081944393,778.007373824978 812.471458243381,778.916009638153 812.823200262501,779.824645444169 813.174942372076,780.733281243098 813.526684572513,781.641917034896 813.878426863812,782.55055281955 814.230169245682,783.033769790709 814.930400164099,783.51698669554 815.630631103064,784.000203533986 816.330862062285,784.483420306045 817.031093041762,784.966637011777 817.731324041786,785.327158797489 818.655054328206,785.687680490228 819.578784599318,786.048202089951 820.502514854597,786.408723596644 821.426245094335,786.769245010335 822.349975318532,787.129766330996 823.27370552707,787.49028755867 824.197435720067,787.850808693314 825.121165897464,788.211329734928 826.044896059204,788.8408278508 826.666741176858,789.470325907925 827.28858634131,790.099823906305 827.910431552562,790.729321845909 828.532276810787,791.358819726767 829.154122115579,791.988317548865 829.775967467343,792.533206026652 830.548952445621,793.078094422919 831.321937450732,793.622982737652 832.094922482735,794.167870970865 832.867907541397,794.712759122558 833.640892627183,795.257647192688 834.413877739455,795.802535181312 835.186862878676,796.347423088373 835.959848044498,796.892310913914 836.732833237154,797.437198657892 837.505818456586,797.982086320364 838.278803703084,798.526973901258 839.051788976183,799.071861400633 839.824774276058,799.616748818444 840.597759602766,800.161636154706 841.370744956366,800.706523409419 842.1437303368,801.251410582568 842.916715743719,801.796297674169 843.689701177704,801.430972837363 844.602077989141,801.065648009928 845.514454708202,800.700323191923 846.426831335353,800.334998383303 847.339207870187,799.969673584084 848.251584312879,799.604348794237 849.16396066302,799.239024013805 850.076336921076,798.873699242788 850.988713086932,798.508374481185 851.901089160587,798.143049728984 852.813465142157,797.777724986183 853.725841031002,798.016250751956 854.597340569831,798.254776444854 855.468840079906,798.493302064875 856.340339561168,798.731827611977 857.211839013326,798.970353086203 858.083338436903,799.208878487567 858.954837831901,798.953551364495 859.892415550537,798.69822422984 860.829993178952,798.442897083572 861.767570717726,798.187569925736 862.705148166569,797.932242756302 863.642725525482,797.149319121716 863.266748846683,796.366395470206 862.890772238141,795.583471801801 862.514795700146,794.800548116487 862.138819232583,794.017624414279 861.762842835451,793.23470069519 861.386866508692,792.451776959177 861.010890252481,791.884026253756 861.806187912589,791.316275598583 862.601485496096,790.748524993658 863.396783002885,790.180774438995 864.192080432898,789.613023934566 864.987377786543,789.045273480398 865.782675063121,788.477523076508 866.577972263447,787.909772722865 867.373269386939,787.342022419485 868.168566433771,786.774272166367 868.963863404002,786.576235537024 869.876126786461,786.378198888429 870.788390087779,787.30372403076 871.046867625962,788.229249183234 871.305345252156,789.154774345865 871.563822966418,790.080299518668 871.82230076869,791.005824701657 872.080778659205,791.931349894774 872.339256637613,792.856875098107 872.597734704148,793.782400311597 872.856212859042,793.866021057605 873.712467302801,793.826633221397 874.577853148105,793.787245346379 875.443238932698,793.747857432565 876.308624656638,793.708469479941 877.174010319693,793.669081488493 878.039395922038,793.629693458264 878.904781463789,793.247731174153 879.811643392488,792.865768902804 880.718505229102,792.483806644261 881.625366973865,792.101844398465 882.532228626194,791.719882165475 883.43909018673,791.984500408798 884.247810401721,792.2491185853 885.056530597853,792.513736694964 885.865250775125,792.778354737762 886.673970932781,793.042972713694 887.482691071695,793.04447679616 888.426104983548,793.045980826035 889.369518828171,793.047484803348 890.312932605564,793.048988728027 891.256346315204,793.05049260013 892.199759957613,793.051996419657 893.14317353256,793.053500186579 894.086587040103,793.05500390091 895.030000480125,793.05650756268 895.973413852975,793.05801117183 896.916827158246,793.059514728404 897.86024039617,793.061018232387 898.803653566632,792.183518880847 898.848735700594,791.306019580486 898.893817888282,790.428520331334 898.93890012987,789.551021133375 898.983982424892,788.67352198661 899.029064773757,787.796022891038 899.07414717623,787.848627089945 900.019198780763,787.901231228883 900.964250322955,787.953835307897 901.909301803913,788.006439326986 902.85435322288,788.059043286165 903.799404580204,788.111647185375 904.744455875596,788.164251024646 905.689507109288,788.216854804021 906.634558281396,789.129638480066 906.637000008021,790.042422204831 906.639441798499,790.040556200969 907.559982790379,790.038690147514 908.480523717473,790.036824044466 909.401064580015,790.034957891839 910.321605377831,790.033091689576 911.242146111326,790.03122543775 912.162686780153,790.029359136315 913.083227384428,790.027492785288 914.00376792415,790.025626384653 914.924308399204,790.27907100947 915.885982363718,790.532515546613 916.847656291677,790.785959996094 917.809330182965,791.039404357885 918.771004037349,791.292848632031 919.732677855063,791.546292818486 920.694351636339,791.799736917252 921.656025380595,792.053180928342 922.617699088238,792.306624851743 923.57937275921,792.560068687468 924.541046393337,792.813512435518 925.502719990909,793.066956095863 926.464393551694,793.320399668533 927.42606707575,792.766403354573 928.068905879336,792.212407088475 928.711744632921,791.658410870266 929.354583336506,791.104414699934 929.997421990149,790.550418577506 930.640260593849,789.996422502954 931.283099147375,789.932142891601 932.200471340679,789.867863239939 933.117843463435,789.803583547982 934.035215515411,789.739303815688 934.952587497013,789.675024043114 935.869959407719,789.759706407043 936.813302232185,789.844388706915 937.756644999317,789.9290709427 938.699987708591,790.013753114385 939.64333035989,790.098435221997 940.586672953796,790.183117265507 941.530015489785,790.267799244961 942.473357968207,790.352481160327 943.416700389003,790.437163011593 944.360042751767,790.521844798801 945.303385057079,790.606526521893 946.2467273043,790.691208180899 947.19006949407,790.775889775832 948.133411625866,790.978541642195 949.089133881498,791.181193427765 950.044856093533,791.383845132543 951.000578261679,791.586496756543 951.956300386577,791.789148299751 952.912022467703,791.991799762167 953.867744505405,792.194451143776 954.823466499569,792.397102444593 955.779188450018,792.599753664632 956.734910356987,792.802404803893 957.690632220416,793.005055862319 958.646354040306,793.207706839967 959.602075816481,793.410357736808 960.557797549176,793.613008552842 961.513519238273,793.815659288084 962.469240883598,794.370227387088 963.140103280777,794.924795421073 963.810965710669,795.479363390055 964.481828173681,795.517216287379 965.397086993034,795.55506913022 966.312345752725,795.592921918564 967.227604453452,795.630774652425 968.142863093875,795.668627331805 969.058121674927,795.706479956702 969.973380196549,795.744332527131 970.888638658624,795.782185043034 971.803897060803,795.820037504483 972.719155403669,795.857889911451 973.634413687279,795.895742263921 974.549671910878,796.718371124458 975.093969262904,797.540999939229 975.638266696827,798.363628708219 976.182564212359,799.186257431415 976.726861809555,800.008886108859 977.271159488417,800.831514740508 977.81545724906,801.654143326377 978.359755091136,802.476771866481 978.904053014936,803.299400360818 979.448351020517,804.122028809361 979.99264910788,804.944657212123 980.536947276967,805.653451075967 981.236476587306,806.3622448651 981.936005957425,807.07103857951 982.635535386915,807.779832219167 983.335064875777,808.488625784128 984.034594423953,809.197419274322 984.734124031384,809.608088529698 985.53801648278,810.018757706668 986.341908936738,810.429426805262 987.145801393199,810.840095825421 987.949693852162,811.250764767217 988.753586313571,810.321110145029 988.413244147843,809.391455518722 988.072902076645,808.461800888283 987.732560099452,807.532146253725 987.392218216497,806.602491615035 987.051876427606,805.67283697224 986.711534733593,804.743182325299 986.371193133295,803.813527674225 986.030851627293,802.883873019033 985.690510215471,801.954218359708 985.350168898236,801.02456369625 985.009827675007,800.02811793967 984.945161246113,799.03167223146 984.880494900106,798.035226571636 984.81582863722,797.038780960182 984.751162456989,796.042335397098 984.686496359762,795.045889882371 984.62183034519,794.049444416043 984.557164413622,793.052998998057 984.492498565058,792.056553628441 984.427832799091,791.060108307182 984.363167116011,790.063663034278 984.298501515994,789.067217809745 984.233835998806,788.070772633539 984.16917056439,787.074327505703 984.104505212978,786.077882426209 984.03983994422,785.081437395056 983.975174758292,784.084992412259 983.910509655485,783.23066391419 983.659697882715,782.376335422683 983.408886185731,781.522006937812 983.158074564941,780.567525540202 983.404423903732,779.61304422839 983.650773279602,778.658563002406 983.897122692782,777.704081862234 984.143472142867,776.850635969939 983.825738510175,775.997190073234 983.508004957053,775.143744172135 983.190271483618,774.290298266656 982.872538089985,773.622239754637 983.431075471453,772.954181307345 983.989612819161,772.286122924779 984.548150133516,771.618064606912 985.106687413878,770.759309414978 985.210546451388,769.900554279331 985.314405533543,769.041799199986 985.418264660577,768.183044176942 985.522123832721,767.324289210213 985.625983049395,766.453007294796 985.939365451864,765.581725459822 986.252747872612,764.710443705248 986.566130311461,763.839162031116 986.879512768704,762.967880437427 987.192895244109,762.170041718156 986.757378537557,761.372202972227 986.321861905977,760.574364199638 985.886345349019,759.672133729167 985.705112317635,758.769903279652 985.523879364599,757.867672851193 985.342646490491,756.965442443703 985.16141369479,756.063212057226 984.980180978077,755.160981691733 984.798948339885,754.258751347239 984.61771578039,753.356521023758 984.436483299534,752.66871836003 983.918421207811,751.980915654043 983.400359173073,751.293112905856 982.882297196134,750.605310115454 982.364235276589,749.673578734582 982.565775261028,748.741847430909 982.767315286445,747.810116204433 982.968855352839,746.878385055155 983.170395460038,745.946653983061 983.371935608506,745.239731721609 982.832729247748,744.532809414362 982.293522947817,743.825887061394 981.754316708772,743.118964662615 981.215110530204,742.160395556319 981.074756456714,741.201826482327 980.934402467567,740.243257440641 980.794048562646,739.284688431275 980.653694742126,738.326119454214 980.513341005659,737.367550509443 980.372987353592,736.408981596993 980.232633785577,735.450412716862 980.092280301964,734.491843869007 979.951926902577,733.533275053458 979.811573587533,732.574706270199 979.671220356598,731.705540965311 979.805940468679,730.836375721512 979.94066062296,729.967210538816 980.075380819908,729.384889185458 979.429506518121,728.802567770224 978.783632254228,728.22024629316 978.137758028752,727.63792475425 977.491883841576,727.055603153523 976.846009692235,726.473281490951 976.200135581428,725.890959766533 975.554261508631,724.923447247347 975.598003556079,723.955934789439 975.641745669534,722.98842239278 975.685487849347,722.020910057385 975.729230095225,721.053397783224 975.772972406878,720.31410785373 975.338127389725,719.574817896268 974.903282437474,718.835527910836 974.468437550007,718.096237897451 974.033592727559,717.356947856111 973.598747970129,716.617657786788 973.1639032776,716.462002073691 972.282921219594,716.306346295649 971.401939120842,716.150690452632 970.520956980996,715.995034544612 969.639974799822,715.839378571633 968.758992577496,715.247739007405 968.039074645552,714.656099368483 967.319156750571,714.064459654881 966.599238892784,713.472819866598 965.879321072309,712.881180003606 965.159403288912,712.289540065933 964.439485542476,711.447981989419 963.964430633176,710.606423880366 963.489375807345,709.764865738805 963.014321065217,708.923307564706 962.539266406733,708.081749358054 962.064211831777,707.682045391179 961.374338496069,707.282341363796 960.684465168684,706.882637275907 959.994591849914,706.48293312754 959.304718538828,705.773141648722 958.929527435044,705.063350150638 958.554336389701,704.353558633331 958.179145403265,703.939351252106 957.462770461803,703.525143805688 956.746395528957,703.432272372127 955.796724142681,703.339400872792 954.847052698664,703.246529307638 953.897381197079,703.153657676725 952.947709637927,703.060785980007 951.998038021149,702.967914217501 951.048366346746,702.87504238922 950.0986946146,702.782170495135 949.149022825237,702.689298535275 948.199350978015,702.596426509626 947.249679073226,702.503554418203 946.300007110985,702.410682260976 945.350335090945,702.317810037988 944.400663013454,701.573216963268 943.928188554011,700.828623854468 943.455714160751,700.084030711572 942.98323983408,699.339437534611 942.510765573941,698.594844323568 942.038291380159,697.850251078416 941.565817252733,697.105657799213 941.093343191547,696.3610644859 940.62086919701,696.040326997332 939.992826149333,695.719589461063 939.36478310317,695.398851877064 938.736740058521,694.482503249208 938.348470220692,693.56615460763 937.9602004771,692.922372229936 937.280925878033,692.278589782989 936.601651326811,691.634807266804 935.922376823379,690.991024681382 935.243102367385,690.347242026706 934.563827959064,689.703459302822 933.884553598415,689.373730622989 933.056607737264,689.044001867878 932.228661864589,688.714273037462 931.400715979922,688.384544131739 930.572770083556,687.605303545846 930.005090904771,686.826062909386 929.437411799328,686.046822222372 928.869732767344,685.267581484848 928.30205380905,684.488340696771 927.734374924272,683.709099858141 927.166696112778,682.929858968972 926.599017374916,682.150618029278 926.031338710571,682.064543629065 925.1589792624,681.978469173293 924.286619765684,681.892394662005 923.414260220597,681.806320095115 922.541900627315,681.72024547265 921.669540984789,681.63417079467 920.797181294474,681.548096061102 919.924821555382,681.462021271975 919.052461768035,680.751971176083 918.415942492429,680.041921017328 917.779423277243,679.331870795679 917.142904122418,678.621820511136 916.506385028129,677.91177016373 915.869865994318,677.201719753473 915.233347021043,676.491669280324 914.596828108071,675.781618744324 913.960309255635,675.07156814546 913.323790463677,674.361517483703 912.687271732255,673.651466759111 912.050753061194,673.088979957713 911.336361441761,672.526493083948 910.621969854808,671.964006137729 909.907578299986,671.401519119143 909.193186777644,670.839032028132 908.478795287549,670.077762397646 908.254514290544,669.31649277221 908.030233354017,668.555223151809 907.805952477443,667.793953536486 907.58167166129,666.961489841895 907.951852778671,666.129026226627 908.322033902223,665.296562690739 908.692215031711,664.464099234188 909.062396167836,663.520809346213 909.054205503024,662.57751950917 909.046014906897,661.634229723029 909.037824379047,660.69093998782 909.029633919941,659.747650303485 909.021443529229,658.918031933266 908.653242451604,658.088413548991 908.285041451454,657.258795150672 907.916840529419,656.429176738297 907.548639684683,655.599558311878 907.180438918236,654.769939871388 906.812238229206,653.940321416856 906.444037617708,653.141681242123 905.851476928859,652.343041012296 905.258916317194,651.544400727362 904.666355782712,650.745760387319 904.073795325181,650.198546079177 903.244805881288,649.651331679459 902.415816461085,649.104117188166 901.586827064573,648.556902605269 900.757837691694,648.009687930826 899.928848342504,647.462473164778 899.099859016831,646.91525830717 898.270869714906,646.368043357987 897.441880436614,645.820828317228 896.612891181838,645.273613184909 895.783901950694,644.726397961014 894.95491274324,644.179182645559 894.125923559419,643.631967238573 893.296934399288,643.084751739982 892.467945262557,642.339547254684 892.043574678595,641.594342743323 891.619204160292,640.849138205915 891.194833707239,640.103933642429 890.770463319495,639.358729052867 890.346092997468,638.613524437242 889.921722740866,638.610946542045 889.037970670208,638.608368600821 888.154218540702,638.605790613597 887.270466351882,638.603212580318 886.386714104097,638.600634501039 885.502961797407,638.598056375733 884.619209431636,638.595478204385 883.735457007075,638.012034548214 882.968469369458,637.428590809621 882.20148176566,636.845146988635 881.434494195099,636.261703085227 880.66750665853,635.678259099412 879.900519155141,635.094815031189 879.133531685453,634.511370880558 878.366544249351,633.927926647506 877.599556846602,633.344482332061 876.832569477323,632.761037934222 876.065582141804,632.218077588492 876.872783327242,631.675117288411 877.679984434566,631.132157034022 878.487185463775,630.58919682524 879.294386414345,630.046236662121 880.101587286452,629.503276544652 880.908788080385,628.960316472861 881.715988796379,628.417356446735 882.523189433618,627.874396466257 883.330389992567,627.331436531444 884.137590473227,626.788476642309 884.944790875714,626.245516798837 885.751991199853,625.70255700103 886.559191445413,625.159597248916 887.366391613032,624.616637542465 888.173591702129,624.073677881708 888.980791713111,623.5307182666 889.787991645513,622.787802409948 889.425963892194,622.044886537042 889.063936202379,621.301970647924 888.701908576011,620.559054742567 888.33988101274,619.81613882097 887.977853513032,619.032119704527 888.375780620787,618.248100662124 888.773707726737,617.464081693717 889.171634830767,616.680062799351 889.569561933167,615.896043979024 889.967489033646,615.112025232724 890.365416132379,614.328006560434 890.763343229133,613.54398796217 891.161270323908,613.126794762458 890.311279002752,612.709601476876 889.461287681072,612.292408105423 888.611296359508,611.875214648069 887.761305037478,611.458021104874 886.911313715274,611.040827475808 886.06132239307,610.623633760872 885.211331070575,610.206439960049 884.361339747673,609.789246073386 883.511348425003,609.37205210088 882.661357101868,608.954858042489 881.811365778733,608.537663898256 880.96137445519,608.120469668167 880.111383131705,607.411394487382 880.52255033754,606.70231937035 880.93371753511,605.993244317055 881.344884723483,605.284169327511 881.756051903591,604.360557267792 881.97066882177,603.436945285328 882.185285778134,602.513333380048 882.399902772391,601.589721552009 882.614519804891,600.666109801183 882.829136875458,599.74249812754 883.043753984093,598.818886531109 883.258371130796,597.895275011906 883.472988315625,596.971663569901 883.687605538638,596.048052205108 883.902222799778,595.124440917498 884.116840098868,594.200829707086 884.331457435968,593.277218573887 884.546074811369,592.353607517885 884.760692224838,591.429996539096 884.975309676491,590.506385637491 885.18992716592,589.607102087306 885.234134097584,588.707818590265 885.278341085708,587.808535146338 885.322548130527,586.90925175554 885.366755231807,586.175097492567 885.113724881085,585.440943229129 884.860694587929,584.706788965195 884.607664352807,583.710577398 884.656561469077,582.714365895954 884.705458654789,581.718154459071 884.754355910234,580.721943087367 884.803253234713,579.725731780825 884.852150628867,578.729520539433 884.901048092346,577.73330936319 884.949945625383,576.73709825211 884.998843227862,575.740887206193 885.047740899841,574.744676225397 885.096638641087,573.89955653355 885.407236358791,573.054436917562 885.717834093142,572.209317377448 886.028431843268,571.364197913237 886.339029610332,570.519078524871 886.649627392879,569.673959212378 886.960225192131,568.828839975758 887.270823007508,568.126763005566 887.883636835555,567.424686107537 888.496450622159,566.722609281627 889.109264367435,566.020532527895 889.722078071616,565.318455846311 890.334891734528,564.616379236904 890.947705356288,563.914302699617 891.560518936487,563.212226234522 892.173332475591,562.510149841561 892.786145973485,561.808073520777 893.398959429818,561.105997272141 894.011772844999,560.191403814417 894.390008201066,559.276810449664 894.768243569473,558.362217177826 895.146478949813,557.44762399896 895.524714342959,556.533030913022 895.902949748095,555.618437920028 896.281185165572,554.703845019976 896.659420595563,553.789252212853 897.037656037603,552.874659498688 897.415891492274,551.960066877466 897.794126958819,551.045474349172 898.172362437996,550.130881913807 898.55059792957,549.21628957137 898.928833433485,548.301697321891 899.307068949274,547.38710516534 899.685304477578,546.472513101719 900.063540018396,545.55792113104 900.441775571613,544.643329253289 900.820011137053,543.840849491709 901.408180755621,543.038369819187 901.996350342117,542.235890235708 902.584519896191,541.433410741258 903.172689417726,540.630931335836 903.760858907073,539.828452019472 904.349028363999,539.025972792137 904.937197788619,538.223493653844 905.5253671807,537.42101460461 906.113536540652,536.618535644389 906.701705868123,535.816056773227 907.289875163289,535.013577991107 907.878044426034,534.211099298016 908.466213656357,533.408620693997 909.054382854665,532.606142179022 909.642552020494,531.803663753075 910.230721153843,531.001185416171 910.818890254945,530.19870716834 911.407059323858,529.396229009537 911.995228360116,528.593750939777 912.583397364127,527.79127295909 913.171566336008,526.988795067431 913.759735275409,526.18631726483 914.347904182563,525.383839551287 914.936073057237,524.787650365543 915.618151030503,524.191461235197 916.300228948123,523.595272160237 916.982306809979,522.999083140661 917.664384616073,522.40289417647 918.346462366637,521.806705267678 919.02854006167,521.210516414256 919.710617700592,520.614327616277 920.392695284041,520.018138873624 921.074772811728,519.421950186399 921.756850283942,518.657463878495 922.400836297194,517.892977655254 923.044822266034,517.128491516705 923.688808190404,516.364005462834 924.332794070244,515.59951949367 924.976779905846,514.835033609183 925.620765696978,514.070547809373 926.264751443523,513.306062094271 926.908737146005,512.541576463846 927.552722804016,512.039784293374 928.395599745272,511.537992160462 929.23847660271,511.036200065151 930.081353375921,510.534408007443 930.924230065197,510.032615987337 931.767106670188,509.530824004818 932.609983191418,509.029032059902 933.452859628247,508.527240152587 934.295735981315,508.025448282875 935.138612250099,507.52365645078 935.981488434772,507.021864656315 936.824364535511,506.520072899453 937.667240552313,506.018281180179 938.510116484831,505.51648949855 939.352992333646,505.014697854524 940.195868097886,504.512906248128 941.03874377819,504.01111467935 941.881619374617,503.509323148217 942.724494886934,502.914555066309 943.493211016292,502.319787040164 944.26192707452,501.725019069723 945.030643061735,501.130251155002 945.799358977645,500.535483296029 946.568074822426,499.940715492776 947.336790595728,499.345947745242 948.105506297899,498.751180053441 948.874221928767,498.156412417375 949.642937488854,497.561644837057 950.411652977346,496.966877312458 951.180368394649,496.372109843607 951.949083740881,495.565630964513 952.432666940847,494.759152168946 952.916250127135,493.952673456908 953.399833299743,493.146194828427 953.883416458557,492.324787433186 953.850809669122,491.503380073045 953.818202934228,490.681972748003 953.785596253583,489.921206218409 954.371584892331,489.160439770305 954.95757349726,488.399673403677 955.543562068196,487.638907118569 956.129550605139,486.878140914923 956.71553910838,486.467121331996 957.615912955138,486.05610176803 958.516286710161,485.645082223098 959.416660373739,485.234062697142 960.317033945001,484.82304319019 961.217407424701,484.412023702214 962.117780812434,484.001004233287 963.018154108606,483.589984783321 963.918527312577,483.178965352374 964.818900424871,482.767945940432 965.719273445429,482.356926547509 966.61964637402,481.945907173591 967.520019210933,481.534887818707 968.420391955937,481.123868482813 969.32076460903,480.712849165939 970.221137170447,480.301829868098 971.121509639896,479.890810589292 972.021882017667,479.47979132949 972.922254303237,479.068772088722 973.822626497364,478.657752866973 974.722998599289,478.246733664288 975.623370609886,477.835714480636 976.523742528341,477.424695316004 977.424114355061,476.883928677067 978.229766914155,476.343162083722 979.035419394902,475.802395535968 979.84107179835,475.261629033805 980.646724123973,474.720862577247 981.45237637189,474.180096166281 982.25802854175,473.639329800892 983.063680633903,473.098563481108 983.869332648581,472.557797206959 984.674984585377,472.017030978386 985.480636444408,471.476264795449 986.286288225732,470.935498658102 987.091939929174,470.394732566361 987.897591554909,469.85396652027 988.703243102937,469.31320051974 989.508894572966,468.772434564875 990.314545965462,468.231668655601 991.12019728031,467.690902791961 991.925848517159,466.757430289508 991.693106859224,465.823957801404 991.4603652886,464.890485327676 991.227623805637,463.957012868355 990.994882410159,463.023540423368 990.762141101877,462.090067992787 990.529399881314,461.156595576555 990.296658748179,460.223123174728 990.063917702297,459.289650787236 989.831176743901,458.356178414106 989.598435872933,457.422706055353 989.365695089567,456.489233710963 989.132954393397,455.555761380921 988.900213784771,454.622289065257 988.667473263573,453.688816763926 988.434732829861,452.755344476973 988.201992483344,451.821872204382 987.969252224546,450.88839994614 987.736512053176,449.954927702245 987.503771969001,449.021455472699 987.27103197237,448.087983257516 987.038292063109,447.154511056666 986.805552241451,446.221038870164 986.572812507104,445.287566698025 986.340072859894,444.354094540206 986.107333300344,443.403457586508 986.022482889472,442.452820672537 985.937632555782,441.502183798279 985.852782299917,440.55154696379 985.7679321217,439.600910169 985.683082021191,438.650273413979 985.598231998039,437.683084749937 985.700135566061,436.715896154565 985.802039193222,435.748707627863 985.903942879522,434.781519169817 986.005846624612,433.814330780413 986.107750428608,432.847142459694 986.209654291684,431.879954207601 986.311558213725,430.912766024179 986.413462194789,429.945577909399 986.515366234875,428.97838986326 986.617270333751,428.078923932844 986.971122026327,427.179458090555 987.324973733863,426.279992336349 987.678825456707,425.380526670255 988.032677194744,424.481061092258 988.38652894774,423.581595602373 988.740380715812,422.68213020057 989.094232499367,421.78266488688 989.448084297939,420.883199661272 989.801936111762,419.983734523776 990.155787940486,419.084269474362 990.509639784403,418.184804513046 990.863491643569,417.285339639813 991.217343517812,416.385874854706 991.57119540748,415.486410157668 991.92504731199,414.586945548697 992.278899231926,414.818192691586 993.151240615814,415.049439762777 994.023581969261,415.280686762242 994.895923292264,415.511933689981 995.768264584476,415.743180546007 996.640605846304,415.974427330293 997.512947077747,416.205674042882 998.38528827863,416.436920683744 999.257629449246,416.668167252865 1000.12997058925,416.899413750274 1001.00231169898,416.237125049942 1001.13171699666,415.574836387139 1001.26112231694,414.709548970131 1000.9376130426,413.844261547812 1000.61410384998,412.978974120182 1000.29059473868,412.113686687255 999.967085708748,411.248399249016 999.643576760544,410.383111805466 999.320067893888,409.517824356604 998.996559108666,408.652536902417 998.673050404701,407.787249442932 998.349541782402,406.882375780828 998.138170065999,405.977502134469 997.926798430621,405.072628503811 997.715426876443,404.167754888869 997.504055403348,403.262881289658 997.292684011336,402.358007706134 997.081312700408,401.453134138355 996.869941470679,400.548260586263 996.658570321917,399.643387049902 996.447199254355,398.786619208331 996.028346901294,397.929851344452 995.609494632168,397.073083458279 995.190642447385,396.216315549827 994.771790346596,395.359547619068 994.352938330034,394.502779666029 993.934086397348,393.646011690696 993.515234548948,392.789243693056 993.096382784424,391.932475673137 992.677531104069,391.075707630909 992.258679507766,390.218939566388 991.839827995631,389.362171479574 991.420976567431,388.505403370451 991.002125223516,387.648635239064 990.583273963595,386.791867085354 990.16442278761,385.935098909336 989.745571695908,385.07833071104 989.326720688201,384.221562490435 988.907869764487,383.319239902019 988.73085285211,382.416917334587 988.553836017905,381.514594788183 988.376819261583,380.612272262719 988.199802583607,379.709949758253 988.022785983398,378.8076272748 987.84576946171,377.916946922196 987.870544024277,377.026266618836 987.895318644645,376.13558636469 987.920093322988,375.244906159773 987.944868059072,374.354226004085 987.969642852957,373.463545897612 987.994417704525,372.572865840382 988.019192614011,371.682185832338 988.043967581121,370.805690186826 987.796745787724,369.9291945492 987.549524073198,369.052698919506 987.302302437427,368.176203297728 987.055080880935,367.29970768388 986.807859403139,366.423212077934 986.560638004041,365.546716479919 986.313416684046,364.690385397218 985.816855495796,363.834054277919 985.320294393401,362.977723122051 984.82373337727,362.121391929613 984.32717244752,361.265060700607 983.830611603858,360.408729435017 983.334050846461,359.552398132859 982.837490175385,358.901877735319 982.1800562524,358.251357272151 981.522622377961,357.600836743382 980.865188552591,356.950316148999 980.20775477594,356.299795488987 979.550321047893,355.649274763389 978.892887368798,354.998753972162 978.235453738424,354.34823311535 977.578020156827,354.369148322075 976.609291994653,354.390063477666 975.640563758614,354.410978582091 974.671835449059,354.43189363541 973.703107065521,354.452808637565 972.734378608584,354.473723588555 971.765650077781,354.49463848841 970.796921473229,354.515553337129 969.828192795161,354.536468134713 968.859464043344,354.557382881132 967.890735217719,354.578297576401 966.92200631852,354.599212220535 965.953277345747,354.620126813519 964.984548298991,354.641041355353 964.015819178778,354.661955846037 963.047089984524,354.682870285586 962.078360716871,354.703784673984 961.109631375642,354.724699011218 960.140901960607,354.745613297317 959.172172471881,354.766527532265 958.203442909347,354.787441716064 957.234713273472,354.808355848727 956.265983563615,354.829269930211 955.2972537803,354.85018396056 954.328523923177,354.871097939773 953.359793992306,354.892011867822 952.391063987976,354.912925744735 951.422333910014,355.649954642708 950.795528902207,356.386983619625 950.168723852374,357.124012675486 949.541918760631,357.861041810276 948.915113626746,358.598071023982 948.288308451127,359.335100316646 947.661503233365,360.072129688211 947.034697973402,360.809159138735 946.407892671879,361.546188668188 945.781087328214,362.283218276556 945.154281942232,363.020247963854 944.527476514457,363.757277730081 943.90067104483,364.494307575238 943.273865532828,365.23133749931 942.64705997915,365.968367502312 942.020254383388,366.705397584228 941.393448745366,367.442427745074 940.766643065668,368.179457984821 940.139837343595,368.916488303497 939.513031579729,369.653518701118 938.886225773953,370.390549177624 938.259419926035,371.12757973306 937.632614035974,371.997135504513 937.222060195345,372.866691364252 936.811506357975,373.736247312219 936.400952523923,374.605803348459 935.990398693364,375.475359472955 935.579844866123,376.34491568571 935.169291042432,377.214471986721 934.758737221593,378.08402837599 934.348183404421,377.707021220049 933.51173637918,377.330013983912 932.675289348117,376.95300666758 931.838842311001,376.575999271066 931.002395268413,376.198991794372 930.165948219772,376.130682313102 929.188241663098,376.062372766653 928.210535041988,375.994063154998 927.232828356384,375.92575347815 926.255121606169,375.857443736095 925.277414791519,375.789133928876 924.299707912258,375.720824056451 923.322000968328,375.206492914775 922.569388606295,374.692161696832 921.816776266089,374.177830402608 921.064163947944,373.663499032104 920.311551651452,373.149167585332 919.558939376846,372.634836062294 918.806327124301,372.12050446299 918.053714893293,372.230606380952 917.08030776825,372.34070826105 916.106900559796,372.450810103343 915.133493268164,372.560911907785 914.160085892654,372.671013674379 913.186678433965,372.781115403093 912.213270891632,372.891217094017 911.239863266237,373.001318747076 910.266455556906,373.111420362286 909.293047764571,373.221521939646 908.31963988865,373.331623479142 907.346231929201,373.441724980818 906.372823886573,373.551826444629 905.399415760301,373.661927870591 904.426007550559,373.772029258704 903.452599257696,373.882130608967 902.479190881364,374.645995963889 901.984556637472,375.409861395805 901.489922375884,376.173726904657 900.995288096252,376.937592490503 900.500653798401,377.701458153315 900.006019482913,378.465323893106 899.511385149322,377.565297180176 899.140319005644,376.665270455458 898.769252951723,375.765243718954 898.398186987324,374.85139608875 898.516195637349,373.937548522459 898.634204337141,373.023701020036 898.752213086816,372.227622443446 898.520510713162,371.431543872386 898.288808404934,370.635465306899 898.057106161956,370.073494432057 897.376797403907,369.511523490684 896.696488678921,368.949552482751 896.016179986997,368.59759232786 895.080429213936,368.245632079474 894.144678422133,367.89367173762 893.208927611064,367.541711302285 892.273176781135,367.189750773468 891.337425932463,366.83779015117 890.401675064815,366.48582943542 889.465924178308,366.133868626173 888.530173272593,365.781907723474 887.594422348076,365.429946727309 886.658671404584,365.077985637647 885.722920442175,364.726024454561 884.787169460673,364.610527424287 883.880154836341,364.495030331294 882.97314016259,364.379533175597 882.066125439538,364.264035957211 881.159110667242,364.148538676076 880.252095845761,364.033041332252 879.345080974977,363.917543925738 878.438066054834,363.802046456491 877.531051085389,363.686548924539 876.624036066583,363.571051329884 875.717020998767,363.372268072533 874.775576245273,363.173484737796 873.834131449519,362.9747013257 872.892686611041,362.775917836247 871.95124173013,362.577134269406 871.009796806495,362.378350625208 870.068351840368,362.179566903651 869.126906831341,361.980783104722 868.185461780406,361.781999228435 867.244016686222,361.583215274804 866.302571549895,361.384431243801 865.361126370728,361.185647135426 864.419681149244,360.986862949707 863.478235884919,360.788078686615 862.53679057816,360.58929434618 861.595345228969,360.390509928402 860.653899837052,360.191725433266 859.712454402819,359.992940860786 858.771008925745,359.794156210948 857.829563406354,359.595371483752 856.888117844239,359.246343708626 856.171937150881,358.897315872979 855.455756456475,358.54828797681 854.739575761429,358.199260020119 854.023395065742,357.612324235728 853.289328204701,357.025388374794 852.555261378991,356.438452437273 851.821194588381,355.851516423209 851.08712783287,355.264580332601 850.353061112459,354.677644165451 849.618994426914,354.090707921758 848.884927776875,353.503771601492 848.15086116147,352.916835204698 847.416794581339,352.329898731361 846.682728036365,351.742962181495 845.948661526432,352.45179521192 845.331918323471,353.160628315643 844.715175079182,353.869461492679 844.098431793391,354.578294743042 843.481688466272,355.287128066717 842.864945098001,355.995961463705 842.248201688461,356.70479493399 841.631458237476,357.413628477589 841.014714745106,358.219473371748 840.582699120569,359.025318345448 840.150683490792,359.831163398645 839.718667855952,360.637008531368 839.286652215931,361.442853743603 838.854636570439,362.248699035379 838.422620919882,363.054544406637 837.990605263971,363.860389857437 837.55858960317,364.666235387762 837.126573936723,365.331920691257 836.583735270775,365.99760605811 836.040896573919,366.663291488294 835.498057846795,367.328976981822 834.955219089112,367.99466253868 834.412380300637,368.264872183092 833.459667692659,368.535081818234 832.506954991724,368.805291444063 831.554242197773,369.075501060623 830.601529310923,369.345710667883 829.648816330882,369.615920265875 828.696103257826,370.584928478405 828.681139490916,371.55393674747 828.666175793274,372.522945073011 828.651212165132,373.49195345513 828.636248606432,374.46096189371 828.621285117115,375.429970388839 828.606321697182,376.398978940488 828.591358346865,377.367987548685 828.576395065873,378.336996213387 828.56143185409,379.306004934639 828.546468712098,380.275013712395 828.531505639548,381.244022546714 828.516542636091,382.213031437583 828.501579702366,383.182040384956 828.48661683785,384.151049388864 828.471654042776,385.120058449349 828.456691317027,386.089067566369 828.441728660837,387.058076739937 828.42676607403,388.027085970054 828.411803556839,387.907897999088 827.434858827561,387.788709956018 826.457914040308,387.669521840871 825.480969195429,387.550333653649 824.504024292866,387.431145394337 823.527079332329,387.311957062964 822.550134314399,387.192768659545 821.573189238727,387.073580184006 820.596244105196,386.954391636405 819.619298913982,386.835203016744 818.642353665142,386.716014325008 817.665408358618,386.596825561181 816.688462994294,386.477636725307 815.71151757217,386.358447817343 814.734572092537,386.239258837319 813.757626555103,386.120069785218 812.780680959753,386.000880661057 811.803735307127,385.881691464834 810.826789596467,385.762502196536 809.849843828473,385.643312856177 808.872898002504,385.418041669283 807.983306316368,385.19277040918 807.093714597519,384.96749907585 806.204122845724,384.742227669325 805.314531061391,384.51695618956 804.424939243647,384.291684636599 803.535347393481,384.066413010412 802.645755510486,383.84114131103 801.756163594371,383.392994879759 800.958198746725,382.944848369138 800.16023390746,382.496701779179 799.362269076752,382.04855510981 798.564304253901,381.600408361119 797.766339439899,381.152261533061 796.968374634627,380.704114625667 796.17040983733,380.255967638906 795.372445048648,379.807820572794 794.574480268348,379.777715032629 793.629025595903,379.747609436454 792.683570859022,378.821166196896 792.381324909395,377.894722959376 792.079079050338,376.968279723878 791.776833281736,376.041836490389 791.47458760353,375.115393258922 791.17234201578,374.188950029478 790.870096518192,373.262506802042 790.567851111293,373.250844855953 789.618686674978,373.23918285605 788.669522171549,373.227520802335 787.720357601531,373.215858694835 786.771192964225,373.204196533523 785.822028260562,373.192534318412 784.872863489902,373.180872049488 783.923698652128,373.169209726781 782.974533747649,373.157547350231 782.025368776405,373.145884919912 781.076203738339,373.134222435794 780.127038633334,373.122559897864 779.177873461565,373.110897306105 778.228708222741,373.099234660578 777.279542917386,373.087571961223 776.3303775448,372.206134699227 775.880630458123,371.324697410542 775.430883460911,370.443260095126 774.981136552873,369.561822753021 774.531389734242,368.680385384228 774.08164300496,367.798947988733 773.631896364968,366.91751056652 773.182149814442,366.036073117619 772.732403353031,365.154635642015 772.282656980853,364.273198139708 771.832910697965,363.391760610699 771.383164504718,362.510323055001 770.933418400469,361.628885472586 770.483672385744,360.747447863483 770.033926460485,359.866010227648 769.584180624224,358.984572565154 769.134434877487,358.174145599391 769.240759221138,357.363718683977 769.34708360373,356.553291818927 769.453408025089,355.742865004242 769.55973248498,354.932438239921 769.666056984162,354.105777101518 769.247760760132,353.27911594024 768.829464614624,352.452454756058 768.41116854758,351.625793548999 767.992872558709,350.799132319051 767.574576648476,349.972471066241 767.156280816591,349.191800337678 766.595987198583,348.411129560089 766.035693653102,347.630458733445 765.475400181022,346.849787857733 764.915106781351,346.069116933024 764.354813454906,345.288445959261 763.794520201511,344.507774936428 763.234227020817,343.72710386457 762.673933913,342.946432743673 762.113640878059,342.165761573735 761.553347916226,341.385090354757 760.993055027328,340.604419086725 760.432762210956,339.823747769682 759.872469467809,339.04307640357 759.312176797306,338.262404988447 758.751884199912,337.48173352427 758.19159167516,336.701062011052 757.631299223634,335.920390448824 757.07100684481,335.139718837556 756.510714538919,334.359047177233 755.950422305672,333.5783754679 755.390130145533,332.797703709541 754.829838058329,332.017031902127 754.269546044059,331.142772103791 753.845162414189,330.268512283132 753.420778871572,329.39425244015 752.996395415685,328.519992574846 752.572012047167,327.645732687219 752.14762876532,326.771472777284 751.723245570669,325.897212845026 751.298862463213,325.022952890446 750.874479442427,324.148692913572 750.450096508837,323.274432914361 750.025713662209,322.400172892798 749.60133090266,321.525912848927 749.176948229957,320.651652782748 748.752565644274,319.777392694246 748.328183145728,318.903132583408 747.903800733853,318.028872450261 747.479418409406,317.154612294762 747.055036171339,316.280352116955 746.630654020759,315.406091916826 746.206271957199,314.531831694374 745.781889980251,313.657571449628 745.35750809079,312.783311182502 744.933126287709,311.909050893082 744.508744571998,311.034790581325 744.084362943191,310.160530247245 743.65998140123,309.286269890828 743.235599946289,308.412009512089 742.811218578136,307.537749111027 742.386837297352,306.663488687627 741.962456103473,306.449966372995 741.293037170428,306.236444013528 740.623618223588,306.02292160927 739.954199262953,305.387473591531 739.499976065359,304.752025541617 739.045752916078,303.845071095493 738.706967710517,302.938116643752 738.368182593549,302.031162186482 738.029397565755,301.124207723609 737.690612626495,300.217253255236 737.351827776874,299.310298781245 737.013043015788,298.403344301696 736.674258343584,297.496389816573 736.335473760264,296.589435325877 735.996689265943,295.682480829622 735.657904860331,294.775526327765 735.319120543892,293.868571820363 734.980336316163,292.961617307374 734.641552177723,292.054662788796 734.302768127702,291.093480138647 734.188638700056,290.132297524469 734.074509354075,289.17111494625 733.960380089353,288.209932404017 733.846250906179,287.248749897728 733.732121804438,286.287567427411 733.617992784071,285.596626306113 732.919916371524,284.9056851114 732.22184001375,284.214743843288 731.523763710866,283.523802501732 730.825687463104,282.83286108679 730.127611270174,282.141919598434 729.429535131785,281.450978036664 728.731459048635,280.760036401494 728.033383020258,280.069094692924 727.335307046771,279.378152910955 726.637231128057,278.687211055585 725.939155264175,277.861466737158 726.095763877034,277.035722476154 726.252372524468,276.209978272571 726.408981206594,275.38423412641 726.565589923761,274.767615741919 725.892352411116,274.150997290548 725.219114940672,273.534378772281 724.545877512777,272.917760187105 723.872640127083,272.301141535092 723.199402783997,271.684522816155 722.526165483112,271.067904030351 721.852928224485,270.451285177653 721.17969100835,269.834666258117 720.506453834474,269.218047271672 719.833216702798,268.431291977598 719.268982421374,267.644536633845 718.704748213757,266.857781240411 718.140514079947,266.071025797282 717.576280019945,265.284270304473 717.012046033982,264.497514761984 716.447812121536,263.710759169815 715.883578283305,262.924003527951 715.31934451859,262.137247836421 714.755110827973,261.350492095182 714.190877210989,260.563736304292 713.626643668278,259.857408245633 713.388287003967,259.151080187046 713.149930392741,258.444752128518 712.911573834252,257.793743895512 712.247912019258,257.142735596339 711.58425025316,256.491727230998 710.920588535257,255.840718799504 710.256926865783,254.981787457 710.101777437842,254.122856135524 709.946628079342,253.263924835002 709.791478789644,252.404993555494 709.636329569446,251.546062296999 709.481180418283,250.687131059458 709.32603133627,250.060856562457 708.590333459026,249.490224279463 707.793674195826,248.919591910046 706.997014961671,248.348959454263 706.200355756737,247.778326912055 705.403696580557,247.207694283483 704.607037433772,246.637061568515 703.810378315742,246.066428767168 703.013719226932,245.495795879426 702.217060167051,244.925162905289 701.4204011361,244.354529844815 700.623742134543,243.783896697918 699.827083161741,243.21326346467 699.030424217868,242.642630145056 698.233765303041,242.071996739061 697.43710641755,241.501363246687 696.640447561047,240.930729667962 695.843788733298,240.360096002856 695.047129934712,239.789462251429 694.250471165287,239.378415482526 693.393030347535,238.967368627884 692.535589527804,238.556321687487 691.678148705745,238.14527466135 690.820707881823,237.734227549445 689.963267055573,237.323180351799 689.105826227227,236.912133068414 688.248385396844,236.501085699259 687.390944564249,236.09003824438 686.533503729443,235.67899070376 685.676062892831,235.267943077415 684.818622053834,234.621452033854 684.076591988618,233.974960910302 683.334561968397,233.328469706816 682.592531993694,232.681978423323 681.850502063986,232.035487059926 681.10847217968,231.388995616508 680.36644234031,230.742504093156 679.624412546284,230.096012489856 678.882382797543,229.449520806578 678.140353094088,228.803029043353 677.398323435686,228.156537200193 676.656293822511,227.510045277057 675.914264254505,226.863553273986 675.172234731785,226.217061190953 674.43020525435,225.570569028001 673.688175822026,224.924076785072 672.946146434639,224.277584462223 672.204117092944,223.631092059441 671.462087796128,222.98459957671 670.720058544714,222.338107014046 669.978029338352,221.691614371433 669.236000176985,221.045121648916 668.493971061136,220.398628846451 667.75194199034,219.752135964067 667.009912964888,219.105643001763 666.267883984372,218.459149959512 665.525855049083,217.812656837355 664.78382615908,217.16616363528 664.041797314538,216.519670353286 663.299768514815,215.873176991357 662.557739760319,215.226683549525 661.815711051109,214.580190027787 661.073682386894,213.895808779838 660.483955692383,213.211427478032 659.894229053229,212.527046122341 659.304502469662,211.842664712764 658.714775941684,211.158283249315 658.125049469061,210.473901731995 657.535323051794,209.789520160819 656.945596690348,209.105138535771 656.355870384315,208.500877521976 655.572955310694,207.896616422673 654.790040273103,207.292355237849 654.007125271193,206.688093967503 653.224210305023,206.08383261165 652.441295374534,205.479571170275 651.658380480018,204.875309643423 650.875465620949,204.271048031034 650.092550797854,203.666786333168 649.309636010206,203.062524549765 648.526721258415,202.458262680899 647.743806542247,201.854000726511 646.960891861934,201.249738686631 646.177977217129,200.645476561258 645.395062608237,200.041214350407 644.612148035085,199.436952054049 643.829233497614,198.832689672228 643.046318995825,198.228427204886 642.263404529775,197.624164652094 641.480490099639,197.01990201381 640.697575704893,196.415639290048 639.914661346062,195.811376480793 639.131747022911,195.20711358609 638.348832735559,194.602850605894 637.56591848383,193.998587540249 636.78300426784,193.394324389112 636.000090087473,192.790061152526 635.217175942904,192.185797830476 634.434261833958,191.581534422963 633.651347761042,190.977270929987 632.868433723459,190.373007351547 632.085519721615,189.768743687659 631.302605755627,189.164479938321 630.519691825262,188.964308160314 629.688157769444,188.764136319849 628.856623684056,188.563964416884 628.025089568517,188.363792451448 627.193555423117,188.163620423555 626.36202124774,188.913377326331 625.707877968787,189.663134310671 625.053734643559,190.412891376502 624.399591271766,191.162648523867 623.745447854046,191.912405752781 623.091304389993,192.662163063185 622.437160879723,193.411920455139 621.783017323061,194.161677928598 621.128873720299,194.911435483576 620.47473007103,195.66119312006 619.820586375601,196.410950838079 619.16644263413,197.160708637603 618.512298845919,197.910466518661 617.858155011898,198.660224481209 617.204011131311,199.409982525278 616.549867204449,200.159740650866 615.895723231661,200.90949885796 615.241579212307,201.659257146559 614.587435146677,202.409015516663 613.933291034657,203.158773968273 613.279146876652,203.908532501402 612.625002672023,204.658291116037 611.97085842141,205.408049812148 611.316714124288,206.157808589793 610.662569781009,206.907567448899 610.008425391279,207.657326389512 609.354280955042,208.407085411658 608.700136472995,209.156844515281 608.045991944615,209.906603700394 607.39184736961,210.656362966998 606.737702748447,211.406122315107 606.083558081067,212.155881744708 605.429413367237,212.905641255784 604.775268606842,213.655400848365 604.121123800578,214.405160522438 603.466978947865,215.154920278001 602.812834048818,215.904680115025 602.158689103555,216.654440033555 601.504544111784,217.404200033561 600.850399073854,218.153960115043 600.196253989358,218.903720278016 599.542108858703,219.653480522495 598.887963681831,220.403240848391 598.233818458277,221.153001255807 597.579673188331,221.902761744699 596.925527872692,222.652522315067 596.271382510255,223.42047227046 596.80475929752,224.188422181818 597.338136154751,224.956372049157 597.871513082064,225.724321872447 598.404890079575,226.492271651703 598.938267146877,227.260221386954 599.471644284669,228.028171078142 600.005021492252,228.79612072531 600.538398770208,229.689276775767 600.944889411679,230.58243280802 601.351380142383,231.475588822082 601.757870962436,232.368744817941 602.164361872245,233.261900795609 602.57085287082,234.155056755044 602.977343959035,235.048212696289 603.383835136599,235.941368619344 603.790326403687,236.834524524194 604.196817759774,237.727680410855 604.6033092055,238.620836279297 605.009800740518,239.513992129563 605.416292364942,240.407147961625 605.822784078773,241.300303775468 606.229275881953,242.193459571135 606.635767774365,243.086615348599 607.042259756243,243.979771107886 607.448751827469,244.872926848926 607.855243988219,245.766082571819 608.261736238259,246.659238276523 608.668228577881,246.925790229521 607.724366679555,247.192342173177 606.780504690716,247.458894107462 605.836642611539,247.725446032375 604.892780441383,247.991997947916 603.948918180889,248.258549854087 603.005055829417,248.5251017509 602.061193387548,249.365130859398 602.515256975079,250.205159939287 602.969320643926,251.045188990582 603.423384394671,251.885218013296 603.877448226558,252.725247007373 604.331512140168,253.565275972869 604.78557613556,254.405304909757 605.239640211745,255.245333818049 605.693704369711,256.085362697733 606.147768609459,256.925391548823 606.601832930639,257.821020112766 606.525267484947,258.716648732938 606.448702091584,259.61227740928 606.372136749967,260.507906141793 606.295571460272,261.403534930534 606.219006222673,262.299163775475 606.142441037111,263.19479267663 606.065875903587,264.090421633955 605.989310821868,265.007917242459 605.760692877928,265.925412928002 605.532074969437,266.842908690611 605.303457095812,267.760404530272 605.074839257344,268.677900447001 604.846221454325,269.595396440782 604.617603686347,270.51289251163 604.388985953643,271.430388659559 604.160368256329,272.347884884512 603.93175059394,273.265381186546 603.703132966883,274.182877565661 603.474515374808,274.38643624424 604.437178569613,274.589994842303 605.399841720413,274.793553359836 606.362504826917,274.997111796853 607.325167889881,275.200670153354 608.287830908666,275.404228429339 609.250493883155,275.161588144663 610.187135985121,274.918947846993 611.123777999135,274.676307536341 612.060419925721,274.433667212681 612.997061764123,274.19102687604 613.933703515213,273.948386526405 614.870345178118,273.705746163789 615.806986753363,273.463105788178 616.743628240889,273.220465399601 617.680269640463,272.977824998045 618.616910952493,272.735184583493 619.553552176687,272.492544155961 620.490193312871,272.249903715448 621.426834361511,272.00726326197 622.363475322258,271.764622795512 623.300116195227,272.580844766839 623.67672507948,273.397066722115 624.053334038705,274.213288661369 624.429943072784,275.029510584558 624.806552181544,275.845732491725 625.183161365509,276.76697205643 625.32198090083,277.688211649715 625.460800513625,278.609451271535 625.599620203371,279.530690921965 625.738439970242,280.451930600961 625.877259814413,281.373170308536 626.016079735709,282.263364472616 626.440094872436,283.153558615231 626.864110098744,284.043752736354 627.288125414925,284.933946835998 627.71214082092,285.824140914163 628.136156316148,286.714334970835 628.560171901423,287.604529006014 628.984187575988,288.494723019729 629.408203340485,289.452148167533 629.653364343103,290.409573329423 629.89852543734,291.366998505386 630.14368662308,292.32442369542 630.388847900322,293.28184889954 630.634009269299,294.239274117732 630.879170729779,295.196699350025 631.124332281819,296.154124596404 631.369493925478,297.111549856869 631.61465566064,298.06897513142 631.859817487246,299.026400420044 632.104979405529,299.983825722797 632.350141415431,300.941251039621 632.595303516835,301.898676370547 632.840465709916,302.856101715573 633.0856279945,303.813527074686 633.330790370586,304.7709524479 633.575952838233,305.728377835228 633.821115397615,306.685803236658 634.066278048384,307.643228652189 634.311440790887,308.600654081834 634.556603624835,309.558079525581 634.801766550692,310.515504983414 635.046929567819,311.472930455391 635.292092676624,312.430355941484 635.537255877221,313.387781441663 635.782419169031,314.319175811645 635.90043064364,315.250570214339 636.018442195258,316.181964649804 636.13645382371,316.684465705985 635.279518425057,317.186966799185 634.422582940082,317.689467929376 633.565647369134,318.191969096588 632.708711712388,318.69447030079 631.851775969437,319.196971542013 630.994840140804,319.699472820241 630.137904225732,320.20197413546 629.280968224863,320.704475487684 628.424032138078,321.206976876871 627.567095965031,321.709478303077 626.710159706126,322.050631158694 625.902588333527,322.391784024847 625.095016889041,322.732936901491 624.287445372145,323.074089788686 623.479873783188,323.415242686388 622.672302122111,323.756395594595 621.864730388857,323.870117631523 620.911590230186,323.983839633016 619.958449991886,324.097561599105 619.005309673201,324.211283529759 618.052169275004,324.325005425009 617.099028796656,325.216917119338 617.495520698081,326.108828797354 617.892012688098,327.000740458985 618.288504767232,327.892652104303 618.684996934957,328.784563733279 619.081489192031,329.676475345899 619.477981537639,330.568386942177 619.87447397213,331.46038302446 620.002098601486,332.352379134667 620.129723302613,333.244375272756 620.257348075684,334.192831904555 619.963756709534,335.14128862528 619.670165372721,336.089745434918 619.376574064838,337.038202333453 619.082982786,337.727385332051 618.550415218109,338.416568396948 618.017847622279,339.105751528157 617.485279998742,339.885877733512 617.294951779768,340.666003994353 617.104623587104,341.446130310607 616.914295420516,342.22625668229 616.723967279482,343.006383109416 616.533639164409,343.952993602652 616.505441605637,344.89960415168 616.477244111127,345.846214756486 616.449046680878,346.792825417084 616.420849315124,347.739436133459 616.392652013397,348.606346924236 616.677584532066,349.473257716643 616.962517129956,350.340168510622 617.247449806659,351.207079306201 617.532382562466,352.073990103367 617.817315397377,352.940900902147 618.102248311276,353.710380770397 617.718443387246,354.479860708801 617.33463846246,355.24934071739 616.950833537034,356.018820796162 616.567028611025,356.788300945118 616.183223684318,357.557781164214 615.799418756738,358.327261453494 615.415613828576,358.947559200387 615.800766510016,359.003992350044 616.729234648286,359.060425442105 617.657702727942,359.116858476613 618.586170748866,359.173291453539 619.514638711116,359.229724372897 620.443106615043,359.286157234674 621.371574460238,359.342590038897 622.300042246934,359.399022785525 623.228509975015,359.866581869035 623.65007996856,360.334140925246 624.071649988065,361.127951515416 623.957526951446,361.921762154932 623.843403950857,362.487408511515 623.132813419856,363.053054917909 622.422222828667,363.618701374086 621.711632177001,364.184347880058 621.001041464857,364.749994435842 620.290450692177,365.315641041409 619.579859859077,366.064970607054 619.316940502438,366.814300230821 619.054021159827,367.563629912751 618.791101831652,368.162745586931 619.161114255781,368.761861240593 619.531126722286,369.360976873722 619.901139231108,369.438677462647 620.773586854222,369.516377997643 621.646034428442,369.594078478738 622.518481953535,369.671778905933 623.390929430025,369.749479279213 624.263376857038,369.827179598607 625.135824235331,369.904879864058 626.00827156473,370.395443504298 626.62703394721,370.886007090608 627.245796354197,371.376570622975 627.864558785688,372.32996316535 627.999660618952,373.283355739884 628.134762534173,374.236748346579 628.2698645317,375.190140985433 628.404966610542,376.143533656461 628.540068771865,377.096926359663 628.675171014911,378.050319095026 628.810273339855,379.003711862577 628.945375747047,379.957104662302 629.080478236079,380.910497494217 629.215580807067,381.863890358291 629.350683459896,382.817283254568 629.48578619468,383.77067618302 629.620889011538,384.72406914366 629.755991910177,385.677462136489 629.891094891238,386.635533775319 629.783158134553,387.593605482194 629.675221434038,388.551677257157 629.567284790101,389.509749100151 629.459348202217,390.467821011189 629.35141167033,391.425892990315 629.243475194904,391.686025111077 628.28618271189,391.946157220198 627.328890136443,392.206289317619 626.371597468096,392.466421403369 625.414304706908,392.72655347742 624.457011853112,392.986685539814 623.499718906358,393.246817590509 622.54242586717,393.506949629547 621.585132735083,393.767081656872 620.627839510504,394.027213672511 619.67054619285,394.287345676479 618.713252782589,394.547477668748 617.755959279835,394.807609649302 616.798665684066,395.067741618186 615.84137199563,395.327873575385 614.884078214644,395.588005520854 613.926784340932,395.848137454654 612.969490374438,396.108269376724 612.012196314987,396.368401287138 611.054902163218,396.628533185794 610.097607918316,396.88866507278 609.140313581098,397.148796948051 608.183019151038,397.408928811594 607.225724628195,397.669060663422 606.268430012511,397.92919250355 605.311135304393,398.189324331979 604.353840503609,398.449456148679 603.396545609925,398.709587953679 602.439250623691,398.969719746921 601.481955544732,399.229851528464 600.52466037299,399.489983298277 599.567365108524,399.750115056362 598.610069751507,400.010246802733 597.652774301707,400.27037853736 596.69547875924,400.047557527927 595.783223562641,399.824736442562 594.87096833071,399.601915281281 593.958713063679,399.379094044081 593.046457761433,399.156272730979 592.134202423738,398.933451341931 591.221947050653,398.710629876994 590.309691642411,398.48780833614 589.397436198953,398.264986719398 588.485180720105,398.042165026694 587.572925205983,397.819343258132 586.660669656645,397.596521413638 585.748414072092,397.373699493226 584.836158452148,396.492249923496 584.526562331303,395.61080035218 584.216966293752,394.729350779322 583.907370338682,393.847901204877 583.597774466558,392.966451628876 583.288178677205,393.583218116357 582.511944268132,394.199984662948 581.735709787114,394.81675126862 580.959475233569,395.433517933416 580.183240608196,396.050284657307 579.407005910529,396.667051440279 578.630771140568,397.283818282362 577.854536298255,397.900585183539 577.078301384114,398.517352143797 576.302066397853,399.134119163151 575.525831339182,399.7508862416 574.749596208392,400.3676533791 573.973361005541,400.77495679578 573.097689778602,401.182260231231 572.222018464992,401.589563685469 571.346347064886,401.996867158479 570.470675578341,402.404170650247 569.595004005125,402.811474160801 568.719332345761,403.218777690126 567.843660599727,403.626081238224 566.967988766963,404.03338480508 566.092316848226,404.440688390678 565.216644842527,404.392100992583 564.268710350967,404.343513535612 563.320775797474,404.294926019764 562.372841181932,404.246338445038 561.424906504224,404.197750811465 560.476971764816,404.149163119029 559.529036963242,404.100575367702 558.581102099619,404.051987557541 557.633167174179,404.003399688503 556.685232186574,403.954811760617 555.737297137151,403.90622377384 554.78936202568,403.857635728215 553.841426852334,403.809047623727 552.893491616996,403.760459460362 551.945556319668,403.711871238149 550.99762096029,403.663282957074 550.049685538979,403.614694617121 549.101750055852,404.356259364096 548.498626488727,405.097824189012 547.895502883708,405.839389091867 547.292379240855,406.58095407272 546.68925556005,407.322519131514 546.08613184141,408.064084268248 545.483008085052,408.805649482951 544.879884290567,409.547214775594 544.276760458364,410.288780146206 543.673636588268,411.030345594743 543.070512680046,411.77191112125 542.467388734221,412.513476725711 541.864264750388,413.255042408113 541.261140728719,413.996608168469 540.658016669331,414.738174006736 540.054892571352,415.479739922986 539.451768436236,416.221305917192 538.848644263169,417.057104563035 539.215285687475,417.892903195607 539.581927189836,418.728701814878 539.948568769963,419.564500420849 540.315210427972,420.400299013534 540.68185216398,421.236097592933 541.048493977985,422.071896159046 541.415135869756,422.907694711874 541.781777839409,423.228360812529 540.867075546354,423.549026914654 539.952373163949,423.869693018249 539.037670692604,424.190359123328 538.122968132142,424.511025229847 537.208265482681,424.831691337837 536.293562743813,425.152357447296 535.378859916003,425.47302355821 534.464156999253,425.793689670594 533.549453993037,426.114355784419 532.63475089788,426.435021899684 531.720047713607,426.755688016448 530.805344440218,427.411159233176 530.358849121316,428.066630507194 529.912353785709,428.722101838488 529.465858433628,429.091940225553 528.54482795595,429.461778622426 527.623797385371,429.831617029165 526.702766722068,430.201455445742 525.781735965982,430.571293872141 524.860705116531,430.941132308377 523.939674174297,431.31097075445 523.018643138988,431.68080921036 522.097612011305,432.050647676078 521.176580790197,432.420486151619 520.255549476191,432.790324636997 519.33451806946,433.160163132183 518.413486569712,433.53000163722 517.49245497724,433.899840152037 516.571423291869,434.269678676676 515.650391513365,434.639517211122 514.729359641904,435.009355755392 513.808327677718,435.379194309469 512.887295620691,435.749032873355 511.966263470473,436.118871447034 511.045231227472,435.3731820057 510.794746933854,434.627492565007 510.544262699026,433.881803124896 510.29377852258,433.13611368541 510.043294404983,433.521947328409 509.123509419151,433.907780984227 508.203724339663,434.293614652794 507.283939166926,434.679448334136 506.364153900533,435.065282028241 505.444368540484,435.451115735137 504.524583087768,435.836949454766 503.604797540582,436.667126913249 503.170060389675,437.497304454897 502.73532323417,438.327482079694 502.300586074125,439.15765978767 501.865848909831,439.987837578781 501.431111741229,440.703191204331 500.770677302207,441.418544905129 500.110242813826,442.133898681146 499.449808276433,442.849252532396 498.789373689797,443.56460645888 498.128939053859,444.279960460597 497.468504368851,444.995314537548 496.808069634717,445.710668689731 496.147634851455,446.426022917134 495.487200018659,445.921029913719 494.629288645636,445.416036817449 493.771377286874,444.911043628279 492.913465942489,444.406050346253 492.055554612074,443.901056971328 491.197643296386,443.396063503547 490.339731994551,442.891069942896 489.481820707209,442.386076289346 488.623909433838,441.881082542925 487.76599817496,441.376088703662 486.908086930169,440.87109477153 486.050175699638,440.366100746542 485.192264483485,439.861106628668 484.334353281418,439.356112417954 483.47644209367,438.617544277848 483.726866653713,437.87897619346 483.977291228133,437.140408164836 484.22771581728,436.401840191931 484.478140421212,435.578049774587 484.368846410885,434.754259382404 484.259552460979,433.930469015424 484.150258571375,433.882950539904 483.153778965294,433.835431999789 482.157299290469,433.787913395077 481.160819546669,433.740394725741 480.164339734125,433.692875991852 479.167859853129,433.645357193353 478.171379903331,433.597838330257 477.1748998845,433.55031940258 476.178419797099,433.502800410322 475.181939641363,433.455281353439 474.185459416243,433.407762231989 473.188979122671,433.360243045943 472.192498760473,433.312723795301 471.196018329589,433.265204480078 470.199537829845,433.396002998095 469.28723307763,433.526801486703 468.374928250501,433.657599945858 467.462623348518,433.788398375604 466.550318371679,433.919196775867 465.638013319927,433.005904911988 465.532503450173,432.092613081419 465.426993653353,431.179321284173 465.321483929176,430.266029520266 465.215974277817,429.352737789668 465.110464699566,428.439446092394 465.004955194017,427.526154428444 464.899445761461,427.802853633766 464.101661915774,428.07955283967 463.303878002509,428.75777524634 462.713613779633,429.435997719454 462.123349518515,430.114220258984 461.533085219329,430.792442864942 460.942820881959,431.470665537345 460.352556506521,432.148888276191 459.76229209319,432.571705703813 459.05494375655,432.994523157584 458.34759536112,433.417340637461 457.640246906842,433.840158143459 456.932898394007,434.262975675607 456.225549821975,434.232888796469 455.267028611852,434.202801859748 454.308507336478,434.172714865432 453.349985995563,434.142627813533 452.391464589338,434.112540704038 451.432943117863,434.082453536947 450.474421580962,434.052366312273 449.515899978636,434.022279030018 448.557378310768,433.992191690166 447.598856577883,433.962104292732 446.640334779571,434.175894874876 445.846219784464,434.389685448492 445.052104725852,434.603476013566 444.257989603735,434.817266570142 443.463874418172,435.031057118147 442.669759169105,434.983021616543 441.703135774704,434.934986053893 440.736512315925,434.886950430198 439.769888792711,434.838914745458 438.803265205177,434.790878999658 437.836641553324,434.742843192813 436.870017837035,434.694807324922 435.903394056251,434.646771396001 434.936770211323,434.598735406034 433.970146302134,434.550699355008 433.00352232845,434.502663242922 432.036898290447,434.454627069805 431.07027418795,434.406590835642 430.10365002125,434.358554540435 429.137025790347,434.310518184182 428.170401495125,434.262481766869 427.203777135233,434.214445288526 426.237152711197,434.166408749152 425.270528222667,434.118372148703 424.303903669934,434.070335487224 423.337279052939,434.022298764714 422.370654371567,433.974261981144 421.404029625817,433.926225136529 420.437404815806,433.878188230883 419.470779941184,433.830151264192 418.504155002884,433.782114236441 417.537529999856,433.734077147659 416.570904932509,433.880440728477 415.706150942831,434.026804286055 414.84139688412,434.173167820409 413.97664275649,434.319531331537 413.111888559884,434.465894819426 412.24713429407,434.612258284105 411.38237995957,434.758621725487 410.517625555862,435.127225331365 409.732351150713,435.49582895264 408.947076676122,435.864432589267 408.161802131915,436.233036241261 407.376527518383,436.601639908637 406.591252835002,436.970243591393 405.805978082295,437.338847289488 405.02070326003,437.900649070187 404.23253740184,438.4624508993 403.444371469319,439.024252776901 402.656205462525,439.586054702959 401.86803938169,440.14785667746 401.079873226467,440.70965870042 400.29170699697,441.271460771837 399.503540693317,441.211354426036 398.520883547026,441.15124801558 397.538226335484,441.091141540441 396.555569059215,441.031035000618 395.572911717696,440.970928396113 394.590254311217,440.910821726924 393.607596839662,440.850714993067 392.624939303263,440.790608194526 391.642281701847,440.730501331287 390.659624035179,440.67039440338 389.676966303552,440.610287410789 388.694308507023,440.550180353515 387.711650645535,440.490073231573 386.728992718738,440.429966044961 385.746334727097,440.614819305789 384.812456860556,440.799672543755 383.878578911419,440.984525758846 382.94470087986,441.16937895109 382.010822765238,441.354232120488 381.076944568427,441.53908526701 380.143066288903,441.723938390671 379.209187926492,441.908791491485 378.275309481542,442.09364456941 377.341430953937,442.278497624473 376.407552343851,442.463350656675 375.473673651053,442.648203666002 374.539794875658,442.833056652453 373.605916017666,443.017909616043 372.672037076729,443.202762556772 371.738158053427,443.387615474596 370.804278947588,443.572468369573 369.870399759151,443.757321241646 368.936520487594,443.942174090858 368.002641133848,444.127026917165 367.068761697272,444.146162690289 366.156386509072,444.165298417705 365.244011256436,444.184434099399 364.331635939598,444.203569735386 363.419260558905,444.22270532565 362.506885113835,444.241840870221 361.594509604562,443.472179309043 361.06199204945,442.702517704602 360.529474565061,441.932856056883 359.996957151219,441.163194365916 359.464439808158,440.393532631686 358.931922535587,440.11624889278 358.085026699642,439.838965081668 357.238130843441,439.561681198305 356.391234966519,439.284397242693 355.544339068874,439.007113214859 354.697443150915,438.729829114789 353.850547212409,438.452544942513 353.003651253413,438.175260698001 352.156755273871,437.442794873059 351.611947484664,436.710329002468 351.06713975966,435.977863086213 350.522332098801,435.245397124323 349.977524502203,435.183743181493 349.012648870877,435.122089175959 348.04777317727,435.060435107705 347.082897421322,434.491040025096 346.438222440775,433.92164488243 345.7935474962,434.047013432108 344.891665155767,434.17238195239 343.989782743156,434.297750443206 343.087900257378,434.423118904597 342.186017699307,434.548487336564 341.284135068767,434.673855739093 340.382252365234,434.799224112168 339.480369589059,434.924592455834 338.578486740356,435.049960770062 337.676603819127,435.175329054866 336.77472082543,435.300697310202 335.872837758681,435.815340274406 335.01557922567,436.329983277144 334.158320606453,436.844626318401 333.301061901031,436.776213981022 332.317915079999,436.707801577781 331.334768195054,436.639389108677 330.351621246198,436.570976573683 329.368474233313,436.502563972826 328.3853271564,436.434151306094 327.40218001575,436.36573857347 326.419032811071,436.297325774998 325.435885542596,436.228912910636 324.452738210151,436.160499980426 323.469590813736,436.09208698431 322.486443353526,436.023673922333 321.503295829112,435.955260794493 320.520148241019,436.181459834799 319.59949027549,436.407658859913 318.678832226142,436.633857869878 317.758174093498,436.860056864636 316.837515877443,437.086255844202 315.916857577278,437.312454808591 314.996199194225,437.538653757772 314.075540727179,437.764852691776 313.154882176663,438.379238904716 312.875229515601,438.993625160641 312.595576856518,439.608011459568 312.315924200404,439.711370896592 311.412331230473,439.814730300743 310.508738189645,439.918089672035 309.605145077861,439.025121148487 309.167468075349,438.132152601844 308.72979116335,437.239184032151 308.292114342097,436.346215439364 307.85443761124,435.453246823454 307.416760970722,434.560278184494 306.979084421124,433.667309522454 306.541407961864,432.774340837306 306.103731592826,431.881372129108 305.666055314767,430.988403397801 305.228379127104,430.095434643401 304.790703029721,429.202465865921 304.353027023259,428.309497065362 303.91535110696,427.416528241694 303.477675281174,426.523559394976 303.03999954625,425.63059052515 302.602323901607,424.737621632215 302.164648347534,423.844652716216 301.726972883742,422.951683777123 301.289297510753,422.058714814935 300.851622228045,421.165745829683 300.413947035791,420.272776821323 299.976271934225,419.379807789854 299.538596922997,418.486838735291 299.100922002457,417.593869657663 298.663247172139,416.700900556942 298.225572432566,415.807931433126 297.787897783215,414.914962286217 297.35022322461,414.021993116199 296.912548756227,413.129023923102 296.47487437824,412.236054706897 296.037200090999,411.343085467626 295.599525894213,410.450116205247 295.16185178794,409.55714691976 294.724177771888,408.664177611194 294.28650384635,407.771208279533 293.84883001144,406.878238924779 293.411156267102,405.985269546916 292.97348261287,405.092300145974 292.535809049266,404.199330721909 292.098135576001,403.30636127475 291.660462193249,402.413391804512 291.222788900952,401.520422311194 290.785115698993,400.627452794739 290.347442587838,399.73448325519 289.909769566788,398.841513692547 289.472096636193,397.94854410681 289.034423796344,397.055574497965 288.596751046542,396.16260486604 288.159078387427,395.269635210978 287.721405818593,394.376665532836 287.283733340155,393.483695831601 286.846060952172,392.590726107243 286.408388654701,391.697756359805 285.970716447569,390.804786589259 285.533044330834,389.911816795604 285.095372304844,389.018846978841 284.657700368727,388.125877138984 284.220028523414,387.232907276019 283.782356768381,386.339937389959 283.344685103802,385.446967480777 282.907013529446,384.553997548515 282.469342045719,383.661027593116 282.031670652214,382.768057614609 281.593999349105,381.875087613022 281.156328136451,380.982117588326 280.718657014309,380.089147540508 280.28098598239,379.196177469596 279.843315041042,378.30320737556 279.405644189799,377.410237258446 278.967973429419,376.517267118179 278.530302758852,375.624296954848 278.092632179032,374.731326768393 277.654961689434,373.838356558816 277.21729129029,373.039772997741 276.72754574212,372.241189401451 276.237800268806,371.442605769989 275.748054870288,370.644022103326 275.258309547091,369.845438401477 274.768564298342,369.046854664426 274.278819124855,368.248270892174 273.789074026048,367.449687084751 273.299329002155,366.591234368636 272.971151544421,365.732781646991 272.6429741662,364.874328919846 272.314796867315,364.015876187186 271.986619647942,363.157423448996 271.658442508138,362.298970705306 271.330265447847,361.4405179561 271.002088466892,360.582065201364 270.673911565333,359.723612441114 270.34573474311,358.865159675348 270.017558000574,358.006706904052 269.689381337434,357.148254127242 269.361204753804,357.150539610462 268.582125393266,357.152825058831 267.803045987152,357.155110472348 267.023966535984,356.246258311876 266.766274706519,355.337406160499 266.508582960872,354.428554018217 266.250891298521,353.519701885045 265.993199720106,352.610849760953 265.735508225567,351.701997645941 265.477816814091,350.793145540039 265.220125486783,349.822467519421 265.218705198145,348.851789553111 265.217284980114,347.881111641109 265.215864832513,346.9104337834 265.21444475482,345.939755979998 265.213024747442,344.96907823089 265.211604810378,343.998400536089 265.210184943746,343.027722895567 265.208765147137,342.057045309353 265.207345421135,341.086367777432 265.205925765214,340.11569029979 265.204506179492,339.145012876441 265.203086664202,338.17433550737 265.201667219109,337.203658192579 265.20024784439,336.232980932065 265.198828539869,335.262303725831 265.197409305605,334.291626573875 265.195990141947,333.320949476198 265.19457104808,332.436543631644 264.989507242804,331.552137802937 264.784443513665,330.66773198999 264.57937986037,329.855684805574 264.178391182853,329.043637601484 263.777402579843,328.231590377749 263.37641405192,327.552805599276 262.730847979896,326.874020758129 262.085281962121,326.195235854291 261.439715997956,325.516450887808 260.794150088041,324.837665858649 260.148584231909,324.158880766816 259.503018429561,323.480095612307 258.857452681521,322.801310395138 258.211886986857,322.122525115308 257.566321346676,321.443739772832 256.920755760279,320.60138083894 256.966633481323,319.759021951686 257.012511251029,318.916663111071 257.058389068465,318.211856882132 256.61600321735,317.507050624219 256.173617424793,316.80224433729 255.731231690559,315.966719176053 255.509165512864,315.131194024696 255.28709940461,314.295668883206 255.065033366205,313.46014375161 254.842967397592,312.624618629867 254.620901498653,311.789093518018 254.398835669272,311.272120718102 253.649984425632,310.755147843651 252.901133205043,310.238174894621 252.152282007097,309.721201871056 251.403430832142,308.814939905817 251.13480577484,307.908677947635 250.866180801357,307.002415996511 250.597555911692,306.096154052444 250.328931106022,305.189892115406 250.060306384112,304.28363018544 249.791681746196,303.377368262503 249.523057191807,302.471106346624 249.254432721296,301.66819585707 248.773969447007,300.865285333988 248.293506247923,300.062374777437 247.81304312381,299.259464187373 247.332580075134,298.456553563854 246.852117101895,297.653642906836 246.371654204093,296.85073221632 245.891191381554,296.047821492306 245.410728634335,295.244910734822 244.930265962204,294.44199994384 244.449803365394,293.639089119373 243.969340844313,292.836178261394 243.488878398202,292.03326736996 243.008416027646,291.230356445041 242.527953732351,291.056278050994 241.624919720634,290.882199588275 240.721885668929,290.708121056872 239.818851577002,290.534042456755 238.915817444853,290.359963787938 238.012783272367,290.185885050436 237.109749059717,290.011806244249 236.206714807078,289.837727369319 235.303680513753,289.663648425761 234.400646180438,289.938243407945 233.520766852656,290.212838385734 232.640887445363,290.487433359114 231.761007958092,290.76202832807 230.88112839096,291.036623292632 230.001248743851,291.311218252769 229.121369016997,291.585813208483 228.241489210515,291.860408159773 227.361609323882,292.135003106669 226.481729357562,292.409598049126 225.601849311555,292.824090118156 224.716643557651,293.23858220641 223.831437716028,293.653074313886 222.946231786627,294.067566440572 222.061025769159,294.482058586495 221.175819664146,294.896550751626 220.290613471123,295.311042935966 219.40540719009,295.725535139514 218.520200821629,296.140027362271 217.634994365333,296.554519604222 216.749787820852,296.969011865396 215.864581188827,297.383504145764 214.97937446885,297.797996445341 214.094167661096,298.212488764111 213.208960765507,298.626981102076 212.323753782082,299.04147345922 211.43854671088,299.455965835587 210.553339551727,299.870458231118 209.668132304854,300.284950645859 208.782924970204,300.699443079764 207.897717547836,301.113935532849 207.012510037399,301.528428005142 206.127302439301,301.942920496585 205.24209475331,302.357413007208 204.356886979367,302.771905537025 203.471679117996,303.186398085993 202.586471168383,303.600890654139 201.701263131108,304.015383241451 200.81605500594,304.429875847942 199.930846793286,304.844368473583 199.045638492564,305.258861118375 198.16043010389,305.673353782346 197.275221627671,306.087846465482 196.390013063676,306.502339167739 195.504804411496,306.916831889175 194.619595671713,307.331324629762 193.734386844095,307.540362947329 192.864962805237,307.749401250752 191.995538692339,307.958439540045 191.126114505867,308.167477815165 190.256690245471,308.37651607614 189.387265911035,308.585554322955 188.517841502617,308.794592555598 187.648417020449,308.691528599971 186.868805817969,308.588464597909 186.089194580505,308.485400549413 185.309583307768,308.38233645451 184.529972000222,307.857067402787 183.714541547932,307.331798265033 182.899111116538,306.806529041191 182.083680705517,306.281259731302 181.268250314984,305.755990335354 180.452819945349,305.230720853375 179.637389596144,304.705451285365 178.821959267894,304.18018163128 178.006528959668,303.654911891164 177.191098672396,303.129642065003 176.37566840573,302.604372152811 175.560238159611,302.079102154574 174.744807933981,301.553832070305 173.929377729306,301.028561900021 173.113947544887,300.50329164369 172.298517381307,300.280407482598 171.357318162161,300.057523242096 170.416118904715,299.834638922184 169.474919609958,299.611754522848 168.533720277133,299.388870044102 167.592520906648,299.165985485946 166.65132149827,298.943100848381 165.710122052114,298.720216131391 164.768922568182,298.497331335006 163.827723046299,298.274446459211 162.886523486581,298.05156150402 161.945323889377,297.82867646942 161.004124254163,297.993028228215 160.040745606704,298.157379958473 159.077366874146,298.32173166018 158.113988056546,298.486083333351 157.150609153672,298.650434977957 156.187230165582,298.814786594041 155.2238510928,298.979138181545 154.260471934511,299.143489740527 153.297092691239,299.307841270915 152.333713362634,299.472192772795 151.370333949337,299.63654424611 150.406954450766,299.80089569086 149.443574867211,299.965247107059 148.480195198266,300.129598494706 147.516815444455,300.293949853774 146.553435605485,300.458301184306 145.590055681474,300.622652486272 144.626675672131,300.787003759688 143.663295578095,300.951355004509 142.699915398844,301.252104880914 141.753648462123,301.552854753027 140.807381432736,301.853604620846 139.86111431109,302.154354484359 138.914847096894,302.455104343579 137.968579790089,302.755854198462 137.022312390385,303.056604049081 136.076044898713,303.357353895364 135.129777314374,303.871000605126 134.286975007039,304.384647353247 133.444172616815,304.898294139755 132.601370143413,305.411940964623 131.758567586716,305.925587827878 130.915764947189,306.439234729492 130.072962224542,306.952881669495 129.230159418716,307.466528647841 128.387356529827,307.980175664561 127.544553557935,308.493822719611 126.701750502805,309.007469813034 125.858947364497,309.521116944816 125.016144143301,310.034764114956 124.173340838926,310.069389481287 123.244759620167,310.104014802651 122.316178333946,310.138640079007 121.387596980203,311.03315990977 121.825327329978,311.927679717686 122.263057770091,312.822199502727 122.700788300484,313.716719264936 123.138518921274,314.611239004284 123.576249632286,315.50575872077 124.013980433811,316.400278414396 124.451711325615,317.29479808519 124.889442307642,318.189317733122 125.327173380181,319.083837358208 125.764904542884,319.978356960448 126.202635796159,320.872876539812 126.640367139596,321.767396096344 127.078098573431,322.661915630015 127.515830097487,323.556435140825 127.953561712115,324.450954628817 128.391293416964,325.345474093949 128.829025212384,326.239993536234 129.266757098027,327.134512955658 129.704489073949,328.029032352235 130.142221140442,328.923551725966 130.579953297274,329.818071076865 131.01768554427,330.712590404888 131.45541788172,331.607109710094 131.893150309741,332.501628992424 132.330882827984,333.396148251937 132.768615436507,334.290667488589 133.20634813566,335.185186702394 133.644080925151,336.079705893368 134.08181380498,336.97422506148 134.519546775147,337.868744206775 134.957279835828,338.763263329194 135.395012986904,339.657782428782 135.832746228203,340.552301505522 136.270479560073,341.446820559431 136.708212982106,342.341339590479 137.145946494769,343.235858598724 137.583680097945,344.130377584079 138.021413791343,345.024896546631 138.459147575079,345.919415486322 138.896881449386,346.828235728943 139.199791211984,347.737055973281 139.502701061021,348.645876219249 139.805610995973,349.554696466876 140.108521017595,350.46351671619 140.411431125365,351.372336967193 140.714341319399,352.281157219855 141.017251599755,353.189977474191 141.320161966316,354.098797730199 141.623072419316,355.007617987867 141.925982958346,355.916438247237 142.22889358399,356.825258508281 142.531804295722,357.734078770998 142.834715093835,358.642899035403 143.137625978386,359.551719301482 143.440536948852,360.460539569249 143.743448005989,361.42661440502 143.885914624669,362.392689273227 144.028381326585,363.358764173885 144.170848112728,364.324839107008 144.313314982108,365.290914072568 144.455781935249,366.256989070607 144.598248972092,367.223064101083 144.740716092056,368.189139164038 144.883183296304,369.15521425943 145.025650584023,370.121289387287 145.168117955094,371.087364547639 145.310585409752,372.009593337076 145.55534190964,372.931822138824 145.800098494045,373.854050952898 146.044855163316,374.776279779282 146.289611917513,375.698508617992 146.534368756111,376.620737469042 146.779125679634,377.542966332388 147.02388268779,378.465195208089 147.268639781047,379.387424096116 147.513396958821,380.309652996439 147.758154221228,381.231881909116 148.002911568794,382.154110834133 148.247669000993,383.076339771462 148.492426517885,383.998568721159 148.737184119644,384.920797683168 148.981941806152,385.843026657516 149.226699577412,386.765255644204 149.471457433596,387.687484643233 149.716215374472,388.609713654601 149.960973400041,389.53194267831 150.205731510418,390.454171714373 150.450489705661,391.419208973064 150.441461683426,392.384246287053 150.432433729235,393.349283656295 150.42340584303,394.314321080805 150.414378025103,395.279358560612 150.405350275047,396.244396095673 150.39632259286,397.209433686003 150.387294978893,398.174471331629 150.378267432912,399.139509032524 150.369239955093,400.104546788716 150.36021254526,401.069584600191 150.351185203413,402.034622466948 150.342157929728,402.999660389018 150.33313072403,403.964698366341 150.324103586434,404.929736399004 150.315076516708,405.894774486937 150.306049515086,406.85981263018 150.297022581624,407.824850828722 150.287995716149,408.789889082545 150.278968918778,409.754927391696 150.26994218945,410.719965756143 150.260915527935,411.685004175917 150.251888934581,412.650042650988 150.242862409446,413.615081181371 150.233835952124,414.452532077135 150.571654500905,415.289982965012 150.909473126056,416.127433844988 151.247291827574,416.964884717061 151.585110605287,417.802335581277 151.92292945995,418.639786437576 152.260748390283,419.477237285988 152.598567397334,420.314688126527 152.936386480811,421.15213895918 153.274205640773,421.915940981533 153.869336740288,422.679742949767 154.46446790942,423.443544863883 155.059599148575,424.207346723881 155.654730457347,425.11495788864 156.017284491274,426.022569044784 156.379838614725,426.93018019227 156.742392827466,427.837791331171 157.104947130196,428.745402461413 157.4675015221,429.653013583025 157.830056003761,430.560624696023 158.192610574886,431.468235800377 158.555165235477,432.375846896131 158.917719985882,433.283457983242 159.280274825636,434.191069061737 159.642829755088,435.098680131603 160.005384774122,436.006291192869 160.367939882504,436.913902245476 160.730495080526,437.821513289513 161.093050368363,438.729124324891 161.45560574549,439.636735351654 161.818161212432,440.544346369803 162.180716769013,441.451957379337 162.543272414885,442.359568380271 162.90582815063,443.26717937256 163.26838397549,444.174790356235 163.630939890223,445.082401331325 163.993495894654,445.9900122978 164.356051988667,446.897623255645 164.718608172028,447.805234204905 165.081164445495,448.712845145506 165.443720807962,449.620456077537 165.806277260242,450.528067000952 166.168833802163,451.435677915768 166.531390433724,452.343288821954 166.893947154807,453.250899719555 167.256503965589,454.24003526337 167.226983035449,455.229170868319 167.197462174343,456.218306534385 167.167941382329,457.207442261628 167.138420659467,458.196578049989 167.108900005813,459.185713899511 167.079379421251,460.174849810166 167.049858905724,461.163985781968 167.020338459406,462.153121814932 166.990818082239,463.142257909043 166.961297774396,464.131394064301 166.931777535472,465.120530280736 166.902257365698,466.109666558317 166.872737265076,467.011949456282 166.964728660299,467.914232388765 167.056720124732,468.816515355764 167.148711658607,469.71879835728 167.240703262098,470.621081393358 167.332694934914,471.523364463937 167.424686677172,472.425647569064 167.516678488813,473.279461398997 167.973495421,474.133275201326 168.430312436889,474.98708897602 168.88712953683,475.840902723081 169.343946720823,476.694716442522 169.800763988867,477.548530134329 170.257581340673,478.402343798531 170.71439877653,479.256157435084 171.171216296265,480.109971044032 171.628033900342,480.963784625332 172.084851588181,481.817598179026 172.541669360129,482.671411705087 172.998487215838,483.525225203528 173.455305155541,484.379038674349 173.912123179587,485.232852117537 174.368941287277,486.08666553309 174.825759479078,486.906668481883 175.359412027523,487.726671388256 175.893064655247,488.546674252211 176.42671736289,489.366677073805 176.960370150569,490.186679852937 177.494023017352,491.006682589694 178.027675964171,491.826685284046 178.561328990851,492.646687935965 179.094982096809,493.466690545509 179.628635282628,494.286693112634 180.162288548483,495.106695637354 180.695941893617,495.926698119656 181.229595318611,496.746700559539 181.763248823467,497.566702957018 182.296902407659,498.386705312107 182.830556071887,499.206707624762 183.364209815918,500.026709895013 183.897863639402,500.846712122846 184.431517542806,501.666714308289 184.965171525779,502.486716451283 185.498825588496,503.306718551888 186.032479730959,503.969136746557 186.684181360528,504.631554877924 187.335883041378,505.293972946034 187.987584773451,505.956390950814 188.639286556805,506.618808892323 189.290988391498,507.281226770545 189.942690277472,507.943644585481 190.594392214902,508.606062337101 191.246094203612,509.26848002545 191.897796243487,509.88446260929 192.680052151612,510.500445108046 193.462308098562,511.116427521672 194.244564084336,511.732409850214 195.026820108935,512.348392093627 195.809076172533,512.964374251926 196.591332274838,513.580356325096 197.373588416143,514.196338313166 198.155844596215,514.812320216093 198.938100815052,515.428302033906 199.720357072772,516.044283766576 200.502613369841,516.660265414146 201.28486970521,517.276246976558 202.067126079462,517.892228453842 202.849382492888,518.508209845997 203.63163894508,519.124191153009 204.413895436155,519.985574023565 204.920884721971,520.846956857524 205.427874095039,521.708339654826 205.934863554779,522.569722415486 206.441853101423,523.43110513952 206.948842735263,524.292487826897 207.455832455773,525.153870477661 207.962822263187,526.01525309174 208.469812157447,526.876635669221 208.976802139077,527.738018210075 209.483792207204,528.599400714258 209.990782362467,529.460783181814 210.497772604576,530.322165612743 211.004762933764,531.183548007029 211.51175334974,532.044930364675 212.018743852852,532.762614768915 212.634419231093,533.480299115428 213.250094671152,534.19798340417 213.865770172502,534.915667635185 214.481445735844,535.633351808458 215.097121360595,536.351035923974 215.712797047105,537.068719981748 216.328472795023,537.786403981765 216.944148604758,538.504087924026 217.559824476019,539.221771808559 218.175500408979,539.939455635322 218.79117640364,540.657139404328 219.40685245971,541.374823115577 220.02252857748,542.092506769099 220.638204757182,542.81019036482 221.253880998178,543.527873902814 221.869557301048,544.245557383038 222.485233665502,545.028434887456 223.017604446854,545.811312349106 223.549975301663,546.594189768017 224.082346229407,547.377067144189 224.61471722991,548.159944477593 225.14708830422,548.942821768258 225.679459451232,549.725699016155 226.211830671295,550.508576221313 226.744201964873,551.291453383688 227.276573330979,552.074330503325 227.808944770484,552.857207580222 228.341316283215,553.640084614322 228.873687868938,554.422961605713 229.406059527828,555.205838554335 229.938431259943,555.988715460175 230.470803064993,556.771592323275 231.003174943151,557.554469143623 231.535546894709,558.174054125222 232.312596742064,558.793639022377 233.089646628941,559.413223835116 233.866696555866,560.03280856341 234.643746522604,560.65239320726 235.420796529099,561.271977766679 236.197846575407,561.891562241639 236.974896661704,562.511146632169 237.751946787816,563.130730938254 238.528996953741,563.750315159879 239.306047159305,564.36989929706 240.083097404975,564.989483349767 240.8601476904,565.609067318044 241.637198015582,566.228651201847 242.414248380577,566.848235001205 243.191298785678,567.46781871609 243.968349230185,568.0874023465 244.745399714797,568.706985892466 245.522450239281,569.326569353943 246.299500803696,569.946152730961 247.07655140775,570.565736023505 247.85360205191,571.185319231561 248.630652735475,571.804902355158 249.407703459263,572.424485394266 250.184754222806,573.0440683489 250.961805025931,573.663651219045 251.738855869393,574.283234004703 252.515906752145,574.902816705871 253.292957675178,575.522399322566 254.070008638024,576.141981854744 254.847059640568,576.761564302462 255.624110683217,577.381146665648 256.401161765389,578.000728944346 257.178212887608,578.620311138555 257.955264049582,579.239893248247 258.732315251487,579.859475273435 259.509366493265,580.479057214136 260.286417774914,581.098639070318 261.063469096436,581.718220841984 261.84052045783,582.337802529131 262.617571858864,582.957384131776 263.394623300061,583.576965649889 264.171674781013,584.196547083513 264.948726301722,584.624126272436 265.754384732107,585.051705382866 266.560043167963,585.479284414745 267.365701609291,585.906863368116 268.171360055974,586.334442242965 268.977018508594,586.762021039292 269.782676966279,587.019491514817 270.616015503649,587.276961921743 271.449354019016,587.534432259999 272.282692512847,587.7919025296 273.116030984791,588.049372730573 273.949369435257,588.306842862905 274.782707863837,588.313501138808 275.704880815814,588.320159364084 276.627053705219,588.326817538793 277.549226531934,588.333475662905 278.471399296133,588.340133736419 279.393571997702,588.346791759366 280.315744636639,588.353449731745 281.237917213002,588.360107653512 282.160089726909,588.366765524683 283.082262177719,588.3734233453 284.004434566363,588.380081115305 284.926606892201,588.386738834713 285.848779155407,588.270635772147 286.777335392951,588.154532676053 287.705891554418,588.038429546446 288.634447640041,587.922326383326 289.563003649993,587.806223186693 290.491559583927,587.690119956547 291.420115442248,587.574016692888 292.348671224667,587.457913395716 293.277226931124,587.341810065016 294.205782561796,587.225706700832 295.134338116739,587.109603303135 296.062893595779,587.127855956976 297.041512115451,587.146108552231 298.02013056603,587.164361088915 298.998748946993,587.182613567027 299.977367259271,587.200865986524 300.955985501641,587.219118347464 301.934603675327,587.237370649818 302.913221779454,587.915136016978 303.599168708897,588.592901314187 304.285115692066,589.270666541444 304.971062728437,589.948431698722 305.6570098183,590.626196786063 306.342956961831,591.303961803453 307.028904158971,591.981726750877 307.71485140908,592.659491628336 308.400798713032,593.337256435843 309.086746070592,594.015021173385 309.772693481296,594.692785840962 310.458640945668,595.370550438573 311.144588463474,595.638268263676 312.038770732994,595.905986010563 312.932952975912,596.173703679233 313.827135192871,596.441421269657 314.72131738317,596.70913878188 315.61549954745,596.976856215857 316.509681685362,597.244573571632 317.403863796964,597.512290849147 318.298045882082,597.780008048445 319.192227941239,598.047725169497 320.086409973912,598.315442212319 320.980591980275,598.583159176909 321.874773960328,598.850876063269 322.768955914304,599.118592871382 323.663137841679,599.48438699136 324.57768569747,599.850181020403 325.492233540164,600.215974958483 326.406781369238,600.581768805583 327.321329185041,600.947562561749 328.235876987746,601.31335622695 329.150424777064,601.679149801173 330.064972553111,602.044943284403 330.979520315654,602.410736676713 331.894068065274,602.776529978029 332.808615801157,602.750330823023 333.758799776318,602.724131619019 334.708983681398,602.697932365976 335.659167515929,602.671733063951 336.609351280378,602.645533712915 337.559534974571,602.619334312854 338.509718598798,602.593134863797 339.459902152768,602.566935365714 340.410085636249,602.540735818635 341.360269049706,602.514536222559 342.31045239279,602.488336577444 343.260635665501,602.462136883332 344.210818868363,602.435937140224 345.161002000677,602.409737348076 346.111185062909,602.383537506961 347.061368054943,602.357337616821 348.011550976662,602.331137677684 348.961733828066,602.304937689521 349.911916609446,602.278737652363 350.862099320395,602.252537566193 351.812281961145,602.110293409787 352.753955853172,601.968049222734 353.695629664464,601.825805005035 354.63730339543,601.683560756719 355.578977046534,601.541316477742 356.520650616905,601.399072168133 357.462324107066,601.256827827878 358.403997516609,601.114583457005 359.345670846058,600.972339055486 360.287344095297,600.830094623336 361.229017263802,600.687850160553 362.170690352272,600.545605667139 363.11236336024,600.403361143079 364.054036287824,600.261116588401 364.995709135197,600.118872003077 365.937381902011,599.976627387136 366.87905458844,599.834382740577 367.820727194834,599.692138063387 368.762399720668,599.549893355565 369.704072166001,600.335178987079 370.309474754788,601.120464562191 370.914877417556,601.905750080899 371.520280154888,602.691035543234 372.125682966318,603.47632094915 372.731085852021,604.261606298664 373.336488811998,605.046891591817 373.941891846422,605.832176828524 374.547294954769,606.617462008842 375.15269813739,607.402747132757 375.758101394458,608.188032200254 376.363504725741,608.430618455284 377.275042011926,608.673204632141 378.186579266447,608.915790730854 379.098116489185,609.15837675138 380.00965367991,609.400962693733 380.921190839028,609.643548557899 381.832727965957,609.88613434392 382.744265061221,610.128720051769 383.655802124878,610.371305681416 384.567339156521,610.613891232904 385.478876156267,610.856476706205 386.390413124347,611.099062101319 387.301950060355,611.34164741826 388.213486964698,611.584232657027 389.125023837201,611.826817817608 390.036560677807,612.069402899986 390.948097486573,611.592221242812 391.679834195587,611.115039619835 392.411570840981,610.637858031041 393.143307422288,610.160676476487 393.875043939799,609.683494956116 394.606780393689,609.206313469971 395.338516783784,608.729132018037 396.070253109792,608.409931276285 396.961462935025,608.090730536598 397.852672675333,607.771529798963 398.7438823306,607.452329063424 399.635091901058,607.133128329922 400.526301386184,606.813927598501 401.417510786443,606.494726869132 402.308720101602,606.175526141829 403.199929331953,605.856325416637 404.091138477437,605.537124693452 404.982347537356,605.217923972392 405.873556512408,604.898723253384 406.764765402535,604.579522536471 407.655974207679,604.260321821639 408.547182927898,604.331212872203 409.474604913732,604.402103862943 410.402026843454,604.472994793905 411.329448716715,604.543885665058 412.256870533689,604.614776476388 413.184292294551,605.246117447314 413.863336633774,605.877458350442 414.542381018458,606.508799185787 415.221425448428,607.140139953379 415.900469924032,607.771480653144 416.579514444864,608.402821285155 417.258559011389,609.034161849384 417.937603623199,609.665502345801 418.616648280411,610.296842774449 419.295692983083,610.9281831353 419.974737731274,611.559523428368 420.653782525158,612.190863653625 421.332827363862,612.822203811098 422.011872248433,613.624012194065 422.423676150851,614.425820555305 422.835480127367,615.227628894805 423.247284177691,616.029437212579 423.659088302113,616.831245508612 424.070892500458,617.633053782934 424.482696773077,618.43486203553 424.894501119736,619.236670266371 425.306305540027,620.038478475486 425.718110034708,620.840286662889 426.129914603371,621.808212423304 426.382529419905,622.776138198198 426.635144330154,623.744063987528 426.887759334408,624.711989791351 427.140374432551,625.679915609639 427.392989624932,626.647841442405 427.645604910853,627.615767289652 427.898220290896,628.583693151377 428.150835764827,629.551619027596 428.403451332706,630.519544918279 428.656066994416,631.487470823442 428.908682750072,632.455396743098 429.161298599793,633.423322677249 429.413914543577,634.391248625863 429.6665305809,635.127305924121 430.12476818607,635.863363191311 430.583005855326,636.599420427447 431.041243588901,637.3354776325 431.499481386971,638.071534806499 431.957719249069,638.807591949429 432.415957175719,639.543649061277 432.874195166572,640.254443646714 433.518912865373,640.965238168777 434.163630624767,641.676032627511 434.808348444349,642.38682702287 435.453066324349,643.097621354886 436.097784264537,643.808415623542 436.742502265144,644.519209828853 437.387220326113,645.230003970792 438.031938447384,645.9407980494 438.676656629192,646.651592064634 439.321374871302,647.362386016495 439.966093173483,648.073179904997 440.610811536433,648.783973730155 441.255529959453,649.494767491924 441.900248442951,650.205561190363 442.544966986869,650.9163548254 443.189685591031,651.627148397078 443.834404255496,652.337941905396 444.479122980381,653.048735350341 445.123841765861,653.759528731913 445.76856061141,654.322569696044 446.564156180888,654.885610574624 447.359751779353,655.448651367595 448.155347406573,656.011692075001 448.950943062548,656.39165352915 449.856322194333,656.771614892263 450.761701316107,657.15157616428 451.66708042752,657.531537345218 452.572459528688,657.911498435118 453.477838619612,658.291459433924 454.383217699884,658.671420341692 455.288596770493,659.051381158322 456.193975830334,659.431341883916 457.099354880105,659.811302518428 458.004733919399,660.191263061817 458.910112948506,661.177931247308 458.909265043738,662.16459948993 458.908417211729,663.151267789697 458.907569452422,664.137936146624 458.906721766165,665.124604560682 458.905874152435,666.1112730319 458.905026611639,667.097941560278 458.904179143603,668.084610145816 458.903331748559,669.071278788499 458.902484426042,670.057947488371 458.901637176517,671.044616245388 458.900789999869,672.031285059566 458.899942896038,673.017953930932 458.899095865025,674.004622859458 458.898248906597,674.991291845145 458.897402021277,675.977960888034 458.896555208485,676.964629988099 458.895708468743,677.951299145323 458.89486180176,678.852581952902 459.231588848459,679.75386475597 459.568315982702,680.655147554571 459.90504320513,681.556430348646 460.241770515568,682.457713138239 460.578497913899,683.358995923336 460.915225400007,684.260278703936 461.2519529743,685.161561480054 461.588680636371,685.451027450486 460.804986538133,685.740493423815 460.021292373596,686.029959400053 459.237598143052,686.319425379159 458.453903846035,686.608891361146 457.670209482487,686.898357346028 456.886515052698,687.645106797863 456.352176015149,688.391856325441 455.817836951057,689.138605928732 455.283497860713,689.885355607767 454.749158743653,690.6321053625 454.21481960034,691.378855192961 453.680480430252,692.125605099136 453.14614123432,692.872355081054 452.611802011786,693.61910513867 452.077462762594,694.365855272015 451.54312348715,695.112605481074 451.008784185338,695.859355765861 450.474444857042,696.463709483665 449.834512577916,697.068063256811 449.194580250478,697.672417085254 448.554647873854,697.917164674436 447.663955536671,698.161912253228 446.77326311887,698.782616710523 447.493820447999,699.403321093021 448.21437781956,700.024025400635 448.934935233614,700.644729633452 449.655492689926,701.265433791414 450.376050188555,701.886137874535 451.096607730025,702.506841882816 451.817165313812,703.127545816271 452.537722940091,703.748249674842 453.258280608803,704.113718347624 453.903076056158,704.479186968514 454.547871510033,704.84465553757 455.192666970543,704.750503312593 456.085546678281,704.656351053956 456.978426317219,704.562198761632 457.871305886889,705.472393917269 458.108588619332,706.382589085842 458.345871434605,707.292784267382 458.583154333348,708.202979461857 458.820437315095,709.113174669314 459.057720379904,709.706406030455 459.820991479792,710.299637310251 460.584262616001,710.892868508687 461.347533787601,711.486099625719 462.110804995289,712.429398300286 462.265945740975,713.372697003753 462.421086569084,714.315995736106 462.576227478858,715.259294497344 462.731368470937,716.202593287453 462.886509544915,717.145892106462 463.041650700907,718.089190954386 463.19679193903,719.032489831181 463.35193325911,719.975788736876 463.50707466132,720.919087671486 463.662216145429,721.862386634995 463.817357711727,722.777284237789 464.054410851095,723.692181853956 464.291464074282,724.607079483452 464.528517381346,725.521977126322 464.765570772695,726.43687478255 465.002624247863,727.351772452137 465.239677807025,728.266670135068 465.476731450064,729.181567831343 465.713785177097,730.096465541035 465.950838988239,731.011363264042 466.187892883259,731.926261000408 466.424946862157,732.841158750161 466.66200092528,733.756056513274 466.899055072106,734.670954289759 467.136109302985,735.585852079603 467.373163618031,736.50074988282 467.610218016896,737.415647699425 467.84727249993,738.301670142246 468.262406606867,739.187692565945 468.677540802921,740.073714970495 469.092675088032,740.959737355937 469.507809462259,741.845759722273 469.922943925834,742.731782069473 470.338078478351,743.617804397581 470.753213120217,744.503826706539 471.168347850908,745.38984899639 471.583482670947,746.27587126712 471.998617579869,747.161893518729 472.413752578432,748.047915751216 472.828887665819,748.933937964597 473.244022842497,749.819960158857 473.659158108348,750.705982333995 474.0742934632,751.592004490027 474.489428907225,752.478026626937 474.904564440425,753.364048744741 475.319700062799,754.250070843409 475.734835774405,755.136092922985 476.149971575185,756.022114983411 476.56510746479,756.908137024773 476.980243443977,757.255947905825 476.047661606281,757.603758791505 475.115079674113,757.951569681754 474.182497647766,758.299380576631 473.24991552718,758.647191476077 472.317333312298,758.995002380136 471.38475100341,759.342813288749 470.452168600052,759.690624201976 469.519586102455,760.038435119772 468.587003510678,760.386246042137 467.65442082443,760.734056969115 466.721838044177,761.081867900662 465.789255169686,761.429678836765 464.856672200898,761.777489777465 463.92408913793,762.125300722721 462.99150598055,762.47311167256 462.058922728989,762.820922626968 461.12633938319,763.168733585917 460.193755943328,763.516544549449 459.261172408878,763.864355517551 458.328588780656,764.212166490179 457.396005057613,764.55997746739 456.463421240798,764.907788449156 455.53083732957,765.255599435462 454.59825332422,765.603410426324 453.665669224574,765.951221421754 452.73308503069,766.299032421695 451.800500742334,766.646843426206 450.867916360032,766.994654435242 449.935331883549,767.590113993647 449.276838879625,768.185573606097 448.618345823372,768.781033272666 447.959852715663,769.376492993266 447.301359555277,770.184579053894 446.851132416981,770.992665195488 446.400905269722,771.800751418094 445.950678113441,772.608837721622 445.500450947846,773.416924106161 445.050223773345,774.225010571652 444.59999658959,775.033097118125 444.149769396754,775.841183745593 443.699542195071,776.649270454029 443.249314984016,777.457357243446 442.799087763939,778.265444113829 442.348860534723,779.216324026493 442.434152058966,780.1672039798 442.519443660043,781.11808397375 442.604735337838,782.068964008315 442.690027092292,783.019844083537 442.775318923173,783.970724199418 442.860610831121,784.921604355943 442.945902815612,785.872484553096 443.031194876763,786.823364790922 443.116487014748,787.774245069391 443.201779229334,788.72512538849 443.287071520637,789.546884257667 443.638906808454,790.368643116002 443.990742171649,791.190401963511 444.342577610223,792.012160800194 444.694413123885,792.833919626035 445.046248713217,793.655678441079 445.398084377637,794.576405735788 445.567063781316,795.497133055411 445.736043264158,796.417860399975 445.90502282721,797.338587769511 446.074002469482,798.259315163974 446.242982191849,799.180042583364 446.411961993726,800.100770027726 446.580941875232,801.021497497015 446.749921836192,801.94222499126 446.918901877245,802.856650350004 446.632365993399,803.771075792378 446.345830135513,804.685501318439 446.059294303181,805.59992692816 445.772758496227,806.514352621525 445.486222715001,807.428778398578 445.199686959444,808.343204259261 444.913151229266,809.257630203632 444.626615524816,810.172056231648 444.340079845919,811.086482343366 444.05354419275,812.062232725977 444.208887641958,813.037983140588 444.364231178886,814.013733587155 444.519574803009,814.989484065736 444.67491851456,815.965234576288 444.83026231348,816.940985118839 444.985606199596,817.916735693376 445.14095017314,818.618439838305 444.569341782539,819.320144053068 443.997733357246,820.021848337652 443.426124896854,820.723552692085 442.854516401479,821.425257116323 442.282907871704,821.586939184461 441.624032031046,821.748621244493 440.965156147256,821.32413377348 440.110783698561,820.899646215737 439.256411251205,820.475158571295 438.402038805652,820.050670840137 437.547666361614,819.626183022265 436.693293919205,819.201695117721 435.838921478367,819.272672732113 435.106548926677,819.343650322975 434.374176328885,820.048058870874 433.708428022976,820.752467492101 433.042679665668,821.456876186654 432.376931257138,822.161284954549 431.711182797328,822.865693795742 431.045434286236,823.570102710262 430.379685723688,824.274511698095 429.713937109569,824.978920759284 429.048188444285,825.683329893756 428.382439727895,826.387739101556 427.716690959933,827.092148382682 427.050942140806,827.796557737092 426.385193270224,828.72363652075 426.390564684756,829.650715354335 426.395936164132,830.577794237863 426.401307708642,831.504873171303 426.406679318054,832.4319521547 426.41205099225,833.365900936595 426.670073364163,834.29984972997 426.9280958249,835.233798534769 427.186118374346,836.167747351021 427.444141012616,837.101696178725 427.702163739363,838.035645017881 427.960186554934,838.969593868474 428.218209459155,839.903542730564 428.476232452318,840.837491604092 428.734255534015,841.771440489087 428.992278704653,842.705389385534 429.250301963999,843.639338293448 429.508325311879,844.573287212828 429.766348748642,845.507236143661 430.024372274056,846.479658423879 430.049110541353,847.452080756251 430.073848882399,848.424503140792 430.098587296903,849.396925577501 430.123325784924,850.369348066379 430.148064346577,851.341770607411 430.17280298163,852.314193200626 430.197541690199,853.286615846009 430.22228047275,854.259038543561 430.247019328701,855.160691524521 430.121563606022,856.062344569465 429.996107929386,856.963997678395 429.870652299083,857.865650851323 429.745196715055,858.767304088251 429.619741177652,859.668957389178 429.494285686174,860.577713115126 429.149335948983,861.48646892971 428.804386227857,862.395224832959 428.459436522389,863.303980824858 428.114486832812,864.212736905421 427.7695371593,865.12149307465 427.424587501562,866.030249332529 427.079637859541,866.939005679087 426.734688233642,867.847762114296 426.389738623227,868.756518638169 426.044789029052,869.665275250707 425.699839450652,870.57403195191 425.354889888316,871.566596364384 425.249428379873,872.559160850054 425.143966931733,873.551725408921 425.03850554442,874.544290040998 424.933044217294,875.536854746271 424.827582951053,876.529419524755 424.722121745115,877.521984376464 424.616660599597,878.514549301399 424.511199514847,879.507114299529 424.405738490692,880.499679370885 424.300277527014,881.492244515452 424.194816623523,882.484809733258 424.089355780918,883.345822452335 423.876419136534,884.206835239995 423.663482522767,885.067848096194 423.450545939209,885.928861020977 423.237609386037,886.789874014343 423.024672863539,887.650887076263 422.811736371252,888.51190020678 422.598799909523,889.27614333354 422.182439201977,890.040386532186 421.766078487737,890.804629802733 421.34971776657,891.568873145166 420.933357038593,892.333116559515 420.516996303748,893.097360045751 420.100635561859,893.861603603902 419.68427481316,894.789411961669 419.33924864023,895.717220411214 418.994222484995,896.645028952495 418.649196347105,897.572837585554 418.304170227144,898.500646310378 417.959144124528,899.428455126967 417.614118039957,900.356264035319 417.26909197279,901.284073035407 416.924065923027,902.211882127318 416.579039891425,903.139691310949 416.234013877052,904.067500586374 415.888987880549,904.995309953578 415.543961901392,905.92311941256 415.198935940163,906.850928963308 414.853909996513,907.778738605819 414.508884070441,908.450986662632 413.84886678285,909.123234786821 413.188849444268,909.795482978341 412.528832054115,910.467731237222 411.868814612797,911.139979563421 411.208797120256,911.812227957023 410.548779576435,912.484476417929 409.888761981449,913.15672494618 409.228744334891,913.828973541793 408.568726637284,914.501222204752 407.908708888455,915.173470935028 407.248691088113,915.845719732664 406.588673236489,916.540647551868 406.222828831407,917.235575429775 405.856984422426,917.930503366355 405.491140009428,918.839725168029 405.261730037339,919.748947046712 405.032320098078,920.658169002418 404.802910192462,921.567391035132 404.57350031985,922.476613144827 404.344090480125,923.385835331559 404.114680673985,924.2950575953 403.885270901024,925.204279936064 403.655861161067,926.113502353852 403.426451454463,927.022724848663 403.197041780921,927.931947420468 402.967632140673,928.84117006934 402.738222533604,929.750392795191 402.508812959772,930.65961559811 402.279403419117,931.594101963099 402.213359051733,932.528588388741 402.147314741975,933.463074875108 402.081270489842,934.397561422142 402.015226295684,935.332048029843 401.949182158685,936.266534698239 401.883138079836,937.221351495406 402.09872438095,938.176168313032 402.314310771297,939.130985151089 402.529897250584,940.085802009606 402.745483819162,941.040618888568 402.961070476449,941.995435787991 403.176657223376,942.950252707888 403.392244059301,943.90506964823 403.607830983936,944.859886609032 403.823417997919,945.814703590309 404.039005100902,946.769520592017 404.254592293175,947.724337614243 404.470179574564,948.679154656886 404.68576694472,949.633971720017 404.901354404166,950.588788803609 405.11694195267,951.543605907689 405.332529590349,952.49842303223 405.548117317143,953.453240177259 405.763705133053,954.408057342735 405.979293037846,955.362874528742 406.194881032279,956.317691735196 406.410469115304,957.272508962153 406.626057287736,958.22732620957 406.841645549284,959.137621358153 406.728925631731,960.04791657046 406.61620576313,960.95821184649 406.503485943715,961.868507186227 406.390766172844,962.778802589673 406.278046450811,963.689098056857 406.165326777729,964.599393587749 406.052607153717,965.509689182363 405.939887578308,966.419984840715 405.827168051794,967.330280562775 405.714448574232,968.246375122093 405.318812410871,969.162469776129 404.923176255717,970.07856452484 404.527540108655,970.994659368269 404.13190396945,971.910754306402 403.736267838627,972.826849339224 403.340631715721,973.74294446675 402.944995600963,974.659039688995 402.549359494122,975.575135005929 402.153723395488,976.491230417596 401.758087305061,977.407325923938 401.362451222318,978.323421524998 400.966815147782,979.239517220762 400.571179081453,980.155613011244 400.175543023157,981.07170889643 399.77990697301,981.987804876335 399.384270930663,982.903900950958 398.988634896465,983.819997120285 398.592998870241,984.73609338433 398.197362852283,985.652189743094 397.801726842183,986.568286196562 397.406090840232,987.484382744748 397.010454846139,988.400479387652 396.614818860311,989.316576125289 396.219182882342,990.232672957616 395.823546912405,991.14876988469 395.427910950559,992.064866906469 395.032274996745,992.980964022994 394.636639051139,993.897061234209 394.241003113217,994.813158540157 393.845367183501,995.729255940852 393.449731261935,996.645353436266 393.054095348343,997.561451026384 392.658459442551,997.870110730786 393.602440677758,998.178770344384 394.546421887993,998.487429867135 395.490403073083,998.796089299096 396.434384233493,999.104748640239 397.378365369106,999.413407890548 398.32234647969,999.72206705001 399.266327565245,1000.03072611867 400.210308625887,1000.33938509651 401.15428966179,1000.64804398348 402.098270672548,1000.95670277966 403.042251658626,1001.26536148498 403.986232619616,1001.57402009948 404.930213555577,1001.88267862314 405.874194466742,1002.19133705595 406.81817535311,1002.49999539791 407.762156214274,1002.80865364904 408.706137050583,1003.11731180933 409.650117862213,1003.42596987876 410.594098648522,1003.73462785735 411.538079410093,1004.04328574509 412.482060146867,1004.35194354197 413.42604085838,1004.66060124802 414.370021545328,1004.96925886317 415.314002206898,1005.27791638752 416.257982843788,1005.58657382095 417.201963455649,1005.89523116358 418.145944042597,1006.20388841529 419.089924604632,1006.51254557616 420.033905141579,1006.82120264617 420.977885653963,1007.1298596253 421.921866141027,1007.43851651356 422.865846603061,1007.74717331094 423.809827040299,1008.05583001747 424.75380745274,1008.36448663313 425.697787839919,1008.67314315788 426.641768202244,1008.98179959177 427.585748539947,1009.29045593477 428.529728852096,1009.59911218687 429.473709139507,1009.90776834812 430.41768940218,1010.21642441847 431.361669639766,1010.52508039793 432.305649852147,1010.8337362865 433.249630039907,1011.14239208418 434.193610202405,1011.45104779096 435.137590339931,1011.75970340683 436.081570452778,1012.06835893185 437.025550540537,1012.37701436593 437.969530603266,1012.68566970911 438.91351064085,1012.9943249614 439.857490653638,1013.30298012278 440.801470641512,1013.61163519326 441.7454506043,1013.92029017283 442.689430542057,1014.22894506149 443.633410454902,1014.53759985922 444.577390342951,1014.84625456606 445.521370205563,1015.15490918198 446.465350043494,1015.46356370699 447.409329856455,1015.77221814106 448.35330964427,1016.08087248422 449.297289407055,1016.38952673646 450.241269144928,1016.69818089777 451.185248858004,1017.00683496814 452.129228545586,1017.3154889476 453.073208208662,1017.62414283612 454.017187846533,1017.93279663373 454.96116745926,1018.10789417423 455.931929637212,1018.2829916351 456.902691766794,1018.45808901633 457.873453848413,1018.63318631794 458.84421588172,1018.8082835399 459.814977867121,1018.98338068223 460.785739804152,1019.15847774493 461.756501693279,1019.33357472798 462.727263534209,1019.5086716314 463.698025327059,1019.68376845516 464.66878707154,1019.85886519931 465.639548768173,1020.40808778406 466.43494784605,1020.95731028363 467.230346950411,1021.50653269808 468.02574608213,1022.05575502738 468.821145241207,1022.60497727155 469.61654442735,1023.15419943053 470.411943640269,1023.70342150435 471.207342880312,1024.25264349305 472.002742147772,1025.11903810325 472.473972891225,1025.98543268365 472.94520372292,1026.85182723426 473.416434642917,1027.71822175506 473.887665650691,1028.58461624608 474.35889674694,1029.45101070729 474.8301279312,1030.31740513869 475.301359203528,1031.18379954032 475.772590564156,1032.05019391215 476.243822012912,1032.91658825416 476.715053549851,1033.47250054059 477.482376791711,1034.02841274648 478.249700063607,1034.58432487176 479.017023365246,1035.14023691643 479.784346696222,1035.69614888051 480.551670057117,1036.25206076402 481.318993447989,1036.80797256691 482.08631686843,1037.3638842892 482.853640318557,1037.75194473553 483.747877029935,1038.14000509125 484.642113734386,1038.52806535631 485.536350430921,1038.91612553076 486.430587120238,1039.30418561456 487.324823802104,1039.69224560773 488.219060476578,1040.08030551024 489.113297143544,1040.46836532214 490.007533803175,1040.85642504336 490.901770455472,1041.24448467395 491.796007100202,1041.63254421389 492.690243737539,1042.02060366317 493.584480367659,1042.40866302182 494.478716990328,1042.7967222898 495.37295360514,1043.18478146712 496.267190212908,1043.57284055381 497.161426813225,1043.9608995498 498.055663406092,1044.34895845514 498.949899991683,1044.73701726983 499.844136569649,1045.12507599383 500.738373140048,1045.51313462718 501.632609703287,1045.90119316986 502.526846259076,1046.28925162186 503.421082807297,1046.67730998318 504.315319348185,1047.06536825382 505.209555881447,1047.4534264338 506.103792407783,1047.84148452307 506.998028926435))) + + diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-mask.vrt b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-mask.vrt new file mode 100644 index 00000000..89b4e303 --- /dev/null +++ b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-mask.vrt @@ -0,0 +1,138 @@ + + PROJCS["WGS 84 / UTM zone 30N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32630"]] + 7.4478000000000000e+05, 1.0000000000000000e+01, 0.0000000000000000e+00, 4.8474100000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+01 + + Band 2 (490nm) + -10000 + + SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt + 1 + + + -10000 + + + + Band 3 (560nm) + -10000 + + SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt + 2 + + + -10000 + + + + Band 4 (665nm) + -10000 + + SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt + 3 + + + -10000 + + + + Band 8 (842nm) + -10000 + + SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt + 4 + + + -10000 + + + + Band 11 (1610nm) + -10000 + + SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt + 5 + + + -10000 + + + + Band 12 (2190nm) + -10000 + + SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt + 6 + + + -10000 + + + + Band 5 (705nm) + -10000 + + SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt + 7 + + + -10000 + + + + Band 6 (740nm) + -10000 + + SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt + 8 + + + -10000 + + + + Band 7 (783nm) + -10000 + + SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt + 9 + + + -10000 + + + + Band 8a (865nm) + -10000 + + SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt + 10 + + + -10000 + + + + + + SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt + 11 + + + + + SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt + 12 + + + + + SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-clipped.vrt + 13 + + + + Python + eolab.rastertools.product.s2_maja_mask + + + diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.vrt b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.vrt new file mode 100644 index 00000000..41ed6d96 --- /dev/null +++ b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.vrt @@ -0,0 +1,134 @@ + + PROJCS["WGS 84 / UTM zone 30N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",-3],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32630"]] + 7.4290000000000000e+05, 1.0000000000000000e+01, 0.0000000000000000e+00, 4.8486200000000000e+06, 0.0000000000000000e+00, -1.0000000000000000e+01 + + Band 2 (490nm) + -10000 + + /vsizip/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B2.tif + 1 + + + + + + Band 3 (560nm) + -10000 + + /vsizip/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B3.tif + 1 + + + + + + Band 4 (665nm) + -10000 + + /vsizip/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B4.tif + 1 + + + + + + Band 8 (842nm) + -10000 + + /vsizip/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8.tif + 1 + + + + + + Band 11 (1610nm) + -10000 + + /vsizip/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B11.tif + 1 + + + + + + Band 12 (2190nm) + -10000 + + /vsizip/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B12.tif + 1 + + + + + + Band 5 (705nm) + -10000 + + /vsizip/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B5.tif + 1 + + + + + + Band 6 (740nm) + -10000 + + /vsizip/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B6.tif + 1 + + + + + + Band 7 (783nm) + -10000 + + /vsizip/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B7.tif + 1 + + + + + + Band 8a (865nm) + -10000 + + /vsizip/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8A.tif + 1 + + + + + + CLM_R1 + 0 + + /vsizip/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R1.tif + 1 + + + + + + SAT_R1 + 0 + + /vsizip/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R1.tif + 1 + + + + + + EDG_R1 + 0 + + /vsizip/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R1.tif + 1 + + + + + diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R1.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R1.tif new file mode 100644 index 00000000..9e442f78 Binary files /dev/null and b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R1.tif differ diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R2.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DFP_R1.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DFP_R1.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DFP_R2.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DFP_R2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D01.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D01.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D02.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D02.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D03.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D03.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D04.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D04.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D05.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D05.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D06.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D06.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D07.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D07.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D01.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D01.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D02.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D02.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D03.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D03.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D04.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D04.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D05.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D05.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D06.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D06.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D07.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D07.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R1.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R1.tif new file mode 100644 index 00000000..02bde188 Binary files /dev/null and b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R1.tif differ diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R2.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_IAB_R1.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_IAB_R1.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_IAB_R2.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_IAB_R2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MG2_R1.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MG2_R1.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MG2_R2.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MG2_R2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R1.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R1.tif new file mode 100644 index 00000000..02bde188 Binary files /dev/null and b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R1.tif differ diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R2.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_ATB_R1.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_ATB_R1.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_ATB_R2.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_ATB_R2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B11.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B11.tif new file mode 100644 index 00000000..c791e6e1 Binary files /dev/null and b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B11.tif differ diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B12.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B12.tif new file mode 100644 index 00000000..52dcf977 Binary files /dev/null and b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B12.tif differ diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B2.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B2.tif new file mode 100644 index 00000000..54659d66 Binary files /dev/null and b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B2.tif differ diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B3.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B3.tif new file mode 100644 index 00000000..094ac9d0 Binary files /dev/null and b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B3.tif differ diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B4.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B4.tif new file mode 100644 index 00000000..de5e4d73 Binary files /dev/null and b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B4.tif differ diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B5.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B5.tif new file mode 100644 index 00000000..118b17a7 Binary files /dev/null and b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B5.tif differ diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B6.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B6.tif new file mode 100644 index 00000000..ecef0018 Binary files /dev/null and b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B6.tif differ diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B7.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B7.tif new file mode 100644 index 00000000..06f652e8 Binary files /dev/null and b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B7.tif differ diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8.tif new file mode 100644 index 00000000..e5ad82c3 Binary files /dev/null and b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8.tif differ diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8A.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8A.tif new file mode 100644 index 00000000..195221f8 Binary files /dev/null and b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8A.tif differ diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MTD_ALL.xml b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MTD_ALL.xml new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_QKL_ALL.jpg b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_QKL_ALL.jpg new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B11.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B11.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B12.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B12.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B2.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B3.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B3.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B4.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B4.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B5.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B5.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B6.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B6.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B7.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B7.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B8.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B8.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B8A.tif b/tests/tests/tests_out/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B8A.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/.coverage b/tests/tests_data/.coverage new file mode 100644 index 00000000..4b165c48 Binary files /dev/null and b/tests/tests_data/.coverage differ diff --git a/tests/tests_data/RGB_TIF_20170105_013442_test.tif.aux.xml b/tests/tests_data/RGB_TIF_20170105_013442_test.tif.aux.xml new file mode 100644 index 00000000..4348f781 --- /dev/null +++ b/tests/tests_data/RGB_TIF_20170105_013442_test.tif.aux.xml @@ -0,0 +1,72 @@ + + + + + -0.003130574205832248 + 1562.003130574206 + 249475 + 0 + 1 + 45872|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|21|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|19|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|27|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|44|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|64|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|122|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|118|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|142|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|161|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|193|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|254|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|303|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|334|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|361|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|392|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|474|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|483|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|567|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|636|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|682|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|753|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|824|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|876|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|896|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|957|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1023|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1076|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1123|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1146|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1200|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1204|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1250|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1219|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1297|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1276|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1297|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1212|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1337|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1284|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1359|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1292|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1251|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1339|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1299|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1312|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1318|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1269|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1262|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1236|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1222|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1144|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1127|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1122|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1118|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1110|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1079|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1070|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1002|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1035|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1013|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1007|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|976|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|987|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|915|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|923|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|930|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|950|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|899|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|885|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|832|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|828|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|887|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|789|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|813|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|785|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|777|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|756|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|762|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|732|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|717|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|756|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|721|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|682|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|711|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|654|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|664|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|720|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|688|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|680|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|735|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|651|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|681|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|710|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|675|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|743|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|802|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|783|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|774|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|789|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|767|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|761|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|702|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|722|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|722|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|686|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|678|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|684|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|682|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|696|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|658|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|644|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|630|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|631|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|617|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|538|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|579|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|522|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|525|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|485|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|470|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|485|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|517|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|467|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|408|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|450|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|408|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|401|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|452|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|389|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|365|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|353|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|342|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|347|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|363|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|331|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|320|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|383|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|346|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|322|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|358|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|322|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|339|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|332|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|306|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|312|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|333|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|349|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|289|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|305|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|292|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|291|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|318|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|293|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|300|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|291|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|290|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|320|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|285|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|283|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|280|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|272|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|306|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|288|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|317|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|298|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|301|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|296|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|290|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|286|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|268|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|281|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|291|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|288|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|259|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|286|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|254|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|241|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|251|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|250|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|271|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|237|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|231|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|246|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|255|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|233|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|240|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|230|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|221|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|207|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|209|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|215|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|224|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|187|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|195|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|199|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|196|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|206|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|179|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|177|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|168|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|173|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|162|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|185|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|182|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|185|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|138|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|159|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|156|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|159|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|190|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|166|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|161|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|144|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|158|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|161|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|141|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|153|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|166|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|140|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|154|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|139|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|143|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|152|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|135|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|141|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|124|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|132|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|152|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|143|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|155|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|145|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|125|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|131|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|152|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|131|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|137|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|137|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|146|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|132|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|124|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|128|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|107|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|115|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|119|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|109|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|125|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|104|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|122|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|109|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|115|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|118|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|108|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|114|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|107|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|121|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|128|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|97|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|91|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|130|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|108|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|94|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|114|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|91|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|94|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|103|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|115|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|90|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|80|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|91|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|97|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|91|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|108|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|90|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|78|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|95|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|88|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|95|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|75|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|88|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|80|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|77|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|75|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|76|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|67|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|76|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|91|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|91|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|82|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|79|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|81|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|78|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|68|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|79|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|65|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|54|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|61|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|81|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|59|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|75|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|82|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|76|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|75|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|81|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|65|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|66|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|76|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|75|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|76|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|80|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|76|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|96|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|75|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|94|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|94|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|81|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|77|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|95|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|104|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|109|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|90|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|90|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|78|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|78|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|103|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|104|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|80|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|82|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|73|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|88|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|80|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|81|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|79|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|77|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|67|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|77|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|79|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|80|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|65|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|76|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|82|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|76|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|62|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|78|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|55|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|75|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|58|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|76|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|59|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|63|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|67|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|78|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|80|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|61|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|64|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|73|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|66|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|59|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|64|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|73|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|67|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|56|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|64|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|59|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|62|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|66|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|62|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|78|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|57|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|56|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|65|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|56|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|67|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|66|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|68|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|57|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|52|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|58|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|58|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|45|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|44|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|68|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|54|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|62|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|52|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|47|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|61|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|61|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|55|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|52|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|61|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|67|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|62|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|47|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|54|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|57|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|48|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|47|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|41|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|38|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|52|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|55|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|58|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|58|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|52|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|59|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|58|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|59|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|55|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|51|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|53|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|54|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|56|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|57|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|56|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|61|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|36|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|54|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|56|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|68|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|56|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|53|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|51|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|65|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|53|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|59|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|61|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|51|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|62|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|51|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|58|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|57|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|61|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|66|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|65|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|59|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|61|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|79|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|66|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|67|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|67|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|73|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|67|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|80|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|73|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|80|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|63|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|51|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|67|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|75|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|80|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|76|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|81|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|102|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|80|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|79|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|77|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|78|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|78|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|59|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|90|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|90|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|81|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|88|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|80|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|101|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|90|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|82|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|91|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|82|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|108|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|95|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|96|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|121|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|109|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|119|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|101|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|90|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|97|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|104|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|125|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|118|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|128|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|108|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|144|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|125|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|132|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|116|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|117|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|137|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|133|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|113|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|112|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|134|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|135|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|121|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|127|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|128|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|116|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|104|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|131|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|112|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|130|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|124|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|125|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|114|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|110|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|128|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|112|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|117|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|104|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|107|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|104|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|124|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|116|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|109|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|107|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|104|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|88|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|101|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|95|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|97|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|103|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|102|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|110|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|107|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|95|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|114|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|115|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|113|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|109|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|90|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|103|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|113|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|112|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|109|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|108|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|124|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|116|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|107|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|109|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|102|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|117|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|114|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|96|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|114|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|108|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|97|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|75|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|76|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|81|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|78|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|88|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|81|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|64|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|81|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|78|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|81|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|68|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|65|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|75|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|82|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|57|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|58|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|78|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|65|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|73|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|73|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|82|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|61|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|73|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|77|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|67|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|73|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|61|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|64|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|68|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|57|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|65|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|68|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|56|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|53|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|58|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|68|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|48|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|35|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|47|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|57|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|48|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|48|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|40|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|51|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|57|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|49|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|53|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|41|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|47|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|49|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|47|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|35|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|58|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|36|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|41|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|36|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|43|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|45|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|37|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|47|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|43|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|33|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|39|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|45|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|51|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|26|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|38|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|39|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|33|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|41|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|42|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|33|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|38|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|42|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|33|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|35|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|31|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|33|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|35|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|30|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|40|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|25|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|28|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|43|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|38|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|42|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|42|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|30|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|27|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|31|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|29|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|36|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|33|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|35|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|29|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|27|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|33|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|21|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|21|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|27|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|27|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|21|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|19|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|13|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|21|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|26|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|33|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|27|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|18|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|17|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|29|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|21|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|13|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|19|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|25|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|21|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|21|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|18|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|19|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|18|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|19|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|17|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|14|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|17|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|14|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|19|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|21|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|19|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|19|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|14|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|13|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 + + + + YES + 1562 + 313.30764418923 + 0 + 265.78147592027 + 100 + + + + + + -0.002990279587132979 + 1492.002990279587 + 249475 + 0 + 1 + 45872|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|14|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|26|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|31|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|47|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|49|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|57|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|64|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|88|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|101|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|101|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|131|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|140|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|165|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|167|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|229|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|239|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|270|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|295|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|315|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|360|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|363|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|376|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|460|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|467|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|457|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|505|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|504|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|559|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|630|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|664|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|704|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|738|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|776|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|788|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|744|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|749|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|854|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|813|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|824|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|820|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|832|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|787|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|854|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|863|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|833|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|803|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|860|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|804|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|839|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|827|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|828|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|825|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|800|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|782|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|779|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|788|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|844|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|885|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|891|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|840|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|899|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|895|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|877|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|890|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|895|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|950|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|859|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|896|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|930|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|891|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|885|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|897|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|897|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|891|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|920|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|926|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|915|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|944|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|868|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|910|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|909|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|855|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|908|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|834|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|795|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|816|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|798|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|828|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|778|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|757|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|730|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|789|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|749|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|724|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|676|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|743|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|715|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|666|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|720|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|688|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|672|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|720|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|699|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|674|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|686|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|687|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|651|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|703|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|699|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|738|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|696|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|725|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|714|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|731|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|715|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|722|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|725|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|739|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|710|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|659|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|717|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|679|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|627|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|613|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|688|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|729|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|686|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|704|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|682|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|685|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|658|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|644|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|729|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|651|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|642|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|600|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|659|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|663|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|665|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|592|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|624|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|620|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|621|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|634|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|694|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|622|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|643|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|662|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|661|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|630|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|606|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|662|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|660|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|663|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|629|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|689|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|667|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|709|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|688|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|720|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|746|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|747|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|742|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|704|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|689|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|661|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|690|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|652|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|610|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|625|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|647|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|562|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|549|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|513|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|521|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|502|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|508|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|467|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|440|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|438|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|426|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|400|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|412|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|356|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|301|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|339|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|301|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|365|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|322|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|306|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|307|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|248|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|268|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|291|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|260|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|300|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|273|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|263|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|268|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|246|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|257|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|251|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|255|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|230|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|214|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|227|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|242|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|210|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|227|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|207|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|221|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|227|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|206|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|188|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|207|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|204|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|211|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|174|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|186|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|215|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|205|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|190|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|173|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|178|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|175|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|171|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|161|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|189|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|189|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|148|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|163|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|169|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|166|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|158|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|174|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|159|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|160|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|178|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|168|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|174|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|168|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|167|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|187|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|166|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|174|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|160|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|166|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|162|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|169|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|133|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|172|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|143|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|176|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|157|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|171|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|177|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|158|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|156|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|186|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|169|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|177|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|164|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|185|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|186|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|207|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|187|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|214|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|155|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|189|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|156|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|178|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|173|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|170|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|185|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|183|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|163|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|174|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|155|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|168|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|133|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|153|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|149|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|150|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|140|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|126|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|140|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|127|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|141|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|139|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|149|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|130|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|127|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|125|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|128|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|113|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|115|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|123|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|118|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|110|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|114|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|104|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|118|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|101|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|107|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|88|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|123|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|96|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|110|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|116|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|123|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|113|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|116|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|117|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|109|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|103|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|107|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|107|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|101|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|102|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|96|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|94|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|102|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|96|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|91|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|108|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|116|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|85|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|110|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|97|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|111|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|102|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|94|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|101|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|101|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|113|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|105|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|103|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|110|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|103|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|115|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|110|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|101|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|108|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|103|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|102|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|117|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|102|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|110|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|109|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|97|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|102|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|107|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|108|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|108|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|97|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|112|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|128|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|116|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|97|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|104|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|113|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|108|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|130|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|128|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|138|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|126|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|117|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|120|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|113|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|136|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|125|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|134|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|115|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|121|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|126|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|133|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|131|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|114|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|138|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|134|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|121|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|138|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|148|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|136|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|136|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|145|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|140|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|144|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|163|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|139|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|147|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|141|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|151|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|152|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|135|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|149|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|147|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|146|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|176|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|136|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|145|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|146|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|152|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|135|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|164|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|153|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|140|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|162|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|152|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|157|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|142|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|159|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|123|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|147|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|140|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|126|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|132|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|141|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|123|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|142|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|137|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|128|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|138|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|134|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|113|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|128|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|132|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|119|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|136|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|136|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|127|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|122|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|109|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|113|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|125|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|125|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|114|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|118|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|122|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|113|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|115|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|139|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|119|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|116|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|118|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|119|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|125|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|119|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|114|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|115|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|133|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|134|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|114|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|123|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|96|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|119|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|121|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|135|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|128|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|110|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|126|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|94|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|116|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|115|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|103|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|102|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|86|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|97|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|99|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|76|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|104|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|95|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|91|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|100|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|82|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|94|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|97|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|96|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|73|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|88|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|98|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|92|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|59|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|77|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|94|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|59|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|65|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|88|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|82|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|67|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|64|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|79|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|62|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|59|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|56|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|65|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|55|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|53|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|55|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|65|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|58|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|57|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|49|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|43|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|54|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|49|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|61|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|47|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|57|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|53|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|64|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|55|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|51|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|57|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|51|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|45|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|47|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|38|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|35|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|44|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|33|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|33|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|44|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|44|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|52|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|39|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|41|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|43|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|43|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|39|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|40|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|37|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|39|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|41|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|44|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|44|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|38|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|44|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|48|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|42|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|27|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|39|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|39|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|33|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|35|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|25|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|42|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|37|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|28|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|28|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|38|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|45|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|39|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|43|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|40|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|28|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|31|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|19|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|26|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|25|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|30|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|35|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|37|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|31|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|28|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|28|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|25|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|27|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|31|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|27|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|36|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|30|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|30|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|30|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|29|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|29|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|26|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|30|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|25|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|21|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|21|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|36|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|19|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|26|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|26|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|18|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|17|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|18|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|17|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|17|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|17|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|14|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|19|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|21|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|13|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|14|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|18|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|17|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|14|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|13|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|18|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|14|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|14|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 + + + + YES + 1492 + 404.59736373127 + 0 + 248.20554671177 + 100 + + + + + + -0.002755787153021345 + 1375.002755787153 + 249475 + 0 + 1 + 45872|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|19|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|40|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|54|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|67|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|96|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|116|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|133|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|163|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|255|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|337|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|450|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|609|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|723|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|935|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1043|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1324|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1533|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1757|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1971|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2041|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2144|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2122|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2080|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2038|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2050|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1998|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1934|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1980|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2017|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2157|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2259|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2353|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2479|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2501|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2516|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2413|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2296|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2185|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2084|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1975|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1909|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1968|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1904|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1926|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1785|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1697|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1575|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1645|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1562|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1557|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1512|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1424|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1449|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1381|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1352|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1367|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1236|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1251|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1171|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1211|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1210|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1031|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1135|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1073|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1004|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1070|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1056|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1006|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1003|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1021|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1090|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1001|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1062|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1066|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1047|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1110|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1123|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1143|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1109|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1140|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1075|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1012|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1039|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|970|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|905|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|892|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|805|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|675|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|647|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|608|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|531|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|523|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|473|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|463|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|448|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|460|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|389|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|413|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|395|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|421|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|388|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|365|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|368|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|357|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|355|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|320|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|340|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|345|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|330|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|335|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|285|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|305|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|286|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|262|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|288|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|291|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|276|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|241|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|263|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|263|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|233|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|234|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|242|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|246|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|273|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|218|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|219|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|196|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|211|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|213|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|212|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|230|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|201|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|221|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|187|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|201|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|227|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|215|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|198|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|205|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|227|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|226|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|200|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|205|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|236|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|223|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|218|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|240|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|241|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|235|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|240|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|279|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|240|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|293|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|263|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|263|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|274|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|263|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|253|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|296|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|280|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|248|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|288|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|308|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|284|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|288|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|274|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|269|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|258|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|288|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|278|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|242|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|265|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|269|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|257|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|255|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|272|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|243|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|223|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|242|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|210|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|233|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|214|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|278|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|223|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|237|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|234|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|230|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|242|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|250|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|243|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|202|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|211|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|233|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|231|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|256|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|223|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|201|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|213|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|218|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|232|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|198|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|200|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|229|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|224|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|212|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|216|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|238|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|197|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|258|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|199|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|228|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|222|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|226|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|227|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|207|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|222|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|207|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|258|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|266|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|278|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|251|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|249|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|260|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|266|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|254|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|316|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|248|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|310|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|289|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|324|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|285|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|307|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|270|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|277|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|263|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|294|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|247|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|279|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|298|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|296|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|275|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|283|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|282|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|274|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|297|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|293|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|269|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|285|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|252|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|247|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|262|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|251|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|246|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|242|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|218|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|231|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|230|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|228|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|217|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|205|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|207|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|225|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|220|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|218|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|238|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|249|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|244|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|239|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|241|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|221|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|230|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|187|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|219|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|219|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|208|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|205|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|192|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|171|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|178|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|164|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|172|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|157|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|173|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|152|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|173|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|151|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|147|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|148|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|134|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|141|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|133|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|153|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|147|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|148|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|128|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|121|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|115|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|136|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|122|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|109|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|90|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|109|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|79|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|96|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|106|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|96|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|91|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|83|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|90|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|77|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|104|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|93|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|87|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|72|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|90|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|84|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|78|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|74|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|81|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|70|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|62|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|63|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|73|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|71|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|64|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|64|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|69|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|64|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|63|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|68|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|63|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|56|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|47|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|45|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|48|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|46|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|48|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|54|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|55|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|60|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|36|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|43|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|34|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|42|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|42|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|40|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|36|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|33|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|27|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|29|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|27|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|30|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|18|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|27|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|26|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|28|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|31|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|18|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|35|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|21|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|29|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|25|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|18|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|17|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|18|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|17|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|14|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|13|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|17|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|14|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|17|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|13|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|13|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|13|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|13|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|14|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|12|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 + + + + YES + 1375 + 345.6192936348 + 0 + 192.74034885003 + 100 + + + + + YES + 2489 + 1181.3571698589 + 0 + 658.69705234006 + 100 + + + diff --git a/tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif.aux.xml b/tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif.aux.xml new file mode 100644 index 00000000..a13ba65d --- /dev/null +++ b/tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif.aux.xml @@ -0,0 +1,13 @@ + + + ndvi + + YES + 1 + 0.61221451996478 + -1 + 0.25565039996541 + 99.81 + + + diff --git a/tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndwi.tif.aux.xml b/tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndwi.tif.aux.xml new file mode 100644 index 00000000..2426f943 --- /dev/null +++ b/tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndwi.tif.aux.xml @@ -0,0 +1,13 @@ + + + ndwi + + YES + 1 + 0.07782893108487 + -1 + 0.20913287882555 + 99.97 + + + diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R1.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R1.tif new file mode 100644 index 00000000..9e442f78 Binary files /dev/null and b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R1.tif differ diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R1.tif.aux.xml b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R1.tif.aux.xml new file mode 100644 index 00000000..005f48ed --- /dev/null +++ b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R1.tif.aux.xml @@ -0,0 +1,12 @@ + + + + YES + 11 + 0.051419031719533 + 0 + 0.75031022390201 + 100 + + + diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R2.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_CLM_R2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DFP_R1.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DFP_R1.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DFP_R2.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DFP_R2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D01.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D01.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D02.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D02.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D03.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D03.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D04.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D04.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D05.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D05.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D06.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D06.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D07.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R1-D07.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D01.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D01.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D02.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D02.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D03.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D03.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D04.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D04.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D05.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D05.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D06.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D06.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D07.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_DTF_R2-D07.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R1.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R1.tif new file mode 100644 index 00000000..02bde188 Binary files /dev/null and b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R1.tif differ diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R2.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_EDG_R2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_IAB_R1.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_IAB_R1.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_IAB_R2.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_IAB_R2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MG2_R1.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MG2_R1.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MG2_R2.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MG2_R2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R1.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R1.tif new file mode 100644 index 00000000..02bde188 Binary files /dev/null and b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R1.tif differ diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R2.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/MASKS/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SAT_R2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_ATB_R1.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_ATB_R1.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_ATB_R2.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_ATB_R2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B11.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B11.tif new file mode 100644 index 00000000..c791e6e1 Binary files /dev/null and b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B11.tif differ diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B12.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B12.tif new file mode 100644 index 00000000..52dcf977 Binary files /dev/null and b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B12.tif differ diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B2.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B2.tif new file mode 100644 index 00000000..54659d66 Binary files /dev/null and b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B2.tif differ diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B3.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B3.tif new file mode 100644 index 00000000..094ac9d0 Binary files /dev/null and b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B3.tif differ diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B4.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B4.tif new file mode 100644 index 00000000..de5e4d73 Binary files /dev/null and b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B4.tif differ diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B5.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B5.tif new file mode 100644 index 00000000..118b17a7 Binary files /dev/null and b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B5.tif differ diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B6.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B6.tif new file mode 100644 index 00000000..ecef0018 Binary files /dev/null and b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B6.tif differ diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B7.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B7.tif new file mode 100644 index 00000000..06f652e8 Binary files /dev/null and b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B7.tif differ diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8.tif new file mode 100644 index 00000000..e5ad82c3 Binary files /dev/null and b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8.tif differ diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8A.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8A.tif new file mode 100644 index 00000000..195221f8 Binary files /dev/null and b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_FRE_B8A.tif differ diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MTD_ALL.xml b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_MTD_ALL.xml new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_QKL_ALL.jpg b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_QKL_ALL.jpg new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B11.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B11.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B12.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B12.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B2.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B2.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B3.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B3.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B4.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B4.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B5.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B5.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B6.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B6.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B7.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B7.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B8.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B8.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B8A.tif b/tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D_V1-9_SRE_B8A.tif new file mode 100644 index 00000000..e69de29b diff --git a/tests/tests_data/listing.lst b/tests/tests_data/listing.lst deleted file mode 100644 index 9e0cb52a..00000000 --- a/tests/tests_data/listing.lst +++ /dev/null @@ -1,2 +0,0 @@ -tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D.zip -tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D.zip \ No newline at end of file diff --git a/tests/tests_data/listing2.lst b/tests/tests_data/listing2.lst deleted file mode 100644 index 06bd2841..00000000 --- a/tests/tests_data/listing2.lst +++ /dev/null @@ -1,2 +0,0 @@ -tests/tests_data/SENTINEL2A_20180928-105515-685_L2A_T30TYP_D-ndvi.tif -tests/tests_data/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif \ No newline at end of file diff --git a/tests/tests_data/listing3.lst b/tests/tests_data/listing3.lst deleted file mode 100644 index ad3fcea2..00000000 --- a/tests/tests_data/listing3.lst +++ /dev/null @@ -1 +0,0 @@ -tests/tests_data/tif_file.tif \ No newline at end of file diff --git a/tests/tests_data/toulouse-mnh.tif.aux.xml b/tests/tests_data/toulouse-mnh.tif.aux.xml new file mode 100644 index 00000000..6968d3d2 --- /dev/null +++ b/tests/tests_data/toulouse-mnh.tif.aux.xml @@ -0,0 +1,12 @@ + + + + YES + 32.209167480469 + 9.0679823683006 + 0 + 7.4556902981363 + 100 + + + diff --git a/tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi-speed-20180928-105515.tif.aux.xml b/tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi-speed-20180928-105515.tif.aux.xml new file mode 100644 index 00000000..a8197cd3 --- /dev/null +++ b/tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi-speed-20180928-105515.tif.aux.xml @@ -0,0 +1,12 @@ + + + + YES + 7.8837473438398e-07 + -7.1865608120041e-09 + -5.2414594620132e-07 + 7.8307756931692e-08 + 99.19 + + + diff --git a/tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif.aux.xml b/tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif.aux.xml new file mode 100644 index 00000000..7abe2759 --- /dev/null +++ b/tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndvi.tif.aux.xml @@ -0,0 +1,13 @@ + + + ndvi + + YES + 0.96573877334595 + 0.59627199385341 + -0.6805807352066 + 0.22579322397076 + 99.19 + + + diff --git a/tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndwi-speed-20180928-105515.tif.aux.xml b/tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndwi-speed-20180928-105515.tif.aux.xml new file mode 100644 index 00000000..65cffd34 --- /dev/null +++ b/tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndwi-speed-20180928-105515.tif.aux.xml @@ -0,0 +1,12 @@ + + + + YES + 7.6261477488515e-07 + 2.7129107911287e-09 + -5.4892882417334e-07 + 7.3487477525606e-08 + 99.34 + + + diff --git a/tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndwi.tif.aux.xml b/tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndwi.tif.aux.xml new file mode 100644 index 00000000..b4d86abe --- /dev/null +++ b/tests/tests_refs/test_radioindice/SENTINEL2B_20181023-105107-455_L2A_T30TYP_D-ndwi.tif.aux.xml @@ -0,0 +1,13 @@ + + + ndwi + + YES + 0.72645741701126 + 0.085357088192938 + -0.67339098453522 + 0.18757795462695 + 99.16 + + + diff --git a/tests/tests_refs/test_tiling/tif_file_tile77.tif.aux.xml b/tests/tests_refs/test_tiling/tif_file_tile77.tif.aux.xml new file mode 100644 index 00000000..ded0adb7 --- /dev/null +++ b/tests/tests_refs/test_tiling/tif_file_tile77.tif.aux.xml @@ -0,0 +1,78 @@ + + + + + -0.4999856626713311 + 34873.49998566267 + 34874 + 0 + 0 + 1201|0|0|0|0|0|0|0|0|0|24|0|0|33|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|121|0|24|0|0|0|0|0|14|14|0|0|21|0|0|3|12|2|1|6|1|0|1|1|0|1|0|0|11|9|11|0|0|1|0|1|5|1|0|0|0|1|0|0|0|0|0|0|0|0|1|2|7|0|0|0|0|0|0|0|0|0|0|0|0|21|4|14|7|29|23|9|11|38|19|54|74|71|85|136|132|145|189|200|330|233|260|273|332|303|346|378|383|371|378|385|418|388|400|456|449|448|471|459|481|483|497|506|517|506|512|525|529|569|598|544|583|585|604|560|603|628|614|553|640|619|691|614|666|698|657|642|696|732|690|717|724|743|696|669|739|701|666|737|658|688|792|742|729|731|678|692|733|731|661|717|772|761|757|749|760|771|755|763|760|788|706|726|736|775|742|851|739|748|812|726|792|773|744|791|748|668|710|745|746|788|752|703|744|755|812|707|723|759|842|778|758|775|784|743|735|795|804|815|780|782|812|870|856|807|832|802|822|893|840|855|830|886|838|911|829|891|868|883|898|871|861|865|907|928|890|895|898|909|878|855|950|938|904|908|879|870|936|955|928|831|915|898|950|893|896|888|855|800|896|872|935|874|818|866|829|886|813|821|824|829|807|798|818|836|837|818|815|831|820|769|831|804|777|780|735|806|811|782|833|758|703|751|796|744|756|773|747|726|748|742|714|693|672|666|700|699|706|691|697|704|658|685|710|692|691|736|694|710|639|681|723|685|694|670|669|691|621|645|647|674|591|684|617|623|651|585|573|632|619|610|656|601|616|629|624|576|567|569|594|570|553|530|537|490|566|474|515|526|483|464|476|492|473|447|453|457|493|472|465|416|422|406|459|411|421|404|397|362|417|407|410|391|363|399|371|361|371|338|355|323|315|311|343|338|326|320|326|318|314|295|286|312|323|289|315|291|290|285|304|269|253|270|307|260|260|250|275|259|256|235|245|231|212|261|257|224|208|217|202|233|253|228|252|231|203|263|211|222|220|226|186|205|223|173|198|202|183|186|207|186|204|176|186|154|167|182|177|188|179|204|176|182|189|188|150|172|173|175|167|155|128|163|164|144|144|153|123|145|144|144|160|144|156|161|165|138|135|117|160|147|158|134|141|134|141|146|130|154|148|124|130|137|139|126|116|111|124|138|149|135|131|126|120|115|131|123|133|135|126|127|106|138|100|120|127|112|117|110|121|125|106|96|147|110|136|114|87|106|100|114|112|106|85|100|116|113|82|104|107|129|96|95|121|84|100|82|96|106|94|98|87|91|103|88|92|79|75|93|92|96|104|108|82|69|100|99|73|62|70|89|93|79|83|79|79|68|89|85|67|64|81|75|68|71|84|57|63|79|73|62|75|58|69|54|69|72|67|64|66|75|52|70|63|45|61|58|63|54|63|49|53|64|59|76|55|53|61|54|57|62|54|57|74|67|51|51|58|53|31|44|52|59|42|42|53|44|34|53|43|71|48|49|47|47|47|43|58|43|44|44|47|37|49|52|31|42|46|49|32|47|54|53|53|45|60|42|44|47|48|34|44|44|44|27|46|30|51|47|44|35|53|49|32|34|50|52|46|45|57|29|38|41|36|40|46|41|37|48|31|36|50|34|32|31|48|40|56|41|52|33|28|39|24|39|44|45|44|37|25|32|51|36|42|35|51|45|43|28|40|52|43|40|31|33|41|24|38|47|40|50|37|38|25|32|28|31|25|30|32|33|37|24|36|32|37|29|31|32|24|26|32|24|32|31|19|32|32|32|25|33|20|31|24|28|26|16|23|17|22|24|32|23|22|24|17|23|33|17|32|25|21|25|12|18|23|29|26|15|29|20|34|26|17|26|21|18|23|22|21|24|32|26|30|26|17|14|22|24|20|22|18|25|26|23|15|23|11|29|23|20|23|23|21|24|11|23|26|25|23|14|20|17|25|20|29|14|25|12|18|24|24|19|18|22|21|28|17|20|19|25|17|21|20|13|15|21|16|20|15|16|15|12|19|17|12|11|12|19|15|12|22|15|17|18|28|28|20|13|30|13|10|20|10|26|15|14|18|26|25|13|24|13|9|15|20|15|25|12|7|13|10|8|15|20|6|18|18|13|15|9|13|12|13|15|16|15|14|13|21|13|8|24|13|18|14|13|7|18|14|21|25|19|29|15|11|20|16|12|20|20|11|18|12|14|8|22|9|21|12|21|18|15|24|15|16|8|21|14|15|15|20|15|14|22|21|14|20|20|17|16|14|17|16|13|10|15|14|21|20|17|15|18|20|25|11|21|17|22|21|11|23|16|13|12|20|17|20|18|6|15|12|12|17|27|17|12|19|18|21|13|27|12|24|14|13|19|22|12|26|29|23|18|25|15|8|17|17|18|16|16|19|21|17|23|14|18|13|14|21|18|9|23|13|16|11|15|17|13|11|19|16|10|17|14|15|17|13|10|9|14|14|18|7|13|18|11|20|16|15|18|18|20|12|17|9|10|13|9|15|14|11|17|18|19|14|14|18|22|12|23|12|16|11|14|26|19|21|14|23|13|18|20|20|15|15|21|18|22|10|9|7|11|16|14|24|14|9|7|13|18|12|13|12|14|20|10|13|19|12|15|15|19|11|10|9|14|14|6|17|9|16|12|15|19|16|12|12|10|17|14|8|15|17|12|14|8|15|9|14|5|5|16|6|16|13|17|12|5|6|16|18|4|8|12|16|8|16|14|13|13|12|10|11|7|18|12|7|6|11|14|11|10|11|10|15|7|12|10|12|9|8|17|10|8|8|14|12|11|12|7|7|8|6|9|15|6|11|12|13|13|9|10|6|12|7|5|9|8|8|14|9|13|4|10|13|6|10|8|8|10|16|7|13|8|8|8|8|14|7|11|9|11|11|8|9|7|10|7|16|12|12|6|12|11|10|5|11|8|7|5|4|19|10|6|6|12|8|5|15|10|8|4|5|10|10|9|16|10|5|6|11|12|10|4|9|7|8|8|16|6|4|10|2|6|5|3|7|1|3|8|10|9|3|8|9|11|6|10|4|5|4|7|7|9|5|3|6|4|7|5|2|5|4|7|5|6|6|4|5|5|6|5|4|6|3|7|5|4|8|3|5|3|5|2|7|1|3|5|3|4|0|3|5|2|0|3|3|1|6|2|1|3|1|2|2|5|2|3|7|5|0|5|4|4|2|7|5|5|1|4|1|7|3|3|5|3|1|7|2|4|3|3|2|1|5|4|4|5|3|5|4|2|1|1|6|5|0|6|0|3|1|0|0|0|3|5|1|1|5|1|3|4|1|3|1|5|4|4|0|1|4|3|1|7|6|1|4|3|5|3|4|3|3|0|3|5|3|0|0|0|4|0|1|1|2|0|2|0|1|1|0|4|1|0|0|0|1|0|1|0|2|1|4|0|1|1|2|2|2|0|4|2|0|3|1|2|2|1|0|1|0|1|1|1|0|3|0|1|1|0|0|0|0|0|4|0|1|0|1|2|4|1|2|1|2|0|0|3|0|2|1|0|0|1|0|1|2|0|0|0|1|2|0|0|2|2|1|1|0|3|1|2|0|3|0|0|2|0|0|1|0|0|0|0|2|1|0|0|0|0|0|0|0|1|1|0|2|2|0|0|2|0|0|0|0|0|0|0|0|0|1|2|0|0|0|0|0|0|0|0|0|0|1|1|0|1|0|1|0|0|0|1|0|0|2|0|2|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|1|1|1|0|0|0|0|1|0|1|1|1|0|0|0|0|1|0|0|0|1|2|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 + + + + 34873 + 334.9712583612 + 0 + 223.09786024491 + 100 + + + + + + -0.4999798646907216 + 24831.49997986469 + 24832 + 0 + 0 + 1201|0|0|0|0|0|0|0|0|0|24|0|0|27|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|121|0|22|0|0|0|0|0|12|11|0|0|14|0|0|10|14|4|4|3|2|0|2|0|3|0|0|0|8|13|8|0|0|0|1|2|7|0|0|0|0|1|0|0|1|1|0|0|0|0|2|0|8|0|0|1|0|0|0|0|0|0|0|0|0|31|8|7|11|31|8|15|4|18|0|8|12|10|11|19|5|0|16|10|36|6|0|0|1|6|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|1|1|1|0|3|0|0|0|0|0|3|0|0|0|0|0|0|0|0|2|1|0|0|0|1|2|2|1|2|2|3|6|10|13|27|20|36|64|50|73|116|131|137|176|186|216|278|305|309|314|327|379|443|418|417|400|407|436|501|556|464|538|486|501|548|565|538|545|583|590|603|615|640|600|658|609|669|621|646|704|662|726|661|714|644|685|734|695|720|669|758|747|712|687|742|754|792|804|788|818|836|770|809|802|831|808|837|814|849|796|851|860|857|896|875|826|885|855|827|849|903|831|881|960|854|908|889|933|875|972|951|919|921|925|982|935|1037|970|1055|1062|1047|1045|1055|1056|1068|1162|1095|1116|1203|1117|1168|1138|1185|1199|1233|1207|1108|1163|1119|1285|1147|1264|1156|1279|1265|1255|1280|1264|1367|1260|1209|1311|1246|1306|1235|1233|1253|1240|1278|1252|1251|1221|1121|1186|1118|1168|1180|1109|1157|1224|1111|1118|1059|1079|1076|1088|1076|1147|1023|1049|1065|984|1022|1017|1027|1053|954|1049|1023|944|973|911|878|983|873|933|871|912|884|864|911|861|887|880|813|847|823|875|801|772|839|755|823|817|805|758|758|797|800|769|716|789|778|787|768|713|742|742|711|710|744|777|718|683|676|719|714|641|672|640|701|697|637|662|652|621|642|573|601|618|660|615|582|565|565|572|569|542|542|546|527|497|474|473|503|475|518|479|466|456|465|475|399|432|441|448|364|397|424|433|441|423|421|361|389|376|329|354|348|361|316|339|329|296|319|316|335|296|265|275|270|293|264|257|233|294|253|237|259|256|232|238|225|238|209|238|244|230|233|246|226|196|232|220|212|209|189|216|196|197|195|203|175|190|176|164|208|167|181|166|156|175|176|156|154|145|150|167|162|174|170|142|140|163|160|137|163|161|123|127|162|135|130|152|105|132|116|138|131|139|117|133|132|127|123|113|117|118|124|136|110|108|124|138|139|120|109|106|134|118|123|108|103|133|116|105|124|104|105|86|91|114|108|121|106|100|118|104|95|90|109|107|90|111|111|107|91|100|92|103|103|89|88|110|86|92|84|72|80|95|80|86|88|105|90|73|100|97|68|78|77|108|91|78|93|79|104|78|91|95|88|78|95|67|60|97|77|106|74|54|70|68|77|78|84|78|70|74|79|66|60|71|64|77|63|55|58|65|70|61|61|69|54|67|54|71|59|56|48|59|71|56|53|76|61|47|52|44|52|66|56|58|63|59|58|41|55|65|56|38|49|58|47|49|57|54|50|45|60|49|52|44|57|35|47|61|48|52|45|38|48|55|44|42|38|40|58|37|44|44|52|40|39|33|36|32|41|35|33|46|47|52|45|43|39|63|48|37|32|35|35|41|45|35|42|30|25|30|36|28|34|25|24|46|40|42|38|28|40|33|48|37|46|41|34|38|28|29|46|31|33|30|31|33|28|33|43|34|23|43|35|29|32|47|32|36|28|28|22|35|39|24|16|24|27|29|38|26|23|31|23|23|33|22|28|29|35|33|16|13|23|21|21|24|27|28|30|29|16|23|18|21|20|23|23|26|24|23|19|25|20|19|14|31|24|19|20|23|21|26|20|19|26|29|20|18|18|23|22|23|19|24|22|18|22|17|21|13|30|23|16|34|31|20|27|19|16|23|31|19|25|23|25|18|14|11|17|22|28|16|13|27|19|17|22|17|24|16|23|29|13|14|18|21|17|21|21|7|22|18|23|19|23|21|8|21|18|16|10|18|23|16|23|15|23|10|18|11|25|16|13|19|16|9|18|20|12|17|13|20|31|22|14|11|12|8|17|16|19|18|25|11|12|16|26|24|16|10|29|11|18|12|19|20|16|15|11|34|31|26|23|16|15|12|18|12|15|17|23|7|16|13|13|17|14|15|7|12|13|10|15|13|16|14|12|20|15|13|8|10|8|17|22|17|10|10|9|17|7|15|14|12|14|10|19|12|22|10|18|16|12|7|10|13|7|16|12|19|13|18|17|11|12|21|14|8|19|17|24|18|14|19|23|19|9|13|22|21|13|22|22|20|14|14|24|15|13|16|13|18|16|13|23|17|10|16|14|10|16|7|18|23|28|15|11|21|22|23|12|14|10|11|17|20|20|16|18|15|17|16|17|17|29|20|15|25|16|19|17|16|14|20|19|13|24|7|12|14|13|22|12|17|19|16|23|13|11|16|24|20|19|13|20|11|11|6|17|29|14|17|12|22|11|18|8|21|16|6|13|15|15|11|24|16|22|16|17|14|20|16|23|20|16|17|25|8|14|14|12|18|13|13|16|17|20|11|17|14|12|13|15|20|16|10|19|17|10|14|15|3|20|12|17|13|10|5|18|16|11|15|20|8|14|15|26|22|10|18|8|10|15|11|16|24|10|4|9|16|14|11|12|20|12|20|5|10|7|10|13|13|10|15|13|10|15|15|19|15|7|16|19|8|18|12|15|17|9|6|6|7|15|8|17|12|11|18|12|14|11|7|13|4|9|12|13|27|13|13|16|5|16|9|16|18|17|6|6|4|17|14|7|18|15|21|8|17|3|3|18|14|13|13|8|6|9|8|17|11|15|8|16|6|16|14|6|3|13|11|10|11|9|6|9|11|17|4|15|13|5|5|20|10|7|12|11|12|17|13|9|2|12|5|7|11|6|7|8|9|6|17|6|10|4|8|15|11|12|8|8|7|8|11|11|12|14|12|12|10|11|5|8|7|5|10|10|6|9|4|12|15|8|13|10|8|8|9|5|4|7|10|5|10|5|12|8|7|14|10|12|3|10|7|8|8|5|5|10|9|14|12|3|8|2|12|6|7|12|9|6|5|5|4|3|6|3|7|7|5|7|6|10|4|1|6|8|2|5|3|2|5|6|6|5|1|1|5|5|5|0|4|5|4|6|10|7|2|1|5|5|2|7|5|4|8|3|4|5|6|5|0|3|3|1|7|3|3|3|5|5|4|0|2|5|2|1|4|0|1|4|4|7|1|3|6|2|3|4|2|7|5|2|7|6|2|3|7|1|4|0|2|6|2|6|5|1|2|2|4|0|4|2|6|10|4|1|5|5|1|3|1|5|2|7|3|1|3|6|2|1|3|4|2|2|5|2|1|4|1|3|7|2|3|2|0|5|6|0|2|1|0|1|0|2|0|4|2|4|3|1|0|0|3|0|0|2|5|2|0|0|2|1|1|4|0|1|0|1|0|3|2|1|0|0|3|2|1|1|0|1|2|0|0|1|0|2|0|1|2|3|0|2|3|4|1|0|2|1|0|0|0|0|0|0|0|2|0|1|0|0|0|0|4|0|0|1|0|0|0|0|2|0|1|2|0|1|0|2|0|1|0|0|0|0|1|0|0|0|1|0|0|2|0|0|0|0|0|0|0|1|2|0|1|2|0|0|1|0|1|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|1|0|1|0|0|0|0|0|0|1|2|1|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|1|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|2|0|0|0|0|0|0|0|0|0|1|0|0|0|0|2|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 + + + + 24831 + 378.60835501053 + 0 + 183.62521317154 + 100 + + + + + + -0.4999071149916404 + 5382.499907114991 + 5383 + 0 + 0 + 1204|0|0|0|0|0|0|0|0|0|9|0|0|42|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|109|0|20|0|0|0|0|0|12|10|0|0|15|0|0|3|18|4|3|2|2|0|3|0|2|0|0|0|13|16|13|0|0|1|2|2|3|2|0|0|0|2|0|0|2|0|0|0|0|0|0|3|3|0|0|0|0|0|0|0|0|0|0|0|0|37|6|15|11|31|14|18|5|24|0|6|17|8|16|13|4|0|15|13|19|7|0|1|1|2|1|2|0|1|0|0|0|1|0|0|0|3|1|1|1|1|0|2|3|2|1|2|4|0|1|3|0|0|2|3|3|1|1|0|1|1|5|2|5|4|3|2|1|2|2|1|0|1|0|3|2|4|2|5|1|2|2|2|2|2|2|0|3|5|1|1|1|1|2|2|0|5|1|2|1|1|0|1|1|0|5|4|1|1|4|0|2|2|4|3|3|4|3|2|3|1|2|5|2|2|5|2|3|0|4|1|4|3|7|3|5|2|2|2|2|3|3|5|6|2|3|3|7|5|3|1|4|10|5|6|9|6|5|8|5|4|8|3|3|9|7|10|5|6|5|12|10|4|5|4|10|4|9|8|10|19|23|29|34|41|60|87|106|120|164|201|231|287|338|353|358|462|471|515|475|581|583|614|618|710|767|792|826|822|820|908|946|869|933|930|1007|989|1014|1026|1109|1080|1132|1114|1138|1094|1202|1273|1214|1211|1288|1275|1260|1214|1289|1339|1323|1341|1354|1327|1316|1338|1272|1319|1309|1338|1352|1322|1420|1373|1476|1382|1408|1415|1415|1444|1403|1466|1512|1582|1500|1498|1423|1531|1493|1508|1473|1569|1543|1569|1560|1488|1551|1507|1512|1533|1538|1523|1434|1455|1441|1483|1307|1384|1379|1355|1397|1302|1264|1220|1204|1231|1184|1139|1162|1184|1099|1149|1130|1074|1127|1117|1122|1046|1024|1058|1113|1079|1014|1050|1009|965|1068|1002|989|1055|999|969|941|903|968|990|961|980|868|918|939|878|872|865|894|823|887|874|883|819|850|811|829|853|806|881|845|801|921|824|795|837|790|852|784|785|813|747|796|807|773|784|794|809|748|716|729|751|745|729|753|704|770|735|728|728|721|664|714|628|694|668|667|661|648|644|635|641|637|636|567|613|577|618|598|560|606|531|509|491|519|512|481|514|439|484|456|448|454|440|425|426|399|403|388|437|420|404|367|340|365|360|354|344|347|320|320|330|311|325|288|267|311|312|277|280|273|303|301|268|262|273|258|234|256|250|226|200|230|246|214|189|201|201|225|210|213|208|194|171|194|178|198|184|218|166|187|174|172|186|175|180|160|173|158|150|181|173|148|151|148|158|136|143|137|175|135|144|147|123|136|109|130|127|124|151|143|130|113|116|129|151|122|116|131|122|120|133|148|132|111|117|117|131|120|104|136|128|122|106|111|110|91|98|116|122|113|132|102|113|104|103|100|98|115|103|122|99|91|101|86|98|87|79|92|106|93|103|88|80|85|97|89|98|87|75|83|101|79|74|75|81|89|78|70|69|72|87|72|75|86|94|61|98|77|77|84|68|62|80|84|63|100|77|65|56|67|79|67|71|50|57|55|70|58|65|63|70|55|52|69|76|52|50|52|62|69|58|65|59|52|78|47|68|55|65|45|72|53|62|56|59|55|78|61|68|62|60|53|67|53|49|45|60|60|54|73|53|56|42|55|52|70|40|70|43|57|53|35|48|52|42|44|52|60|49|59|41|42|48|42|42|38|37|31|33|40|49|52|44|43|45|38|27|44|31|34|33|40|36|48|50|42|36|34|44|32|44|35|25|38|38|40|35|37|41|24|38|23|29|37|30|43|25|26|39|27|32|24|18|25|27|23|30|37|31|24|33|36|27|27|18|29|30|23|18|27|29|27|25|25|29|29|19|25|16|19|22|18|13|20|12|27|16|24|28|28|20|20|16|28|28|30|30|16|17|18|28|21|26|25|28|21|15|10|23|19|32|21|13|25|24|18|27|19|28|28|30|39|16|15|23|27|10|23|24|20|19|22|20|25|15|30|12|14|13|20|23|19|19|27|16|19|20|17|15|22|13|16|13|16|15|10|22|14|15|14|13|20|14|19|25|17|19|24|28|19|10|16|26|13|14|12|20|19|20|15|21|17|22|17|15|15|26|16|28|11|27|18|21|14|11|13|18|19|19|18|16|23|18|15|23|12|19|16|18|17|18|20|10|14|17|26|18|10|21|10|19|18|16|19|18|14|10|13|23|17|27|19|22|16|15|13|20|17|14|24|12|17|20|20|14|17|17|10|17|12|12|13|17|5|9|15|27|14|10|16|18|14|14|17|22|11|26|15|9|23|18|28|29|16|12|14|17|22|19|17|14|10|13|14|14|27|15|19|15|14|18|25|18|9|17|22|18|14|16|16|19|19|16|18|24|22|17|28|15|22|17|23|18|19|26|16|19|15|26|17|19|19|15|15|13|20|19|20|20|22|19|23|16|15|9|15|18|21|22|11|15|26|14|20|19|16|15|5|15|11|15|16|15|14|17|21|9|19|21|18|19|18|8|20|10|20|9|27|13|14|15|19|20|26|16|26|14|14|15|17|16|14|19|12|15|16|12|20|15|22|14|21|16|18|16|9|11|12|22|23|16|11|17|22|21|14|17|9|13|9|22|9|16|19|15|13|21|11|16|14|13|17|11|14|13|20|13|11|13|16|10|20|16|12|19|19|10|9|12|15|11|7|16|16|18|11|10|8|11|16|13|14|14|10|19|6|15|15|13|10|17|18|14|13|19|12|15|10|13|10|18|5|14|22|10|10|14|9|13|12|5|17|14|13|20|10|12|9|10|6|8|14|7|12|17|14|11|11|12|11|10|13|10|22|10|18|13|6|8|22|8|11|12|14|9|15|18|6|14|7|9|13|7|11|7|10|8|8|10|16|13|16|19|4|14|4|10|17|10|14|12|13|11|7|15|15|10|10|5|10|12|6|3|10|10|6|14|11|11|5|12|4|10|13|4|20|10|6|9|11|11|9|9|5|10|10|3|8|10|9|10|9|3|4|8|16|11|6|7|10|8|7|8|13|12|14|9|5|6|8|8|7|7|8|5|8|8|5|3|4|11|6|9|6|9|13|4|4|5|8|2|5|7|11|6|7|5|5|6|1|4|8|5|5|4|4|8|4|3|1|5|9|5|4|3|13|1|2|2|3|3|5|2|9|7|9|4|1|3|3|2|6|6|4|2|4|3|8|5|4|1|5|4|5|9|2|5|4|1|2|4|2|7|2|1|5|7|2|3|4|3|2|4|4|5|10|3|1|3|6|1|5|4|3|3|2|3|2|4|2|2|4|3|2|5|4|4|1|7|3|5|8|8|3|0|3|5|4|2|6|4|0|1|2|1|1|3|1|2|2|3|3|2|3|2|0|2|2|4|4|2|0|0|7|0|0|1|2|3|5|0|1|0|2|0|2|1|0|1|0|1|0|2|0|2|0|2|0|0|1|1|0|1|0|0|2|0|2|0|0|1|1|2|1|0|3|0|1|4|0|0|0|0|0|2|3|0|0|3|2|0|0|2|1|1|0|0|0|0|1|0|0|1|0|0|0|1|0|0|0|1|0|1|0|2|0|0|0|0|0|1|1|0|0|0|0|1|1|0|0|0|0|1|1|0|0|0|1|0|0|1|2|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 + + + + 5382 + 435.74953161774 + 0 + 161.65474914655 + 100 + + + + + + -0.4999923704890517 + 65534.49999237049 + 65535 + 0 + 0 + 9500|10|141|46|2|0|0|1|1|0|94|4|7|230|0|1|0|0|0|1|32|0|0|0|22|0|0|2|0|0|1|1|543|4|164|5|1|1|0|6|56|54|0|0|95|7|1|46|56|18|12|22|5|4|10|5|5|2|6|2|53|77|54|1|1|8|9|29|22|10|9|2|8|15|11|5|21|18|14|21|36|18|35|54|51|43|49|45|47|60|51|36|49|32|35|21|55|193|82|149|118|293|103|93|55|223|55|61|178|103|130|198|95|47|163|173|263|103|48|53|53|67|33|44|38|37|52|33|41|54|59|49|47|49|54|61|42|57|35|43|50|45|48|48|48|60|54|55|52|53|46|38|57|55|52|53|51|76|43|52|46|76|67|53|53|57|58|68|58|72|62|58|53|63|50|48|62|62|69|57|82|64|92|78|89|90|96|69|64|112|93|112|156|139|145|142|159|169|180|207|182|218|233|223|242|228|241|294|267|261|286|298|356|329|310|321|337|399|366|366|326|380|393|330|373|424|401|345|393|386|375|410|354|394|423|392|399|405|377|404|448|421|381|435|449|464|457|436|407|424|430|419|455|437|463|450|610|452|500|498|484|537|475|470|465|490|455|530|489|498|481|559|517|492|553|554|502|551|545|573|544|572|532|559|578|596|558|573|589|608|591|657|605|640|685|647|645|735|684|645|670|679|657|659|673|761|706|725|708|754|747|761|813|771|810|752|772|859|768|773|796|813|855|830|796|839|817|762|802|771|782|785|701|718|744|800|754|724|786|758|761|727|723|719|692|735|666|696|667|770|666|636|581|642|596|632|645|646|637|567|652|649|635|603|595|623|617|561|630|609|615|610|617|612|597|619|620|591|637|619|527|578|640|636|577|646|631|645|672|528|620|604|589|592|680|628|620|642|569|562|584|625|579|574|546|594|591|560|529|550|623|531|587|569|502|522|541|498|508|554|545|517|527|529|493|492|529|492|536|544|479|500|490|480|445|440|470|438|463|449|471|433|420|447|431|419|415|433|391|419|418|387|339|389|374|358|385|366|337|367|333|332|366|394|365|335|344|356|358|339|305|349|301|308|313|310|328|336|348|305|309|309|320|311|337|302|303|316|312|284|280|298|278|319|304|269|255|293|293|297|277|305|289|285|238|261|305|291|290|283|274|269|421|295|250|268|258|277|265|302|244|302|248|252|307|245|246|257|265|275|272|285|275|242|277|249|278|273|254|263|244|241|231|255|257|258|270|214|297|275|233|247|215|244|248|247|241|217|234|246|231|219|250|252|216|247|237|234|282|227|235|226|227|197|231|193|210|210|215|249|226|220|254|196|231|205|208|223|219|212|187|212|166|241|226|225|190|191|200|215|214|252|214|168|193|200|217|204|198|196|193|188|184|183|204|204|203|198|185|222|175|211|173|195|189|183|182|170|211|193|192|207|175|173|169|199|170|184|192|174|183|203|168|184|171|165|175|201|169|199|178|167|194|160|169|164|166|162|174|194|152|147|159|189|154|186|144|159|171|178|160|149|137|144|177|201|185|160|136|170|152|161|185|146|158|153|144|153|138|147|164|149|145|152|125|141|140|136|137|145|160|133|146|126|145|131|143|163|143|134|135|131|153|176|145|144|152|129|136|156|131|145|122|152|140|130|137|144|134|116|148|151|135|133|140|128|127|134|128|114|145|114|124|115|147|126|136|156|134|122|115|133|124|164|140|118|120|130|139|132|126|127|132|130|118|116|109|117|150|136|124|113|126|130|135|129|102|134|124|126|114|147|118|114|107|126|118|135|97|134|115|125|120|123|109|106|130|106|92|124|109|118|108|113|93|109|105|101|116|108|96|103|109|104|99|90|81|138|93|87|126|105|95|105|88|112|114|94|82|102|107|103|130|95|99|96|111|81|84|90|92|103|80|88|82|87|90|87|91|85|80|80|84|86|93|95|92|79|90|85|73|87|75|74|66|93|72|81|79|71|82|83|72|85|76|79|69|92|90|77|73|78|75|80|80|79|91|79|82|91|73|93|69|108|71|63|76|69|70|58|68|50|64|62|60|69|62|54|84|78|57|73|63|76|77|64|64|54|64|68|58|64|51|62|55|77|62|53|58|71|73|66|71|67|55|61|59|51|41|50|50|56|68|58|45|51|54|45|51|53|38|42|46|35|59|49|54|51|52|53|48|53|41|72|45|62|58|45|33|51|45|36|60|44|42|47|39|54|43|49|40|46|55|41|42|50|49|38|60|45|55|43|29|46|38|39|32|45|37|35|44|45|38|38|43|43|30|37|56|37|52|39|37|41|40|29|42|24|34|40|38|27|20|39|53|31|31|48|31|37|35|54|31|31|38|19|35|40|40|31|31|28|25|34|30|33|28|32|29|19|33|29|29|39|36|25|37|32|31|40|30|24|26|25|35|41|29|32|23|24|29|23|22|26|33|27|24|28|28|29|35|12|30|27|24|25|47|20|17|23|19|23|27|30|15|21|33|22|31|39|32|39|23|32|22|27|27|28|35|23|26|29|24|21|23|25|23|22|26|24|23|14|26|24|22|18|14|12|21|18|16|17|20|19|17|31|28|12|9|26|30|21|16|20|10|17|15|21|15|19|22|12|22|26|14|23|17|17|16|19|17|19|13|21|12|16|33|14|14|15|15|15|20|13|16|15|21|28|14|19|12|22|10|25|21|13|13|6|9|23|17|10|10|21|21|18|28|14|17|11|14|13|22|9|14|6|19|14|13|7|13|8|9|9|10|16|13|11|17|11|9|23|13|20|16|7|18|9|15|13|13|11|12|14|11|9|13|8|10|7|6|17|19|9|8|17|15|9|12|8|11|11|12|4|6|7|7|8|14|8|15|9|16|5|11|16|10|6|13|10|15|5|25|14|12|8|6|14|10|12|13|10|10|5|9|9|12|11|13|7|10|3|9|5|10|16|13|6|8|13|13|15|6|7|10|11|13|11|3|5|11|13|11|12|8|10|12|9|5|5|15|10|18|6|9|7|6|6|12|4|6|6|4|5|8|5|7|19|4|5|12|16|3|11|7|10|9|10|18|9|12|4|6|3|6|10|5|14|7|8|4|10|4|9|3|10|3|8|15|9|9|5|5|2|11|7|9|13|8|7|3|3|9|9|4|9|5|10|7|4|3|2|5|5|5|12|11|10|7|6|13|4|5|3|2|7|8|5|9|3|2|4|4|9|7|8|4|4|3|11|2|2|6|4|5|6|4|6|0|7|9|1|9|5|8|3|4|3|0|2|3|2|2|3|2|2|2|3|8|11|9|5|3|2|2|4|2|4|5|0|10|1|5|1|6|6|2|2|2|4|5|5|5|4|5|2|3|2|1|3|5|4|9|8|1|2|3|3|2|9|4|1|6|0|7|3|1|5|8|4|16|5|5|2|3|1|3|6|1|3|2|3|1|1|2|2|0|3|1|5|7|1|0|3|1|8|2|2|3|7|4|5|2|1|4|0|7|0|5|2|3|0|3|0|1|0|2|5|1|6|4|2|1|4|2|2|5|1|2|1|1|1|1|3|1|1|3|1|5|2|2|4|2|2|1|3|2|3|1|2|2|2|0|1|4|4|0|1|2|2|0|0|0|2|0|0|0|0|1|1|1|2|2|0|3|2|2|0|7|2|0|2|2|0|1|0|0|1|2|3|0|2|1|2|4|0|0|3|2|4|4|3|2|3|0|1|6|2|3|0|1|0|0|3|0|2|1|0|0|1|0|1|2|2|2|1|2|2|0|1|2|0|0|0|0|3|0|4|2|2|2|1|1|0|4|0|1|0|1|0|2|0|0|2|2|1|2|1|1|4|1|3|0|0|0|1|1|0|0|0|2|0|2|0|1|1|1|1|1|0|0|0|0|0|0|1|0|0|0|0|2|1|0|0|0|1|2|0|0|0|0|2|1|0|0|0|0|0|0|1|1|2|0|0|0|0|1|1|0|0|0|1|0|2|2|1|1|1|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|1|0|0|0|0|0|1|0|0|0|1|0|0|2|0|0|1|1|0|0|0|0|1|0|0|1|0|0|0|0|0|2|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|2|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|2|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|8|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|2|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|1|0|1|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|13|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|1|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|3|2|1|6|0|0|0|0|0|1|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|1|0|0|0|1|1|0|0|0|0|0|0|0|1|1|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|1|1|1|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|1|1|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1817|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|1|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|1|0|0|0|1|0|0|0|1|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|1|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|7|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|3|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|1|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|2|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|1|2|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|1|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|1|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|1|10|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|27|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|1|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|23|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|1|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|31|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|2|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|1|1|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|4|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|1|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|24|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|1|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|1|0|0|1|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|3|0|0|4|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|0|2|0|0|0|0|1|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|1|1|1|2|1|0|1|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|2|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|1|1|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|1|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|4|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|2|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|1|0|1|0|0|6|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|1|1|0|0|0|8|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|1|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|1|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|2|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|1|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|10|0|0|1|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|6|0|0|0|1|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|1|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|1|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|1|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|4|1|1|1|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|2|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|1|0|0|1|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|32|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|7|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|4|5|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|4|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|11|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|1|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|2|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|3|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|15|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|25|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|8|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|3|1|2|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|3|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|4|0|0|1|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|14|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|2|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|5|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|6|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|4|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|3|1|0|0|0|1|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|1|0|0|1|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|1|5|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|10|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|1|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|2|1|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|16|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|1|1|0|1|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|1|1|1|1|0|0|1|0|0|0|1|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|36|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|35|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|1|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|54|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|1|0|0|0|0|1|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|3|0|0|1|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|6|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|4|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|5|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|7|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|5|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|1|0|0|0|0|0|0|0|0|1|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|1|0|0|0|0|0|16|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|1|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|4|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|1|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|9|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|1|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|2|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|1|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|31|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|32|1|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|6|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|1|5|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|3|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|2|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|5|1|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|3|0|0|0|0|0|0|0|0|0|0|0|4|0|0|0|0|0|0|0|20|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|4|0|0|2|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|17|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|8|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|1|0|0|0|0|13|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|1|1|0|0|0|0|0|0|9|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|1|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|2|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|1|1|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 + + + + 65534 + 798.73652910784 + 0 + 3695.1817920526 + 99.72 + + + diff --git a/tests/tests_refs/test_tiling/tif_file_tile93.tif.aux.xml b/tests/tests_refs/test_tiling/tif_file_tile93.tif.aux.xml new file mode 100644 index 00000000..f70e3da0 --- /dev/null +++ b/tests/tests_refs/test_tiling/tif_file_tile93.tif.aux.xml @@ -0,0 +1,68 @@ + + + + + -0.4999856626713311 + 34873.49998566267 + 34874 + 0 + 0 + 1050|0|0|0|0|0|0|0|0|0|15|0|0|45|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|98|0|15|0|0|0|0|4|7|14|0|0|20|0|0|5|17|12|9|7|2|1|3|2|1|1|1|0|14|6|14|0|0|2|1|0|9|2|0|0|0|0|0|0|0|0|0|0|2|0|0|0|10|0|0|0|0|0|0|0|1|1|0|0|0|22|14|8|22|37|5|9|1|18|0|9|21|17|20|34|22|26|52|38|62|52|64|69|91|80|129|134|136|141|181|206|182|243|266|256|299|331|297|329|332|358|350|358|399|424|384|409|464|474|477|451|459|477|519|516|539|552|565|555|560|593|579|574|570|602|501|573|546|578|496|547|617|578|591|614|625|568|613|579|605|613|577|594|613|564|589|644|630|611|624|606|621|680|647|660|629|609|680|655|644|670|645|713|729|660|667|637|690|666|697|672|724|701|752|711|692|716|725|715|778|702|772|743|749|835|822|795|814|862|797|830|821|838|832|888|863|866|872|957|894|898|957|945|904|931|957|954|934|1012|945|960|983|995|982|1043|996|1081|1024|1045|1042|1066|1036|1058|1083|1097|1096|1063|1021|1056|1173|1145|1141|1093|1187|1144|1038|1115|1146|1067|1017|1127|1135|1085|1054|982|1006|1083|1046|1028|969|998|928|902|943|971|980|917|909|870|868|848|878|805|838|794|777|844|795|788|833|780|757|736|804|757|727|784|724|707|767|705|764|691|761|750|677|712|731|735|719|619|650|721|721|629|632|698|677|702|676|683|630|626|645|640|624|661|666|600|638|687|574|610|662|549|591|566|551|585|554|553|589|584|565|554|556|586|517|557|532|609|563|508|579|504|522|498|528|494|462|466|493|489|512|463|473|467|461|492|409|477|469|456|434|451|430|445|454|416|451|463|424|431|439|422|406|416|438|439|416|440|416|409|376|395|395|371|325|366|361|343|347|298|325|337|303|331|337|337|301|308|302|303|309|275|335|299|288|291|283|274|267|231|247|264|231|257|219|189|210|220|246|246|241|217|231|258|218|236|207|219|181|194|207|201|213|220|204|207|197|206|213|231|187|187|194|186|191|168|179|216|158|173|196|198|190|200|156|159|170|190|163|152|155|163|152|186|136|157|166|143|155|149|157|138|172|125|170|141|124|160|163|149|139|160|166|155|156|141|144|160|136|151|136|146|139|147|175|135|155|130|126|129|152|126|142|139|147|123|137|169|120|142|118|131|162|130|123|127|118|141|130|160|114|120|117|129|136|122|127|135|106|104|131|154|123|93|133|125|121|122|116|125|107|101|97|137|99|115|102|108|120|121|121|116|117|102|107|111|111|104|122|95|109|104|115|79|100|116|92|93|95|138|103|112|112|111|111|96|123|107|107|103|102|84|119|108|98|102|102|82|76|94|100|124|101|116|132|100|87|87|89|75|85|99|129|103|97|103|113|96|97|109|91|95|101|103|101|95|99|104|120|80|101|105|101|106|123|93|82|100|86|103|119|94|124|102|109|108|89|95|88|94|107|90|96|87|83|97|101|90|96|93|91|88|70|78|96|104|89|104|63|96|95|82|89|83|86|71|80|80|90|83|74|90|79|66|75|70|72|94|72|61|90|76|81|66|76|58|75|72|86|68|86|83|77|61|73|82|90|73|76|79|76|82|77|94|67|77|84|76|79|60|62|75|66|70|70|82|82|65|62|64|79|70|76|60|63|59|82|76|75|91|61|67|70|54|66|78|68|71|78|59|58|72|61|64|56|64|60|52|63|65|67|69|71|61|60|65|66|72|57|79|61|55|58|53|67|58|48|65|56|59|70|50|60|61|56|53|62|61|61|64|63|71|58|49|50|45|46|45|52|43|56|61|44|54|52|48|41|48|29|38|27|45|37|33|48|42|53|48|39|50|42|31|46|37|44|31|50|23|43|52|43|49|18|41|50|46|47|34|44|36|37|48|26|31|40|41|42|30|32|35|37|34|44|30|46|30|25|30|25|33|29|39|25|25|35|31|26|25|20|30|28|25|26|26|19|32|24|18|12|10|22|20|22|23|21|16|15|19|16|17|8|25|21|16|12|13|9|18|18|19|22|15|15|10|12|15|24|21|18|12|14|20|12|5|14|11|24|10|14|13|17|14|7|5|11|8|17|4|21|10|13|9|10|13|15|9|10|13|11|3|6|10|13|19|8|11|8|16|6|13|9|8|6|2|8|11|10|5|6|15|6|12|6|8|14|7|12|8|4|9|9|9|12|5|8|8|7|4|4|7|8|7|6|4|7|7|4|5|8|9|6|7|6|9|6|10|9|9|4|12|7|8|15|13|15|9|11|14|9|12|5|7|9|11|5|8|10|13|6|11|10|12|12|7|8|12|6|8|6|7|9|6|11|8|9|9|5|8|11|9|7|4|8|14|11|10|17|8|8|11|8|6|8|5|9|5|7|15|10|3|5|3|6|8|18|9|9|12|9|10|5|7|17|8|8|3|6|8|8|10|12|7|10|4|3|8|1|7|1|12|3|8|7|5|6|7|13|6|10|8|7|5|11|11|9|9|7|13|14|14|10|14|7|11|10|13|4|4|10|16|5|4|13|19|8|9|4|6|8|9|8|7|7|11|11|11|11|4|10|5|11|8|3|10|5|2|6|8|6|5|9|7|4|6|7|9|14|7|9|17|6|8|7|13|7|1|9|6|11|8|11|9|3|7|5|8|7|5|4|8|9|7|5|6|8|15|4|6|6|8|8|14|8|5|6|4|11|9|7|6|5|11|6|9|4|11|6|11|6|7|8|8|7|6|7|4|7|9|4|10|8|3|5|4|4|3|12|2|5|6|5|3|5|5|3|4|8|4|6|4|6|4|2|7|4|0|8|3|5|8|9|11|8|4|7|11|12|4|2|6|5|4|2|5|4|13|6|3|9|6|6|2|7|6|7|4|2|4|6|5|7|7|12|3|1|3|7|5|9|5|6|3|8|10|7|9|10|10|9|4|6|10|11|9|5|4|12|5|5|4|3|7|14|5|2|5|7|6|10|8|8|5|3|4|9|6|4|6|4|4|7|4|7|6|7|9|9|8|2|5|5|2|2|9|5|11|3|3|4|7|14|9|3|2|9|2|6|7|5|4|7|3|8|6|5|1|6|0|7|4|4|4|4|5|6|4|5|2|1|4|8|0|1|2|4|7|7|3|2|5|1|2|4|3|4|3|7|2|4|3|2|0|0|3|3|1|3|4|7|2|3|2|0|3|3|3|9|3|8|2|1|2|9|1|1|5|6|1|2|3|2|4|1|2|2|1|2|2|2|3|7|8|5|1|2|1|5|3|2|1|1|6|6|1|7|8|0|5|5|2|0|2|5|4|1|1|0|4|2|4|7|1|2|3|2|2|1|1|2|5|3|0|1|2|3|4|4|4|5|3|6|2|1|6|2|5|5|2|2|3|0|3|1|2|4|2|3|1|1|5|3|2|3|1|3|2|4|0|3|2|1|2|1|3|3|1|2|0|1|2|4|4|1|3|1|3|3|2|2|2|3|1|5|1|1|1|1|3|6|8|2|6|1|3|2|3|3|7|1|3|0|3|3|3|3|3|1|1|1|0|3|2|3|3|0|5|3|2|3|1|2|1|6|0|1|6|1|4|2|4|2|2|1|4|1|0|2|3|1|2|2|0|1|0|2|5|3|1|3|0|1|1|0|0|3|1|1|2|0|0|2|3|0|1|0|2|1|0|2|0|1|2|0|2|0|0|2|1|4|4|3|1|1|1|0|3|1|1|0|0|0|0|2|0|0|0|0|1|0|1|1|0|2|0|0|2|0|0|2|3|1|0|1|1|0|0|0|0|0|3|0|1|0|1|1|0|0|1|1|0|0|3|0|0|0|0|1|0|1|0|1|0|0|0|0|3|0|0|0|0|0|0|0|0|3|4|3|2|0|0|0|1|1|0|1|0|0|0|0|0|0|0|0|0|0|1|0|0|1|1|0|1|2|1|1|1|0|0|0|0|0|1|0|1|0|1|0|2|1|1|0|0|2|0|2|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|1|0|1|2|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 + + + + 34873 + 348.20541465378 + 0 + 228.69458178471 + 100 + + + + + + -0.4999798646907216 + 24831.49997986469 + 24832 + 0 + 0 + 1050|0|0|0|0|0|0|0|0|0|22|0|0|39|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|95|0|17|0|0|0|0|0|14|19|0|0|19|0|0|7|33|6|3|4|4|0|2|0|0|2|1|0|6|12|6|0|0|0|0|1|5|2|0|0|0|1|0|0|0|0|0|0|0|0|0|0|5|0|0|1|1|0|0|0|0|0|0|0|0|27|7|11|9|29|14|14|9|21|0|5|13|18|13|19|6|0|12|6|29|7|0|1|3|0|0|0|1|0|1|0|0|0|0|0|1|1|1|0|0|0|2|0|0|0|0|0|0|0|0|1|1|0|0|0|1|0|0|0|1|0|0|0|2|1|0|0|0|3|1|0|1|2|1|0|0|1|1|3|0|1|3|1|1|1|0|2|5|8|7|8|15|16|28|44|34|58|77|77|103|121|158|184|152|179|189|257|265|273|291|290|312|345|341|429|364|398|370|405|465|430|463|473|489|491|528|475|523|549|599|549|603|575|590|629|601|599|610|600|619|610|652|647|670|676|660|676|692|672|707|682|656|690|667|646|716|709|709|754|712|713|761|809|806|728|752|759|780|715|775|807|835|889|836|906|843|857|859|902|932|949|926|938|929|894|892|960|972|887|996|962|986|1034|1020|1091|1131|1072|1164|1074|1081|1152|1171|1197|1302|1292|1264|1338|1410|1345|1390|1482|1388|1462|1506|1483|1488|1498|1575|1505|1487|1433|1477|1513|1492|1481|1380|1469|1370|1414|1364|1383|1319|1369|1319|1349|1277|1363|1274|1236|1371|1236|1190|1239|1219|1266|1310|1196|1137|1202|1100|1084|1022|1076|1101|1010|1022|1081|859|922|987|955|862|842|986|909|883|833|852|857|785|787|819|798|710|823|785|786|749|714|783|793|743|716|772|740|736|790|716|737|773|682|694|704|667|692|698|773|647|680|673|655|682|617|599|621|656|655|646|586|593|578|554|603|582|580|589|570|540|540|558|535|517|533|530|497|526|525|527|523|476|506|509|475|468|463|472|488|415|472|471|455|488|420|434|485|457|444|483|448|382|412|378|435|391|348|383|326|408|341|359|367|326|347|352|341|297|349|334|323|297|306|292|289|286|271|257|252|260|280|262|230|266|253|236|229|236|226|221|237|237|217|212|236|237|206|216|195|210|196|219|189|191|204|188|217|180|185|182|193|190|175|184|181|180|174|183|187|166|145|172|178|168|181|154|146|152|152|139|138|173|159|156|159|153|133|143|162|134|163|154|143|171|150|153|148|139|136|162|155|146|122|130|125|128|156|139|139|130|154|129|113|126|139|150|99|135|135|122|154|115|144|108|135|146|113|133|116|124|117|94|105|100|123|121|124|125|100|130|151|128|113|125|130|125|126|104|104|104|104|92|92|102|117|102|110|80|105|93|101|102|107|94|84|89|82|102|107|98|84|106|79|82|91|74|106|105|106|99|87|90|88|81|110|100|76|105|84|102|109|96|80|72|86|73|73|91|88|102|76|92|86|91|83|77|80|94|79|74|84|89|85|89|84|93|93|94|112|92|80|80|75|77|100|88|71|69|86|93|84|80|78|69|77|84|57|82|80|87|67|91|66|81|68|81|77|60|86|61|68|72|80|68|64|70|64|77|99|70|66|57|79|85|88|64|82|83|67|71|67|58|72|68|65|58|69|59|72|63|69|66|90|55|66|68|82|76|80|76|67|59|51|64|59|69|47|62|70|71|57|66|63|64|72|59|58|82|60|61|73|79|50|90|64|53|64|59|86|70|86|66|60|71|59|56|60|76|62|71|73|68|56|63|73|68|58|70|65|66|60|72|71|74|63|69|66|67|83|67|57|62|52|57|52|53|51|86|60|51|73|52|74|64|64|64|60|56|58|58|71|60|54|43|50|71|57|43|55|53|53|63|45|62|58|46|48|58|53|41|59|56|58|48|40|58|37|45|34|51|53|39|53|50|43|33|36|36|55|32|51|54|32|45|31|36|53|47|49|43|43|47|27|38|38|26|37|41|32|37|38|32|26|22|37|35|33|36|33|39|31|40|24|33|34|25|34|33|38|27|30|38|32|31|25|18|31|32|31|25|25|26|28|36|23|26|26|28|23|29|23|17|23|15|18|20|15|26|20|16|31|19|22|16|20|20|17|15|17|18|12|17|12|17|20|14|13|23|22|13|10|13|19|14|16|11|17|14|17|21|15|13|12|13|16|13|16|13|16|20|4|16|10|18|15|13|11|19|9|11|12|18|8|12|11|10|12|10|14|17|13|11|13|9|14|13|15|9|6|7|12|13|26|10|14|13|15|15|11|9|4|18|4|12|14|10|16|13|9|14|6|7|9|4|11|8|11|8|6|6|9|4|15|10|7|13|8|15|14|5|13|15|12|6|6|11|7|8|5|6|4|14|6|7|5|13|10|10|11|6|13|8|6|7|6|4|8|8|13|2|6|4|7|12|9|7|7|7|5|6|5|8|11|11|6|16|8|5|6|11|8|8|14|12|3|11|10|7|8|6|7|9|5|11|9|4|9|10|9|11|6|7|10|10|10|9|6|7|5|9|8|16|8|9|9|8|11|5|9|10|11|9|10|12|5|6|12|4|4|7|9|12|5|7|7|7|8|10|11|13|9|7|10|4|5|10|12|7|6|12|5|6|14|2|5|5|9|6|12|6|6|8|8|6|8|6|7|13|15|5|7|11|4|9|12|5|14|9|8|7|9|9|15|10|8|7|6|7|11|6|2|6|8|6|7|7|9|10|11|3|9|14|9|7|7|7|7|4|10|1|13|9|15|10|11|7|11|9|4|7|9|8|10|8|4|10|5|2|4|6|10|8|5|5|8|7|10|8|9|10|7|8|5|7|7|10|7|3|5|4|7|7|5|3|6|9|4|10|3|3|3|8|10|7|9|6|4|16|3|4|3|10|11|3|11|4|3|11|10|3|0|3|5|5|6|7|2|3|6|6|2|6|5|5|6|1|6|6|9|7|11|8|5|5|9|6|4|4|4|6|6|8|11|7|5|13|8|6|1|9|6|4|9|9|7|7|4|4|2|7|6|8|4|4|2|4|5|4|3|6|4|4|9|7|7|8|7|14|6|5|9|6|3|3|2|6|5|4|7|8|3|3|1|12|3|7|3|1|11|2|6|2|5|6|2|3|6|4|4|3|5|3|2|6|5|3|6|7|6|4|2|8|2|9|4|7|4|1|2|4|3|2|10|5|4|3|0|4|4|7|3|1|5|3|3|6|3|7|9|9|2|3|5|3|6|4|2|5|4|7|3|5|3|7|4|8|4|0|1|3|4|3|5|2|4|2|0|3|4|3|2|4|2|1|5|2|2|5|1|1|0|1|4|3|0|4|6|2|5|4|8|4|4|2|2|1|0|5|1|4|3|1|5|2|6|2|1|1|1|4|1|6|1|4|0|4|2|4|2|4|2|4|3|0|2|2|7|2|4|3|4|2|3|6|5|2|1|2|8|2|0|6|4|0|0|2|2|2|2|3|1|3|2|2|5|2|0|1|2|2|3|3|1|3|2|2|1|1|1|1|1|5|6|3|2|2|2|7|0|3|0|3|1|0|3|5|0|5|2|0|1|2|0|7|1|0|2|2|0|8|6|1|1|4|4|3|0|3|3|4|4|1|1|1|2|0|2|0|1|1|4|0|3|4|4|2|6|4|4|1|3|2|1|6|3|6|5|2|1|8|2|0|2|0|4|3|3|1|1|1|3|5|2|4|0|1|1|2|3|2|2|0|0|0|3|2|3|0|1|4|4|0|4|4|1|1|2|1|2|0|4|0|3|1|2|1|1|3|0|2|0|0|0|3|1|0|0|0|0|3|2|0|0|0|0|0|4|1|2|1|0|1|3|0|0|1|0|2|0|1|1|0|0|1|0|0|0|0|2|0|0|0|1|0|0|1|2|2|0|0|2|2|1|0|0|0|0|0|0|0|1|0|0|0|0|1|0|0|0|0|0|1|4|0|0|0|0|0|0|3|2|2|1|0|3|0|0|1|0|0|0|0|0|1|0|1|0|0|1|0|1|2|0|0|0|1|0|0|1|1|0|1|1|2|1|1|0|0|0|0|0|0|1|0|0|0|0|1|0|0|1|0|0|0|0|0|1|0|0|0|1|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 + + + + 24831 + 390.20913848631 + 0 + 184.42907767143 + 100 + + + + + + -0.4999100881136486 + 5560.499910088113 + 5561 + 0 + 0 + 1052|0|0|0|0|0|0|0|0|0|23|0|0|31|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|96|0|17|0|0|0|0|1|13|15|0|0|32|0|0|7|17|9|5|5|0|2|0|1|0|3|0|0|9|13|7|0|0|1|0|1|4|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|4|0|0|0|0|0|0|0|0|0|0|0|0|33|15|6|15|37|10|15|13|15|0|6|5|7|7|15|6|0|17|18|22|16|3|4|6|0|2|0|1|0|0|1|0|1|1|1|0|1|4|0|3|2|2|2|6|3|2|1|0|5|2|0|1|2|4|2|1|1|4|0|2|0|0|0|4|4|0|1|2|2|4|1|1|1|1|7|3|1|2|3|4|2|0|4|1|6|4|1|2|3|2|2|1|0|7|5|1|2|2|2|1|1|2|6|2|2|8|4|0|1|2|5|3|7|10|5|1|4|1|4|3|3|5|6|6|4|3|5|3|5|0|0|4|6|6|5|4|5|4|3|1|4|3|3|3|3|2|5|3|5|5|0|1|4|1|3|1|2|3|5|4|5|10|6|7|3|5|1|2|1|9|3|5|6|8|6|9|4|11|5|8|8|5|11|13|14|17|14|19|36|37|66|69|70|92|128|173|184|206|237|244|274|351|378|385|417|445|517|486|524|598|605|601|626|661|719|779|704|712|816|895|938|935|1033|933|1060|979|1035|1100|1086|1083|1172|1053|1102|1133|1117|1185|1195|1219|1175|1227|1237|1245|1352|1211|1199|1223|1344|1301|1288|1355|1370|1291|1339|1312|1375|1471|1425|1465|1476|1455|1563|1645|1693|1580|1746|1692|1706|1791|1711|1749|1759|1829|1730|1712|1722|1722|1813|1623|1557|1724|1533|1591|1551|1472|1538|1477|1400|1297|1325|1269|1268|1258|1249|1161|1179|1177|1191|1160|1117|1163|1096|1126|1102|1040|1066|1011|1070|1010|1032|1017|960|1019|1015|1032|1044|980|979|980|1039|1017|1036|1006|972|923|912|936|961|952|936|973|881|934|893|843|807|833|876|825|776|812|819|776|791|804|889|790|774|809|773|805|715|776|735|735|741|771|739|728|660|764|795|682|715|732|742|762|730|623|706|689|727|680|647|633|680|626|618|639|647|621|627|612|590|586|500|571|584|610|559|519|609|542|542|504|496|550|494|500|482|441|447|467|419|436|472|470|411|399|447|422|404|388|414|422|375|365|355|379|355|340|375|373|312|339|308|318|317|282|278|302|268|310|272|287|246|235|253|256|247|228|227|257|223|237|216|220|225|236|211|226|200|227|242|198|220|194|206|201|200|187|203|179|220|159|170|186|166|157|165|172|156|166|195|161|179|173|190|168|173|167|145|130|186|160|164|157|120|138|186|169|159|140|138|135|140|143|118|155|167|152|140|148|121|146|166|124|157|146|130|127|139|140|146|111|119|120|120|123|105|134|116|139|146|131|135|129|124|99|150|121|117|113|102|128|99|122|97|117|104|111|125|107|101|110|119|111|91|117|82|82|112|134|118|98|103|113|79|93|105|91|88|112|90|98|79|108|89|118|87|96|106|97|95|117|112|118|89|84|102|96|109|107|101|91|107|99|81|105|93|84|103|87|90|81|90|89|93|66|82|98|89|85|93|106|67|70|95|84|80|83|77|81|68|64|71|78|68|73|81|76|57|107|81|70|83|95|91|54|82|91|82|83|95|75|88|80|85|99|80|90|87|69|83|110|72|63|80|59|86|81|83|92|81|67|64|64|74|52|71|62|73|67|79|66|69|68|63|88|76|60|64|79|77|68|74|73|77|58|75|68|80|72|52|103|84|88|85|75|73|90|78|61|73|57|64|69|97|81|76|70|83|64|82|66|69|69|65|76|59|97|65|73|78|76|67|84|79|80|82|74|67|60|59|69|70|57|64|64|62|64|61|68|50|74|71|69|72|68|69|76|73|68|62|65|59|74|52|50|59|54|72|59|43|43|50|40|48|60|51|53|42|50|42|52|44|61|50|58|36|45|46|45|41|36|43|46|43|37|46|36|51|52|49|43|39|50|49|33|34|33|37|41|31|52|26|38|42|39|38|41|33|28|29|35|36|22|30|40|20|27|33|22|28|25|24|29|38|27|25|23|34|28|31|29|26|26|22|29|22|21|42|27|23|26|23|22|17|18|22|27|32|33|29|28|21|22|16|16|19|18|23|16|14|21|19|14|36|14|23|22|30|21|23|14|18|21|16|14|22|15|17|17|14|12|19|16|14|15|17|18|12|16|10|17|11|13|15|9|19|20|17|13|12|14|20|15|12|30|5|13|14|16|14|15|13|9|16|12|8|17|13|12|16|12|9|18|5|6|12|9|11|8|16|11|8|18|18|15|7|17|9|17|16|10|13|8|8|9|19|10|13|13|11|9|9|16|11|12|10|4|14|10|11|15|14|12|10|7|10|11|13|14|7|11|22|12|6|6|17|6|8|12|14|14|11|7|9|14|13|13|6|3|9|15|12|14|10|12|15|15|7|10|12|8|13|14|14|3|14|9|7|11|14|13|8|11|14|10|20|6|6|12|10|7|7|14|8|17|7|6|15|12|7|13|8|12|5|9|11|13|5|8|7|9|7|15|11|7|6|4|13|6|10|9|6|11|9|4|8|9|9|16|7|11|9|9|12|10|5|14|8|2|3|4|8|12|9|8|14|4|7|4|11|12|16|2|4|8|9|14|8|6|14|7|8|11|8|10|10|15|8|10|7|9|6|5|8|8|8|13|2|9|15|7|7|10|11|15|8|5|7|5|9|6|8|4|3|7|3|13|2|6|6|7|3|6|2|11|8|4|5|16|4|4|8|10|3|11|2|3|8|7|6|12|3|5|8|8|9|5|5|10|8|13|4|7|3|2|10|9|9|12|5|3|7|9|6|4|5|5|8|6|6|10|9|2|14|10|8|12|8|9|5|8|13|8|4|10|4|3|4|10|13|8|5|16|8|4|9|5|6|2|6|6|4|5|10|3|8|7|5|11|9|4|4|5|4|7|6|5|4|13|6|4|7|4|2|3|6|3|6|3|5|6|5|2|5|5|3|9|5|6|2|4|5|6|3|9|8|2|7|10|3|11|5|11|2|3|8|11|4|7|1|3|4|6|7|3|5|6|3|9|7|6|5|5|4|8|5|5|2|5|6|4|2|4|6|4|5|7|7|1|6|5|1|3|3|3|2|6|7|3|3|6|4|2|4|3|5|3|1|4|3|1|4|3|3|7|4|4|1|4|4|3|6|4|0|1|6|3|1|0|4|6|3|3|3|7|1|2|5|1|7|1|5|3|6|3|3|2|1|2|1|6|4|1|3|5|1|4|2|2|5|1|2|3|2|2|0|1|1|4|1|0|1|2|4|5|2|6|2|0|1|4|3|0|1|3|2|0|2|3|1|4|5|5|1|6|2|2|3|1|1|0|5|2|3|0|3|4|4|1|4|2|2|2|1|3|4|1|3|6|2|1|3|5|5|5|2|4|2|6|2|3|8|3|1|2|6|1|0|4|1|1|4|3|2|2|1|4|3|1|1|2|2|3|2|2|1|4|3|1|2|1|0|4|3|3|0|3|4|2|1|6|1|3|1|1|5|0|3|0|3|0|2|0|3|3|5|2|1|2|0|2|3|4|3|1|0|2|3|2|5|1|3|3|0|2|0|2|2|4|6|3|4|3|2|3|5|3|0|1|2|1|1|3|4|5|3|2|0|1|3|4|4|3|2|2|0|5|1|2|1|0|3|2|0|0|0|1|2|1|1|1|1|1|1|1|4|0|0|0|0|1|1|0|0|3|0|0|0|0|2|0|1|0|1|0|0|0|1|0|2|1|0|0|0|3|2|0|2|3|0|0|2|0|1|0|1|2|0|0|0|1|0|0|0|0|3|2|2|0|1|3|0|0|0|0|0|1|0|0|0|0|2|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|1 + + + + 5560 + 447.99542456336 + 0 + 163.46698492804 + 100 + + + + + 65519 + 846.36985067791 + 0 + 4236.4478607242 + 99.73 + + + diff --git a/tests/tests_refs/test_timeseries/SENTINEL2A_20180926-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif.aux.xml b/tests/tests_refs/test_timeseries/SENTINEL2A_20180926-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif.aux.xml new file mode 100644 index 00000000..47e102b5 --- /dev/null +++ b/tests/tests_refs/test_timeseries/SENTINEL2A_20180926-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif.aux.xml @@ -0,0 +1,13 @@ + + + ndvi + + YES + 1 + 0.6270102256583 + -1 + 0.25599010256217 + 99.81 + + + diff --git a/tests/tests_refs/test_timeseries/SENTINEL2A_20181016-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif.aux.xml b/tests/tests_refs/test_timeseries/SENTINEL2A_20181016-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif.aux.xml new file mode 100644 index 00000000..6383ddb8 --- /dev/null +++ b/tests/tests_refs/test_timeseries/SENTINEL2A_20181016-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif.aux.xml @@ -0,0 +1,13 @@ + + + ndvi + + YES + 1 + 0.62522005319166 + -0.77001810073853 + 0.21752895259574 + 99.81 + + + diff --git a/tests/tests_refs/test_timeseries/SENTINEL2A_20181105-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif.aux.xml b/tests/tests_refs/test_timeseries/SENTINEL2A_20181105-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif.aux.xml new file mode 100644 index 00000000..d779e405 --- /dev/null +++ b/tests/tests_refs/test_timeseries/SENTINEL2A_20181105-000000-685_L2A_T30TYP_D-ndvi-timeseries.tif.aux.xml @@ -0,0 +1,13 @@ + + + ndvi + + YES + 1 + 0.62452387501836 + -0.6805807352066 + 0.21760545356158 + 99.81 + + + diff --git a/tests/tests_refs/tif_file_tile0.tif b/tests/tests_refs/tif_file_tile0.tif new file mode 100644 index 00000000..43841625 Binary files /dev/null and b/tests/tests_refs/tif_file_tile0.tif differ diff --git a/tests/tests_refs/tif_file_tile3.tif b/tests/tests_refs/tif_file_tile3.tif new file mode 100644 index 00000000..89c5685f Binary files /dev/null and b/tests/tests_refs/tif_file_tile3.tif differ diff --git a/tests/tests_refs/tif_file_tile77.tif b/tests/tests_refs/tif_file_tile77.tif new file mode 100644 index 00000000..43841625 Binary files /dev/null and b/tests/tests_refs/tif_file_tile77.tif differ diff --git a/tests/tests_refs/tif_file_tile93.tif b/tests/tests_refs/tif_file_tile93.tif new file mode 100644 index 00000000..89c5685f Binary files /dev/null and b/tests/tests_refs/tif_file_tile93.tif differ diff --git a/tests/tests_refs/tiletif_file.tif b/tests/tests_refs/tiletif_file.tif new file mode 100644 index 00000000..89c5685f Binary files /dev/null and b/tests/tests_refs/tiletif_file.tif differ diff --git a/tests/utils4test.py b/tests/utils4test.py index 027acb71..366fc8dc 100644 --- a/tests/utils4test.py +++ b/tests/utils4test.py @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- import os import shutil +from dataclasses import dataclass from pathlib import Path from . import cmptools @@ -10,20 +11,27 @@ __copyright = "Copyright 2019, CNES" __license = "Apache v2.0" - -indir = "tests/tests_data/" -outdir = "tests/tests_out/" __root_refdir = "tests/tests_refs/" +@dataclass +class RastertoolsTestsData: + + project_dir: Path = Path(__file__).parent.parent + tests_project_dir:str = str(project_dir) + tests_input_data_dir:str = str(project_dir / "tests" / "tests_data" ) + tests_output_data_dir:str = str(project_dir / "tests" / "tests_out") + tests_ref_data_dir:str = str(project_dir / "tests" / "tests_refs") + + def get_refdir(testname: str): - return __root_refdir + testname + return RastertoolsTestsData.tests_ref_data_dir + '/' + testname def clear_outdir(subdirs=True): """function to clear content of a dir""" - for file in os.listdir(outdir): - file_path = os.path.join(outdir, file) + for file in os.listdir(RastertoolsTestsData.tests_output_data_dir + '/'): + file_path = os.path.join(RastertoolsTestsData.tests_output_data_dir + '/', file) if os.path.isfile(file_path): os.unlink(file_path) elif subdirs: @@ -32,8 +40,8 @@ def clear_outdir(subdirs=True): def create_outdir(): - if not os.path.isdir(outdir): - os.makedirs(outdir) + if not os.path.isdir(RastertoolsTestsData.tests_output_data_dir + '/'): + os.makedirs(RastertoolsTestsData.tests_output_data_dir + '/') clear_outdir() @@ -43,41 +51,44 @@ def delete_dir(dir): def copy_to_ref(files, refdir): for f in files: - os.replace(outdir + f, refdir + f) + os.replace(RastertoolsTestsData.tests_output_data_dir + '/' + f, refdir + f) def basename(infile): - """function to get basename of file""" + """ + Function to get basename of file + """ file = Path(infile) if isinstance(infile, str) else infile suffix = len("".join(file.suffixes)) return file.name if suffix == 0 else file.name[:-suffix] -def cmpfiles(a, b, common, tolerance=1e-9): - """Compare common files in two directories. - - a, b -- directory names - common -- list of file names found in both directories - shallow -- if true, do comparison based solely on stat() information +def cmpfiles(a : str, b : str, common : list, tolerance : float =1e-9, **kwargs) -> tuple: + """ + Compare common files in two directories. - Returns a tuple of three lists: - files that compare equal - files that are different - filenames that aren't regular files. + Args: + a, b (str) : Directory names + common (list) : List of file names found in both directories + Returns: + Tuple of three lists ( [files that are the same], [files that differs], [filenames that aren't regular files] ) """ res = ([], [], []) for x in common: new = os.path.join(a, x) golden = os.path.join(b, x) - res[_cmp(golden, new, tolerance)].append(x) + res[_cmp(golden, new, tolerance, **kwargs)].append(x) return res -def _cmp(gld, new, tolerance): +def _cmp(gld, new, tolerance, **kwargs): + """ + """ ftype = os.path.splitext(gld)[-1].lower() cmp = cmptools.CMP_FUN[ftype] try: - return not cmp(gld, new, tolerance=tolerance) + return not cmp(gld, new, tolerance=tolerance, **kwargs) except OSError: return 2 +