diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 1e222e716b4..5bd27eeafe7 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -125,7 +125,7 @@ jobs: - name: Install ert run: | - uv pip install ".[dev]" + uv pip install ".[dev, everest]" - name: Make test directory run: | @@ -136,7 +136,7 @@ jobs: - name: Test docs run: | - sphinx-build -n -v -E -W ./docs ./tmp/ert_docs + sphinx-build -n -v -E -W ./docs/ert ./tmp/ert_docs publish: name: Publish to PyPI diff --git a/.github/workflows/test_ert.yml b/.github/workflows/test_ert.yml index d7b9ee82154..a68a29b3914 100644 --- a/.github/workflows/test_ert.yml +++ b/.github/workflows/test_ert.yml @@ -40,7 +40,7 @@ jobs: - name: Install ert run: | - uv pip install ".[dev]" + uv pip install ".[dev, everest]" - name: GUI Test if: inputs.test-type == 'gui-tests' @@ -56,7 +56,7 @@ jobs: if: inputs.test-type == 'unit-tests' run: | pytest --cov=ert --cov-report=xml:cov1.xml --junit-xml=junit.xml -n logical --show-capture=stderr -v --benchmark-disable --dist loadgroup tests/unit_tests - pytest --doctest-modules --cov=ert --cov-report=xml:cov2.xml src/ --ignore src/ert/dark_storage + pytest --doctest-modules --cov=ert --cov-report=xml:cov2.xml src/ --ignore src/ert/dark_storage --ignore src/ieverest - name: Performance Test if: inputs.test-type == 'performance-tests' diff --git a/.github/workflows/test_everest.yml b/.github/workflows/test_everest.yml index 3ee54a2cce1..76486c13b9c 100644 --- a/.github/workflows/test_everest.yml +++ b/.github/workflows/test_everest.yml @@ -1,57 +1,76 @@ -name: Test everest +name: everest-run-tests-build-docs -# This job checks whether current main of everest -# is compatible with the changes. It is not required to pass -# before merging, but breakage should be followed by fix in everest -# after merge. - -on: [pull_request] - -env: - UV_SYSTEM_PYTHON: 1 +on: + pull_request: + workflow_dispatch: + push: + branches: + - main + tags: "*" concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} +env: + NO_PROJECT_RES: 1 + jobs: - test-everest: - name: Test everest - timeout-minutes: 40 - runs-on: ubuntu-latest + tests: + name: "py_${{ matrix.python-version }}_${{ matrix.test_type }}" + timeout-minutes: 60 strategy: fail-fast: false matrix: - python-version: ['3.12'] + python-version: ['3.8', '3.11', '3.12'] + os: [ubuntu-22.04] + test_type: ['doc', 'ui-test', 'test', 'integration-test', 'everest-models-test'] + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - - - name: Set up Python + - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} + cache: "pip" - - name: Install uv - run: pip install uv + - name: Install Everest and dependencies + run: | + pip install ".[dev,everest]" - - name: Install ert + - name: Run Tests + if: matrix.test_type == 'test' run: | - uv pip install . + pytest tests/everest -n 4 -m "not ui_test and not integration_test" --dist loadgroup -sv - - name: Install everest and dependencies + - name: Run Integration Tests + if: matrix.test_type == 'integration-test' run: | - git clone https://github.com/equinor/everest.git - uv pip install git+https://github.com/equinor/everest-models.git + pytest tests -n 4 -m "integration_test" --dist loadgroup - - name: Test everest + - name: Run UI Tests + if: matrix.test_type == 'ui-test' env: QT_QPA_PLATFORM: 'minimal' - NO_PROJECT_RES: 1 run: | - pushd everest - uv pip install ".[test]" + python -m pytest tests/everest -m "ui_test" + + - name: Build Documentation + if: matrix.test_type == 'doc' + run: | + pip install git+https://github.com/equinor/everest-models.git + mkdir tmp + sphinx-build -n -v -E -W ./docs/everest ./tmp/everest_docs - pytest tests -n 4 --dist loadgroup -m "not ui_test" - pytest tests -m "ui_test" + - name: Run tests requiring everest-models + if: matrix.test_type == 'everest-models-test' + run: | + pip install git+https://github.com/equinor/everest-models.git + python -m pytest tests -n 4 -m everest_models_test --dist loadgroup + + - name: Test docs entry point + if: matrix.test_type == 'everest-docs-entry-test' + run: | + python -m everest.docs diff --git a/.github/workflows/test_everest_macos.yml b/.github/workflows/test_everest_macos.yml new file mode 100644 index 00000000000..d61f2d65935 --- /dev/null +++ b/.github/workflows/test_everest_macos.yml @@ -0,0 +1,79 @@ +name: everest-macos-run-tests-build-docs + +on: + pull_request: + workflow_dispatch: + push: + branches: + - main + tags: "*" + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: ${{ github.ref != 'refs/heads/main' }} + +env: + NO_PROJECT_RES: 1 + +jobs: + tests: + if: github.ref_type == 'tag' # only build for mac when tags + name: "py-${{ matrix.python-version }}_${{ matrix.test_type }}_${{ matrix.os }}" + timeout-minutes: 60 + strategy: + fail-fast: false + matrix: + python-version: ['3.8', '3.12'] + os: ['macos-13', 'macos-14', 'macos-14-large'] + # https://github.com/actions/runner-images/tree/main?tab=readme-ov-file#available-images + exclude: + - os: 'macos-14' + python-version: '3.8' + - os: 'macos-14-large' + python-version: '3.8' + - os: 'macos-13' + python-version: '3.12' + + test_type: ['doc', 'test', 'integration-test', 'everest-models-test'] + runs-on: ${{ matrix.os }} + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + cache: "pip" + cache-dependency-path: | + pyproject.toml + + - name: Install HDF5 source files + run: brew install hdf5 + + - name: Install Everest and dependencies + run: | + pip install .[dev, everest] + + - name: Run Tests + if: matrix.test_type == 'test' + run: | + python -m pytest tests/everest -n 4 -m "not ui_test and not integration_test and not fails_on_macos_github_workflow" --dist loadgroup + + - name: Run Integration Tests + if: matrix.test_type == 'integration-test' + run: | + python -m pytest tests/everest -n 4 -m "integration_test and not fails_on_macos_github_workflow" --dist loadgroup + + - name: Build Documentation + if: matrix.test_type == 'doc' + run: | + pip install git+https://github.com/equinor/everest-models.git + mkdir tmp + sphinx-build -n -v -E -W ./docs/everest ./tmp/everest_docs + + - name: Run tests requiring everest-models + if: matrix.test_type == 'everest-models-test' + run: | + pip install git+https://github.com/equinor/everest-models.git + python -m pytest tests/everest -n 4 -m everest_models_test --dist loadgroup diff --git a/.github/workflows/typing.yml b/.github/workflows/typing.yml index 2dc01eefa30..8c52e246fbd 100644 --- a/.github/workflows/typing.yml +++ b/.github/workflows/typing.yml @@ -37,9 +37,13 @@ jobs: - name: Install ERT and dependencies run: | - uv pip install ".[dev, types]" + uv pip install ".[dev, types, everest]" - run: echo ::add-matcher::.github/mypy-matcher.json - - name: Run mypy + - name: Run mypy ert run: | mypy src/ert + + - name: Run mypy everest + run: | + mypy src/everest diff --git a/.mypy.ini b/.mypy.ini index 210f08c2d8b..689433dfa63 100644 --- a/.mypy.ini +++ b/.mypy.ini @@ -40,3 +40,42 @@ ignore_missing_imports = True [mypy-seaborn.*] ignore_missing_imports = True + +[mypy-opm.*] +ignore_missing_imports = True + +[mypy-colorama.*] +ignore_missing_imports = True + +[mypy-ruamel.*] +ignore_missing_imports = True + +[mypy-resdata.*] +ignore_missing_imports = True +disable_error_code = import-untyped + +[mypy-everest.*] +disable_error_code = dict-item, + no-untyped-def, + call-overload, + union-attr, + no-untyped-call, + var-annotated, + index, + call-arg, + unused-ignore, + arg-type, + type-arg, + type-var, + assignment, + typeddict-item, + attr-defined, + comparison-overlap, + return-value, + name-defined + +[mypy-tests.*] +disable_error_code = no-untyped-def, no-untyped-call, typeddict-item, assignment + +[mypy-ieverest.*] +ignore_errors = True diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 494f1a3b809..7e415f9e3fd 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,6 +5,7 @@ repos: - id: no-commit-to-branch - id: check-json - id: check-yaml + exclude: tests/everest/test_data/valid_config_file/invalid_yaml_config.yml # Invalid yml needed for testing - id: end-of-file-fixer - id: trailing-whitespace exclude: test-data/eclipse/parse/ERROR.PRT # exact format is needed for testing diff --git a/README.md b/README.md index 53c35014cd5..331545ed86e 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,18 @@ $ ert --help For examples and help with configuration, see the [ert Documentation](https://ert.readthedocs.io/en/latest/getting_started/configuration/poly_new/guide.html#configuration-guide). +# Everest™ + +The primary goal of the Everest tool is to find *optimal* well +planning and production strategies by utilizing an ensemble of +reservoir models (e.g., an ensemble of geologically-consistent models). +This will enable robust decisions about drilling schedule and well +placement, in order to achieve results of significant practical value. + +```bash + pip install . "[everest]" +``` + ## Developing To start developing the Python code, we suggest installing ert in editable mode @@ -49,7 +61,7 @@ pip install --upgrade pip wheel setuptools # Download and install ert git clone https://github.com/equinor/ert cd ert -pip install --editable ".[dev]" +pip install --editable ".[dev, everest]" ``` ### Test setup @@ -93,7 +105,7 @@ git submodule foreach "git lfs pull" You can build the documentation after installation by running ```bash pip install ".[dev]" -sphinx-build -n -v -E -W ./docs ./tmp/ert_docs +sphinx-build -n -v -E -W ./docs/ert ./tmp/ert_docs ``` and then open the generated `./tmp/ert_docs/index.html` in a browser. diff --git a/docs/_ext/ert_jobs.py b/docs/ert/_ext/ert_jobs.py similarity index 100% rename from docs/_ext/ert_jobs.py rename to docs/ert/_ext/ert_jobs.py diff --git a/docs/_templates/breadcrumbs.html b/docs/ert/_templates/breadcrumbs.html similarity index 100% rename from docs/_templates/breadcrumbs.html rename to docs/ert/_templates/breadcrumbs.html diff --git a/docs/_templates/ert_narratives.tmpl b/docs/ert/_templates/ert_narratives.tmpl similarity index 100% rename from docs/_templates/ert_narratives.tmpl rename to docs/ert/_templates/ert_narratives.tmpl diff --git a/docs/about/click-on-stderr.png b/docs/ert/about/click-on-stderr.png similarity index 100% rename from docs/about/click-on-stderr.png rename to docs/ert/about/click-on-stderr.png diff --git a/docs/about/click-show-details.png b/docs/ert/about/click-show-details.png similarity index 100% rename from docs/about/click-show-details.png rename to docs/ert/about/click-show-details.png diff --git a/docs/about/index.rst b/docs/ert/about/index.rst similarity index 100% rename from docs/about/index.rst rename to docs/ert/about/index.rst diff --git a/docs/about/license-retry.png b/docs/ert/about/license-retry.png similarity index 100% rename from docs/about/license-retry.png rename to docs/ert/about/license-retry.png diff --git a/docs/about/release_notes.rst b/docs/ert/about/release_notes.rst similarity index 100% rename from docs/about/release_notes.rst rename to docs/ert/about/release_notes.rst diff --git a/docs/about/v10_manage_experiments.png b/docs/ert/about/v10_manage_experiments.png similarity index 100% rename from docs/about/v10_manage_experiments.png rename to docs/ert/about/v10_manage_experiments.png diff --git a/docs/about/v9_auto_scale.png b/docs/ert/about/v9_auto_scale.png similarity index 100% rename from docs/about/v9_auto_scale.png rename to docs/ert/about/v9_auto_scale.png diff --git a/docs/about/v9_update_param.png b/docs/ert/about/v9_update_param.png similarity index 100% rename from docs/about/v9_update_param.png rename to docs/ert/about/v9_update_param.png diff --git a/docs/about/version-8.0-delete-runpath.gif b/docs/ert/about/version-8.0-delete-runpath.gif similarity index 100% rename from docs/about/version-8.0-delete-runpath.gif rename to docs/ert/about/version-8.0-delete-runpath.gif diff --git a/docs/about/version-8.0-localization.gif b/docs/ert/about/version-8.0-localization.gif similarity index 100% rename from docs/about/version-8.0-localization.gif rename to docs/ert/about/version-8.0-localization.gif diff --git a/docs/about/version-8.0-suggestor.png b/docs/ert/about/version-8.0-suggestor.png similarity index 100% rename from docs/about/version-8.0-suggestor.png rename to docs/ert/about/version-8.0-suggestor.png diff --git a/docs/about/version-8.0-update.gif b/docs/ert/about/version-8.0-update.gif similarity index 100% rename from docs/about/version-8.0-update.gif rename to docs/ert/about/version-8.0-update.gif diff --git a/docs/conf.py b/docs/ert/conf.py similarity index 99% rename from docs/conf.py rename to docs/ert/conf.py index 942b05debab..fa79b90b611 100644 --- a/docs/conf.py +++ b/docs/ert/conf.py @@ -16,7 +16,7 @@ import sys from importlib import metadata -sys.path.append(os.path.abspath("./_ext")) +sys.path.append(os.path.abspath("_ext")) # -- Project information ----------------------------------------------------- diff --git a/docs/developer_documentation/concepts.rst b/docs/ert/developer_documentation/concepts.rst similarity index 100% rename from docs/developer_documentation/concepts.rst rename to docs/ert/developer_documentation/concepts.rst diff --git a/docs/developer_documentation/dev-strategy.rst b/docs/ert/developer_documentation/dev-strategy.rst similarity index 100% rename from docs/developer_documentation/dev-strategy.rst rename to docs/ert/developer_documentation/dev-strategy.rst diff --git a/docs/developer_documentation/forward_model.rst b/docs/ert/developer_documentation/forward_model.rst similarity index 100% rename from docs/developer_documentation/forward_model.rst rename to docs/ert/developer_documentation/forward_model.rst diff --git a/docs/developer_documentation/qt.rst b/docs/ert/developer_documentation/qt.rst similarity index 100% rename from docs/developer_documentation/qt.rst rename to docs/ert/developer_documentation/qt.rst diff --git a/docs/developer_documentation/roadmap.rst b/docs/ert/developer_documentation/roadmap.rst similarity index 100% rename from docs/developer_documentation/roadmap.rst rename to docs/ert/developer_documentation/roadmap.rst diff --git a/docs/getting_started/configuration/poly_new/guide.rst b/docs/ert/getting_started/configuration/poly_new/guide.rst similarity index 100% rename from docs/getting_started/configuration/poly_new/guide.rst rename to docs/ert/getting_started/configuration/poly_new/guide.rst diff --git a/docs/getting_started/configuration/poly_new/minimal/POLY_EVAL b/docs/ert/getting_started/configuration/poly_new/minimal/POLY_EVAL similarity index 100% rename from docs/getting_started/configuration/poly_new/minimal/POLY_EVAL rename to docs/ert/getting_started/configuration/poly_new/minimal/POLY_EVAL diff --git a/docs/getting_started/configuration/poly_new/minimal/ert.png b/docs/ert/getting_started/configuration/poly_new/minimal/ert.png similarity index 100% rename from docs/getting_started/configuration/poly_new/minimal/ert.png rename to docs/ert/getting_started/configuration/poly_new/minimal/ert.png diff --git a/docs/getting_started/configuration/poly_new/minimal/poly.ert b/docs/ert/getting_started/configuration/poly_new/minimal/poly.ert similarity index 100% rename from docs/getting_started/configuration/poly_new/minimal/poly.ert rename to docs/ert/getting_started/configuration/poly_new/minimal/poly.ert diff --git a/docs/getting_started/configuration/poly_new/minimal/simulations.png b/docs/ert/getting_started/configuration/poly_new/minimal/simulations.png similarity index 100% rename from docs/getting_started/configuration/poly_new/minimal/simulations.png rename to docs/ert/getting_started/configuration/poly_new/minimal/simulations.png diff --git a/docs/getting_started/configuration/poly_new/minimal/startdialog.png b/docs/ert/getting_started/configuration/poly_new/minimal/startdialog.png similarity index 100% rename from docs/getting_started/configuration/poly_new/minimal/startdialog.png rename to docs/ert/getting_started/configuration/poly_new/minimal/startdialog.png diff --git a/docs/getting_started/configuration/poly_new/minimal/warning.png b/docs/ert/getting_started/configuration/poly_new/minimal/warning.png similarity index 100% rename from docs/getting_started/configuration/poly_new/minimal/warning.png rename to docs/ert/getting_started/configuration/poly_new/minimal/warning.png diff --git a/docs/getting_started/configuration/poly_new/with_more_observations/POLY_EVAL b/docs/ert/getting_started/configuration/poly_new/with_more_observations/POLY_EVAL similarity index 100% rename from docs/getting_started/configuration/poly_new/with_more_observations/POLY_EVAL rename to docs/ert/getting_started/configuration/poly_new/with_more_observations/POLY_EVAL diff --git a/docs/getting_started/configuration/poly_new/with_more_observations/coeff_b.png b/docs/ert/getting_started/configuration/poly_new/with_more_observations/coeff_b.png similarity index 100% rename from docs/getting_started/configuration/poly_new/with_more_observations/coeff_b.png rename to docs/ert/getting_started/configuration/poly_new/with_more_observations/coeff_b.png diff --git a/docs/getting_started/configuration/poly_new/with_more_observations/coeff_priors b/docs/ert/getting_started/configuration/poly_new/with_more_observations/coeff_priors similarity index 100% rename from docs/getting_started/configuration/poly_new/with_more_observations/coeff_priors rename to docs/ert/getting_started/configuration/poly_new/with_more_observations/coeff_priors diff --git a/docs/getting_started/configuration/poly_new/with_more_observations/generate_synthetic_observations.py b/docs/ert/getting_started/configuration/poly_new/with_more_observations/generate_synthetic_observations.py similarity index 100% rename from docs/getting_started/configuration/poly_new/with_more_observations/generate_synthetic_observations.py rename to docs/ert/getting_started/configuration/poly_new/with_more_observations/generate_synthetic_observations.py diff --git a/docs/getting_started/configuration/poly_new/with_more_observations/observations b/docs/ert/getting_started/configuration/poly_new/with_more_observations/observations similarity index 100% rename from docs/getting_started/configuration/poly_new/with_more_observations/observations rename to docs/ert/getting_started/configuration/poly_new/with_more_observations/observations diff --git a/docs/getting_started/configuration/poly_new/with_more_observations/poly_eval.py b/docs/ert/getting_started/configuration/poly_new/with_more_observations/poly_eval.py similarity index 100% rename from docs/getting_started/configuration/poly_new/with_more_observations/poly_eval.py rename to docs/ert/getting_started/configuration/poly_new/with_more_observations/poly_eval.py diff --git a/docs/getting_started/configuration/poly_new/with_more_observations/poly_final.ert b/docs/ert/getting_started/configuration/poly_new/with_more_observations/poly_final.ert similarity index 100% rename from docs/getting_started/configuration/poly_new/with_more_observations/poly_final.ert rename to docs/ert/getting_started/configuration/poly_new/with_more_observations/poly_final.ert diff --git a/docs/getting_started/configuration/poly_new/with_more_observations/poly_obs_data.txt b/docs/ert/getting_started/configuration/poly_new/with_more_observations/poly_obs_data.txt similarity index 100% rename from docs/getting_started/configuration/poly_new/with_more_observations/poly_obs_data.txt rename to docs/ert/getting_started/configuration/poly_new/with_more_observations/poly_obs_data.txt diff --git a/docs/getting_started/configuration/poly_new/with_observations/POLY_EVAL b/docs/ert/getting_started/configuration/poly_new/with_observations/POLY_EVAL similarity index 100% rename from docs/getting_started/configuration/poly_new/with_observations/POLY_EVAL rename to docs/ert/getting_started/configuration/poly_new/with_observations/POLY_EVAL diff --git a/docs/getting_started/configuration/poly_new/with_observations/coeff_a.png b/docs/ert/getting_started/configuration/poly_new/with_observations/coeff_a.png similarity index 100% rename from docs/getting_started/configuration/poly_new/with_observations/coeff_a.png rename to docs/ert/getting_started/configuration/poly_new/with_observations/coeff_a.png diff --git a/docs/getting_started/configuration/poly_new/with_observations/coeff_b.png b/docs/ert/getting_started/configuration/poly_new/with_observations/coeff_b.png similarity index 100% rename from docs/getting_started/configuration/poly_new/with_observations/coeff_b.png rename to docs/ert/getting_started/configuration/poly_new/with_observations/coeff_b.png diff --git a/docs/getting_started/configuration/poly_new/with_observations/coeff_c.png b/docs/ert/getting_started/configuration/poly_new/with_observations/coeff_c.png similarity index 100% rename from docs/getting_started/configuration/poly_new/with_observations/coeff_c.png rename to docs/ert/getting_started/configuration/poly_new/with_observations/coeff_c.png diff --git a/docs/getting_started/configuration/poly_new/with_observations/coeff_priors b/docs/ert/getting_started/configuration/poly_new/with_observations/coeff_priors similarity index 100% rename from docs/getting_started/configuration/poly_new/with_observations/coeff_priors rename to docs/ert/getting_started/configuration/poly_new/with_observations/coeff_priors diff --git a/docs/getting_started/configuration/poly_new/with_observations/generate_synthetic_observations.py b/docs/ert/getting_started/configuration/poly_new/with_observations/generate_synthetic_observations.py similarity index 100% rename from docs/getting_started/configuration/poly_new/with_observations/generate_synthetic_observations.py rename to docs/ert/getting_started/configuration/poly_new/with_observations/generate_synthetic_observations.py diff --git a/docs/getting_started/configuration/poly_new/with_observations/observations b/docs/ert/getting_started/configuration/poly_new/with_observations/observations similarity index 100% rename from docs/getting_started/configuration/poly_new/with_observations/observations rename to docs/ert/getting_started/configuration/poly_new/with_observations/observations diff --git a/docs/getting_started/configuration/poly_new/with_observations/plot_obs.png b/docs/ert/getting_started/configuration/poly_new/with_observations/plot_obs.png similarity index 100% rename from docs/getting_started/configuration/poly_new/with_observations/plot_obs.png rename to docs/ert/getting_started/configuration/poly_new/with_observations/plot_obs.png diff --git a/docs/getting_started/configuration/poly_new/with_observations/poly_eval.py b/docs/ert/getting_started/configuration/poly_new/with_observations/poly_eval.py similarity index 100% rename from docs/getting_started/configuration/poly_new/with_observations/poly_eval.py rename to docs/ert/getting_started/configuration/poly_new/with_observations/poly_eval.py diff --git a/docs/getting_started/configuration/poly_new/with_observations/poly_final.ert b/docs/ert/getting_started/configuration/poly_new/with_observations/poly_final.ert similarity index 100% rename from docs/getting_started/configuration/poly_new/with_observations/poly_final.ert rename to docs/ert/getting_started/configuration/poly_new/with_observations/poly_final.ert diff --git a/docs/getting_started/configuration/poly_new/with_observations/poly_obs_data.txt b/docs/ert/getting_started/configuration/poly_new/with_observations/poly_obs_data.txt similarity index 100% rename from docs/getting_started/configuration/poly_new/with_observations/poly_obs_data.txt rename to docs/ert/getting_started/configuration/poly_new/with_observations/poly_obs_data.txt diff --git a/docs/getting_started/configuration/poly_new/with_results/POLY_EVAL b/docs/ert/getting_started/configuration/poly_new/with_results/POLY_EVAL similarity index 100% rename from docs/getting_started/configuration/poly_new/with_results/POLY_EVAL rename to docs/ert/getting_started/configuration/poly_new/with_results/POLY_EVAL diff --git a/docs/getting_started/configuration/poly_new/with_results/coeff_priors b/docs/ert/getting_started/configuration/poly_new/with_results/coeff_priors similarity index 100% rename from docs/getting_started/configuration/poly_new/with_results/coeff_priors rename to docs/ert/getting_started/configuration/poly_new/with_results/coeff_priors diff --git a/docs/getting_started/configuration/poly_new/with_results/plots.png b/docs/ert/getting_started/configuration/poly_new/with_results/plots.png similarity index 100% rename from docs/getting_started/configuration/poly_new/with_results/plots.png rename to docs/ert/getting_started/configuration/poly_new/with_results/plots.png diff --git a/docs/getting_started/configuration/poly_new/with_results/poly.ert b/docs/ert/getting_started/configuration/poly_new/with_results/poly.ert similarity index 100% rename from docs/getting_started/configuration/poly_new/with_results/poly.ert rename to docs/ert/getting_started/configuration/poly_new/with_results/poly.ert diff --git a/docs/getting_started/configuration/poly_new/with_results/poly_eval.py b/docs/ert/getting_started/configuration/poly_new/with_results/poly_eval.py similarity index 100% rename from docs/getting_started/configuration/poly_new/with_results/poly_eval.py rename to docs/ert/getting_started/configuration/poly_new/with_results/poly_eval.py diff --git a/docs/getting_started/configuration/poly_new/with_results/poly_plot.png b/docs/ert/getting_started/configuration/poly_new/with_results/poly_plot.png similarity index 100% rename from docs/getting_started/configuration/poly_new/with_results/poly_plot.png rename to docs/ert/getting_started/configuration/poly_new/with_results/poly_plot.png diff --git a/docs/getting_started/configuration/poly_new/with_simple_script/POLY_EVAL b/docs/ert/getting_started/configuration/poly_new/with_simple_script/POLY_EVAL similarity index 100% rename from docs/getting_started/configuration/poly_new/with_simple_script/POLY_EVAL rename to docs/ert/getting_started/configuration/poly_new/with_simple_script/POLY_EVAL diff --git a/docs/getting_started/configuration/poly_new/with_simple_script/ert.png b/docs/ert/getting_started/configuration/poly_new/with_simple_script/ert.png similarity index 100% rename from docs/getting_started/configuration/poly_new/with_simple_script/ert.png rename to docs/ert/getting_started/configuration/poly_new/with_simple_script/ert.png diff --git a/docs/getting_started/configuration/poly_new/with_simple_script/poly.ert b/docs/ert/getting_started/configuration/poly_new/with_simple_script/poly.ert similarity index 100% rename from docs/getting_started/configuration/poly_new/with_simple_script/poly.ert rename to docs/ert/getting_started/configuration/poly_new/with_simple_script/poly.ert diff --git a/docs/getting_started/configuration/poly_new/with_simple_script/poly_eval.py b/docs/ert/getting_started/configuration/poly_new/with_simple_script/poly_eval.py similarity index 100% rename from docs/getting_started/configuration/poly_new/with_simple_script/poly_eval.py rename to docs/ert/getting_started/configuration/poly_new/with_simple_script/poly_eval.py diff --git a/docs/getting_started/howto/adaptive_localization.ipynb b/docs/ert/getting_started/howto/adaptive_localization.ipynb similarity index 100% rename from docs/getting_started/howto/adaptive_localization.ipynb rename to docs/ert/getting_started/howto/adaptive_localization.ipynb diff --git a/docs/getting_started/howto/ert_screenshot_adaptive_loc.png b/docs/ert/getting_started/howto/ert_screenshot_adaptive_loc.png similarity index 100% rename from docs/getting_started/howto/ert_screenshot_adaptive_loc.png rename to docs/ert/getting_started/howto/ert_screenshot_adaptive_loc.png diff --git a/docs/getting_started/howto/esmda_restart.rst b/docs/ert/getting_started/howto/esmda_restart.rst similarity index 100% rename from docs/getting_started/howto/esmda_restart.rst rename to docs/ert/getting_started/howto/esmda_restart.rst diff --git a/docs/getting_started/howto/plugin_system.rst b/docs/ert/getting_started/howto/plugin_system.rst similarity index 97% rename from docs/getting_started/howto/plugin_system.rst rename to docs/ert/getting_started/howto/plugin_system.rst index d2d7ad95321..2a24fb5c7e3 100644 --- a/docs/getting_started/howto/plugin_system.rst +++ b/docs/ert/getting_started/howto/plugin_system.rst @@ -129,7 +129,7 @@ The configuration file needed to use the ``installable_workflow_jobs`` hook must and specify its arguments. The built-in internal ``CSV_EXPORT`` workflow job is shown as an example: -.. literalinclude:: ../../../src/ert/resources/workflows/jobs/internal-gui/config/CSV_EXPORT +.. literalinclude:: ../../../../src/ert/resources/workflows/jobs/internal-gui/config/CSV_EXPORT Implement the hook specification as follows to register the workflow job ``CSV_EXPORT``: @@ -150,7 +150,7 @@ Implement the hook specification as follows to register the workflow job ``CSV_E The second approach does not require creating a workflow job configuration file up-front, and allows adding documentation. -.. literalinclude:: ../../../src/ert/plugins/hook_specifications/jobs.py +.. literalinclude:: ../../../../src/ert/plugins/hook_specifications/jobs.py :pyobject: legacy_ertscript_workflow Minimal example: diff --git a/docs/getting_started/howto/restart-es-mda.png b/docs/ert/getting_started/howto/restart-es-mda.png similarity index 100% rename from docs/getting_started/howto/restart-es-mda.png rename to docs/ert/getting_started/howto/restart-es-mda.png diff --git a/docs/getting_started/setup.rst b/docs/ert/getting_started/setup.rst similarity index 100% rename from docs/getting_started/setup.rst rename to docs/ert/getting_started/setup.rst diff --git a/docs/getting_started/updating_parameters/fig/evaluate_ensemble.gif b/docs/ert/getting_started/updating_parameters/fig/evaluate_ensemble.gif similarity index 100% rename from docs/getting_started/updating_parameters/fig/evaluate_ensemble.gif rename to docs/ert/getting_started/updating_parameters/fig/evaluate_ensemble.gif diff --git a/docs/getting_started/updating_parameters/fig/prior_params.png b/docs/ert/getting_started/updating_parameters/fig/prior_params.png similarity index 100% rename from docs/getting_started/updating_parameters/fig/prior_params.png rename to docs/ert/getting_started/updating_parameters/fig/prior_params.png diff --git a/docs/getting_started/updating_parameters/fig/prior_response.png b/docs/ert/getting_started/updating_parameters/fig/prior_response.png similarity index 100% rename from docs/getting_started/updating_parameters/fig/prior_response.png rename to docs/ert/getting_started/updating_parameters/fig/prior_response.png diff --git a/docs/getting_started/updating_parameters/fig/restart_es_mda.gif b/docs/ert/getting_started/updating_parameters/fig/restart_es_mda.gif similarity index 100% rename from docs/getting_started/updating_parameters/fig/restart_es_mda.gif rename to docs/ert/getting_started/updating_parameters/fig/restart_es_mda.gif diff --git a/docs/getting_started/updating_parameters/fig/sample_prior.gif b/docs/ert/getting_started/updating_parameters/fig/sample_prior.gif similarity index 100% rename from docs/getting_started/updating_parameters/fig/sample_prior.gif rename to docs/ert/getting_started/updating_parameters/fig/sample_prior.gif diff --git a/docs/getting_started/updating_parameters/fig/update_report.png b/docs/ert/getting_started/updating_parameters/fig/update_report.png similarity index 100% rename from docs/getting_started/updating_parameters/fig/update_report.png rename to docs/ert/getting_started/updating_parameters/fig/update_report.png diff --git a/docs/getting_started/updating_parameters/index.rst b/docs/ert/getting_started/updating_parameters/index.rst similarity index 100% rename from docs/getting_started/updating_parameters/index.rst rename to docs/ert/getting_started/updating_parameters/index.rst diff --git a/docs/getting_started/updating_parameters/update_parameters.rst b/docs/ert/getting_started/updating_parameters/update_parameters.rst similarity index 100% rename from docs/getting_started/updating_parameters/update_parameters.rst rename to docs/ert/getting_started/updating_parameters/update_parameters.rst diff --git a/docs/getting_started/webviz-ert/observation_analyzer.gif b/docs/ert/getting_started/webviz-ert/observation_analyzer.gif similarity index 100% rename from docs/getting_started/webviz-ert/observation_analyzer.gif rename to docs/ert/getting_started/webviz-ert/observation_analyzer.gif diff --git a/docs/getting_started/webviz-ert/parameter_comparison.gif b/docs/ert/getting_started/webviz-ert/parameter_comparison.gif similarity index 100% rename from docs/getting_started/webviz-ert/parameter_comparison.gif rename to docs/ert/getting_started/webviz-ert/parameter_comparison.gif diff --git a/docs/getting_started/webviz-ert/plot_viewer.gif b/docs/ert/getting_started/webviz-ert/plot_viewer.gif similarity index 100% rename from docs/getting_started/webviz-ert/plot_viewer.gif rename to docs/ert/getting_started/webviz-ert/plot_viewer.gif diff --git a/docs/getting_started/webviz-ert/response_correlation.gif b/docs/ert/getting_started/webviz-ert/response_correlation.gif similarity index 100% rename from docs/getting_started/webviz-ert/response_correlation.gif rename to docs/ert/getting_started/webviz-ert/response_correlation.gif diff --git a/docs/getting_started/webviz-ert/start_up.gif b/docs/ert/getting_started/webviz-ert/start_up.gif similarity index 100% rename from docs/getting_started/webviz-ert/start_up.gif rename to docs/ert/getting_started/webviz-ert/start_up.gif diff --git a/docs/getting_started/webviz-ert/webviz-ert.rst b/docs/ert/getting_started/webviz-ert/webviz-ert.rst similarity index 100% rename from docs/getting_started/webviz-ert/webviz-ert.rst rename to docs/ert/getting_started/webviz-ert/webviz-ert.rst diff --git a/docs/img/logo.png b/docs/ert/img/logo.png similarity index 100% rename from docs/img/logo.png rename to docs/ert/img/logo.png diff --git a/docs/index.rst b/docs/ert/index.rst similarity index 97% rename from docs/index.rst rename to docs/ert/index.rst index 6e44eccd277..da092fe2696 100644 --- a/docs/index.rst +++ b/docs/ert/index.rst @@ -1,4 +1,4 @@ -.. image:: ../src/ert/gui/resources/gui/img/ert_icon.svg +.. image:: ../../src/ert/gui/resources/gui/img/ert_icon.svg :align: center :scale: 50% diff --git a/docs/reference/configuration/data_types.rst b/docs/ert/reference/configuration/data_types.rst similarity index 100% rename from docs/reference/configuration/data_types.rst rename to docs/ert/reference/configuration/data_types.rst diff --git a/docs/reference/configuration/fig/README.md b/docs/ert/reference/configuration/fig/README.md similarity index 100% rename from docs/reference/configuration/fig/README.md rename to docs/ert/reference/configuration/fig/README.md diff --git a/docs/reference/configuration/fig/config.ert b/docs/ert/reference/configuration/fig/config.ert similarity index 100% rename from docs/reference/configuration/fig/config.ert rename to docs/ert/reference/configuration/fig/config.ert diff --git a/docs/reference/configuration/fig/const.png b/docs/ert/reference/configuration/fig/const.png similarity index 100% rename from docs/reference/configuration/fig/const.png rename to docs/ert/reference/configuration/fig/const.png diff --git a/docs/reference/configuration/fig/derrf_right_skewed.png b/docs/ert/reference/configuration/fig/derrf_right_skewed.png similarity index 100% rename from docs/reference/configuration/fig/derrf_right_skewed.png rename to docs/ert/reference/configuration/fig/derrf_right_skewed.png diff --git a/docs/reference/configuration/fig/derrf_symmetric_uniform.png b/docs/ert/reference/configuration/fig/derrf_symmetric_uniform.png similarity index 100% rename from docs/reference/configuration/fig/derrf_symmetric_uniform.png rename to docs/ert/reference/configuration/fig/derrf_symmetric_uniform.png diff --git a/docs/reference/configuration/fig/dunif.png b/docs/ert/reference/configuration/fig/dunif.png similarity index 100% rename from docs/reference/configuration/fig/dunif.png rename to docs/ert/reference/configuration/fig/dunif.png diff --git a/docs/reference/configuration/fig/errf_right_skewed_unimodal.png b/docs/ert/reference/configuration/fig/errf_right_skewed_unimodal.png similarity index 100% rename from docs/reference/configuration/fig/errf_right_skewed_unimodal.png rename to docs/ert/reference/configuration/fig/errf_right_skewed_unimodal.png diff --git a/docs/reference/configuration/fig/errf_symmetric_uniform.png b/docs/ert/reference/configuration/fig/errf_symmetric_uniform.png similarity index 100% rename from docs/reference/configuration/fig/errf_symmetric_uniform.png rename to docs/ert/reference/configuration/fig/errf_symmetric_uniform.png diff --git a/docs/reference/configuration/fig/lognormal.png b/docs/ert/reference/configuration/fig/lognormal.png similarity index 100% rename from docs/reference/configuration/fig/lognormal.png rename to docs/ert/reference/configuration/fig/lognormal.png diff --git a/docs/reference/configuration/fig/loguniform.png b/docs/ert/reference/configuration/fig/loguniform.png similarity index 100% rename from docs/reference/configuration/fig/loguniform.png rename to docs/ert/reference/configuration/fig/loguniform.png diff --git a/docs/reference/configuration/fig/normal.png b/docs/ert/reference/configuration/fig/normal.png similarity index 100% rename from docs/reference/configuration/fig/normal.png rename to docs/ert/reference/configuration/fig/normal.png diff --git a/docs/reference/configuration/fig/priors.txt b/docs/ert/reference/configuration/fig/priors.txt similarity index 100% rename from docs/reference/configuration/fig/priors.txt rename to docs/ert/reference/configuration/fig/priors.txt diff --git a/docs/reference/configuration/fig/triangular.png b/docs/ert/reference/configuration/fig/triangular.png similarity index 100% rename from docs/reference/configuration/fig/triangular.png rename to docs/ert/reference/configuration/fig/triangular.png diff --git a/docs/reference/configuration/fig/truncated_ok.png b/docs/ert/reference/configuration/fig/truncated_ok.png similarity index 100% rename from docs/reference/configuration/fig/truncated_ok.png rename to docs/ert/reference/configuration/fig/truncated_ok.png diff --git a/docs/reference/configuration/fig/uniform.png b/docs/ert/reference/configuration/fig/uniform.png similarity index 100% rename from docs/reference/configuration/fig/uniform.png rename to docs/ert/reference/configuration/fig/uniform.png diff --git a/docs/reference/configuration/forward_model.rst b/docs/ert/reference/configuration/forward_model.rst similarity index 100% rename from docs/reference/configuration/forward_model.rst rename to docs/ert/reference/configuration/forward_model.rst diff --git a/docs/reference/configuration/index.rst b/docs/ert/reference/configuration/index.rst similarity index 100% rename from docs/reference/configuration/index.rst rename to docs/ert/reference/configuration/index.rst diff --git a/docs/reference/configuration/keywords.rst b/docs/ert/reference/configuration/keywords.rst similarity index 100% rename from docs/reference/configuration/keywords.rst rename to docs/ert/reference/configuration/keywords.rst diff --git a/docs/reference/configuration/magic_strings.rst b/docs/ert/reference/configuration/magic_strings.rst similarity index 100% rename from docs/reference/configuration/magic_strings.rst rename to docs/ert/reference/configuration/magic_strings.rst diff --git a/docs/reference/configuration/observations.rst b/docs/ert/reference/configuration/observations.rst similarity index 100% rename from docs/reference/configuration/observations.rst rename to docs/ert/reference/configuration/observations.rst diff --git a/docs/reference/configuration/queue.rst b/docs/ert/reference/configuration/queue.rst similarity index 100% rename from docs/reference/configuration/queue.rst rename to docs/ert/reference/configuration/queue.rst diff --git a/docs/reference/configuration/site_wide.rst b/docs/ert/reference/configuration/site_wide.rst similarity index 100% rename from docs/reference/configuration/site_wide.rst rename to docs/ert/reference/configuration/site_wide.rst diff --git a/docs/reference/queue/QUEUE_TEST b/docs/ert/reference/queue/QUEUE_TEST similarity index 100% rename from docs/reference/queue/QUEUE_TEST rename to docs/ert/reference/queue/QUEUE_TEST diff --git a/docs/reference/queue/local_queue.ert b/docs/ert/reference/queue/local_queue.ert similarity index 100% rename from docs/reference/queue/local_queue.ert rename to docs/ert/reference/queue/local_queue.ert diff --git a/docs/reference/queue/lsf_queue.ert b/docs/ert/reference/queue/lsf_queue.ert similarity index 100% rename from docs/reference/queue/lsf_queue.ert rename to docs/ert/reference/queue/lsf_queue.ert diff --git a/docs/reference/queue/queue_test_forward_model.py b/docs/ert/reference/queue/queue_test_forward_model.py similarity index 100% rename from docs/reference/queue/queue_test_forward_model.py rename to docs/ert/reference/queue/queue_test_forward_model.py diff --git a/docs/reference/running_ert.rst b/docs/ert/reference/running_ert.rst similarity index 100% rename from docs/reference/running_ert.rst rename to docs/ert/reference/running_ert.rst diff --git a/docs/reference/workflows/added_workflow_jobs.rst b/docs/ert/reference/workflows/added_workflow_jobs.rst similarity index 100% rename from docs/reference/workflows/added_workflow_jobs.rst rename to docs/ert/reference/workflows/added_workflow_jobs.rst diff --git a/docs/reference/workflows/complete_workflows.rst b/docs/ert/reference/workflows/complete_workflows.rst similarity index 100% rename from docs/reference/workflows/complete_workflows.rst rename to docs/ert/reference/workflows/complete_workflows.rst diff --git a/docs/reference/workflows/configuring_jobs.rst b/docs/ert/reference/workflows/configuring_jobs.rst similarity index 100% rename from docs/reference/workflows/configuring_jobs.rst rename to docs/ert/reference/workflows/configuring_jobs.rst diff --git a/docs/reference/workflows/index.rst b/docs/ert/reference/workflows/index.rst similarity index 100% rename from docs/reference/workflows/index.rst rename to docs/ert/reference/workflows/index.rst diff --git a/docs/reference/workflows/workflows.rst b/docs/ert/reference/workflows/workflows.rst similarity index 100% rename from docs/reference/workflows/workflows.rst rename to docs/ert/reference/workflows/workflows.rst diff --git a/docs/static_html/Oscillator.html b/docs/ert/static_html/Oscillator.html similarity index 95% rename from docs/static_html/Oscillator.html rename to docs/ert/static_html/Oscillator.html index f33e5184432..98409164420 100644 --- a/docs/static_html/Oscillator.html +++ b/docs/ert/static_html/Oscillator.html @@ -26,7 +26,7 @@ - + @@ -54,11 +54,11 @@

Getting started

Reference

Developer Documentation

API Reference

About

@@ -342,7 +342,7 @@

Example: Oscillator - +
diff --git a/docs/static_html/Polynomial.html b/docs/ert/static_html/Polynomial.html similarity index 95% rename from docs/static_html/Polynomial.html rename to docs/ert/static_html/Polynomial.html index 08104845c36..277c2fc9216 100644 --- a/docs/static_html/Polynomial.html +++ b/docs/ert/static_html/Polynomial.html @@ -54,11 +54,11 @@

Getting started

Reference

Developer Documentation

API Reference

About

diff --git a/docs/static_html/README.txt b/docs/ert/static_html/README.txt similarity index 100% rename from docs/static_html/README.txt rename to docs/ert/static_html/README.txt diff --git a/docs/static_html/css/narratives.css b/docs/ert/static_html/css/narratives.css similarity index 100% rename from docs/static_html/css/narratives.css rename to docs/ert/static_html/css/narratives.css diff --git a/docs/theory/ensemble_based_methods.rst b/docs/ert/theory/ensemble_based_methods.rst similarity index 100% rename from docs/theory/ensemble_based_methods.rst rename to docs/ert/theory/ensemble_based_methods.rst diff --git a/docs/theory/images/Bayes_theorem.PNG b/docs/ert/theory/images/Bayes_theorem.PNG similarity index 100% rename from docs/theory/images/Bayes_theorem.PNG rename to docs/ert/theory/images/Bayes_theorem.PNG diff --git a/docs/theory/images/bpr.jpg b/docs/ert/theory/images/bpr.jpg similarity index 100% rename from docs/theory/images/bpr.jpg rename to docs/ert/theory/images/bpr.jpg diff --git a/docs/theory/images/posterior_path.png b/docs/ert/theory/images/posterior_path.png similarity index 100% rename from docs/theory/images/posterior_path.png rename to docs/ert/theory/images/posterior_path.png diff --git a/docs/everest/cli.rst b/docs/everest/cli.rst new file mode 100644 index 00000000000..3f1d4d068ea --- /dev/null +++ b/docs/everest/cli.rst @@ -0,0 +1,221 @@ +.. _cha_cli: + +********************** +Command Line Interface +********************** + +.. argparse:: + :module: everest.bin.main + :func: _build_args_parser + :prog: start_everest + +============== + Everest `run` +============== + +.. argparse:: + :module: everest.bin.everest_script + :func: _build_args_parser + :prog: everest_entry + +Closing the console used to start the optimization case while it is running will not terminate the optimization process. +To continue monitoring the running optimization use the command `everest monitor config_file.yml`. +To stop a running optimization use `everest kill config_file.yml`. + + +================== + Everest `monitor` +================== + +.. argparse:: + :module: everest.bin.monitor_script + :func: _build_args_parser + :prog: monitor_entry + +Closing the console while monitoring the optimization case will not terminate the optimization process. + +Using again the command `everest monitor config_file.yml`, will reattach to the optimization case and display the optimization progress from the point it has reached. + +================== + Everest `kill` +================== + +.. argparse:: + :module: everest.bin.kill_script + :func: _build_args_parser + :prog: kill_entry + + +.. _evexport: + +================ +Everest `export` +================ + +.. argparse:: + :module: everest.bin.everexport_script + :func: _build_args_parser + :prog: everexport_entry + + +The everest export functionality is configured in the export section of the config file. +The following represents an export section a config file set with default values. + +.. code-block:: yaml + + export: + skip_export: False + keywords: + batches: + discard_gradient: True # Export only non-gradient simulations + discard_rejected: True # Export only increased merit simulations + csv_output_filepath: everest_output_folder/config_file.csv + +When the export command `everest export config_file.yml` is run with a config file that does not define an export section default values will be used, a `config_file.csv` file in the Everest output folder will be created. +By default Everest exports only non-gradient with increased merit simulations when no config section is defined in the config file. +The file will contain optimization data for all the optimization batches and the available eclipse keywords (if a data file is available) for only the non-gradient simulations and the simulations that increase merit. + +**Examples** + +* Export only non-gradient simulation using the following export section in the config file + +.. code-block:: yaml + + export: + discard_rejected: False + +* Export only increased merit simulation using the following export section in the config file + +.. code-block:: yaml + + export: + discard_gradient: False + + +* Export only a list of available batches even if they are gradient batches and if no export section is defined. + + everest export config_file.yml --batches 0 2 4 + +The command above is equivalent to having the following export section defined in the config file `config_file.yml`. + +.. code-block:: yaml + + export: + batches: [0, 2, 4] + +* Exporting just a specific list of eclipse keywords requires the following export section defined in the config file. + +.. code-block:: yaml + + export: + keywords: ['FOIP', 'FOPT'] + +* Skip export by adding the following section in the config file. + +.. code-block:: yaml + + export: + skip_export: True + +* Export will also be skipped if an empty list of batches is defined in the export section. + +.. code-block:: yaml + + export: + batches: [] + +============== +Everest `load` +============== + +.. argparse:: + :module: everest.bin.everload_script + :func: _build_args_parser + :prog: everload_entry + + +============== +Everest `lint` +============== + +.. argparse:: + :module: everest.bin.everlint_script + :func: _build_args_parser + :prog: lint_entry + +================ +Everest `render` +================ + +.. argparse:: + :module: everest.bin.everconfigdump_script + :func: _build_args_parser + :prog: config_dump_entry + + +=================== +Graphical interface +=================== + +.. argparse:: + :module: ieverest.bin.ieverest_script + :func: _build_args_parser + :prog: ieverest_entry + + +.. _ev_branch: + +============== +Everest branch +============== + +.. argparse:: + :module: everest.bin.config_branch_script + :func: _build_args_parser + :prog: config_branch_entry + +**Description** + +The *everest branch* command is designed to help users quickly create a new config file based on a previous config file +used in an optimization experiment. + +The user is required to provide an existing batch number form the previous optimization experiment. + +The newly created config file will contain updated values for the control's initial guesses. + +The new values for the control's initial guess will be the control values associated with the given batch number +in the previous optimization case. + +**Warning** +Removing the optimization output folder before running the *branch* will make the command unable to successfully execute + +The *branch* command does not provide optimization experiment restart functionality. Starting an optimization case based +on the newly created config file is considered an new optimization experiment. + +=============== +Everest results +=============== + +.. argparse:: + :module: everest.bin.visualization_script + :func: _build_args_parser + :prog: visualization_entry + + +If no visualization plugin is installed the message: +``No visualization plugin installed!`` will be displayed in the console. + + +Plugin +====== + +The recommended open-source everest visualization plugin is Everviz_ + +.. _Everviz: https://github.com/equinor/everviz + + +It can be installed using `pip` + +.. code-block:: yaml + + pip install everviz diff --git a/docs/everest/conf.py b/docs/everest/conf.py new file mode 100644 index 00000000000..55b339a5ed3 --- /dev/null +++ b/docs/everest/conf.py @@ -0,0 +1,198 @@ +# -*- coding: utf-8 -*- +# +# Configuration file for the Sphinx documentation builder. +# +# This file does only contain a selection of the most common options. For a +# full list see the documentation: +# http://www.sphinx-doc.org/en/master/config + +# -- Path setup -------------------------------------------------------------- + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +from importlib import metadata + +# -- Project information ----------------------------------------------------- + +project = "Everest" +copyright = "2024, Equinor & TNO" +author = "Equinor & TNO" + + +try: + dist_version = metadata.version("ert") +except metadata.PackageNotFoundError: + dist_version = "0.0.0" + +# The short X.Y version +version = ".".join(dist_version.split(".")[:2]) +# The full version, including alpha/beta/rc tags +release = dist_version + + +# -- General configuration --------------------------------------------------- + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "sphinx_copybutton", + "sphinx.ext.autodoc", + "sphinx.ext.intersphinx", + "sphinx.ext.ifconfig", + "sphinx.ext.viewcode", + "sphinxarg.ext", +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ["_templates"] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = {".rst": "restructuredtext"} + +# The master toctree document. +master_doc = "index" + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = "en" + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = "sphinx" + + +# -- Options for HTML output ------------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = "furo" +html_title = f"{project} {version} documentation" +html_logo = "./images/everest_icon.svg" + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. + +html_theme_options = { + "source_repository": "https://github.com/equinor/everest/", + "source_branch": "main", + "source_directory": "docs/source", +} + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +# html_static_path = ['_static'] + +# Custom sidebar templates, must be a dictionary that maps document names +# to template names. +# +# The default sidebars (for documents that don't match any pattern) are +# defined by theme itself. Builtin themes are using these templates by +# default: ``['localtoc.html', 'relations.html', 'sourcelink.html', +# 'searchbox.html']``. +# +# html_sidebars = {} + + +# -- Options for HTMLHelp output --------------------------------------------- + +# Output file base name for HTML help builder. +htmlhelp_basename = "Everestdoc" + + +# -- Options for LaTeX output ------------------------------------------------ + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, "Everest.tex", "Everest Documentation", "Equinor \\& TNO", "manual"), +] + + +# -- Options for manual page output ------------------------------------------ + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [(master_doc, "everest", "Everest Documentation", [author], 1)] + + +# -- Options for Texinfo output ---------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + ( + master_doc, + "Everest", + "Everest Documentation", + author, + "Everest", + "One line description of project.", + "Miscellaneous", + ), +] + + +# -- Options for Epub output ------------------------------------------------- + +# Bibliographic Dublin Core info. +epub_title = project + +# The unique identifier of the text. This can be a ISBN number +# or the project homepage. +# +# epub_identifier = '' + +# A unique identification for the text. +# +# epub_uid = '' + +# A list of files that should not be packed into the epub file. +epub_exclude_files = ["search.html"] + + +# -- Extension configuration ------------------------------------------------- + +# -- Options for intersphinx extension --------------------------------------- + +# Allow to refer to a figure using its number +numfig = True + +# Example configuration for intersphinx: refer to the Python standard library. +intersphinx_mapping = {"python": ("https://docs.python.org/3", None)} diff --git a/docs/everest/config.rst b/docs/everest/config.rst new file mode 100644 index 00000000000..1dbea254844 --- /dev/null +++ b/docs/everest/config.rst @@ -0,0 +1,56 @@ +.. _cha_config: + +********************* +Everest configuration +********************* + +Everest is configured via a yaml file, using a set of pre-defined keywords that +are described in more detail in the section :ref:`cha_config_reference`. + +In addition to the standard yaml syntax, Everest also supports the use of +variables that are replaced with their value when referred in the following +way: ``r{{variable}}``. For instance in the following snippet, the variable +``tol`` is replaced by its value: + +.. code-block:: yaml + + optimization: + algorithm: optpp_q_newton + convergence_tolerance: r{{tol}} + +The value of a variable can be set in three different ways: + +1. In the ``definitions`` section in the yaml file. For instance, to define a + variable ``tol`` with a value of 0.0001, include this in the ``definitions`` + section: + + .. code-block:: yaml + + definitions: + tol: 0.0001 + +2. Everest pre-defines the following variables: + + .. code-block:: yaml + + realization: + configpath: + runpath_file: + eclbase: + + These variables do not need to be defined by the user, although their values + can be overridden in the ``definitions`` section. However, this is not + recommended for the ``realization`` entry, and Everest will produce a warning + when this is attempted. + +3. Variables with a name of the form ``os.ENVIRONMENT_VARIABLE_NAME`` can be used to access + the values of environment variables. For instance, the variable + ``r{{os.HOSTNAME}}`` will be replaced by the contents of the environment + variable ``HOSTNAME``. + +.. note:: + Variables are a distinct feature from the yaml keywords defined in section + :ref:`cha_config_reference`. The final yaml file used by Everest is produced + by pre-processing the config file to replace all variables with their value. + It is possible to define variables that have the same name as a keyword, but + this should be done sparingly to avoid confusion. diff --git a/docs/everest/config_generated.rst b/docs/everest/config_generated.rst new file mode 100644 index 00000000000..41852529e75 --- /dev/null +++ b/docs/everest/config_generated.rst @@ -0,0 +1,1336 @@ +model (required) +---------------- +Type: *ModelConfig* + +Configuration of the Everest model + +**realizations (optional)** + Type: *List[NonNegativeInt]* + + List of realizations to use in optimization ensemble. + + Typically, this is a list [0, 1, ..., n-1] of all realizations in the ensemble. + + +**data_file (optional)** + Type: *Optional[str]* + + Path to the eclipse data file used for optimization. + The path can contain r{{geo_id}}. + + NOTE: Without a data file no well or group specific summary data will be exported. + + +**realizations_weights (optional)** + Type: *Optional[List[float]]* + + List of weights, one per realization. + + If specified, it must be a list of numeric values, one per realization. + + +**report_steps (optional)** + Type: *Optional[List[str]]* + + List of dates allowed in the summary file. + + + +controls (required) +------------------- +Type: *List[ControlConfig]* + +Defines a list of controls. +Controls should have unique names each control defines +a group of control variables + + +**name (required)** + Type: *str* + + Control name + + +**type (required)** + Type: *Literal['well_control', 'generic_control']* + + + Only two allowed control types are accepted + + * **well_control**: Standard built-in Everest control type designed for field optimization + + * **generic_control**: Enables the user to define controls types to be employed for customized optimization jobs. + + +**variables (required)** + Type: *Union[List[ControlVariableConfig], List[ControlVariableGuessListConfig]]* + + List of control variables + + **name (required)** + Type: *str* + + Control variable name + + + **control_type (optional)** + Type: *Optional[Literal['real', 'integer']]* + + + The type of control. Set to "integer" for discrete optimization. This may be + ignored if the algorithm that is used does not support different control types. + + + **enabled (optional)** + Type: *Optional[bool]* + + + If `True`, the variable will be optimized, otherwise it will be fixed to the + initial value. + + + **auto_scale (optional)** + Type: *Optional[bool]* + + + Can be set to true to re-scale variable from the range + defined by [min, max] to the range defined by scaled_range (default [0, 1]) + + + **scaled_range (optional)** + Type: *Optional[Tuple[float, float]]* + + + Can be used to set the range of the variable values + after scaling (default = [0, 1]). + + This option has no effect if auto_scale is not set. + + + **min (optional)** + Type: *Optional[float]* + + + Minimal value allowed for the variable + + initial_guess is required to be greater than this value. + + + **max (optional)** + Type: *Optional[float]* + + + Max value allowed for the variable + + initial_guess is required to be less than this value. + + + + **perturbation_magnitude (optional)** + Type: *Optional[PositiveFloat]* + + + Specifies the perturbation magnitude for this particular variable. + This feature adds flexibility to combine controls into more logical + of structures at the same time allowing the variable to contain time ( + how long rate applies for) & value (the actual rate). + + NOTE: In most cases this should not be configured, and the default value should be used. + + + **sampler (optional)** + Type: *Optional[SamplerConfig]* + + The backend used by Everest for sampling points + + **backend (optional)** + Type: *str* + + The backend used by Everest for sampling points. + + The sampler backend provides the methods for sampling the points used to + estimate the gradient. The default is the built-in 'scipy' backend. + + + + **options (optional)** + Type: *Optional[Mapping[str, Any]]* + + + Specifies a dict of optional parameters for the sampler backend. + + This dict of values is passed unchanged to the selected method in the backend. + + + + **method (optional)** + Type: *str* + + The sampling method or distribution used by the sampler backend. + + + **shared (optional)** + Type: *Optional[bool]* + + Whether to share perturbations between realizations. + + + + **initial_guess (optional)** + Type: *List[float]* + + List of Starting values for the control variable + + + +**initial_guess (optional)** + Type: *Optional[float]* + + + Initial guess for the control group all control variables with initial_guess not + defined will be assigned this value. Individual initial_guess values in the control + variables will overwrite this value. + + +**control_type (optional)** + Type: *Literal['real', 'integer']* + + + The type of the controls for the control group. Individual control types in the + control variables will override this value. Set to "integer" for discrete + optimization. This may be ignored if the algorithm that is used does not support + different control types. + + +**enabled (optional)** + Type: *Optional[bool]* + + + If `True`, all variables in this control group will be optimized. If set to `False` + the value of the variables will remain fixed. + + +**auto_scale (optional)** + Type: *bool* + + + Can be set to true to re-scale controls from the range + defined by [min, max] to the range defined by + scaled_range (default [0, 1]). + + + +**min (optional)** + Type: *Optional[float]* + + + Defines left-side value in the control group range [min, max]. + This value will be overwritten by the control variable min value if given. + + The initial guess for both the group and the individual variables needs to be contained + in the resulting [min, max] range + + +**max (optional)** + Type: *Optional[float]* + + + Defines right-side value in the control group range [min, max]. + This value will be overwritten by the control variable max value if given. + + The initial guess for both the group and the individual variables needs to be contained + in the resulting [min, max] range + + +**perturbation_type (optional)** + Type: *Literal['absolute', 'relative']* + + + Example: absolute or relative + Specifies the perturbation type for a set of controls of a certain type. The + perturbation type keyword defines whether the perturbation magnitude + (perturbation_magnitude) should be considered as an absolute value or relative + to the dynamic range of the controls. + + NOTE: currently the dynamic range is computed with respect to all controls, so + defining relative perturbation type for control types with different dynamic + ranges might have unintended effects. + + + +**perturbation_magnitude (optional)** + Type: *Optional[float]* + + + Specifies the perturbation magnitude for a set of controls of a certain type. + + This controls the size of perturbations (standard deviation of a + normal distribution) of controls used to approximate the gradient. + The value depends on the type of control and magnitude of the variables. + For continuous controls smaller values should give a better gradient, + whilst for more discrete controls larger values should give a better + result. However, this is a balance as too large or too small + of values also cause issues. + + NOTE: In most cases this should not be configured, and the default value should be used. + + + +**scaled_range (optional)** + Type: *Optional[Tuple[float, float]]* + + + Can be used to set the range of the control values + after scaling (default = [0, 1]). + + This option has no effect if auto_scale is not set. + + + +**sampler (optional)** + Type: *Optional[SamplerConfig]* + + + A sampler specification section applies to a group of controls, or to an + individual control. Sampler specifications are not required, with the + following behavior, if no sampler sections are provided, a normal + distribution is used. + + If at least one control group or variable has a sampler specification, only + the groups or variables with a sampler specification are perturbed. + Controls/variables that do not have a sampler section will not be perturbed + at all. If that is not desired, make sure to specify a sampler for each + control group and/or variable (or none at all to use a normal distribution + for each control). + + Within the sampler section, the *shared* keyword can be used to direct the + sampler to use the same perturbations for each realization. + + + **backend (optional)** + Type: *str* + + The backend used by Everest for sampling points. + + The sampler backend provides the methods for sampling the points used to + estimate the gradient. The default is the built-in 'scipy' backend. + + + + **options (optional)** + Type: *Optional[Mapping[str, Any]]* + + + Specifies a dict of optional parameters for the sampler backend. + + This dict of values is passed unchanged to the selected method in the backend. + + + + **method (optional)** + Type: *str* + + The sampling method or distribution used by the sampler backend. + + + **shared (optional)** + Type: *Optional[bool]* + + Whether to share perturbations between realizations. + + + + +optimization (required) +----------------------- +Type: *OptimizationConfig* + +Optimizer options + +**algorithm (optional)** + Type: *Optional[str]* + + Algorithm used by Everest. Defaults to + optpp_q_newton, a quasi-Newton algorithm in Dakota's OPT PP library. + + +**convergence_tolerance (optional)** + Type: *Optional[float]* + + Defines the threshold value on relative change + in the objective function that indicates convergence. + + The convergence_tolerance specification provides a real value for controlling + the termination of iteration. In most cases, it is a relative convergence tolerance + for the objective function; i.e., if the change in the objective function between + successive iterations divided by the previous objective function is less than + the amount specified by convergence_tolerance, then this convergence criterion is + satisfied on the current iteration. + + Since no progress may be made on one iteration followed by significant progress + on a subsequent iteration, some libraries require that the convergence tolerance + be satisfied on two or more consecutive iterations prior to termination of + iteration. + + (From the Dakota Manual.) + + +**backend (optional)** + Type: *Optional[str]* + + The optimization backend used. Defaults to "dakota". + + Currently, backends are included to use Dakota or SciPy ("dakota" and "scipy"). + The Dakota backend is the default, and can be assumed to be installed. The SciPy + backend is optional, and will only be available if SciPy is installed on the + system. + + +**backend_options (optional)** + Type: *Optional[Mapping[str, Any]]* + + Dict of optional parameters for the optimizer backend. + This dict of values is passed unchanged to the selected algorithm in the backend. + + Note that the default Dakota backend ignores this option, because it requires a + list of strings rather than a dictionary. For setting Dakota backend options, see + the 'option' keyword. + + +**constraint_tolerance (optional)** + Type: *Optional[float]* + + Determines the maximum allowable value of + infeasibility that any constraint in an optimization problem may possess and + still be considered to be satisfied. + + It is specified as a positive real value. If a constraint function is greater + than this value then it is considered to be violated by the optimization + algorithm. This specification gives some control over how tightly the + constraints will be satisfied at convergence of the algorithm. However, if the + value is set too small the algorithm may terminate with one or more constraints + being violated. + + (From the Dakota Manual.) + + +**cvar (optional)** + Type: *Optional[CVaRConfig]* + + Directs the optimizer to use CVaR estimation. + + When this section is present Everest will use Conditional Value at Risk (CVaR) + to minimize risk. Effectively this means that at each iteration the objective + and constraint functions will be calculated as the mean over the sub-set of the + realizations that perform worst. The size of this set is specified as an + absolute number or as a percentile value. These options are selected by setting + either the **number_of_realizations** option, or the **percentile** option, + which are mutually exclusive. + + **number_of_realizations (optional)** + Type: *Optional[int]* + + The number of realizations used for CVaR estimation. + + Sets the number of realizations that is used to calculate the total objective. + + This option is exclusive with the **percentile** option. + + + **percentile (optional)** + Type: *Optional[float]* + + The percentile used for CVaR estimation. + + Sets the percentile of distribution of the objective over the realizations that + is used to calculate the total objective. + + This option is exclusive with the **number_of_realizations** option. + + + + + +**max_batch_num (optional)** + Type: *Optional[int]* + + Limits the number of batches of simulations + during optimization, where 0 represents unlimited simulation batches. + When max_batch_num is specified and the current batch index is greater than + max_batch_num an exception is raised. + + +**max_function_evaluations (optional)** + Type: *Optional[int]* + + Limits the maximum number of function evaluations. + + The max_function_evaluations controls the number of control update steps the optimizer + will allow before convergence is obtained. + + See max_iterations for a description. + + +**max_iterations (optional)** + Type: *Optional[int]* + + Limits the maximum number of iterations. + + The difference between an iteration and a batch is that an iteration corresponds to + a complete accepted batch (i.e., a batch that provides an improvement in the + objective function while satisfying all constraints). + + +**min_pert_success (optional)** + Type: *Optional[int]* + + specifies the minimum number of successfully completed + evaluations of perturbed controls required to compute a gradient. The optimization + process will stop if this minimum is not reached, and otherwise a gradient will be + computed based on the set of successful perturbation runs. The minimum is checked for + each realization individually. + + A special case is robust optimization with `perturbation_num: 1`. In that case the + minimum applies to all realizations combined. In other words, a robust gradient may then + still be computed based on a subset of the realizations. + + The user-provided value is reset to perturbation_num if it is larger than this number + and a message is produced. In the special case of robust optimization case with + `perturbation_num: 1` the maximum allowed value is the number of realizations specified + by realizations instead. + + +**min_realizations_success (optional)** + Type: *Optional[int]* + + Minimum number of realizations + + The minimum number of realizations that should be available for the computation + of either expected function values (both objective function and constraint + functions) or of the expected gradient. Note that this keyword does not apply + to gradient computation in the robust case with 1 perturbation in which the + expected gradient is computed directly. + + The optimization process will stop if this minimum is not reached, and otherwise + the expected objective function value (and expected gradient/constraint function + values) will be computed based on the set of successful contributions. In other + words, a robust objective function, a robust gradient and robust constraint + functions may then still be computed based on a subset of the realizations. + + The user-provided value is reset to the number of realizations specified by + realizations if it is larger than this number and a message is produced. + + Note that it is possible to set the minimum number of successful realizations equal + to zero. Some optimization algorithms are able to handle this and will proceed even + if all realizations failed. Most algorithms are not capable of this and will adjust + the value to be equal to one. + + +**options (optional)** + Type: *Optional[List[str]]* + + specifies non-validated, optional + passthrough parameters for the optimizer + + | Examples used are + | - max_repetitions = 300 + | - retry_if_fail + | - classical_search 1 + + +**perturbation_num (optional)** + Type: *Optional[int]* + + The number of perturbed control vectors per realization. + + The number of simulation runs used for estimating the gradient is equal to the + the product of perturbation_num and model.realizations. + + +**speculative (optional)** + Type: *Optional[bool]* + + specifies whether to enable speculative computation. + + The speculative specification enables speculative computation of gradient and/or + Hessian information, where applicable, for parallel optimization studies. By + speculating that the derivative information at the current point will be used + later, the complete data set (all available gradient/Hessian information) can be + computed on every function evaluation. While some of these computations will be + wasted, the positive effects are a consistent parallel load balance and usually + shorter wall clock time. The speculative specification is applicable only when + parallelism in the gradient calculations can be exploited by Dakota (it will be + ignored for vendor numerical gradients). (From the Dakota Manual.) + + +**parallel (optional)** + Type: *Optional[bool]* + + whether to allow parallel function evaluation. + + By default Everest will evaluate a single function and gradient evaluation at + a time. In case of gradient-free optimizer this can be highly inefficient, + since these tend to need many independent function evaluations at each + iteration. By setting parallel to True, multiple functions may be evaluated in + parallel, if supported by the optimization algorithm. + + The default is to use parallel evaluation if supported. + + +**restart (optional)** + Type: *Optional[RestartConfig]* + + Optional restarting configuration. + + Restarting the optimization from scratch from a new initial point can be + beneficial to the optimization process for some optimization algorithms. This + option can be used to direct Everest to restart the optimization once or + multiple times. + + **max_restarts (optional)** + Type: *int* + + The maximum number of restarts. + + Sets the maximum number of times that the optimization process will be + restarted. + + The default is equal to a single restart. + + + **restart_from (required)** + Type: *Literal['initial', 'last', 'optimal', 'last_optimal']* + + Restart from the initial, optimal or the last controls. + + When restarting, the initial values for the new run are set according to this field: + - initial: Use the initial controls from the configuration + - last: Use the last controls used by the previous run + - optimal: Use the controls from the optimal solution found so far + - last_optimal: Use the controls from the optimal solution found in previous run + + When restarting from optimal values, the best result obtained so far (either + overall, or in the last restart run) is used, which is defined as the result + with the maximal weighted total objective value. If the `constraint_tolerance` + option is set in the `optimization` section, this tolerance will be used to + exclude results that violate a constraint. + + + + + +objective_functions (required) +------------------------------ +Type: *List[ObjectiveFunctionConfig]* + +List of objective function specifications + +**name (required)** + Type: *str* + + + + +**alias (optional)** + Type: *Optional[str]* + + + alias can be set to the name of another objective function, directing everest + to copy the value of that objective into the current objective. This is useful + when used together with the **type** option, for instance to construct an objective + function that consist of the sum of the mean and standard-deviation over the + realizations of the same objective. In such a case, add a second objective with + **type** equal to "stddev" and set **alias** to the name of the first objective to make + sure that the standard deviation is calculated over the values of that objective. + + +**weight (optional)** + Type: *Optional[PositiveFloat]* + + + weight determines the importance of an objective function relative to the other + objective functions. + + Ultimately, the weighted sum of all the objectives is what Everest tries to optimize. + Note that, in case the weights do not sum up to 1, they are normalized before being + used in the optimization process. + + +**normalization (optional)** + Type: *Optional[float]* + + + normalization is a multiplication factor defined per objective function. + + The value of each objective function is multiplied by the related normalization value. + When optimizing with respect to multiple objective functions, it is important + that the normalization is set so that all the normalized objectives have the same order + of magnitude. Ultimately, the normalized objectives are used in computing + the weighted sum that Everest tries to optimize. + + +**auto_normalize (optional)** + Type: *Optional[bool]* + + + auto_normalize can be set to true to automatically + determine the normalization factor from the objective value in batch 0. + + If normalization is also set, the automatic value is multiplied by its value. + + +**type (optional)** + Type: *Optional[str]* + + + type can be set to the name of a method that should be applied to calculate a + total objective function from the objectives obtained for all realizations. + Currently, the only values supported are "mean" and "stddev", which calculate + the mean and the negative of the standard deviation over the realizations, + respectively. The negative of the standard deviation is used, since in general + the aim is to minimize the standard deviation as opposed to the mean, which is + preferred to be maximized. + + + + +environment (required) +---------------------- +Type: *EnvironmentConfig* + +The environment of Everest, specifies which folders are used for simulation and output, as well as the level of detail in Everest-logs + +**simulation_folder (optional)** + Type: *str* + + Folder used for simulation by Everest + + +**output_folder (optional)** + Type: *Optional[str]* + + Folder for outputs of Everest + + +**log_level (optional)** + Type: *Optional[Literal['debug', 'info', 'warning', 'error', 'critical']]* + + Defines the verbosity of logs output by Everest. + + The default log level is `info`. All supported log levels are: + + debug: Detailed information, typically of interest only when diagnosing + problems. + + info: Confirmation that things are working as expected. + + warning: An indication that something unexpected happened, or indicative of some + problem in the near future (e.g. `disk space low`). The software is still + working as expected. + + error: Due to a more serious problem, the software has not been able to perform + some function. + + critical: A serious error, indicating that the program itself may be unable to + continue running. + + +**random_seed (optional)** + Type: *Optional[int]* + + Random seed (must be positive) + + + +wells (optional) +---------------- +Type: *List[WellConfig]* + +A list of well configurations, all with unique names. + +**name (required)** + Type: *str* + + The unique name of the well + + +**drill_date (optional)** + Type: *Optional[str]* + + Ideal date to drill a well. + + The interpretation of this is up to the forward model. The standard tooling will + consider this as the earliest possible drill date. + + +**drill_time (optional)** + Type: *Optional[float]* + + specifies the time it takes + to drill the well under consideration. + + + +input_constraints (optional) +---------------------------- +Type: *Optional[List[InputConstraintConfig]]* + +List of input constraints + +**weights (required)** + Type: *Mapping[str, float]* + + **Example** + If we are trying to constrain only one control (i.e the z control) value: + | input_constraints: + | - weights: + | point_3D.x-0: 0 + | point_3D.y-1: 0 + | point_3D.z-2: 1 + | upper_bound: 0.2 + + Only control values (x, y, z) that satisfy the following equation will be allowed: + `x-0 * 0 + y-1 * 0 + z-2 * 1 > 0.2` + + +**target (optional)** + Type: *Optional[float]* + + **Example** + | input_constraints: + | - weights: + | point_3D.x-0: 1 + | point_3D.y-1: 2 + | point_3D.z-2: 3 + | target: 4 + + Only control values (x, y, z) that satisfy the following equation will be allowed: + `x-0 * 1 + y-1 * 2 + z-2 * 3 = 4` + + +**lower_bound (optional)** + Type: *Optional[float]* + + **Example** + | input_constraints: + | - weights: + | point_3D.x-0: 1 + | point_3D.y-1: 2 + | point_3D.z-2: 3 + | lower_bound: 4 + + Only control values (x, y, z) that satisfy the following + equation will be allowed: + `x-0 * 1 + y-1 * 2 + z-2 * 3 >= 4` + + +**upper_bound (optional)** + Type: *Optional[float]* + + **Example** + | input_constraints: + | - weights: + | point_3D.x-0: 1 + | point_3D.y-1: 2 + | point_3D.z-2: 3 + | upper_bound: 4 + + Only control values (x, y, z) that satisfy the following equation will be allowed: + `x-0 * 1 + y-1 * 2 + z-2 * 3 <= 4` + + + +output_constraints (optional) +----------------------------- +Type: *Optional[List[OutputConstraintConfig]]* + +A list of output constraints with unique names. + +**name (required)** + Type: *str* + + The unique name of the output constraint. + + +**target (optional)** + Type: *Optional[float]* + + Defines the equality constraint + + (f(x) - b) / c = 0, + + where b is the target, f is a function of the control vector x, and c is the + scale (scale). + + + +**auto_scale (optional)** + Type: *Optional[bool]* + + If set to true, Everest will automatically + determine the scaling factor from the constraint value in batch 0. + + If scale is also set, the automatic value is multiplied by its value. + + +**lower_bound (optional)** + Type: *Optional[float]* + + Defines the lower bound + (greater than or equal) constraint + + (f(x) - b) / c >= 0, + + where b is the lower bound, f is a function of the control vector x, and c is + the scale (scale). + + +**upper_bound (optional)** + Type: *Optional[float]* + + Defines the upper bound (less than or equal) constraint: + + (f(x) - b) / c <= 0, + + where b is the upper bound, f is a function of the control vector x, and c is + the scale (scale). + + +**scale (optional)** + Type: *Optional[float]* + + Scaling of constraints (scale). + + scale is a normalization factor which can be used to scale the constraint + to control its importance relative to the (singular) objective and the controls. + + Both the upper_bound and the function evaluation value will be scaled with this number. + That means that if, e.g., the upper_bound is 0.5 and the scaling is 10, then the + function evaluation value will be divided by 10 and bounded from above by 0.05. + + + + +simulator (optional) +-------------------- +Type: *Optional[SimulatorConfig]* + +Simulation settings + +**name (optional)** + Type: *Optional[str]* + + Specifies which queue to use + + +**cores (optional)** + Type: *Optional[PositiveInt]* + + Defines the number of simultaneously running forward models. + + When using queue system lsf, this corresponds to number of nodes used at one + time, whereas when using the local queue system, cores refers to the number of + cores you want to use on your system. + + This number is specified in Ert as MAX_RUNNING. + + + +**cores_per_node (optional)** + Type: *Optional[PositiveInt]* + + defines the number of CPUs when running + the forward models. This can for example be used in conjunction with the Eclipse + parallel keyword for multiple CPU simulation runs. This keyword has no effect + when running with the local queue. + + This number is specified in Ert as NUM_CPU. + + +**delete_run_path (optional)** + Type: *Optional[bool]* + + Whether the batch folder for a successful simulation needs to be deleted. + + +**exclude_host (optional)** + Type: *Optional[str]* + + Comma separated list of nodes that should be + excluded from the slurm run. + + +**include_host (optional)** + Type: *Optional[str]* + + Comma separated list of nodes that + should be included in the slurm run + + +**max_memory (optional)** + Type: *Optional[str]* + + Maximum memory usage for a slurm job. + + +**max_memory_cpu (optional)** + Type: *Optional[str]* + + Maximum memory usage per cpu for a slurm job. + + +**max_runtime (optional)** + Type: *Optional[NonNegativeInt]* + + Maximum allowed running time of a forward model. When + set, a job is only allowed to run for max_runtime seconds. + A value of 0 means unlimited runtime. + + + +**options (optional)** + Type: *Optional[str]* + + Used to specify options to LSF. + Examples to set memory requirement is: + * rusage[mem=1000] + + +**queue_system (optional)** + Type: *Optional[Literal['lsf', 'local', 'slurm']]* + + Defines which queue system the everest server runs on. + + +**resubmit_limit (optional)** + Type: *Optional[NonNegativeInt]* + + + Defines how many times should the queue system retry a forward model. + + A forward model may fail for reasons that are not due to the forward model + itself, like a node in the cluster crashing, network issues, etc. Therefore, it + might make sense to resubmit a forward model in case it fails. + resumbit_limit defines the number of times we will resubmit a failing forward model. + If not specified, a default value of 1 will be used. + + +**sbatch (optional)** + Type: *Optional[str]* + + sbatch executable to be used by the slurm queue interface. + + +**scancel (optional)** + Type: *Optional[str]* + + scancel executable to be used by the slurm queue interface. + + +**scontrol (optional)** + Type: *Optional[str]* + + scontrol executable to be used by the slurm queue interface. + + +**squeue (optional)** + Type: *Optional[str]* + + squeue executable to be used by the slurm queue interface. + + +**server (optional)** + Type: *Optional[str]* + + Name of LSF server to use + + +**slurm_timeout (optional)** + Type: *Optional[int]* + + Timeout for cached status used by the slurm queue interface + + +**squeue_timeout (optional)** + Type: *Optional[int]* + + Timeout for cached status used by the slurm queue interface. + + +**enable_cache (optional)** + Type: *bool* + + Enable forward model result caching. + + If enabled, objective and constraint function results are cached for + each realization. If the optimizer requests an evaluation that has + already been done before, these cached values will be re-used without + running the forward model again. + + This option is disabled by default, since it will not be necessary for + the most common use of a standard optimization with a continuous + optimizer. + + + +install_jobs (optional) +----------------------- +Type: *Optional[List[InstallJobConfig]]* + +A list of jobs to install + +**name (required)** + Type: *str* + + name of the installed job + + +**source (required)** + Type: *str* + + source file of the ert job + + + +install_workflow_jobs (optional) +-------------------------------- +Type: *Optional[List[InstallJobConfig]]* + +A list of workflow jobs to install + +**name (required)** + Type: *str* + + name of the installed job + + +**source (required)** + Type: *str* + + source file of the ert job + + + +install_data (optional) +----------------------- +Type: *Optional[List[InstallDataConfig]]* + +A list of install data elements from the install_data config +section. Each item marks what folders or paths need to be copied or linked +in order for the evaluation jobs to run. + +**source (required)** + Type: *str* + + + Path to file or directory that needs to be copied or linked in the evaluation + execution context. + + + +**target (required)** + Type: *str* + + + Relative path to place the copy or link for the given source. + + + +**link (optional)** + Type: *Optional[bool]* + + + If set to true will create a link to the given source at the given target, + if not set the source will be copied at the given target. + + + + +install_templates (optional) +---------------------------- +Type: *Optional[List[InstallTemplateConfig]]* + +Allow the user to define the workflow establishing the model +chain for the purpose of sensitivity analysis, enabling the relationship +between sensitivity input variables and quantities of interests to be +evaluated. + +**template (required)** + Type: *str* + + + + +**output_file (required)** + Type: *str* + + + + +**extra_data (optional)** + Type: *Optional[str]* + + + + + +forward_model (optional) +------------------------ +Type: *Optional[List[str]]* + +List of jobs to run + + +workflows (optional) +-------------------- +Type: *Optional[WorkflowConfig]* + +Workflows to run during optimization + +**pre_simulation (optional)** + Type: *Optional[List[str]]* + + List of workflow jobs triggered pre-simulation + + +**post_simulation (optional)** + Type: *Optional[List[str]]* + + List of workflow jobs triggered post-simulation + + + +server (optional) +----------------- +Type: *Optional[ServerConfig]* + +Defines Everest server settings, i.e., which queue system, +queue name and queue options are used for the everest server. +The main reason for changing this section is situations where everest +times out because it can not add the server to the queue. +This makes it possible to reduce the resource requirements as they tend to +be low compared with the forward model. + +Queue system and queue name defaults to the same as simulator, and the +server should not need to be configured by most users. +This is also true for the --include-host and --exclude-host options +that are used by the SLURM driver. + +Note that changing values in this section has no impact on the resource +requirements of the forward models. + +**name (optional)** + Type: *Optional[str]* + + Specifies which queue to use. + + Examples are + * mr + * bigmem + + The everest server generally has lower resource requirements than forward models such + as RMS and Eclipse. + + + +**exclude_host (optional)** + Type: *Optional[str]* + + Comma separated list of nodes that should be + excluded from the slurm run + + +**include_host (optional)** + Type: *Optional[str]* + + Comma separated list of nodes that + should be included in the slurm run + + +**options (optional)** + Type: *Optional[str]* + + Used to specify options to LSF. + Examples to set memory requirement is: + * rusage[mem=1000] + + +**queue_system (optional)** + Type: *Optional[Literal['lsf', 'local', 'slurm']]* + + Defines which queue system the everest server runs on. + + + +export (optional) +----------------- +Type: *Optional[ExportConfig]* + +Settings to control the exports of a optimization run by everest. + +**csv_output_filepath (optional)** + Type: *Optional[str]* + + Specifies which file to write the export to. + Defaults to .csv in output folder. + + +**discard_gradient (optional)** + Type: *Optional[bool]* + + If set to True, Everest export will not contain gradient simulation data. + + +**discard_rejected (optional)** + Type: *Optional[bool]* + + If set to True, Everest export will contain only simulations + that have the increase_merit flag set to true. + + +**keywords (optional)** + Type: *Optional[List[str]]* + + List of eclipse keywords to be exported into csv. + + +**batches (optional)** + Type: *Optional[List[int]]* + + list of batches to be exported, default is all batches. + + +**skip_export (optional)** + Type: *Optional[bool]* + + set to True if export should not + be run after the optimization case. + Default value is False. + + + +definitions (optional) +---------------------- +Type: *Optional[dict]* + +Section for specifying variables. + +Used to specify variables that will be replaced in the file when encountered. + +| scratch: /scratch/ert/ +| num_reals: 10 +| min_success: 13 +| fixed_wells: [Prod1, Inj3] + +Some keywords are pre-defined by Everest, + +| realization: +| configpath: +| runpath_file: +| eclbase: + +and environment variables are exposed in the form 'os.NAME', for example: + +| os.USER: $USER +| os.HOSTNAME: $HOSTNAME +| ... diff --git a/docs/everest/config_reference.rst b/docs/everest/config_reference.rst new file mode 100644 index 00000000000..37ef900c97d --- /dev/null +++ b/docs/everest/config_reference.rst @@ -0,0 +1,13 @@ +.. _cha_config_reference: + +***************** +Keyword reference +***************** + +The keywords that are recognized by the Everest configuration system are +described below. Each keyword is followed by its data type in brackets, usually +some basic type. It may also be a list, which indicates that the keyword can be +repeated as a yaml list. If a keyword is required, this is also indicated in +brackets after the keyword name. + +.. include:: config_generated.rst diff --git a/docs/everest/creating_custom_jobs.rst b/docs/everest/creating_custom_jobs.rst new file mode 100644 index 00000000000..c6f0dd11f17 --- /dev/null +++ b/docs/everest/creating_custom_jobs.rst @@ -0,0 +1,293 @@ +.. _cha_creating_custom_jobs: + +************************* +Custom forward model jobs +************************* + +To use a custom job in everest, the job needs to be added to the `install_jobs` section of the config file. + +The standard template to install a job inside the config file is as follows: + +.. code-block:: yaml + + install_jobs: + - + name: + source: + +Where the job config file is a file calls a python file. These scripts generally only contain one line: + +.. code-block:: bash + + EXECUTABLE .py + +This file should point to the location of the python file relative to the job config file. +In this case the python file is next to the script. + +-------- +Examples +-------- + +This section outlines a few examples of jobs you might want to implement. +These examples are focussed on manipulating the optimizers output values concerning well priority. + +All examples assume you have the following python dictionary in memory: + +.. code-block:: python + + well_priorities = { + "PROD2": 9, + "PROD1": 10, + "INJ1": 8, + "INJ2": 7, + "PROD3": 6, + "INJ3": 5, + "PROD4": 4, + "PROD5": 3, + "PROD6": 2, + "PROD7": 1 + } + + +A group of wells first +---------------------- + +In this example, we have a group of wells that we would like to be drilled first, in order of their priority. +Then all the other wells will be added afterwards, again in the order of their priority. + +Given an extra list of wells that should be the highest priority, +an implementation of this behaviour could be: + +.. code-block:: python + + def rearrange_priorities(well_priorities, first_wells): + first = sorted( + [well_name for well_name in well_priorities if well_name in first_wells], + key=lambda x: well_priorities[x], + reverse=True, + ) + rest = sorted( + [well_name for well_name in well_priorities if well_name not in first_wells], + key=lambda x: well_priorities[x], + reverse=True, + ) + + new_order = first + rest + sorted_priorities = sorted(well_priorities.values(), reverse=True) + new_priorities = dict(zip(new_order, sorted_priorities)) + + return new_priorities + +In the above code block, we first split the wells in ``wells_priority`` based on whether they are in the ``first_wells`` list. +Then we order those lists and put the ``first`` before the ``rest``. +Then we assign ``new_priorities`` by using previous priority values based on the new order of wells. + +We can then store these new priorities in an ``output_filename`` +and make the python file execute the code when called as follows: + +.. code-block:: python + + import yaml + + def entry_point(): + well_priorities = { + "PROD2": 9, + "PROD1": 10, + "INJ1": 8, + "INJ2": 7, + "PROD3": 6, + "INJ3": 5, + "PROD4": 4, + "PROD5": 3, + "PROD6": 2, + "PROD7": 1 + } + first_wells = ["PROD4", "PROD1", "INJ3"] + + new_priorities = rearrange_priorities(well_priorities, first_wells) + + with open(output_filename, "w") as f: + yaml.dump(new_priorities, f, sort_keys=False) + + if __name__ == "__main__": + entry_point() + +``output_filename``: + +.. code-block:: yaml + + PROD1: 10 + INJ3: 9 + PROD4: 8 + PROD2: 7 + INJ1: 6 + INJ2: 5 + PROD3: 4 + PROD5: 3 + PROD6: 2 + PROD7: 1 + +where you can see the group has been correctly shifted to the front. + +This can be expanded by loading both ``well_priorities`` and ``first_wells`` from files or from input arguments of the job. + +Highest priority in Nth spot +----------------------------- + +In this example, we want to always put the highest priority well from a group of wells on spot ``N`` in the order. +So the highest priority well could be pushed down to spot ``N``. +Note that ``N`` will be zero-indexed in this example, so if we want to give a well the top spot, ``N = 0``. + +Given a priority_number and a list of candidates: + +.. code-block:: python + + def shift_well(well_priorities, candidates, prio_num): + sorted_priorities = sorted(well_priorities.values(), reverse=True) + old_order = sorted(well_priorities.keys(), reverse=True, key=lambda w: well_priorities[w]) + + best_candidate = max(candidates, key=lambda c: well_priorities[c]) + old_order.remove(best_candidate) + + new_order = old_order[:prio_num] + [best_candidate] + old_order[prio_num:] + new_priorities = dict(zip(new_order, sorted_priorities)) + + return new_priorities + +Where we first determine the ``best_candidate`` by picking the highest priority one. +Then we remove that one from the original order and insert it in spot number ``prio_num``. +Then we assign ``new_priorities`` by using previous priority values based on the new order of wells. + +We can then store these new priorities in an ``output_filename`` +and make the python file execute the code when called as follows: + +.. code-block:: python + + import yaml + + def entry_point(): + well_priorities = { + "PROD2": 9, + "PROD1": 10, + "INJ1": 8, + "INJ2": 7, + "PROD3": 6, + "INJ3": 5, + "PROD4": 4, + "PROD5": 3, + "PROD6": 2, + "PROD7": 1 + } + candidates = ["PROD2", "PROD4", "INJ3"] + prio_num = 4 + + new_priorities = shift_well(well_priorities, candidates, prio_num) + + with open(output_filename, "w") as f: + yaml.dump(new_priorities, f, sort_keys=False) + + + if __name__ == "__main__": + entry_point() + +``output_filename``: + +.. code-block:: yaml + + PROD1: 10 + INJ1: 9 + INJ2: 8 + PROD3: 7 + PROD2: 6 + INJ3: 5 + PROD4: 4 + PROD5: 3 + PROD6: 2 + PROD7: 1 + +Where you can see ``PROD2`` has been successfully shifted. + + +Well cycles +----------- + +In this example, we want to repeat a specific cycle of wells: +2 producers, then one injector. This is done by splitting injectors and producers into groups. + +In order to make ``well_priorities`` adhere to the cycle as well as possible, +we can implement the functionality as follows: + +.. code-block:: python + + from itertools import cycle, islice + + def apply_cycle(well_priorities, config): + well_cycle = islice(cycle(config["cycle"]), len(well_priorities)) + groups = {k: sorted(v, key=lambda x: well_priorities[x]) for k, v in config["groups"].items()} + + priorities = sorted(well_priorities.values(), reverse=True) + new_order = [] + for group in well_cycle: + if groups[group]: + new_order.append(groups[group].pop()) + else: + break + + leftovers = list(set(well_priorities.keys()) - set(new_order)) + new_order += sorted(leftovers, reverse=True, key=lambda x: well_priorities[x]) + + new_priorities = dict(zip(new_order, priorities)) + return new_priorities + +In this piece of code, we make use of ``itertools``' ``cycle`` and ``islice`` functions. +Where ``cycle`` is used to endlessly repeat a list (in this case the "cycle" list inside ``config``) +and ``islice`` is used to limit the length of this ``cycle`` to the number of wells. + +Then, well names in the various groups are sorted based on priority (highest priority last) +and the last element of a group is popped off based on the index of ``well_cycle``. + +The ``leftovers`` from when the cycle can no longer be adhered to +(group has no more wells) are sorted based on priority (highest first) and added at the end of ``new_order``. + +We can then store these new priorities in an ``output_filename`` +and make the python file execute the code when called as follows: + +.. code-block:: python + + import yaml + + def entry_point(): + config = { + "groups": { + "producer": ["PROD1", "PROD2", "PROD3", "PROD4", "PROD5", "PROD6", "PROD7"], + "injector": ["INJ1", "INJ2", "INJ3"] + } + "cycle": ["producer", "producer", "injector"] + } + + new_priorities = apply_cycle(well_priorities, config) + + with open(output_filename, "w") as f: + yaml.dump(new_priorities, f, sort_keys=False) + + + if __name__ == "__main__": + entry_point() + + +``output_filename``: + +.. code-block:: yaml + + PROD1: 10 + PROD2: 9 + INJ1: 8 + PROD3: 7 + PROD4: 6 + INJ2: 5 + PROD5: 4 + PROD6: 3 + INJ3: 2 + PROD7: 1 + +where you can see the "two producer, one injector" cycle has been successfully applied. diff --git a/docs/everest/custom_workflow_jobs.rst b/docs/everest/custom_workflow_jobs.rst new file mode 100644 index 00000000000..2868114fc4c --- /dev/null +++ b/docs/everest/custom_workflow_jobs.rst @@ -0,0 +1,47 @@ +.. _cha_custom_workflow_jobs: + +************************* +Custom workflow jobs +************************* + +To use a custom workflow job in everest, the job needs to be added to the `install_workflow_jobs` section of the config file. + +The standard template to install a job inside the config file is as follows: + +.. code-block:: yaml + + install_workflow_jobs: + - + name: + source: + +Where the job config file contains a reference to an executable file: + +.. code-block:: bash + + EXECUTABLE + +This file should point to the location of the executable file relative to the job config file. +In this case it is next to the script. + +Workflows can then be specified to run the installed jobs for specific triggers: + +.. code-block:: yaml + + workflows: + pre_simulation: + - job_name + - another_job + post_simulation: + - job_name + - another_job + +Currently `pre_simulation` and `post_simulation` triggers are defined, which run the specified jobs just before, and directly after, running each batch of simulations. + +For each batch evaluation, a runpath file is written containing a list of the simulation folders. The location of that file can be passed to a job using the pre-defined `runpath_file` variable that will be replaced with the full path to the runpath file. For example, this will pass the location of the runpath file as the first argument to a workflow job: + +.. code-block:: yaml + + workflows: + pre_simulation: + - job_name r{{ runpath_file }} diff --git a/docs/everest/development.rst b/docs/everest/development.rst new file mode 100644 index 00000000000..9247b4424f7 --- /dev/null +++ b/docs/everest/development.rst @@ -0,0 +1,54 @@ +.. _cha_development: + +*********** +Development +*********** + +In this section Everest development decisions are documented. + + +Architecture +============ + +The everest application is split into two components, a server component and a +client component. + +.. figure:: images/architecture_design.png + :align: center + :width: 700px + :alt: Everest architecture + +Every time an optimization instance is ran by a user, the client component of the +application spawns an instance of the server component, which is started either on a +cluster node using LSF (when the `queue_system` is defined to be *lsf*) or on the +client's machine (when the `queue_system` is defined to be *local*). + +Communication between the two components is done via an HTTP API. + + +Server HTTP API +=============== +The Everest server component supports the following HTTP requests API. The Everest +server component was designed as an internal component that will be available as +long as the optimization process is running. + + +.. list-table:: Server HTTP API + :widths: 25 25 75 + :header-rows: 1 + + * - Method + - Endpoint + - Description + * - GET + - '/' + - Check server is online + * - GET + - '/sim_progress' + - Simulation progress information + * - GET + - '/opt_progress' + - Optimization progress information + * - POST + - '/stop' + - Signal everest optimization run termination. It will be called by the client when the optimization needs to be terminated in the middle of the run diff --git a/docs/everest/forward_model_jobs.rst b/docs/everest/forward_model_jobs.rst new file mode 100644 index 00000000000..34dab83ee89 --- /dev/null +++ b/docs/everest/forward_model_jobs.rst @@ -0,0 +1,1027 @@ +.. _cha_forward_model_jobs: + +****************** +Forward Model Jobs +****************** + +Some of the forward models are connected and often the output of one is the +input to another. However, they maintain the same format, and thus a subset +of the jobs can be run independently. For example, if well_constraints is not +necessary, it can be omitted, and if well_order is not a concern, the input to +the well_constraints can be setup and copied (in the everest configuration, +rather than using the drill_planner every time). +Some of them are however mandatory, e.g. the add_templates is a prerequisite +for the schmerge job. + +**Example** + +.. code-block:: yaml + + forward_model: + - fm_drill_planner -i well.json + -c drill_planner_config.yaml + -opt optimizer_values.yml + -o wells_dp_result.json + - fm_well_constraints -i wells_dp_result.json + -c well_constraint_config.yml + -rc rate_input.json + -pc phase_input.json + -dc duration_input.json + -o wells_wc_result.json + - fm_add_templates -c template_config.yml + -i wells_wc_result.json + -o wells_tmpl_result.json + - fm_schmerge -s raw_schedule.sch + -i wells_tmpl_result.json + -o result_schedule.sch + +.. _dp: + +Drill Planner +============= + +.. argparse:: + :module: everest_models.jobs.fm_drill_planner.parser + :func: build_argument_parser + :prog: fm_drill_planner + +Argument examples +~~~~~~~~~~~~~~~~~ +**--input** example (generated by Everest) + +.. code-block:: json + + [ + { + "name": "w1", + "drill_time": 20 + }, + { + "name": "w2", + "drill_time": 25 + }, + { + "name": "w3", + "drill_time": 43 + }, + { + "name": "w4", + "drill_time": 23 + }, + { + "name": "w5", + "drill_time": 36 + } + ] + +**--config** example + +.. code-block:: yaml + + start_date: 2000-01-01 + end_date: 2001-01-01 + rigs: + - + name: 'A' + wells: ['w1', 'w2', 'w3'] + slots: ['S1', 'S2', 'S3'] + unavailability: + - + start: 2000-01-01 + stop: 2000-02-02 + - + start: 2000-03-14 + stop: 2000-03-19 + - + name: 'B' + wells: ['w3', 'w4', 'w5'] + slots: ['S3', 'S4', 'S5'] + unavailability: + - + start: 2000-02-01 + stop: 2000-02-02 + - + start: 2000-02-14 + stop: 2000-02-15 + slots: + - + name: 'S1' + wells: ['w1', 'w2', 'w3'] + unavailability: + - + start: 2000-02-01 + stop: 2000-02-03 + - + name: 'S2' + wells: ['w1', 'w2', 'w3'] + - + name: 'S3' + wells: ['w1', 'w2', 'w3'] + - + name: 'S4' + wells: ['w3', 'w4', 'w5'] + - + name: 'S5' + wells: ['w3', 'w4', 'w5'] + +**--optimizer** example (generated by Everest) + +.. code-block:: yaml + + w1: 5 + w2: 4 + w3: 3 + w4: 2 + w5: 1 + +.. _npv: + +Net Present Value +================= + +.. argparse:: + :module: everest_models.jobs.fm_npv.parser + :func: build_argument_parser + :prog: fm_npv + +Argument examples +~~~~~~~~~~~~~~~~~ +**--config** example + +.. code-block:: yaml + + prices: + FOPT: + - { date: 1999-01-01, value: 60, currency: USD } + FWPT: + - { date: 1999-01-01, value: -5, currency: USD } + - { date: 2002-01-01, value: -2 } + FGPT: + - { date: 1999-01-01, value: 1, currency: USD } + - { date: 2002-01-01, value: 0.1 } + FWIT: + - { date: 1999-01-01, value: -10, currency: USD } + - { date: 2002-01-01, value: -20 } + FGIT: + - { date: 1999-01-01, value: -0.02, currency: USD } + - { date: 2002-01-01, value: -0.1 } + GOPT:OP: + - { date: 1999-12-10, value: 555 } + + dates: + start_date: 2000-12-06 + end_date: 2002-12-23 + ref_date: 2000-12-06 + + summary_keys: ['FWIT', 'FOPT'] + + exchange_rates: + USD: + - { date: 1997-01-01, value: 5 } + - { date: 2000-02-01, value: 7 } + - { date: 2001-05-01, value: 6 } + - { date: 2002-02-01, value: 9 } + + discount_rates: + - { date: 1999-01-01, value: 0.02 } + - { date: 2002-01-01, value: 0.05 } + + costs: + - { date: 1999-01-01, value: 10000000, currency: USD } + - { date: 1999-10-01, value: 20000000 } + - { date: 1999-10-05, value: 5000000, currency: USD } + - { date: 2000-01-07, value: 100000000, currency: GBP } + - { date: 2000-07-25, value: 5000000, currency: NOK } + + well_costs: + - { well: OP_1, value: 10000000, currency: USD } + - { well: OP_2, value: 20000000 } + - { well: OP_3, value: 5000000, currency: USD } + - { well: OP_4, value: 100000000, currency: GBP } + - { well: OP_5, value: 1000000 } + - { well: WI_1, value: 100000, currency: USD } + - { well: WI_2, value: 20000000, currency: USD } + - { well: WI_3, value: 5000000, currency: NOK } + +**--input** example (generated by Everest) + +This argument uses output of the **drill_planner** job, or a similar output. + +.. code-block:: json + + [ + { + "name": "OP_4", + "readydate": "2000-02-23" + }, + { + "name": "OP_5", + "readydate": "2000-06-14" + }, + { + "name": "OP_1", + "readydate": "2000-07-19" + } + ] + +.. _rf: + +Recovery Factor +=============== + +.. argparse:: + :module: everest_models.jobs.fm_rf.parser + :func: build_argument_parser + :prog: fm_rf + +.. _well_constraints: + +Well Constraints +================ + +.. argparse:: + :module: everest_models.jobs.fm_well_constraints.parser + :func: build_argument_parser + :prog: fm_well_constraints + +Argument examples +~~~~~~~~~~~~~~~~~ + +Please note that the number of entries and the corresponding indexes for the +configuration file must line up with each of the phase, rate and duration +constraint inputs respectively. + +If there is an entry in e.g. the rate-constraint file for `INJECT1`, `1`, then +either `options` must be declared, or a `min`/`max` must be entered in the +configuration file under index `1` for `INJECT1`. For all other entries in the +configuration file that does not exist in any input file, there must exist a +`value` entry that contains a single value. + +**--config** example + +.. code-block:: yaml + + INJECT1: + 1: + phase: + options: [water, gas] + rate: + min: 0 + max: 1000 + duration: + min: 10 + max: 40 + 2: + phase: + options: [water, gas] + rate: + min: 0 + max: 1000 + duration: + min: 20 + max: 30 + 3: + phase: + options: [water, gas] + rate: + min: 0 + max: 1000 + duration: + value: 70 + 4: + phase: + value: water + rate: + value: 333 + duration: + value: 100 + + INJECT2: + 1: + phase: + options: [water, gas] + rate: + min: 500 + max: 1000 + duration: + value: 50 + 2: + phase: + options: [water, gas] + rate: + min: 500 + max: 1000 + duration: + value: 60 + +**--phase-constraint** example + +.. code-block:: json + + { + "INJECT1" : { + "1": 0.49, + "2": 0.51, + "3": 0.8 + }, + "INJECT2" : { + "1": 0.3, + "2": 0.1 + }} + +**--rate-constraint** example + +.. code-block:: json + + { + "INJECT1" : { + "1": 0.6, + "2": 0.4, + "3": 0.2 + }, + "INJECT2" : { + "1": 0.123, + "2": 0.465 + }} + +**--duration-constraint** example + +.. code-block:: json + + { + "INJECT1" : { + "1": 0.6, + "2": 0.4, + }} + +**--input** example (generated by everest) + + +.. code-block:: json + + [ + { + "name": "INJECT1", + "readydate": "2019-05-12", + "ops": [ + {"opname": "open", "date": "2019-05-12"} + ] + }, + { + "name": "INJECT2", + "readydate": "2019-09-15", + "ops": [ + {"opname": "open", "date": "2019-09-15"} + ] + } + ] + +.. _strip_dates: + +Strip dates +=========== +.. argparse:: + :module: everest_models.jobs.fm_strip_dates.parser + :func: build_argument_parser + :prog: fm_strip_dates + +.. _well_filter: + +Well filter +=========== +.. argparse:: + :module: everest_models.jobs.fm_well_filter.parser + :func: build_argument_parser + :prog: fm_well_filter + + +Argument examples +~~~~~~~~~~~~~~~~~ +**--input** example (generated by Everest) + +.. code-block:: json + + [ + { + "name": "w1", + "drill_time": 20 + }, + { + "name": "w2", + "drill_time": 25 + }, + { + "name": "w3", + "drill_time": 43 + }, + { + "name": "w4", + "drill_time": 23 + }, + { + "name": "w5", + "drill_time": 36 + } + ] + +**--keep** example + +.. code-block:: json + + ["w1", "w3", "w5"] + +.. _add_tmpl: + +Add templates +============= +.. argparse:: + :module: everest_models.jobs.fm_add_templates.parser + :func: build_argument_parser + :prog: fm_add_templates + +.. _eclipse100: + +Eclipse simulator +================= + +.. code-block:: bash + + eclipse100 --version + +Running eclipse with parallel option +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +It is possible to run eclipse with multiple CPUs on clusters. This requires the eclipse data file to have the +parallel option and the everest config needs to specify the number of CPUs per node: + +.. code-block:: yaml + + simulator: + cores_per_realization: x + +where x is an int giving the number of cores. The eclipse100 forward model also needs to be given the argument to use +multiple cores: + +.. code-block:: bash + + eclipse100 --version --num-cpu x + +where x is the number of cores. + +Everest usage example +~~~~~~~~~~~~~~~~~~~~~ +The following illustrates an example of a forward model section of an Everest config file: + +.. code-block:: yaml + + forward_model: + - well_constraints -i files/well_readydate.json -c files/wc_config.yml -rc well_rate.json -o wc_wells.json + - add_templates -i wc_wells.json -c files/at_config.yml -o at_wells.json + - schmerge -s eclipse/include/schedule/schedule.tmpl -i at_wells.json -o eclipse/include/schedule/schedule.sch + - eclipse100 r{{ eclbase }} --version 2020.2 + - rf -s r{{ eclbase }} -o rf + +The ``add_templates`` job does **NOT** need to be *installed* it is already part of the default everest jobs. +In the example above all files present in the ``files`` folder need to be provided by the user. The ``files`` +folder should have the following structure: + +.. code-block:: yaml + + files/ + |- well_readydate.json + |- wc_config.yml + |- at_config.yml + |- templates/ + |- wconinje.j2.html + |- wconprod.j2.html + +and should be *installed* in the everest config file: + +.. code-block:: + + install_data: + - + source: r{{ configpath }}/../input/files + target: files + link: true + +``well_readydate.json`` + +.. code-block:: json + + [ + { + "name": "PROD1", + "readydate": "2000-01-01", + }, + { + "name": "PROD2", + "readydate": "2000-01-01", + }, + { + "name": "INJECT1", + "readydate": "2000-01-01", + }, + { + "name": "INJECT2", + "readydate": "2000-01-01", + } + ] + +``wc_config.yml`` + +.. code-block:: yaml + + PROD1: + 1: + phase: + value: OIL + rate: + min: 500 + max: 1000 + duration: + value: 50 + PROD2: + 1: + phase: + value: OIL + rate: + min: 800 + max: 1400 + duration: + value: 50 + INJECT1: + 1: + phase: + value: WATER + rate: + min: 5000 + max: 10000 + duration: + value: 50 + INJECT2: + 1: + phase: + value: WATER + rate: + min: 5000 + max: 10000 + duration: + value: 50 + +``at_config.yml`` + +.. code-block:: yaml + + templates: + - + file: './files/templates/wconinje.j2.html' + keys: + opname: rate + phase: WATER + - + file: './files/templates/wconprod.j2.html' + keys: + opname: rate + phase: OIL + +``wconprod.j2.html`` + +.. code-block:: jinja + + WCONPROD + '{{ name }}' 'OPEN' 'ORAT' {{ rate }} 4* 100 / + / + +``wconinje.j2.html`` + +.. code-block:: jinja + + WCONINJE + '{{ name }}' '{{ phase }}' 'OPEN' 'RATE' {{ rate }} 1* 320 1* 1* 1* / + / + +In the above example of the forward model section of the config file: + +* The file ``wc_wells.json`` is a direct output of the ``well_constraint`` job. +* The ``add_templates`` job uses the same file ``wc_wells.json`` as an input for the job. +* The ``wc_wells.json`` file is not modified by the user. Any modification to this file should be done using a custom job (see the section :ref:`cha_creating_custom_jobs` for more information on how to do that). + +If the file is to be modified by a custom job, the everest config should contain: + +.. code-block:: yaml + + install_jobs: + - + name: custom_job + source: jobs/CUSTOM_JOB_CONFIG + + forward_model: + - well_constraints -i files/well_readydate.json -c files/wc_config.yml -rc well_rate.json -o wc_wells.json + - custom_job -i wc_wells.json -o wc_wells_custom.json + - add_templates -i wc_wells_custom.json -c files/at_config.yml -o at_wells.json + - schmerge -s eclipse/include/schedule/schedule.tmpl -i at_wells.json -o eclipse/include/schedule/schedule.sch + - eclipse100 r{{ eclbase }} --version 2020.2 + - rf -s r{{ eclbase }} -o rf + + +``wc_wells.json`` + +.. code-block:: json + + [ + { + "name": "PROD1", + "readydate": "2000-01-01", + "ops": [ + { + "phase": "OIL", + "rate": 550.0015, + "date": "2000-01-01", + "opname": "rate" + } + ] + }, + { + "name": "PROD2", + "readydate": "2000-01-01", + "ops": [ + { + "phase": "OIL", + "rate": 860.0048, + "date": "2000-01-01", + "opname": "rate" + } + ] + }, + { + "name": "INJECT1", + "readydate": "2000-01-01", + "ops": [ + { + "phase": "WATER", + "rate": 5499.93, + "date": "2000-01-01", + "opname": "rate" + } + ] + }, + { + "name": "INJECT2", + "readydate": "2000-01-01", + "ops": [ + { + "phase": "WATER", + "rate": 5500.075, + "date": "2000-01-01", + "opname": "rate" + } + ] + } + ] + +The add_templates job will search in the file ``wc_wells.json`` for the keys defined by the user in the config file ``at_config.yml`` +and where the keys are present the job will add the corresponding template file. The resulting output ``at_wells.json`` has the following form: + +``at_wells.json`` + +.. code-block:: json + + [ + { + "name": "PROD1", + "readydate": "2000-01-01", + "ops": [ + { + "phase": "OIL", + "rate": 550.0015, + "date": "2000-01-01", + "opname": "rate", + "template": "./files/templates/wconprod.j2.html" + } + ] + }, + { + "name": "PROD2", + "readydate": "2000-01-01", + "ops": [ + { + "phase": "OIL", + "rate": 860.0048, + "date": "2000-01-01", + "opname": "rate", + "template": "./files/templates/wconprod.j2.html" + } + ] + }, + { + "name": "INJECT1", + "readydate": "2000-01-01", + "ops": [ + { + "phase": "WATER", + "rate": 5499.93, + "date": "2000-01-01", + "opname": "rate", + "template": "./files/templates/wconinje.j2.html" + } + ] + }, + { + "name": "INJECT2", + "readydate": "2000-01-01", + "ops": [ + { + "phase": "WATER", + "rate": 5500.075, + "date": "2000-01-01", + "opname": "rate", + "template": "./files/templates/wconinje.j2.html" + } + ] + } + ] + +Next, the ``at_wells.json`` file is used as an input for the schedule merge job ``schmerge`` together with the initial schedule template +``schedule.tmpl`` file, which will result in the new schedule file ``schedule.sch`` used for the simulation. + +For the following entry in the ``at_wells.json``: + +.. code-block:: json + + { + "name": "PROD1", + "readydate": "2000-01-01", + "ops": [ + { + "phase": "OIL", + "rate": 550.0015, + "date": "2000-01-01", + "opname": "rate", + "template": "./files/templates/wconprod.j2.html" + } + ] + } + +and the template ``wconprod.j2.html``: + +.. code-block:: jinja + + WCONPROD + '{{ name }}' 'OPEN' 'ORAT' {{ rate }} 4* 100 / + / + +the resulting entry in ``schedule.sch`` is as follows: + +.. code-block:: + + DATES + 01 JAN 2000 / --ADDED + / + + --start ./files/templates/wconprod.j2.html + WCONPROD + 'PROD1' 'OPEN' 'ORAT' 550.0015 4* 100 / + / + + --end ./files/templates/wconprod.j2.html + +where ``"--"`` marks the beginning of a comment line and will be ignored by the simulator. + + +Other template examples +^^^^^^^^^^^^^^^^^^^^^^^ +The `jinja2 `_ templating language is supported by +the schedule merge job, and can be used to write the templates. +Below a few default examples can be found: + +**Water injection template** + +.. code-block:: jinja + + WCONINJE + '{{ name }}' '{{ phase }}' 'OPEN' 'RATE' {{ rate }} 5* / + / + +**Gas production template** + +.. code-block:: jinja + + WCONPROD + '{{ name }}' 'OPEN' 'GRAT' {{ rate }} 5* / + / + +**Oil production template** + +.. code-block:: jinja + + WCONPROD + '{{ name }}' 'OPEN' 'ORAT' {{ rate }} 5* / + / + +**Well open template** + +.. code-block:: jinja + + WELOPEN + '{{ name }}' 'OPEN' / + / + +More information regarding template design and usage can be found `here `_. + +.. _schmerge: + +Schedule merge +============== + +.. argparse:: + :module: everest_models.jobs.fm_schmerge.parser + :func: build_argument_parser + :prog: fm_schmerge + +Argument examples +~~~~~~~~~~~~~~~~~ + +**--input** example + +.. code-block:: python + + -- Dummy schedule file - but we try to add a typical set up + + WELSPECS + -- Item #: 1 2 3 4 5 6 + 'PROD1' 'G1' 10 10 8400 'OIL' / + 'PROD2' 'G1' 10 9 8400 'OIL' / + 'PROD3' 'G1' 10 8 8400 'OIL' / + 'INJ1' 'G1' 1 1 8335 'GAS' / + 'INJ2' 'G1' 1 2 8335 'GAS' / + / + + COMPDAT + -- Item #: 1 2 3 4 5 6 7 8 9 + 'PROD1' 10 10 3 3 'CLOSE' 1* 1* 0.5 / + 'PROD2' 10 9 3 3 'CLOSE' 1* 1* 0.5 / + 'PROD3' 10 8 3 3 'CLOSE' 1* 1* 0.5 / + 'INJ1' 1 1 1 1 'CLOSE' 1* 1* 0.5 / + 'INJ2' 1 2 1 1 'CLOSE' 1* 1* 0.5 / + / + + RPTRST + BASIC=3 FREQ=3 / + + DATES + 01 JAN 2000 / + / + + DATES + 01 FEB 2001 / + / + + DATES + 01 MAR 2002 / + / + + + +**--config** example (generated by previous job) + +This argument uses output of the **add_templates** and possibly **well_constraints** jobs, or similar output. + +.. code-block:: yaml + + [ + { + "name": "INJECT5", + "ops": [{ + "opname": "open", + "date": "2016-05-19", + "template": "files/welopen.jinja" + }] + }, + { + "name": "INJECT7", + "ops": [{ + "opname": "wconinje", + "date": "2000-01-01", + "template": "files/wconinje.jinja", + "rate": "0.7", + "phase": "WATER" + }] + }, + { + "name": "PROD3", + "ops": [{ + "opname": "open", + "date": "2016-05-20", + "template": "files/welopen.jinja" + }] + }, + { + "name": "INJECT3", + "ops": [{ + "opname": "wcqonje", + "date": "2021-04-24", + "template": "files/wconinje.jinja", + "rate": "0.55", + "phase": "GAS" + }] + }, + { + "name": "INJECT1", + "ops": [{ + "opname": "open", + "date": "2020-01-28", + "template": "files/welopen.jinja" + }] + }, + { + "name": "PROD1", + "ops": [{ + "opname": "open", + "date": "2021-04-23", + "template": "files/welopen.jinja" + }] + } + ] + + +.. _stea: + +Stea +==== + +.. argparse:: + :module: everest_models.jobs.fm_stea.parser + :func: build_argument_parser + :prog: fm_stea + +Argument examples +~~~~~~~~~~~~~~~~~ + +**--config** example + +.. code-block:: yaml + + # The id of the project, which must already exist and be available in + # the stea database. In the Stea documentation this is called "AlternativeId". + project-id: 4782 + project-version: 1 + + + # All information in stea is versioned with a timestamp. When we request a + # calculation we must specify wich date we wish to use to fetch configuration + # information for assumptions like e.g. the oil price. + config-date: 2018-07-01 12:00:00 + + + # The stea web client works by *adjusting* the profiles in an existing + # stea project which has already been defined. That implies that all + # profiles added in this configuration file should already be part of + # the project. To match the profiles specified here with the profiles in + # the project we must give a id for the profiles. + + # The profiles keyword is used to enter profile data explicitly in the + # configuration file. Each profile is identified with an id from the + # existing stea project, a start date and the actual data. + + profiles: + : + start-year: 2018 + data: [100, 200, 300] + + # Profiles which are calculated directly from an eclipse simulation are + # listed with the ecl-profiles key. Each profile is identified with an id + # from the stea project and an eclipe key like 'FOPT'. By default the stea + # client will calculate a profile from the full time range of the simulated + # data, but you can optionally use the keywords start-year and end-year to + # limit the time range. + ecl-profiles: + : + ecl-key: FOPT + + : + ecl-key: FGPT + start-year: 2020 + end-year: 2030 + + profile_comment_in_stea: + ecl-key: FWPT + glob_mult: 1.1 + + another_profile_comment_in_stea: + ecl-key: FWPT + mult: [ 1.1, 2, 0 ] + + # What do you want stea to calculate + results: + - NPV + +.. _extract_sd: + +Extract summary data +==================== + +.. argparse:: + :module: everest_models.jobs.fm_extract_summary_data.parser + :func: build_argument_parser + :prog: fm_extract_summary_data diff --git a/docs/everest/images/architecture_design.png b/docs/everest/images/architecture_design.png new file mode 100644 index 00000000000..92e8807078a Binary files /dev/null and b/docs/everest/images/architecture_design.png differ diff --git a/docs/everest/images/deter_vs_robust.png b/docs/everest/images/deter_vs_robust.png new file mode 100644 index 00000000000..aa5f12d3415 Binary files /dev/null and b/docs/everest/images/deter_vs_robust.png differ diff --git a/docs/everest/images/enopt_objfunc.png b/docs/everest/images/enopt_objfunc.png new file mode 100644 index 00000000000..e3a733a7aca Binary files /dev/null and b/docs/everest/images/enopt_objfunc.png differ diff --git a/docs/everest/images/everest_icon.svg b/docs/everest/images/everest_icon.svg new file mode 100644 index 00000000000..96ad966fadb --- /dev/null +++ b/docs/everest/images/everest_icon.svg @@ -0,0 +1,8 @@ + + +everest_icon + + + + + diff --git a/docs/everest/images/everest_wf.png b/docs/everest/images/everest_wf.png new file mode 100644 index 00000000000..c519da2f158 Binary files /dev/null and b/docs/everest/images/everest_wf.png differ diff --git a/docs/everest/index.rst b/docs/everest/index.rst new file mode 100644 index 00000000000..7541c618740 --- /dev/null +++ b/docs/everest/index.rst @@ -0,0 +1,61 @@ +Everest™ Documentation +====================== + +This guide serves as documentation for the *Everest* decision-making tool. + +* The intended readers are reservoir engineers and others involved in reservoir management and well planning. +* Everest is developed with the use of multiple realization models/ensemble models in mind. Everest can be used both for optimization on single realizations and multiple realizations. +* Everest could for example be used as decision support tool for well planning (drilling order) and drainage strategy optimization. + + +.. toctree:: + :hidden: + + self + +.. toctree:: + :hidden: + :caption: Getting started + + introduction + installation + minimal_example + +.. toctree:: + :hidden: + :caption: Reference + + cli + config + config_reference + optimization_backends + sampler_backends + forward_model_jobs + creating_custom_jobs + custom_workflow_jobs + +.. toctree:: + :hidden: + :caption: Theory + + theory + +.. toctree:: + :hidden: + :caption: Developer Documentation + + development + +.. toctree:: + :hidden: + :caption: About + + Code in GitHub + Issue tracker + +.. Indices and tables + ================== + + * :ref:`genindex` + * :ref:`modindex` + * :ref:`search` diff --git a/docs/everest/installation.rst b/docs/everest/installation.rst new file mode 100644 index 00000000000..a057c42936c --- /dev/null +++ b/docs/everest/installation.rst @@ -0,0 +1,28 @@ + +************ +Installation +************ + +Follow these instructions to install Everest on your system: + +Using pip (Recommended for General Users) +----------------------------------------- +**Install via pip** - Open your command line interface (CLI) and enter the following command: + +.. code-block:: bash + + $ pip install git+https://github.com/equinor/everest.git + + +Installing the Development Version +--------------------------------------------------- +If you want to build and install the latest development version, follow the instructions on the `Everest Github page `_. + + +For Equinor Employees (Using Komodo Release) +-------------------------------------------- +If you work at Equinor, Everest should be available after sourcing a Komodo release. Run the following command: + +.. code-block:: bash + + $ source /prog/res/komodo/stable/enable diff --git a/docs/everest/introduction.rst b/docs/everest/introduction.rst new file mode 100644 index 00000000000..876ae071057 --- /dev/null +++ b/docs/everest/introduction.rst @@ -0,0 +1,60 @@ +.. _cha_introduction: + +************ +Introduction +************ + +Background and motivation +========================= + +Everest is a tool, which uses ensembles of models to deliver a robust optimization. + +While the result of an data assimilation process is an ensemble of models, the result of the robust optimization process is one optimal strategy, for example for well order or drainage strategy. With this optimised strategy we can, e.g., maximize net present value (NPV) with respect to the geological uncertainty in the models. Note that Everest is a generic tool that can be applied to other optimisation problems (also outside the domain of Oil & Gas). + + +Everest +======= + +The objectives (what to optimise) can, for example, be the Net Present Value (NPV), the recovery factor, or carbon emissions. The controls (what to adjust in order to optimise the objective) can, for example, be the drilling order of the wells and production and/or injection rates (drainage strategy). Additionally, constraints on these controls can be handled both within Everest and/or in flow simulator. + +The primary goal of the Everest tool is to find an "optimal" strategies by utilizing an ensemble of reservoir models (e.g., an ensemble of geologically-consistent models). This will help make robust decisions about drilling schedule or drainage strategy in an efficient and assisted manner. + +To this end, an optimization problem is formulated and solved by the *Ensemble Optimization* (EnOpt) method described here: :ref:`en-opt-label`. + +A single configuration file is required to define controls, constraints, objective functions, and other items related to gradient estimation for optimization. This file should also include items related to simulations themselves, such as manipulating schedule files according to the controls and calculating the values of objective functions and constraints. + +Everest will, then, generate new set of controls as a result of the simulated results, e.g., ensemble objective function values. +The flow chart below provides a detailed description of the elements involved in running an optimization experiment. + + +Considerations regarding the usage of Everest +----------------------------------------------- + +Everest can assist the decision makers when there are many outcomes or decisions that need to be made. If the decision and outcome is limited or easy, then Everest may not be needed as one can evaluate the outcomes with a heuristic approach. However, it is unlikely that one can easily find few outcomes or real optimised, robust strategies using this “manual” approach when uncertainty is involved. In the following sections we will discuss the use of Everest in different cases and some of the "ifs and buts " associated with the application of the tool. + +The power of the Everest tool is to assist in optimising strategies while capturing the underlying reservoir uncertainty, which is modelled by an ensemble of models. A crucial factor for the success of the optimisation is to have good enough model quality and the uncertainty well represented - i.e., to span the current understanding or knowledge of the reservoir uncertainty. Moreover, the greater the reservoir complexity, the more important it is to have many model realisations in the ensemble, i.e., to span the actual reservoir uncertainty. The alternative might lead to a situation where the strategy is not representative. The essential take away is that Everest cannot improve your model's quality and your uncertainty representation, and that the quality of the Everest optimisation results is dependent on the quality of the underlying model and uncertainty representation. + +When doing experiments that involve tuning specific parameters, it is advisable to begin with a coarse-grained approach when adjusting control variables. Initially, one might consider modifying the parameters at long intervals, such as every several years or at key points in the process timeline. This sets a foundational structure for the optimization without overwhelming the algorithm with too many variables. + +In general, the following elements should be reflected upon when consider applying Everest for decision support and decision making: + +* the need for, or value of, robustness of optimisation results; + +* the value of time saving from using the tool (heuristic approach versus assisted optimisation); + +* the quality of the underlying reservoir models and uncertainty span; + +* the need for a tool in order to handle reservoir complexity or uncertainty in decision making. + + +Everest workflow +---------------- + +.. figure:: images/everest_wf.png + :align: center + :width: 700px + :alt: Everest workflow + +The figure shows the Everest workflow. The workflow starts with defining the initial controls (e.g., drilling order), objective function (e.g., NPV), constraints (e.g., upper injection rate) and related information, such as optimization algorithm, perturbation magnitude, and ensemble realizations used in optimization. Based on these information, Everest will run simulations in order to evaluate either objective function or gradient with respect to the current control variables. Also, it prepares the input files for the simulator, such as the schedule file. + +Normally, different schedule files will be generated for different control values. For example, in case the drilling order is the control, with different drilling orders the well open dates can be totally different, which leads to different schedule files. Once all necessary simulator files are set up, the ensemble of simulations will be run. Based on the simulation results, Everest will calculate the objective function value (e.g. NPV) or constraint values. Everest will then update the controls based on the selected optimization algorithm and run a new experiment until the convergence criteria is satisfied. diff --git a/docs/everest/minimal_example.rst b/docs/everest/minimal_example.rst new file mode 100644 index 00000000000..7ea721104d8 --- /dev/null +++ b/docs/everest/minimal_example.rst @@ -0,0 +1,354 @@ +.. _cha_minimal_example: + +******* +Example +******* + +In this section we will go through the setup and running of a simple everest optimization case. + +Problem definition +################## + +The optimization problem we will solve using everest will be to minimize the distance between an initial 3D point +and another given target 3D point. + +Everest config +################## + +The main element an Everest optimization experiment requires is a configuration file. Everest supports the `YAML `_ +format for the configuration file. The configuration file is build up of multiple sections and next we will go through it section +by section. + +Creating the optimization folder:: + + ~$: mkdir everest_example + ~$: cd everest_example + ~/everest_example$: touch everest_config.yml + +Controls definition +------------------- +everest_config.yml:: + + controls: + - + name: point + type: generic_control + min: -1.0 + max: 1.0 + initial_guess: 0 + perturbation_magnitude : 0.001 + variables: + - name: x + - name: y + - name: z + +**Details** + +``name``: control defined name + +``min``: minimal value each of the control variables can take + +``max``: maximal value each of the control variables can take + +``initial_guess``: the initial value for the control variables + +``min``, ``max`` and ``initial_guess`` can also be defined for each control individually:: + + controls: + - + name: point + type: generic_control + initial_guess: 0 + perturbation_magnitude : 0.001 + variables: + - + name: x + initial_guess: 0 + min: -1.0 + max: 1.0 + - + name: y + initial_guess: 0 + min: -1.0 + max: 1.0 + - + name: z + initial_guess: 0 + min: -1.0 + max: 1.0 + +``perturbation_magnitude`` controls the size of perturbations (standard deviation of a normal distribution) of controls used to approximate the gradient. +The value depends on the type of control and magnitude of the variables. +For continuous controls smaller values should give a better gradient, +whilst for more discrete controls larger values should give a better +result. However, this is a balance as too large or too small values also cause issues. + +``variables``: list of control variables. + +Objective function definition +------------------------------ + +everest_config.yml:: + + objective_functions: + - + name: distance + + +Optimization definition +----------------------- + +everest_config.yml:: + + optimization: + algorithm: optpp_q_newton + convergence_tolerance: 0.005 + +**Details** + +``algorithm``: the algorithm used for the optimization +currently supported algorithms: optpp_q_newton, conmin_mfd, conmin_frcg, mesh_adaptive_search. + +``convergence_tolerance``: provides a real value for controlling the termination of +iteration. In most cases, it is a relative convergence tolerance for the +objective function; i.e., if the change in the objective function between +successive iterations divided by the previous objective function is less than +the amount specified by convergence_tolerance, then this convergence criterion is satisfied on the +current iteration. Since no progress may be made on one iteration followed by significant progress +on a subsequent iteration, some libraries require that the convergence tolerance +be satisfied on two or more consecutive iterations prior to termination of +iteration (from the Dakota Manual.) + +Install jobs definition +----------------------- + +everest_config.yml:: + + install_jobs: + - + name: distance3d + source: jobs/DISTANCE3d + + +**Details** + +The custom job can be *installed* by adding information regarding it in the **install_jobs** section. Each custom job entry will contain: + +``name``: the name the job, the same name will be used in the forward model section. + +``source``: the file path to the job's config file. + + +Model definition +---------------- + +everest_config.yml:: + + model: + realizations: [0] + +**Details** + +``realizations``: list of realizations to use in optimization ensemble. Typically, this is a +list [0, 1, ..., n-1] of all realizations in the ensemble. + +Forward model definition +------------------------ + +everest_config.yml:: + + forward_model: + - distance3d --point-file point.json --target 0.5 0.5 0.5 --out distance + +**Details** + +``distance3d``: the name of the custom job installed in the ``install_jobs`` section of the config file. +The job name is followed by named arguments the job is designed to accept. + +``point.json``: file generated by the Everest optimization experiment. It contains the list of control variables with +the values used for the current forward model evaluation. + +Example:: + + { + "x" : 0, + "y" : 0, + "z" : 0 + } + +Everest creates the file with the name ``point.json`` because we have added to the ``controls`` section the control with +the name ``point``. + +``distance``: file required for the optimization experiment +to succeed. + +One of the jobs in the forward model needs to create the file ``distance``. + +``distance`` needs to contain the value for the objective function +evaluation. + +The files needs to be called ``distance`` because we have defined the objective function named ``distance``. + +Optimization environment definition +----------------------------------- + +everest_config.yml:: + + environment: + simulation_folder: sim_output + output_folder: everest_optimization + random_seed: 999 + +**Details** + +``simulation_f0older``: folder path where the simulation information will be written to. + +``output_folder``: folder path where the optimization information will be written. + +``random_seed``: integer used to make optimization experiments reproducible + + +Putting all together +-------------------- + +everest_config.yml:: + + controls: + - + name: point + type: generic_control + min: -1.0 + max: 1.0 + initial_guess: 0 + perturbation_magnitude : 0.001 + variables: + - name: x + - name: y + - name: z + + objective_functions: + - + name: distance + + optimization: + algorithm: optpp_q_newton + convergence_tolerance: 0.005 + + install_jobs: + - + name: distance3d + source: jobs/DISTANCE3D + + model: + realizations: [0] + + forward_model: + - distance3d --point-file point.json + --target 0.5 0.5 0.5 + --out distance + + environment: + simulation_folder: sim_output + output_folder: everest_optimization + random_seed: 999 + +More information regarding all the available section options and additional sections not covered in the current example +can be found in :ref:`cha_config` section + +Creating the custom job +####################### + +Before we are able to start the optimization experiment we need to create the script for the custom job +``distance3d`` used in the forward model. + +Creating the folders and files:: + + ~/everest_example$: mkdir jobs + ~/everest_example$: cd jobs + ~/everest_example/jobs$: touch DISTANCE3D + ~/everest_example/jobs$: touch distance3d.py + ~/everest_example/jobs$: chmod 777 distance3d.py + +``chmod +x distance3d.py``: command is used to change the access permissions for the file ``distance3d.py``, such that execution of the file is +allowed. + +DISTANCE3D:: + + EXECUTABLE distance3d.py + +distance3d.py:: + + #!/usr/bin/env python + + import argparse + import json + import sys + + + def compute_distance_squared(p, q): + d = ((i - j) ** 2 for i, j in zip(p, q)) + d = sum(d) + return -d + + def read_point(filename): + with open(filename, "r") as f: + point = json.load(f) + return point["x"], point["y"], point["z"] + + def main(argv): + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument("--point-file", type=str) + arg_parser.add_argument("--point", nargs=3, type=float) + arg_parser.add_argument("--target-file", type=str) + arg_parser.add_argument("--target", nargs=3, type=float) + arg_parser.add_argument("--out", type=str) + options, _ = arg_parser.parse_known_args(args=argv) + + point = options.point if options.point else read_point(options.point_file) + if len(point) != 3: + raise RuntimeError("Failed parsing point") + + target = options.target if options.target else read_point(options.target_file) + if len(target) != 3: + raise RuntimeError("Failed parsing target") + + value = compute_distance_squared(point, target) + + if options.out: + with open(options.out, "w") as f: + f.write("%g \n" % value) + else: + print(value) + + if __name__ == "__main__": + main(sys.argv[1:]) + +More information about creating custom jobs can be found in the :ref:`cha_creating_custom_jobs` section + +Running everest +############### + +Now we have all the components needed to start the optimization experiment, +which can be done using the following command:: + + ~/everest_example$: everest run everest_config.yml + + +A successful run should provide the following information in the console:: + + =================================== Optimization progress =================================== + objective_history + [-0.75, -0.741387, -3.0771e-06, -3.52973e-05, -1.9738e-06] + control_history + point_x + [0.0, 0.9969848491048954, 0.5004497377256543, 0.494934760761201, 0.4987474020091786] + point_y + [0.0, 0.9969449712812354, 0.4983102069271145, 0.5024668256000643, 0.49959325134821364] + point_z + [0.0, 0.9974323304790726, 0.4998643423913659, 0.5018857127965773, 0.5004882889752225] + objectives_history + distance + [-0.75, -0.741387, -3.0771e-06, -3.52973e-05, -1.9738e-06] + accepted_control_indices + [0, 1, 2, 4] + All 1 active jobs complete and data loaded. diff --git a/docs/everest/optimization_backends.rst b/docs/everest/optimization_backends.rst new file mode 100644 index 00000000000..fe0c5ac9bd4 --- /dev/null +++ b/docs/everest/optimization_backends.rst @@ -0,0 +1,84 @@ +.. _cha_optimization_backends: + +********************* +Optimization backends +********************* + +Everest offers the possibility to specify the backend used for optimization with +the `backend` keyword. Everest will check if the requested backend is installed +and if the algorithm specified by the `algorithm` keyword is supported. The +general optimization options, like `convergence_tolerance` are handled +appropiately by the backend, and backend specific options can be passed using +the `options` or `backend_options` keywords. + +Out of the box, Everest supports Dakota and SciPy backends, provided their +corresponding prerequisites are installed, i.e., provided Dakota and/or Scipy are +installed. Additional backends may be installed in your local installation, +consult your systems manager for options. + +By default, if the `backend` keyword is missing, Everest will select the Dakota +backend. + +The Dakota backend +================== + +The Dakota backend is the default choice for the optimization backend, it will +be selected when the `backend` keyword is not present, or if it is set to +`dakota`. Consult the documentation on the configuration file +(:ref:`cha_config`) for the algorithms that can be selected by the `algorithm` +keyword. + +Additional options specific to Dakota can be passed as a list of strings using +the `options` keyword. The `backend_options` keyword is ignored by the Dakota +backend. + +.. important:: + + For more information regarding specific optimizer settings please refer to the official `Dakota reference manual `_. + +**Example** + +.. code-block:: yaml + + optimization: + algorithm: optpp_q_newton + convergence_tolerance: 0.001 + constraint_tolerance: 0.001 + perturbation_num: 7 + speculative: True + options: + - max_repetitions = 300 + - retry_if_fail + - classical_search 1 + +The SciPy backend +================= + +Everest supports algorithms from the SciPy Optimization package (`scipy.optimize +`_). This +requires that SciPy is installed, otherwise Everest will raise an error if an +attempt is made to use this backend. Set the `backend` keyword to `scipy` to +select this backend, and set the `algorithms` keyword to one of the values +listed in the documentation of the configuration file (:ref:`cha_config`). + +Additional options for the SciPy algorithms can be passed using the +`backend_options` keyword as a dictionary containing the option names and their +values. Consult the `scipy.optimize.minimize +`_ +documentation for the options supported by each algorithm. The `options` keyword +is ignored by the SciPy backend. + +**Example** + +.. code-block:: yaml + + optimization: + backend: scipy + algorithm: SLSQP + convergence_tolerance: 0.001 + constraint_tolerance: 0.001 + perturbation_num: 7 + speculative: True + backend_options: + ftol: 1e-5 + disp: True diff --git a/docs/everest/sampler_backends.rst b/docs/everest/sampler_backends.rst new file mode 100644 index 00000000000..1b036885bdb --- /dev/null +++ b/docs/everest/sampler_backends.rst @@ -0,0 +1,52 @@ +.. _cha_sampler_backends: + +******** +Samplers +******** + +By default Everest generates perturbations to estimate gradients using sampling +code based on SciPy. It provides sampling from common distributions such as +Gaussian, Uniform and Bernoulli, and some additional methods such as Sobol and +Latin hypercube sampling. + +The sampling method and options are specified in the `sampler` subsection of the +`controls` configuration settings. The sampling method is selected using the +`method` keyword. If the `method` keyword is missing, the backend will select a +default method, which samples from a normal distribution. + +The sampling methods in the SciPy backend support several options that can be +passed using the `backend_options` keyword. Please consult the online SciPy +manual for details for the options to those sampler that can be passed. + +The sampler methods use a random number generator to generate stochastic +samples. The seed for that generator can be set using the `seed` keyword. If the +`seed` keyword is not provided, the more general Everest seed, as configured by +the `random_seed` keyword is used instead. + +Everest offers the possibility to specify another backend for sampling with the +optional `backend` keyword in the `sampler`` subsection of the 'controls' +configuration settings. Everest will check if the requested backend is +installed, and if the method specified by the `method` keyword is supported. By +default, if the `backend` keyword is missing, Everest will select the `scipy` +backend. Additional backends may be installed in your local installation, +consult your systems manager for options. + +**Example** + +.. code-block:: yaml + + optimization: + sampler: + method: sobol + seed: 123 + +Another example using the SciPy backend, with some options added, and the seed +taken from the global Everest seed: + +.. code-block:: yaml + + optimization: + sampler: + method: sobol + backend_options: + scramble: False diff --git a/docs/everest/theory.rst b/docs/everest/theory.rst new file mode 100644 index 00000000000..e3c3d64e873 --- /dev/null +++ b/docs/everest/theory.rst @@ -0,0 +1,167 @@ +.. _cha_theory: + +****** +Theory +****** + + +Optimization +============ + +Have you being recently tasked with some aspect of field development or operational planning? If so, you have maybe come across the following problem. Imagine you have been tasked with designing the drilling schedule for three potential wells, two producers *Well-A* and *Well-B*, and an injector *Well-C*. The complexity being you can only drill one well at a time. +Thus the question is "What is the optimal order to drill these three potential wells?". The answer naturally depends on: + +* the properties of the reservoir, +* the life cycle production duration +* the location and potential of the wells, +* the cost of the individual wells, +* the platform capacity, +* and so on and so forth. + +Other factors often have to be considered. Does the reservoir have pressure support from an aquifer, thus eliminating the need for an injector? Or could the reservoir be underpressued thus the urgent need for an injector? Or are the reserves in connection with producer *Well-B* too low to be profitable? +For this simple example of 3 wells the number of possibilities and scenarios to be considered is equal to 3 factorial, i.e. 6 different combinations. Thus it is possible to "manually" test these 6 different drilling combinations in order to find the best possible solution. However what if you are tasked with planning 6 potential wells. This would entail 6 factorial (i.e. 720) combinations of the drilling order to be tested. Can this task of testing 720 different possible combinations be performed manually? What if you have to plan 10 wells or more? As the number of wells increase the potential number of possible combinations increases exponentially. +Finding or obtaining the optimal order for the wells to be drilled is a tedious task. Solutions to such problems can be obtained using computationally efficient optimization techniques. So what is Optimization and these Optimization techniques? + +The optimization process +------------------------ +**Optimization** is the process of finding the best possible solution for a particular problem. For petroleum/reservoir engineering, such problems would primarily imply + +* Can I improve the ultimate oil recovery from the reservoir being produced? or +* Can I produce a certain more efficiently/economically? or +* Can I improve the sweep efficiency of my reservoir? or +* How much water/chemicals should I inject to improve the oil/gas recovery factor? or +* How many wells should I drill to efficiently produce the reservoir being developed? + +This list can be endless and tailored to various different applications and problems for different reservoirs. Additionally many more such questions such well design, operating constraints, value of information etc. can be framed into an optimization problem. +To optimize ( i.e. find the best possible solution) a certain problem, there must be "something" that a user can manipulate/change in order to achieve a better solution. This "something" that can be changed or manipulated is known as **controls**. Within the context of petroleum/reservoir engineering, controls can be defined as + +* Production and injection rates - the rates of production and injection (well-by-well or by group/field scale). +* Well location - optimization of the well location and path +* Well drilling priority - the order of which the wells are drilled (*Well-A* first, then *Well-B*) +* Well drilling timing - the timing of which the wells are drilled (*Well-A* is drilled as soon as a drilling rig is available) + +Having defined the controls we aim to optimize, we must define a function to be optimized. Such a function is known as an **objective function**. In general many different types of objectives can be considered by a user for different problems encountered. The most widely used objective functions for petroleum engineering applications are: + +* Economic Objectives: Net Present Value (NPV) +* Production Objectives: Recovery factor, Sweep Efficiency +* Risk Objectives: Uncertainty based risk measures + +Thus optimization is the process which aims to find an *optimal* set of controls which will provide the *best possible* objective function value for the problem being optimized. Optimization process can either be manual or automated. Manual optimization is time consuming and prone to human bias and errors. Automated optimization on the other hand is quicker and less prone to human bias and errors. However the results from automated optimization workflows need to be analysed through human intervention. Everest focuses on state-of-the-art automated workflows for performing optimizations, with the goal of achieving solutions of significant practical value, using computationally efficient techniques. + + +.. _en-opt-label: + +Ensemble optimization (EnOpt) +----------------------------- + +There are numerous methods for model-based optimization for petroleum/reservoir engineering objectives. +These methods can be classified into two general classes, *derivative-based* and *derivative free* techniques. +Derivative/Gradient-based methods have been shown to be computationally more efficient than derivative free methods and thus have been used in this Everest toolbox. +Among the gradient-based methods the adjoint approach (see :ref:`Jansen 2011 ` for an overview), provides the most accurate gradient and is computationally very efficient. +However the adjoint approach has the disadvantage that it requires access to the simulation code to be implemented. + +:ref:`Chen 2008 ` and :ref:`Chen et al. 2009 ` introduced the ensemble-based optimization method (EnOpt), an approximate gradient-based method which is computationally less attractive than the adjoint method but does not require simulator access and has proven to achieve good results. +A detailed mathematical description of the Ensemble Optimization method can be found in, amongst others, :ref:`Fonseca 2015 ` and :ref:`Chen et al. 2009 ` + +The following is a diagrammatic representation of the EnOpt method. Imagine a two control problem as displayed in :numref:`fig_enopt_objfunc`, where the controls are called ``u1`` and ``u2``. + +.. _fig_enopt_objfunc: +.. figure:: images/enopt_objfunc.png + :align: center + :width: 700px + + The ensemble-based optimization method (EnOpt). + +To approximate the gradient the following steps are taken: + +#. A user must choose an initial assignment of the controls. For instance in :numref:`fig_enopt_objfunc` the point ``(u1 = -1, u2 = 0)`` has been chosen. +#. Around this initial choice of ``u1`` and ``u2``, Everest will generate a set of normally (Gaussian) distributed perturbed controls which can be seen as blue dots in :numref:`fig_enopt_objfunc`. +#. Then, the objective function value for each of these blue dots will be evaluated. These are represented as the red dots. +#. Now we have all the information required to approximate the gradient of the objective function. An estrimate of the gradient at the initial point is determined by computing the linear regression through the red dots (green line). +#. We use a simple line-search algorithm to take a step along the gradient direction and to find an "updated" set of controls. +#. The entire process is repeated till convergence is observed (i.e. little/no change in the objective function). + +The theoretical justifications for the use of a linear regression as an approximation to the gradient can be found in many text books on numerical optimization such as :ref:`Nocedal and Wright 2009 `. + +Intuitively it is fairly simple to visualize that the number of perturbed controls generated (i.e. blue dots) can have a significant impact on the quality of the approximate gradient. +Also the methodology to create the blue dots can also significantly impact the gradient quality. +Detailed investigations into the importance of both these features can be found in :ref:`Fonseca 2015 `. +Note that a larger number of blue dots will increase the quality of the gradient, but the computational complexity will also increase. +Traditionally many studies have used 10-50 perturbed controls during the optimization process to estimate the gradient. +These studies have used a single model realization (i.e. a single geological representation) of the reservoir which may not always be an accurate representation of the real reservoir system. + +Robust Optimization: Stochastic Simplex Gradients (StoSAG) +========================================================== +In reality, geological and reservoir modeling process is fraught with uncertainties since a reservoir is modeled using uncertain interpretations based on uncertain data sources such as seismic, well logs etc. +Thus to achieve optimization solutions which have practical value it is imperative to account for uncertainty within the optimization framework. +One way of representing the uncertainty present is to generate multiple realization models, or an ensemble of models. +Instead of a single reservoir model, we might have tens to hundreds of potential reservoir models. +Together they represent the uncertainty in your models and you no longer have a base case and a P10/P90. +Thus now the question is how can we use EnOpt for optimization which incorporates geological uncertainty. +The section above details diagrammatically how a gradient can be approximated for a single model realization. +Intuitively if multiple model realizations were to be used one could think of using a similar method as when using a single model realization. +In the case of a single model realization (as illustrated in figure below) to estimate the gradient we use 10-50 perturbed control samples which is a user dependent choice. +Thus the ratio between model realizations and control samples is ``1:10-50``. +If we were to follow the same procedure for Robust Optimization i.e. optimization over an ensemble of geological realizations we would need to find a gradient for each model realization. +These individual gradients would then need to be averaged to estimate the approximate *robust ensemble gradient*. +The drawback of such an approach is the computational complexity involved in estimating the robust ensemble gradient. +Imagine you have ``10`` model (geological) realization to be optimized. +Assume you have chosen to use ``25`` perturbed samples to evaluate the gradient for each realization. +This would entail ``10 * 25 = 250`` reservoir simulations to estimate a single gradient. +For large field scale models this would be computationally expensive. + + +.. figure:: images/deter_vs_robust.png + :align: center + :width: 700px + :alt: Diagrammatic representation of the difference between deterministic and robust optimization when using Everest. + + +Chen 2008 suggested a computationally efficient technique to estimate the robust ensemble gradient. +Chen 2008 based on some assumptions suggested the use of 1 perturbed control sample for each model realization. +Thus now the total number of simulations to estimate the robust ensemble gradient would be only 10, since each model realization has been coupled with only 1 perturbed control sample. +This method is computationally attractive and can be applied to large scale optimization problems. +:ref:`Fonseca et al. 2016 ` showed that the assumptions introduced by Chen 2008 were not theoretically valid. +They also introduced a theoretically robust version of the formulation introduced by Chen 2008. +The new formulation, called **Stochastic Simplex Gradients (StoSAG)** introduced, retains the computational attractive feature of Chen 2008, i.e. the use of 1 perturbed control sample for each model realization. +Everest supports the StoSAG formulation for estimating the gradient in robust optimization problems. + + +Multi-objective optimization (MOO) +=================================== + +Most real-world design and planning problems must also satisfy multiple objectives. Very often these objectives are in conflict with each other, which means that one objective must be decreased to increase the other objective. In such cases it is not trivial to find solutions which satisfy different objectives. When the problem includes two or more performance indicators, Everest employs the widely used weighted sum method to balance the objective functions. This approach aims to optimize a weighted objective function that combines multiple objectives in a single function according to: + +.. math:: + + J = w*J_{I} + (1-w)*J_{II} + +where J :subscript:`I` and J :subscript:`II` are the two objective functions considered and w is the weighting factor between both of objectives. Note that this can be extended to cases with more objectives by introducing more importance weights, which are recommended to be chosen as fraction values (i.e., 0 ≤ w ≤ 1) adding up to 1. + + +References +========== + +.. _chen2008: + +Chen, Y. (2008). Efficient ensemble based reservoir management (Doctoral dissertation, University of Oklahoma). + +.. _chen2009: + +Chen, Yan, Oliver, Dean S., and Dongxiao Zhang. (2009). "Efficient Ensemble-Based Closed-Loop Production Optimization." SPE J. 14: 634–645. doi: https://doi.org/10.2118/112873-PA + +.. _nocedal2009: + +Nocedal, J. and Wright, S. J. (2006). "Trust-region methods" in Numerical Optimization, New York, NY, USA:Springer, pp. 66-98, doi: https://doi.org/10.1007/978-0-387-40065-5 + +.. _jansen2011: + +Jannsen, J. D. (2011) "Adjoint-based optimization of multi-phase flow through porous media - A review", Computers & Fluids, Volume 46, Issue 1, doi: https://doi.org/10.1016/j.compfluid.2010.09.039 + +.. _fonseca2015: + +Fonseca, R. M. (2015) "A Modified Gradient Formulation for Ensemble Optimization under Geological Uncertainty" (Doctoral dissertation, Technische Universiteit Delft) http://www.publications.pvandenhof.nl/Paperfiles/Fonseca_PhD_Thesis_2015.pdf + +.. _fonseca2016: + +Fonseca, R. M., Chen, B., Jansen, J. D., Reynolds, A., (2016) "A Stochastic Simplex Approximate Gradient (StoSAG) for optimization under uncertainty", Numerical Methods in Engineering, Volume 109, Issue 13, pp. 1756-1776 doi: https://doi.org/10.1002/nme.5342 diff --git a/examples/egg/eclipse/include/EGG.DATA b/examples/egg/eclipse/include/EGG.DATA new file mode 100644 index 00000000000..cb56f279590 --- /dev/null +++ b/examples/egg/eclipse/include/EGG.DATA @@ -0,0 +1,492 @@ +-- <+> Start of deck ECL + +NOECHO +-- <+> RUNSPEC Section + +RUNSPEC + +TITLE +EGG_WFL + +DIMENS + 60 60 7 / + +METRIC + +OIL +GAS +WATER +DISGAS +VAPOIL + +NUMRES + 1 / + +ENDSCALE + 'NODIR' 'REVERS' 1 20 / + +EQLOPTS + 'QUIESC' / + +TABDIMS + 2* 24 2* 20 20 1* 1 7* / +EQLDIMS + 2* 100 2* / +REGDIMS + 6* / +WELLDIMS + 12 100 4 12 0 0 0 0 0 0 0 0 / +VFPPDIMS + 6* / +VFPIDIMS + 3* / +AQUDIMS + 2* 1 3* / +NSTACK + -75 / + +START +31 'DEC' 1999 / + +-- <-> RUNSPEC Section + +-- <+> GRID Section +-- Input and output files format +UNIFIN +UNIFOUT + + +GRID + +INIT + +SPECGRID + 60 60 7 1 F / + +INCLUDE + '../include/grid/active.inc' / + +DX + 25200*8 / + + +DY + 25200*8 / + + +DZ + 25200*4 / + +TOPS + 3600*4000 3600*4004 3600*4008 3600*4012 3600*4016 3600*4020 3600*4024/ + +INCLUDE + '../include/grid/PERM.INC' / + +COPY +PERMX PERMY / +PERMX PERMZ / +/ + +MULTIPLY +PERMZ 0.1 / +/ + +NTG + 25200*1 / + +PORO + 25200*0.2 / + +ECHO + +INIT + +-- <-> GRID Section + + +-- <+> PROPS Section + +EDIT + +PROPS + +EQUALS + SWL 0.05 / Connate water saturation + SWU 1.0 / Maximum water saturation + SGCR 0.05 / Critical gas saturation + SOWCR 0.1 / Residual oil saturation after water-flood + SOGCR 0.05 / Residual oil sat. after gas-flood +/ + +COPY + SWL SWCR / + SWL SGU / +/ + +MULTIPLY + SGU -1 / +/ +ADD + SGU 1 / +/ + +SWFN + 0.000000 0.000000 0.000000 + 0.006819 0.003554 0.000000 + 0.027091 0.013908 0.000000 + 0.060263 0.025952 0.000000 + 0.105430 0.044108 0.000000 + 0.161359 0.068765 0.000000 + 0.226526 0.101539 0.000000 + 0.299152 0.145360 0.000000 + 0.377257 0.193942 0.000000 + 0.458710 0.244954 0.000000 + 0.541290 0.308844 0.000000 + 0.622743 0.394668 0.000000 + 0.700848 0.491067 0.000000 + 0.773474 0.593135 0.000000 + 0.838641 0.699496 0.000000 + 0.894570 0.800074 0.000000 + 0.939737 0.888146 0.000000 + 0.972909 0.949655 0.000000 + 0.993181 0.987216 0.000000 + 1.000000 1.000000 0.000000 +/ +SOF3 + 0.000000 0.000000 0.000000 + 0.006819 0.000686 0.002515 + 0.027091 0.002746 0.013164 + 0.060263 0.006794 0.034361 + 0.105430 0.014497 0.067229 + 0.161359 0.026915 0.112035 + 0.226526 0.045924 0.168322 + 0.299152 0.073425 0.235001 + 0.377257 0.111978 0.310431 + 0.458710 0.166662 0.392506 + 0.541290 0.228933 0.478758 + 0.622743 0.297987 0.566462 + 0.700848 0.383686 0.652753 + 0.773474 0.495582 0.734742 + 0.838641 0.617999 0.809639 + 0.894570 0.732288 0.874857 + 0.939737 0.839305 0.928127 + 0.972909 0.926725 0.967580 + 0.993181 0.980640 0.991823 + 1.000000 1.000000 1.000 +/ +SGFN + 0.0 0.0 0.000 + 0.006819 0.000563 0.000 + 0.027091 0.004459 0.000 + 0.060263 0.014794 0.000 + 0.105430 0.034233 0.000 + 0.161359 0.064817 0.000 + 0.226526 0.107814 0.000 + 0.299152 0.163621 0.000 + 0.377257 0.231716 0.000 + 0.458710 0.310676 0.000 + 0.541290 0.398240 0.000 + 0.622743 0.491432 0.000 + 0.700848 0.586727 0.000 + 0.773474 0.680250 0.000 + 0.838641 0.768005 0.000 + 0.894570 0.846100 0.000 + 0.939737 0.910981 0.000 + 0.972909 0.959640 0.000 + 0.993181 0.989789 0.000 + 1.0 1.000000 0.000 +/ +PVTG + 20.00 0.00002448 0.061895 0.01299 + 0.00001224 0.061810 0.01300 + 0.00000000 0.061725 0.01300 / + 40.00 0.00000628 0.030252 0.01383 + 0.00000314 0.030249 0.01383 + 0.00000000 0.030245 0.01383 / + 60.00 0.00000585 0.019844 0.01450 + 0.00000292 0.019845 0.01450 + 0.00000000 0.019846 0.01449 / + 80.00 0.00000728 0.014686 0.01520 + 0.00000364 0.014689 0.01519 + 0.00000000 0.014692 0.01518 / + 100.00 0.00001017 0.011627 0.01596 + 0.00000509 0.011633 0.01595 + 0.00000000 0.011638 0.01593 / + 120.00 0.00001485 0.009619 0.01682 + 0.00000743 0.009627 0.01679 + 0.00000000 0.009635 0.01676 / + 140.00 0.00002182 0.008213 0.01780 + 0.00001091 0.008224 0.01774 + 0.00000000 0.008235 0.01767 / + 160.00 0.00003155 0.007184 0.01890 + 0.00001577 0.007198 0.01878 + 0.00000000 0.007212 0.01866 / + 197.66 0.00006327 0.005820 0.02160 + 0.00003164 0.005840 0.02122 + 0.00000000 0.005860 0.02086 / + 231.13 0.00010861 0.005042 0.02477 + 0.00005431 0.005061 0.02389 + 0.00000000 0.005082 0.02306 / + 261.31 0.00016781 0.004561 0.02844 + 0.00008391 0.004571 0.02672 + 0.00000000 0.004584 0.02515 / + 288.87 0.00024205 0.004255 0.03272 + 0.00012103 0.004243 0.02976 + 0.00000000 0.004241 0.02711 / + 314.34 0.00033405 0.004062 0.03783 + 0.00016703 0.004017 0.03311 + 0.00000000 0.003990 0.02893 / + 338.20 0.00044866 0.003953 0.04410 + 0.00022433 0.003860 0.03693 + 0.00000000 0.003797 0.03065 / + 360.83 0.00059341 0.003915 0.05210 + 0.00029670 0.003756 0.04150 + 0.00000000 0.003644 0.03227 / + 382.58 0.00077814 0.003947 0.06273 + 0.00038907 0.003698 0.04725 + 0.00000000 0.003518 0.03382 / + 403.60 0.00100943 0.004048 0.07723 + 0.00050471 0.003683 0.05472 + 0.00000000 0.003413 0.03529 / + 423.77 0.00127517 0.004207 0.09631 + 0.00063758 0.003705 0.06418 + 0.00000000 0.003325 0.03664 / +450.00 0.00127517 0.004207 0.09631 + 0.00063758 0.003705 0.06418 + 0.00000000 0.003325 0.03664 / +/ + + + +PVTO + 19.6 20.00 1.12324 0.96519 + 55.00 1.11698 1.03237 + 90.00 1.11127 1.10051 + 125.00 1.10602 1.16942 + 160.00 1.10119 1.23890 + 195.00 1.09672 1.30876 + 230.00 1.09256 1.37884 + 265.00 1.08868 1.44899 + 300.00 1.08504 1.51908 + 335.00 1.08164 1.58903 + 370.00 1.07843 1.65876 / + + 31.5 40.00 1.15981 0.85738 + 75.00 1.15288 0.91402 + 110.00 1.14657 0.97137 + 145.00 1.14079 1.02927 + 180.00 1.13546 1.08759 + 215.00 1.13053 1.14617 + 250.00 1.12595 1.20488 + 285.00 1.12168 1.26360 + 320.00 1.11768 1.32224 + 355.00 1.11394 1.38073 + 390.00 1.11042 1.43898 / + + 42.4 60.00 1.191 0.7868 + 95.00 1.184 0.8364 + 130.00 1.177 0.8866 + 165.00 1.171 0.9371 + 200.00 1.165 0.9880 + 235.00 1.160 1.0390 + 270.00 1.155 1.0902 + 305.00 1.150 1.1413 + 340.00 1.146 1.1922 + 375.00 1.142 1.2431 + 410.00 1.138 1.2936 / + 53.4 80.00 1.222 0.7175 + 115.00 1.214 0.7608 + 150.00 1.206 0.8045 + 185.00 1.200 0.8485 + 220.00 1.194 0.8928 + 255.00 1.188 0.9371 + 290.00 1.183 0.9815 + 325.00 1.178 1.0258 + 360.00 1.173 1.0700 + 395.00 1.169 1.1141 + 430.00 1.165 1.1579 / + 64.6 100.00 1.252 0.6544 + 135.00 1.244 0.6923 + 170.00 1.236 0.7305 + 205.00 1.229 0.7689 + 240.00 1.222 0.8075 + 275.00 1.216 0.8461 + 310.00 1.211 0.8847 + 345.00 1.205 0.9233 + 380.00 1.200 0.9618 + 415.00 1.196 1.0000 + 450.00 1.191 1.0381 / + 76.3 120.00 1.284 0.5978 + 155.00 1.275 0.6312 + 190.00 1.266 0.6648 + 225.00 1.259 0.6985 + 260.00 1.252 0.7323 + 295.00 1.245 0.7661 + 330.00 1.239 0.7999 + 365.00 1.234 0.8337 + 400.00 1.229 0.8673 + 435.00 1.224 0.9007 + 470.00 1.219 0.9340 / + 88.5 140.00 1.316 0.5477 + 175.00 1.307 0.5749 + 210.00 1.298 0.6020 + 245.00 1.290 0.6290 + 280.00 1.282 0.6559 + 315.00 1.276 0.6827 + 350.00 1.269 0.7095 + 385.00 1.263 0.7362 + 420.00 1.258 0.7629 + 455.00 1.253 0.7895 + 490.00 1.248 0.8161 / + 101.3 160.00 1.350 0.5020 + 195.00 1.340 0.5227 + 230.00 1.331 0.5432 + 265.00 1.322 0.5635 + 300.00 1.314 0.5835 + 335.00 1.307 0.6034 + 370.00 1.300 0.6231 + 405.00 1.294 0.6426 + 440.00 1.288 0.6620 + 475.00 1.283 0.6813 / + 114.7 180.00 1.385 0.4636 + 215.00 1.375 0.4820 + 250.00 1.365 0.5003 + 285.00 1.356 0.5183 + 320.00 1.347 0.5362 + 355.00 1.340 0.5538 + 390.00 1.333 0.5712 + 425.00 1.326 0.5885 + 460.00 1.320 0.6055 + 495.00 1.314 0.6222 / + 128.9 200.00 1.422 0.4290 + 235.00 1.411 0.4455 + 270.00 1.401 0.4618 + 305.00 1.391 0.4779 + 340.00 1.382 0.4938 + 375.00 1.374 0.5096 + 410.00 1.367 0.5252 + 445.00 1.360 0.5406 + 480.00 1.353 0.5558 / + 143.8 220.00 1.461 0.3977 + 255.00 1.449 0.4125 + 290.00 1.438 0.4271 + 325.00 1.428 0.4415 + 360.00 1.419 0.4558 + 395.00 1.410 0.4699 + 430.00 1.402 0.4839 + 465.00 1.395 0.4977 / + 159.5 240.00 1.502 0.3692 + 275.00 1.489 0.3825 + 310.00 1.478 0.3956 + 345.00 1.467 0.4086 + 380.00 1.458 0.4214 + 415.00 1.449 0.4341 + 450.00 1.440 0.4466 + 485.00 1.432 0.4590 / + 184.0 268.79 1.565 0.3324 + 303.79 1.551 0.3438 + 338.79 1.539 0.3551 + 373.79 1.528 0.3663 + 408.79 1.517 0.3774 + 443.79 1.508 0.3883 + 478.79 1.499 0.3991 / + 226.3 306.18 1.679 0.2855 + 341.18 1.664 0.2949 + 376.18 1.650 0.3041 + 411.18 1.637 0.3132 + 446.18 1.625 0.3222 + 481.18 1.614 0.3311 / + 268.6 339.93 1.792 0.2517 + 374.93 1.775 0.2597 + 409.93 1.760 0.2675 + 444.93 1.746 0.2751 + 479.93 1.732 0.2827 / + 310.9 371.44 1.903 0.2265 + 406.44 1.885 0.2333 + 441.44 1.868 0.2401 + 476.44 1.853 0.2468 / + 353.3 401.66 2.013 0.2071 + 436.66 1.993 0.2132 + 471.66 1.975 0.2192 / +/ +PVTW + 344.83 1.0292 4.002E-05 0.36000 0.00E+00 / + +ROCK + 383.0 4.12E-05 / + + +DENSITY + 842.3 1001.1 0.900 / + + +-- <-> PROPS Section + +-- <+> REGIONS Section + +REGIONS + +-- <-> REGIONS Section + +-- <+> SOLUTION Section + +SOLUTION + +EQUIL + 4000 400.0 5000.0 0.0 500 0.0 1 1 / + +RVVD + 2000 0.0 + 4000 0.0 / + +RSVD + 1500 184.0 + 4000 184.0 / + +--RPTSOL +-- RESTART=2 FIP=3/ + +--RPTSOL +-- RESTART=2 / + +-- <-> SOLUTION Section + +-- <+> SUMMARY Section + +-- +-- ************************************************************************************** +-- In this section simulation output data to be written to summary file are defined +-- ************************************************************************************** + +SUMMARY + +-- *************************************************** + + +-- --------------------------------------------------- +-- Summary data to be written to summary file +-- +-- Outputs the date to the summary file +DATE + +INCLUDE +'../include/summary/example_summary.txt' / + + +--ALL + +RPTONLY + +-- <-> SUMMARY Section + +-- <+> SCHEDULE Section + +SCHEDULE + +INCLUDE + '../include/schedule/events.sch' / + +INCLUDE + '../include/schedule/schedule.sch' / +-- END OF DECK diff --git a/examples/egg/eclipse/include/EGG_FLOW.DATA b/examples/egg/eclipse/include/EGG_FLOW.DATA new file mode 100644 index 00000000000..6f474bcb5a4 --- /dev/null +++ b/examples/egg/eclipse/include/EGG_FLOW.DATA @@ -0,0 +1,487 @@ +-- <+> Start of deck ECL + +-- <+> RUNSPEC Section + +RUNSPEC + +TITLE +EGG_WFL + +DIMENS + 60 60 7 / + +METRIC + +OIL +GAS +WATER +DISGAS +VAPOIL + +NUMRES + 1 / + +ENDSCALE + 'NODIR' 'REVERS' 1 20 / + + +TABDIMS + 2* 24 2* 20 20 1* 1 7* / +EQLDIMS + 2* 100 2* / +REGDIMS + 6* / +WELLDIMS + 12 100 4 12 / +VFPPDIMS + 6* / +VFPIDIMS + 3* / +AQUDIMS + 2* 1 3* / + + +START +31 'DEC' 1999 / + +-- <-> RUNSPEC Section + +-- <+> GRID Section +-- Input and output files format +UNIFIN +UNIFOUT + + +GRID + +INIT + +SPECGRID + 60 60 7 1 F / + +INCLUDE + '../include/grid/active.inc' / + +DX + 25200*8 / + + +DY + 25200*8 / + + +DZ + 25200*4 / + +TOPS + 3600*4000 3600*4004 3600*4008 3600*4012 3600*4016 3600*4020 3600*4024/ + +INCLUDE + '../include/grid/PERM.INC' / + +COPY +PERMX PERMY / + +COPY +PERMX PERMZ / + +MULTIPLY +PERMZ 0.1 / + +NTG + 25200*1 / + +PORO + 25200*0.2 / + + +INIT + +-- <-> GRID Section + + +-- <+> PROPS Section + +EDIT + +PROPS + +EQUALS + SWL 0.05 / Connate water saturation + SWU 1.0 / Maximum water saturation + SGCR 0.05 / Critical gas saturation + SOWCR 0.1 / Residual oil saturation after water-flood + SOGCR 0.05 / Residual oil sat. after gas-flood +/ + +COPY + SWL SWCR / + SWL SGU / +/ + +MULTIPLY + SGU -1 / +/ +ADD + SGU 1 / +/ + +SWFN + 0.000000 0.000000 0.000000 + 0.006819 0.003554 0.000000 + 0.027091 0.013908 0.000000 + 0.060263 0.025952 0.000000 + 0.105430 0.044108 0.000000 + 0.161359 0.068765 0.000000 + 0.226526 0.101539 0.000000 + 0.299152 0.145360 0.000000 + 0.377257 0.193942 0.000000 + 0.458710 0.244954 0.000000 + 0.541290 0.308844 0.000000 + 0.622743 0.394668 0.000000 + 0.700848 0.491067 0.000000 + 0.773474 0.593135 0.000000 + 0.838641 0.699496 0.000000 + 0.894570 0.800074 0.000000 + 0.939737 0.888146 0.000000 + 0.972909 0.949655 0.000000 + 0.993181 0.987216 0.000000 + 1.000000 1.000000 0.000000 +/ +SOF3 + 0.000000 0.000000 0.000000 + 0.006819 0.000686 0.002515 + 0.027091 0.002746 0.013164 + 0.060263 0.006794 0.034361 + 0.105430 0.014497 0.067229 + 0.161359 0.026915 0.112035 + 0.226526 0.045924 0.168322 + 0.299152 0.073425 0.235001 + 0.377257 0.111978 0.310431 + 0.458710 0.166662 0.392506 + 0.541290 0.228933 0.478758 + 0.622743 0.297987 0.566462 + 0.700848 0.383686 0.652753 + 0.773474 0.495582 0.734742 + 0.838641 0.617999 0.809639 + 0.894570 0.732288 0.874857 + 0.939737 0.839305 0.928127 + 0.972909 0.926725 0.967580 + 0.993181 0.980640 0.991823 + 1.000000 1.000000 1.000 +/ +SGFN + 0.0 0.0 0.000 + 0.006819 0.000563 0.000 + 0.027091 0.004459 0.000 + 0.060263 0.014794 0.000 + 0.105430 0.034233 0.000 + 0.161359 0.064817 0.000 + 0.226526 0.107814 0.000 + 0.299152 0.163621 0.000 + 0.377257 0.231716 0.000 + 0.458710 0.310676 0.000 + 0.541290 0.398240 0.000 + 0.622743 0.491432 0.000 + 0.700848 0.586727 0.000 + 0.773474 0.680250 0.000 + 0.838641 0.768005 0.000 + 0.894570 0.846100 0.000 + 0.939737 0.910981 0.000 + 0.972909 0.959640 0.000 + 0.993181 0.989789 0.000 + 1.0 1.000000 0.000 +/ +PVTG + 20.00 0.00002448 0.061895 0.01299 + 0.00001224 0.061810 0.01300 + 0.00000000 0.061725 0.01300 / + 40.00 0.00000628 0.030252 0.01383 + 0.00000314 0.030249 0.01383 + 0.00000000 0.030245 0.01383 / + 60.00 0.00000585 0.019844 0.01450 + 0.00000292 0.019845 0.01450 + 0.00000000 0.019846 0.01449 / + 80.00 0.00000728 0.014686 0.01520 + 0.00000364 0.014689 0.01519 + 0.00000000 0.014692 0.01518 / + 100.00 0.00001017 0.011627 0.01596 + 0.00000509 0.011633 0.01595 + 0.00000000 0.011638 0.01593 / + 120.00 0.00001485 0.009619 0.01682 + 0.00000743 0.009627 0.01679 + 0.00000000 0.009635 0.01676 / + 140.00 0.00002182 0.008213 0.01780 + 0.00001091 0.008224 0.01774 + 0.00000000 0.008235 0.01767 / + 160.00 0.00003155 0.007184 0.01890 + 0.00001577 0.007198 0.01878 + 0.00000000 0.007212 0.01866 / + 197.66 0.00006327 0.005820 0.02160 + 0.00003164 0.005840 0.02122 + 0.00000000 0.005860 0.02086 / + 231.13 0.00010861 0.005042 0.02477 + 0.00005431 0.005061 0.02389 + 0.00000000 0.005082 0.02306 / + 261.31 0.00016781 0.004561 0.02844 + 0.00008391 0.004571 0.02672 + 0.00000000 0.004584 0.02515 / + 288.87 0.00024205 0.004255 0.03272 + 0.00012103 0.004243 0.02976 + 0.00000000 0.004241 0.02711 / + 314.34 0.00033405 0.004062 0.03783 + 0.00016703 0.004017 0.03311 + 0.00000000 0.003990 0.02893 / + 338.20 0.00044866 0.003953 0.04410 + 0.00022433 0.003860 0.03693 + 0.00000000 0.003797 0.03065 / + 360.83 0.00059341 0.003915 0.05210 + 0.00029670 0.003756 0.04150 + 0.00000000 0.003644 0.03227 / + 382.58 0.00077814 0.003947 0.06273 + 0.00038907 0.003698 0.04725 + 0.00000000 0.003518 0.03382 / + 403.60 0.00100943 0.004048 0.07723 + 0.00050471 0.003683 0.05472 + 0.00000000 0.003413 0.03529 / + 423.77 0.00127517 0.004207 0.09631 + 0.00063758 0.003705 0.06418 + 0.00000000 0.003325 0.03664 / +450.00 0.00127517 0.004207 0.09631 + 0.00063758 0.003705 0.06418 + 0.00000000 0.003325 0.03664 / +/ + + + +PVTO + 19.6 20.00 1.12324 0.96519 + 55.00 1.11698 1.03237 + 90.00 1.11127 1.10051 + 125.00 1.10602 1.16942 + 160.00 1.10119 1.23890 + 195.00 1.09672 1.30876 + 230.00 1.09256 1.37884 + 265.00 1.08868 1.44899 + 300.00 1.08504 1.51908 + 335.00 1.08164 1.58903 + 370.00 1.07843 1.65876 / + + 31.5 40.00 1.15981 0.85738 + 75.00 1.15288 0.91402 + 110.00 1.14657 0.97137 + 145.00 1.14079 1.02927 + 180.00 1.13546 1.08759 + 215.00 1.13053 1.14617 + 250.00 1.12595 1.20488 + 285.00 1.12168 1.26360 + 320.00 1.11768 1.32224 + 355.00 1.11394 1.38073 + 390.00 1.11042 1.43898 / + + 42.4 60.00 1.191 0.7868 + 95.00 1.184 0.8364 + 130.00 1.177 0.8866 + 165.00 1.171 0.9371 + 200.00 1.165 0.9880 + 235.00 1.160 1.0390 + 270.00 1.155 1.0902 + 305.00 1.150 1.1413 + 340.00 1.146 1.1922 + 375.00 1.142 1.2431 + 410.00 1.138 1.2936 / + 53.4 80.00 1.222 0.7175 + 115.00 1.214 0.7608 + 150.00 1.206 0.8045 + 185.00 1.200 0.8485 + 220.00 1.194 0.8928 + 255.00 1.188 0.9371 + 290.00 1.183 0.9815 + 325.00 1.178 1.0258 + 360.00 1.173 1.0700 + 395.00 1.169 1.1141 + 430.00 1.165 1.1579 / + 64.6 100.00 1.252 0.6544 + 135.00 1.244 0.6923 + 170.00 1.236 0.7305 + 205.00 1.229 0.7689 + 240.00 1.222 0.8075 + 275.00 1.216 0.8461 + 310.00 1.211 0.8847 + 345.00 1.205 0.9233 + 380.00 1.200 0.9618 + 415.00 1.196 1.0000 + 450.00 1.191 1.0381 / + 76.3 120.00 1.284 0.5978 + 155.00 1.275 0.6312 + 190.00 1.266 0.6648 + 225.00 1.259 0.6985 + 260.00 1.252 0.7323 + 295.00 1.245 0.7661 + 330.00 1.239 0.7999 + 365.00 1.234 0.8337 + 400.00 1.229 0.8673 + 435.00 1.224 0.9007 + 470.00 1.219 0.9340 / + 88.5 140.00 1.316 0.5477 + 175.00 1.307 0.5749 + 210.00 1.298 0.6020 + 245.00 1.290 0.6290 + 280.00 1.282 0.6559 + 315.00 1.276 0.6827 + 350.00 1.269 0.7095 + 385.00 1.263 0.7362 + 420.00 1.258 0.7629 + 455.00 1.253 0.7895 + 490.00 1.248 0.8161 / + 101.3 160.00 1.350 0.5020 + 195.00 1.340 0.5227 + 230.00 1.331 0.5432 + 265.00 1.322 0.5635 + 300.00 1.314 0.5835 + 335.00 1.307 0.6034 + 370.00 1.300 0.6231 + 405.00 1.294 0.6426 + 440.00 1.288 0.6620 + 475.00 1.283 0.6813 / + 114.7 180.00 1.385 0.4636 + 215.00 1.375 0.4820 + 250.00 1.365 0.5003 + 285.00 1.356 0.5183 + 320.00 1.347 0.5362 + 355.00 1.340 0.5538 + 390.00 1.333 0.5712 + 425.00 1.326 0.5885 + 460.00 1.320 0.6055 + 495.00 1.314 0.6222 / + 128.9 200.00 1.422 0.4290 + 235.00 1.411 0.4455 + 270.00 1.401 0.4618 + 305.00 1.391 0.4779 + 340.00 1.382 0.4938 + 375.00 1.374 0.5096 + 410.00 1.367 0.5252 + 445.00 1.360 0.5406 + 480.00 1.353 0.5558 / + 143.8 220.00 1.461 0.3977 + 255.00 1.449 0.4125 + 290.00 1.438 0.4271 + 325.00 1.428 0.4415 + 360.00 1.419 0.4558 + 395.00 1.410 0.4699 + 430.00 1.402 0.4839 + 465.00 1.395 0.4977 / + 159.5 240.00 1.502 0.3692 + 275.00 1.489 0.3825 + 310.00 1.478 0.3956 + 345.00 1.467 0.4086 + 380.00 1.458 0.4214 + 415.00 1.449 0.4341 + 450.00 1.440 0.4466 + 485.00 1.432 0.4590 / + 184.0 268.79 1.565 0.3324 + 303.79 1.551 0.3438 + 338.79 1.539 0.3551 + 373.79 1.528 0.3663 + 408.79 1.517 0.3774 + 443.79 1.508 0.3883 + 478.79 1.499 0.3991 / + 226.3 306.18 1.679 0.2855 + 341.18 1.664 0.2949 + 376.18 1.650 0.3041 + 411.18 1.637 0.3132 + 446.18 1.625 0.3222 + 481.18 1.614 0.3311 / + 268.6 339.93 1.792 0.2517 + 374.93 1.775 0.2597 + 409.93 1.760 0.2675 + 444.93 1.746 0.2751 + 479.93 1.732 0.2827 / + 310.9 371.44 1.903 0.2265 + 406.44 1.885 0.2333 + 441.44 1.868 0.2401 + 476.44 1.853 0.2468 / + 353.3 401.66 2.013 0.2071 + 436.66 1.993 0.2132 + 471.66 1.975 0.2192 / +/ +PVTW + 344.83 1.0292 4.002E-05 0.36000 0.00E+00 / + +ROCK + 383.0 4.12E-05 / + + +DENSITY + 842.3 1001.1 0.900 / + + +-- <-> PROPS Section + +-- <+> REGIONS Section + +REGIONS + +-- <-> REGIONS Section + +-- <+> SOLUTION Section + +SOLUTION + +EQUIL + 4000 400.0 5000.0 0.0 500 0.0 1 1 / + +RVVD + 2000 0.0 + 4000 0.0 / + +RSVD + 1500 184.0 + 4000 184.0 / + +--RPTSOL +-- RESTART=2 FIP=3/ + +--RPTSOL +-- RESTART=2 / + +-- <-> SOLUTION Section + +-- <+> SUMMARY Section + +-- +-- ************************************************************************************** +-- In this section simulation output data to be written to summary file are defined +-- ************************************************************************************** + +SUMMARY + +-- *************************************************** + + +-- --------------------------------------------------- +-- Summary data to be written to summary file +-- +-- Outputs the date to the summary file +DATE + +INCLUDE +'../include/summary/example_summary.txt' / + + +--ALL + +RPTONLY + +-- <-> SUMMARY Section + +-- <+> SCHEDULE Section + +SCHEDULE + +INCLUDE + '../include/schedule/events.sch' / + +INCLUDE + '../include/schedule/schedule.sch' / +-- END OF DECK diff --git a/examples/egg/eclipse/include/grid/PERM.INC b/examples/egg/eclipse/include/grid/PERM.INC new file mode 100755 index 00000000000..fcb15cf3eb3 --- /dev/null +++ b/examples/egg/eclipse/include/grid/PERM.INC @@ -0,0 +1,3603 @@ +PERMX + 3.6620e+02 5.3140e+02 1.1437e+03 1.7951e+03 1.5245e+03 8.1670e+02 2.5970e+02 + 2.9860e+02 7.9780e+02 2.2834e+03 2.0910e+03 8.4870e+02 9.2020e+02 9.0860e+02 + 1.1648e+03 6.0810e+02 5.0170e+02 2.5300e+02 7.0640e+02 9.4220e+02 2.6474e+03 + 1.7103e+03 1.0985e+03 9.1740e+02 8.8270e+02 6.5260e+02 1.9025e+03 1.6445e+03 + 1.5170e+03 4.9260e+02 1.3461e+03 8.4710e+02 3.7510e+02 5.5620e+02 8.3690e+02 + 5.2740e+02 8.2220e+02 1.3889e+03 2.0340e+03 2.1878e+03 2.9273e+03 1.5637e+03 + 4.2680e+02 2.5750e+02 5.0600e+02 1.5530e+02 2.3540e+02 2.9890e+02 3.8760e+02 + 3.6140e+02 4.6870e+02 5.8210e+02 9.5540e+02 3.8860e+02 3.4400e+02 7.8040e+02 + 1.0596e+03 1.5559e+03 7.6340e+02 7.2110e+02 6.8710e+02 5.4930e+02 2.1699e+03 + 1.6536e+03 9.2580e+02 3.8260e+02 3.0980e+02 2.5690e+02 1.0563e+03 8.6860e+02 + 2.2711e+03 1.3934e+03 5.2850e+02 6.0050e+02 5.6380e+02 4.9550e+02 6.5700e+02 + 3.4190e+02 5.4230e+02 3.5580e+02 1.6736e+03 2.0471e+03 7.7810e+02 1.1123e+03 + 4.1060e+02 3.4030e+02 5.0960e+02 2.3792e+03 2.0770e+03 1.4109e+03 7.6760e+02 + 7.2580e+02 3.2600e+02 6.4810e+02 7.9300e+02 7.3810e+02 7.2870e+02 8.3950e+02 + 7.9060e+02 2*3.5000e+03 1.8240e+03 9.5060e+02 3.5050e+02 4.8290e+02 + 3.0170e+02 1.8720e+02 4.4170e+02 3.4300e+02 1.6590e+02 2.3610e+02 7.2910e+02 + 1.1118e+03 5.6040e+02 6.2940e+02 9.4240e+02 8.3970e+02 9.0780e+02 6.5970e+02 + 3.6960e+02 6.6350e+02 9.4660e+02 2.2505e+03 8.4180e+02 1.0213e+03 4.7550e+02 + 3.0320e+02 3.1460e+02 1.1718e+03 2.6677e+03 1.9880e+03 1.5268e+03 3.0480e+02 + 4.8050e+02 4.2220e+02 3.2310e+02 3.9760e+02 5.6520e+02 3.1710e+02 5.1800e+02 + 7.3180e+02 2.7547e+03 1.7298e+03 1.0286e+03 5.6060e+02 5.1880e+02 9.6370e+02 + 6.6420e+02 1.6024e+03 8.6690e+02 1.3608e+03 4.8740e+02 5.5030e+02 5.6170e+02 + 4.6930e+02 3.6200e+02 4.2170e+02 6.9960e+02 1.4178e+03 3.2765e+03 2.2965e+03 + 3.0535e+03 1.3697e+03 1.5601e+03 8.6040e+02 4.8040e+02 3.7450e+02 7.4420e+02 + 5.1130e+02 5.3880e+02 4.5600e+02 6.6740e+02 8.1050e+02 7.3320e+02 3.4990e+02 + 7.2010e+02 8.4740e+02 5.7490e+02 7.9120e+02 1.0667e+03 1.3692e+03 1.6649e+03 + 1.8214e+03 8.6890e+02 6.5200e+02 6.7520e+02 3.4520e+02 8.8560e+02 8.5080e+02 + 2.5100e+03 1.2070e+03 7.3370e+02 3.0720e+02 3.8570e+02 3.5440e+02 4.0080e+02 + 4.2760e+02 7.6220e+02 5.0310e+02 2.8450e+02 1.6715e+03 2.0101e+03 9.6180e+02 + 8.4070e+02 3.2660e+02 5.6430e+02 9.5080e+02 1.5524e+03 1.3425e+03 1.5973e+03 + 1.8932e+03 3.3620e+02 6.5350e+02 1.0473e+03 8.1610e+02 3.9420e+02 2.8380e+02 + 5.8510e+02 1.0060e+03 2.1106e+03 2.2302e+03 1.9214e+03 2.4730e+03 1.5109e+03 + 8.3080e+02 5.7750e+02 2.8980e+02 5.6390e+02 6.8040e+02 5.1030e+02 5.2910e+02 + 4.0130e+02 4.9950e+02 4.8160e+02 6.3070e+02 3.5790e+02 3.7510e+02 5.1450e+02 + 1.0737e+03 1.0678e+03 9.9900e+02 9.8610e+02 1.8111e+03 1.3886e+03 6.5990e+02 + 5.0500e+02 7.7420e+02 7.5720e+02 1.2640e+03 1.6376e+03 1.7215e+03 6.6120e+02 + 4.6550e+02 4.2890e+02 5.5530e+02 3.9670e+02 2.8960e+02 4.5560e+02 6.6430e+02 + 3.8190e+02 1.5547e+03 2.0981e+03 1.8550e+03 1.1185e+03 6.5380e+02 4.5780e+02 + 9.9420e+02 1.2041e+03 1.3779e+03 1.9218e+03 2.0746e+03 9.9500e+02 8.9400e+02 + 4.5150e+02 4.3990e+02 2.7050e+02 3.3290e+02 6.4610e+02 1.1813e+03 1.5896e+03 + 2.7295e+03 1.2109e+03 2.7612e+03 1.1731e+03 1.0727e+03 3.1630e+02 6.2490e+02 + 4.0110e+02 6.1610e+02 6.6380e+02 8.5000e+02 1.0820e+02 2.7470e+02 5.1420e+02 + 1.1270e+03 3.6760e+02 2.4370e+02 6.6200e+02 1.3842e+03 1.0914e+03 9.0690e+02 + 2.1908e+03 2.2699e+03 4.7490e+02 5.0530e+02 4.6170e+02 1.1276e+03 5.0510e+02 + 1.6074e+03 2.5332e+03 1.7314e+03 4.4820e+02 3.9140e+02 4.4390e+02 1.0339e+03 + 2.2030e+02 2.2510e+02 3.6070e+02 4.7660e+02 5.1380e+02 8.9470e+02 1.7401e+03 + 1.7140e+03 1.2101e+03 5.8730e+02 5.9170e+02 6.3920e+02 4.1240e+02 1.2628e+03 + 1.0766e+03 1.6355e+03 1.5779e+03 1.0215e+03 3.6940e+02 5.4670e+02 2.6640e+02 + 4.0270e+02 3.2790e+02 1.0841e+03 1.8287e+03 2.0129e+03 2.4593e+03 2.6705e+03 + 1.8275e+03 7.9150e+02 4.0410e+02 3.1780e+02 6.6040e+02 6.8980e+02 7.7420e+02 + 3.6330e+02 1.2080e+02 5.3480e+02 4.5500e+02 1.0225e+03 2.2790e+02 3.8070e+02 + 7.9800e+02 1.4663e+03 2.1248e+03 1.9925e+03 1.8188e+03 1.3006e+03 4.8610e+02 + 3.3970e+02 4.6130e+02 3.4930e+02 3.8420e+02 1.2756e+03 1.6373e+03 1.1765e+03 + 8.6290e+02 5.2530e+02 4.1600e+02 9.6790e+02 4.7400e+02 2.5360e+02 4.1140e+02 + 4.8220e+02 9.5660e+02 1.1327e+03 9.7080e+02 1.8812e+03 9.2740e+02 5.9690e+02 + 6.2630e+02 5.7640e+02 6.9420e+02 7.6420e+02 1.4738e+03 1.9411e+03 1.7880e+03 + 9.5160e+02 7.9650e+02 5.4060e+02 6.1690e+02 1.3050e+02 3.9770e+02 1.5765e+03 + 1.5046e+03 1.9130e+03 2.0085e+03 1.8262e+03 1.6717e+03 5.4980e+02 2.2980e+02 + 4.7130e+02 4.9130e+02 8.6350e+02 1.1506e+03 3.8720e+02 3.9900e+02 5.0060e+02 + 3.7230e+02 7.1370e+02 3.4270e+02 3.4460e+02 7.1000e+02 1.4356e+03 1.6930e+03 + 2.6501e+03 1.8994e+03 1.5406e+03 1.7180e+02 4.1210e+02 8.4560e+02 6.2450e+02 + 6.0610e+02 1.3808e+03 2.4656e+03 1.5318e+03 8.4710e+02 7.9650e+02 7.9660e+02 + 5.6430e+02 1.4830e+02 3.3780e+02 4.9160e+02 2.7490e+02 2.4370e+02 9.2600e+02 + 1.8909e+03 2.2836e+03 9.4160e+02 7.8950e+02 5.4080e+02 3.6690e+02 3.8210e+02 + 5.8310e+02 1.1066e+03 1.7207e+03 1.6423e+03 8.4670e+02 1.0417e+03 7.9070e+02 + 3.0050e+02 3.3070e+02 4.6370e+02 1.6845e+03 1.8811e+03 1.5316e+03 1.7620e+03 + 1.5233e+03 1.3308e+03 5.8710e+02 4.0830e+02 4.5830e+02 8.9910e+02 1.0326e+03 + 3.8650e+02 3.6570e+02 2.0890e+02 3.0180e+02 5.5130e+02 1.2750e+02 2.6560e+02 + 6.4940e+02 5.0890e+02 1.7016e+03 2.4461e+03 2.1424e+03 2.4385e+03 9.0860e+02 + 2.1420e+02 2.7570e+02 6.6910e+02 4.3090e+02 3.3650e+02 8.9510e+02 2.4526e+03 + 1.5096e+03 6.7860e+02 6.6590e+02 6.0750e+02 6.4710e+02 2.7710e+02 4.7540e+02 + 3.4100e+02 2.7090e+02 2.7550e+02 7.6580e+02 1.3723e+03 2.0940e+03 1.1671e+03 + 7.4610e+02 4.7540e+02 5.3800e+02 3.4820e+02 5.2650e+02 6.4890e+02 8.2230e+02 + 1.4934e+03 1.8228e+03 1.2756e+03 1.1135e+03 3.2380e+02 2.0320e+02 6.7040e+02 + 1.5171e+03 1.8864e+03 1.5094e+03 1.5077e+03 1.1608e+03 7.7030e+02 9.0940e+02 + 3.1020e+02 4.8850e+02 8.1230e+02 5.4930e+02 3.1630e+02 3.6420e+02 4.8590e+02 + 6.6760e+02 3.1750e+02 1.9580e+02 1.9960e+02 3.0510e+02 1.0854e+03 1.3889e+03 + 2.2718e+03 2.1062e+03 1.8900e+03 8.2600e+02 5.2700e+02 5.0850e+02 6.8910e+02 + 6.5690e+02 4.3930e+02 1.2933e+03 1.8753e+03 7.1460e+02 6.9070e+02 6.5930e+02 + 5.8640e+02 4.5800e+02 5.9140e+02 4.4890e+02 4.6280e+02 2.5230e+02 2.5890e+02 + 4.8380e+02 1.5654e+03 1.8485e+03 1.4999e+03 3.9150e+02 5.9500e+02 5.5190e+02 + 5.6110e+02 3.4590e+02 5.1850e+02 6.1410e+02 1.0238e+03 1.8124e+03 1.7628e+03 + 1.6298e+03 1.0186e+03 5.4690e+02 6.2980e+02 1.8382e+03 1.5917e+03 1.5066e+03 + 1.7530e+03 1.9830e+03 1.4298e+03 5.6240e+02 2.9820e+02 2.6360e+02 6.2090e+02 + 4.2160e+02 1.7350e+02 2.5100e+02 3.3830e+02 5.1010e+02 1.3547e+03 6.2450e+02 + 4.4220e+02 3.7050e+02 6.9870e+02 1.4302e+03 2.4603e+03 1.1473e+03 2.2715e+03 + 9.8700e+02 6.5570e+02 6.6810e+02 1.0383e+03 5.5310e+02 2.8090e+02 8.8600e+02 + 1.5212e+03 1.2141e+03 3.7120e+02 5.6140e+02 5.1140e+02 6.4300e+02 7.7810e+02 + 2.5480e+02 5.3240e+02 3.6810e+02 4.6820e+02 6.2340e+02 9.8880e+02 2.8595e+03 + 1.1694e+03 4.8070e+02 2.1790e+02 7.2210e+02 8.7030e+02 8.9020e+02 3.3330e+02 + 4.1220e+02 5.3810e+02 1.3123e+03 2.8459e+03 1.5398e+03 5.8390e+02 8.6700e+02 + 8.3280e+02 2.6927e+03 1.5163e+03 6.3960e+02 1.4527e+03 1.8848e+03 1.4013e+03 + 8.7690e+02 3.3090e+02 3.3450e+02 4.3480e+02 5.0490e+02 3.3360e+02 2.0190e+02 + 5.9200e+02 6.1760e+02 5.6810e+02 2.5940e+02 5.8230e+02 8.6900e+02 1.0958e+03 + 1.1092e+03 1.8425e+03 1.5320e+03 2.0588e+03 1.5398e+03 4.5910e+02 7.2300e+02 + 1.4205e+03 5.1270e+02 2.8600e+02 6.0380e+02 7.3270e+02 1.9211e+03 9.0570e+02 + 4.5300e+02 5.5460e+02 4.5780e+02 4.9940e+02 3.3210e+02 6.7750e+02 4.6820e+02 + 6.5720e+02 6.9740e+02 9.8180e+02 2.6631e+03 1.8623e+03 7.4140e+02 2.1340e+02 + 3.1150e+02 7.9590e+02 7.4090e+02 2.0100e+02 3.3320e+02 4.5420e+02 9.0380e+02 + 2.7337e+03 1.9003e+03 5.6750e+02 1.0338e+03 1.6462e+03 2.0256e+03 5.9000e+02 + 1.3790e+03 2.3686e+03 1.7874e+03 7.7060e+02 7.6700e+02 4.4190e+02 1.6120e+02 + 2.6360e+02 8.6960e+02 4.4070e+02 4.7430e+02 2.1400e+02 6.4740e+02 6.4330e+02 + 3.0790e+02 5.6330e+02 6.0500e+02 1.0884e+03 1.9462e+03 1.5988e+03 1.1834e+03 + 2.8455e+03 6.0480e+02 1.1393e+03 5.8270e+02 6.9550e+02 4.4020e+02 4.2770e+02 + 4.7120e+02 1.0845e+03 2.0344e+03 1.0444e+03 7.8370e+02 4.8240e+02 3.3630e+02 + 4.3090e+02 4.0370e+02 3.7730e+02 6.0220e+02 8.5680e+02 7.9920e+02 8.7190e+02 + 1.8543e+03 4.4650e+02 3.6900e+02 1.5210e+02 8.8640e+02 6.5980e+02 8.9620e+02 + 5.4780e+02 5.4560e+02 2.0020e+02 4.7550e+02 1.5343e+03 1.3272e+03 1.9178e+03 + 6.4630e+02 1.6024e+03 1.5498e+03 8.1640e+02 1.3044e+03 2.3768e+03 2.0707e+03 + 1.4783e+03 5.0350e+02 5.7340e+02 2.9800e+02 3.2580e+02 4.8440e+02 7.1660e+02 + 8.3750e+02 3.1330e+02 5.9390e+02 4.3420e+02 2.7660e+02 2.4030e+02 5.4480e+02 + 7.9660e+02 2.1210e+03 1.1984e+03 1.7163e+03 2.9941e+03 1.3686e+03 1.1111e+03 + 1.0454e+03 3.9780e+02 2.3390e+02 4.0240e+02 6.4270e+02 1.1138e+03 2.4318e+03 + 1.5910e+03 3.7910e+02 3.8960e+02 4.0280e+02 4.8180e+02 5.4480e+02 6.7400e+02 + 2.6090e+02 8.4620e+02 7.1880e+02 1.3026e+03 2.7504e+03 1.5300e+03 3.6860e+02 + 2.0120e+02 6.3500e+02 7.3600e+02 8.1890e+02 5.1990e+02 3.7530e+02 2.4840e+02 + 3.1860e+02 1.3146e+03 2.1921e+03 1.7108e+03 1.2199e+03 1.7491e+03 8.6130e+02 + 1.1924e+03 1.3596e+03 1.2613e+03 1.6720e+03 9.7290e+02 6.2440e+02 3.5980e+02 + 3.0250e+02 2.7310e+02 4.9260e+02 5.2770e+02 5.8450e+02 4.4170e+02 4.9280e+02 + 7.1340e+02 2.2500e+02 1.5890e+02 9.5050e+02 1.4497e+03 1.8720e+03 1.6068e+03 + 1.4449e+03 2.1056e+03 9.4890e+02 8.9830e+02 8.5110e+02 5.0920e+02 5.3430e+02 + 9.5570e+02 5.9420e+02 1.0416e+03 2.7169e+03 2.5006e+03 8.1110e+02 4.7130e+02 + 6.6420e+02 4.5130e+02 7.0200e+02 5.1020e+02 7.4280e+02 8.4270e+02 5.3680e+02 + 1.8666e+03 2.7093e+03 1.0673e+03 6.8630e+02 2.2510e+02 5.2030e+02 5.3330e+02 + 9.0860e+02 5.7540e+02 2.6870e+02 4.4490e+02 3.6130e+02 8.2850e+02 1.1546e+03 + 3.0258e+03 1.6927e+03 1.4084e+03 1.5249e+03 7.7430e+02 1.6156e+03 2.2090e+03 + 2.1138e+03 3.1780e+02 6.0790e+02 4.9850e+02 4.3110e+02 3.8760e+02 4.4600e+02 + 3.4020e+02 4.0110e+02 6.0920e+02 9.7790e+02 6.5070e+02 5.0930e+02 4.4170e+02 + 6.1920e+02 1.1381e+03 1.6551e+03 1.6988e+03 1.1063e+03 2.5403e+03 1.1618e+03 + 7.0470e+02 5.2420e+02 4.4520e+02 8.0410e+02 1.3317e+03 7.5670e+02 4.9470e+02 + 1.2279e+03 2.0494e+03 1.0100e+03 5.0090e+02 3.5750e+02 4.7010e+02 4.0760e+02 + 4.9670e+02 5.0730e+02 7.0390e+02 1.1877e+03 2.2205e+03 1.9572e+03 1.3667e+03 + 4.9530e+02 2.7360e+02 7.4970e+02 3.4500e+02 4.4340e+02 3.7410e+02 6.6960e+02 + 4.3920e+02 3.3710e+02 1.5785e+03 1.9154e+03 3.3418e+03 2.0439e+03 1.7751e+03 + 1.2521e+03 6.0580e+02 1.3508e+03 2.5817e+03 1.1131e+03 4.6750e+02 4.3280e+02 + 3.7370e+02 2.9080e+02 4.3220e+02 5.3200e+02 3.3150e+02 1.9700e+02 4.0930e+02 + 1.0057e+03 1.1149e+03 3.7300e+02 2.6970e+02 7.2160e+02 1.7884e+03 2.4571e+03 + 1.9154e+03 2.1214e+03 2.9023e+03 1.7210e+03 5.1150e+02 2.6650e+02 4.5440e+02 + 5.7100e+02 6.8900e+02 5.3480e+02 1.2915e+03 9.3420e+02 2.1995e+03 2.5257e+03 + 1.1485e+03 5.2980e+02 5.4310e+02 4.7270e+02 3.8360e+02 5.2690e+02 7.3070e+02 + 1.1708e+03 1.8400e+03 1.8103e+03 9.5840e+02 5.5620e+02 4.4650e+02 3.2130e+02 + 5.6930e+02 3.3180e+02 5.6670e+02 5.1550e+02 2.4930e+02 7.5490e+02 6.5300e+02 + 2.2282e+03 2.6755e+03 3.5000e+03 1.1280e+03 7.1670e+02 4.5010e+02 1.2894e+03 + 2.4310e+03 1.2523e+03 6.3500e+02 5.4450e+02 5.5450e+02 1.0360e+02 6.6830e+02 + 3.5980e+02 6.4420e+02 2.0960e+02 2.3170e+02 7.5000e+02 6.7960e+02 6.5470e+02 + 2.9970e+02 4.2430e+02 5.3560e+02 1.6768e+03 2.3061e+03 9.6190e+02 3.3730e+03 + 9.6710e+02 3.4020e+02 2.5080e+02 4.7890e+02 4.9350e+02 7.6720e+02 3.3800e+02 + 4.9740e+02 1.0311e+03 6.6230e+02 2.6078e+03 1.0210e+03 7.1060e+02 7.1350e+02 + 2.3300e+02 5.0770e+02 2.4500e+02 7.5820e+02 7.6850e+02 2.9879e+03 1.9110e+03 + 1.5322e+03 4.6920e+02 4.0900e+02 5.2230e+02 1.3723e+03 4.8060e+02 2.9900e+02 + 4.3250e+02 3.8980e+02 2.8610e+02 9.0060e+02 1.4613e+03 3.5000e+03 2.3961e+03 + 8.5680e+02 5.2180e+02 7.8620e+02 7.3200e+02 2.0435e+03 1.7449e+03 1.1049e+03 + 4.9600e+02 2.3930e+02 2.8670e+02 5.4420e+02 4.1530e+02 9.9970e+02 1.6560e+02 + 2.3200e+02 4.8790e+02 9.4660e+02 4.1380e+02 5.0540e+02 6.3740e+02 5.4450e+02 + 1.7527e+03 1.6629e+03 1.8066e+03 2.7705e+03 1.0701e+03 2.1920e+02 4.5580e+02 + 9.4310e+02 9.7910e+02 5.3140e+02 3.6610e+02 5.6190e+02 9.1320e+02 1.5461e+03 + 1.9760e+03 2.0065e+03 1.0934e+03 9.6780e+02 2.1030e+02 1.9330e+02 2.0120e+02 + 4.9780e+02 2.1807e+03 2.0312e+03 1.4701e+03 8.8990e+02 4.1480e+02 3.0170e+02 + 5.4480e+02 7.6340e+02 6.0500e+02 6.3560e+02 2.4940e+02 3.3800e+02 4.9340e+02 + 5.8610e+02 2.2422e+03 3.3198e+03 3.3252e+03 6.3980e+02 5.0770e+02 3.7210e+02 + 1.7298e+03 1.9327e+03 3.2705e+03 9.4060e+02 6.6110e+02 3.6540e+02 1.9240e+02 + 6.8000e+02 8.6020e+02 1.0145e+03 8.2520e+02 6.2700e+02 5.1160e+02 6.0690e+02 + 6.7390e+02 7.3830e+02 4.8610e+02 2.8850e+02 9.7180e+02 8.3300e+02 6.0240e+02 + 2.9623e+03 9.9680e+02 1.5250e+02 6.8150e+02 9.7670e+02 7.1820e+02 1.6100e+02 + 1.2080e+02 3.1410e+02 7.2420e+02 1.5769e+03 1.5255e+03 1.8799e+03 8.9870e+02 + 9.4660e+02 2.8470e+02 2.0020e+02 4.3170e+02 8.1250e+02 2.5654e+03 2.0206e+03 + 1.1152e+03 8.5630e+02 7.1850e+02 5.1690e+02 3.9520e+02 6.8250e+02 4.4700e+02 + 1.0115e+03 5.0420e+02 7.0880e+02 4.4870e+02 6.9840e+02 2.2198e+03 2.8898e+03 + 3.0380e+03 6.4600e+02 2.1600e+02 4.4120e+02 1.1487e+03 1.5080e+03 2.5755e+03 + 1.4132e+03 1.3523e+03 7.1570e+02 3.9460e+02 7.3600e+02 4.2740e+02 6.3160e+02 + 2.4290e+02 7.6060e+02 5.6400e+02 3.6890e+02 6.5160e+02 9.2000e+02 3.6550e+02 + 1.0130e+02 9.6650e+02 1.9472e+03 1.0279e+03 2.0073e+03 1.8539e+03 7.1470e+02 + 6.4960e+02 1.2914e+03 7.1220e+02 2.5150e+02 2.2150e+02 4.7080e+02 3.0830e+02 + 7.5500e+02 1.5402e+03 2.0565e+03 1.4775e+03 9.2870e+02 4.5530e+02 2.0590e+02 + 4.3240e+02 1.0363e+03 2.7406e+03 1.2181e+03 9.2500e+02 3.8920e+02 7.6290e+02 + 5.5610e+02 2.7920e+02 3.9730e+02 5.8330e+02 7.1630e+02 3.7850e+02 2.7290e+02 + 5.8930e+02 7.1620e+02 2.6317e+03 3.2142e+03 1.2197e+03 1.0199e+03 2.2730e+02 + 2.8780e+02 1.0240e+03 1.0801e+03 2.5500e+03 1.0882e+03 7.8540e+02 8.7400e+02 + 4.0070e+02 6.1170e+02 1.1364e+03 5.4340e+02 5.2730e+02 5.4180e+02 5.1220e+02 + 3.6740e+02 6.4940e+02 5.4400e+02 5.2210e+02 1.0230e+02 1.0477e+03 1.9274e+03 + 1.0603e+03 1.9498e+03 2.2072e+03 8.2120e+02 3.6370e+02 1.1636e+03 7.7340e+02 + 1.7790e+02 6.3270e+02 3.8280e+02 3.7920e+02 7.0270e+02 1.1333e+03 1.5843e+03 + 2.1615e+03 1.0095e+03 8.5930e+02 4.1600e+02 1.0963e+03 1.6563e+03 1.7378e+03 + 8.9050e+02 4.4440e+02 3.6340e+02 7.1070e+02 7.2120e+02 5.2870e+02 2.2360e+02 + 3.1020e+02 8.0130e+02 3.6500e+02 2.8380e+02 4.0810e+02 1.8011e+03 3.1334e+03 + 2.7011e+03 1.5237e+03 8.1080e+02 3.0820e+02 1.6760e+02 5.1510e+02 1.1928e+03 + 1.5826e+03 1.1150e+03 1.2979e+03 1.1845e+03 7.0000e+02 1.1955e+03 6.9670e+02 + 4.1460e+02 4.7560e+02 7.6980e+02 2.7550e+02 6.9340e+02 7.9630e+02 5.3390e+02 + 5.3280e+02 6.9430e+02 9.3320e+02 1.9927e+03 4.7780e+02 2.4414e+03 2.1849e+03 + 8.4720e+02 5.5790e+02 5.5750e+02 5.4630e+02 2.6810e+02 5.4160e+02 3.9640e+02 + 3.3460e+02 4.0430e+02 9.0940e+02 1.3978e+03 1.7710e+03 1.7229e+03 9.5860e+02 + 9.5680e+02 7.3500e+02 1.5032e+03 1.5291e+03 6.9700e+02 4.9440e+02 5.2050e+02 + 4.1030e+02 7.0450e+02 4.4870e+02 6.8020e+02 5.4400e+02 9.7670e+02 1.9000e+02 + 7.1850e+02 1.2151e+03 1.5256e+03 3.5000e+03 2.9896e+03 1.1301e+03 7.0700e+02 + 4.8110e+02 3.6180e+02 4.6880e+02 1.7580e+03 1.9738e+03 1.6057e+03 1.9237e+03 + 6.7020e+02 8.2830e+02 6.5540e+02 9.1000e+02 6.5550e+02 6.7880e+02 5.8520e+02 + 7.1670e+02 3.1860e+02 4.5780e+02 4.9530e+02 5.3010e+02 6.9450e+02 7.3600e+02 + 2.1420e+03 3.7340e+02 1.8990e+03 3.5000e+03 1.1637e+03 5.4430e+02 3.6030e+02 + 3.8100e+02 4.4580e+02 5.1390e+02 3.3650e+02 3.6320e+02 4.6280e+02 1.0359e+03 + 8.2040e+02 2.7938e+03 8.1200e+02 8.3680e+02 4.6660e+02 1.7369e+03 1.8820e+03 + 7.9050e+02 8.1910e+02 5.6760e+02 6.1080e+02 8.2630e+02 5.9120e+02 3.5440e+02 + 6.0850e+02 6.8900e+02 4.1630e+02 4.3430e+02 7.4570e+02 8.2600e+02 1.7715e+03 + 2.2601e+03 2.8574e+03 1.6537e+03 5.8140e+02 4.5560e+02 6.1110e+02 3.0110e+02 + 1.2824e+03 1.2710e+03 1.3573e+03 1.6421e+03 8.9930e+02 1.1523e+03 1.5431e+03 + 6.7740e+02 9.9230e+02 8.0220e+02 7.5270e+02 6.5090e+02 4.4070e+02 4.6770e+02 + 2.7280e+02 8.7050e+02 1.1748e+03 1.4445e+03 1.5961e+03 5.1260e+02 9.8660e+02 + 3.5000e+03 1.7643e+03 5.9640e+02 5.5310e+02 2.7670e+02 2.0250e+02 3.3650e+02 + 3.4300e+02 2.6380e+02 2.4130e+02 7.7250e+02 6.9210e+02 1.5056e+03 1.8470e+03 + 1.5070e+03 2.7698e+03 1.6453e+03 2.2830e+03 9.0490e+02 4.1170e+02 4.7960e+02 + 2.5920e+02 5.5090e+02 2.0360e+02 4.0030e+02 4.2190e+02 5.2310e+02 1.7690e+02 + 2.4960e+02 6.4570e+02 1.6326e+03 2.3900e+03 2.4044e+03 3.0836e+03 8.0490e+02 + 6.6180e+02 4.7350e+02 7.9260e+02 3.4880e+02 6.7320e+02 1.2909e+03 8.0530e+02 + 1.2747e+03 1.3276e+03 2.1032e+03 2.0295e+03 1.1691e+03 1.0097e+03 9.0680e+02 + 9.8250e+02 1.1777e+03 7.4590e+02 3.0960e+02 2.7340e+02 6.4140e+02 7.1010e+02 + 1.3660e+03 2.3813e+03 3.6650e+02 8.6790e+02 2.5212e+03 2.2974e+03 1.0795e+03 + 6.6060e+02 4.7990e+02 2.5050e+02 3.3010e+02 7.5110e+02 7.4760e+02 3.1230e+02 + 3.6100e+02 4.3080e+02 7.1340e+02 1.6527e+03 3.1243e+03 2.2570e+03 1.6028e+03 + 7.1660e+02 8.2400e+02 3.2920e+02 5.6030e+02 3.2460e+02 6.7810e+02 2.6730e+02 + 4.9060e+02 7.0180e+02 3.4830e+02 2.7750e+02 3.2640e+02 5.4230e+02 1.5010e+03 + 3.1148e+03 3.5000e+03 2.0391e+03 9.2350e+02 3.4580e+02 7.6940e+02 6.3110e+02 + 3.4580e+02 4.3210e+02 7.4100e+02 5.1550e+02 1.0194e+03 6.9940e+02 1.7617e+03 + 1.6383e+03 1.0797e+03 1.4286e+03 1.2776e+03 1.1933e+03 1.5305e+03 9.2610e+02 + 7.7320e+02 3.0530e+02 6.8780e+02 6.0000e+02 9.7010e+02 2.2201e+03 2.1470e+02 + 5.0230e+02 1.4904e+03 2.0522e+03 7.8100e+02 1.0898e+03 7.9070e+02 2.1620e+02 + 3.0120e+02 7.0510e+02 9.5300e+02 4.6660e+02 4.3960e+02 7.2170e+02 9.5240e+02 + 2.3636e+03 3.5000e+03 2.1036e+03 1.5170e+03 8.1260e+02 9.3540e+02 5.4120e+02 + 4.9200e+02 5.0710e+02 4.3440e+02 5.2870e+02 5.8560e+02 5.8280e+02 3.5100e+02 + 3.6860e+02 3.7390e+02 6.4310e+02 1.3358e+03 2.0396e+03 2.9971e+03 1.6831e+03 + 4.4530e+02 4.7670e+02 1.1616e+03 3.0710e+02 2.0820e+02 3.5720e+02 7.3610e+02 + 4.7220e+02 7.7660e+02 7.5300e+02 1.6285e+03 1.5268e+03 2.0574e+03 1.0950e+03 + 1.1845e+03 8.7720e+02 1.0980e+03 9.6040e+02 6.1180e+02 6.6000e+02 4.7230e+02 + 4.9810e+02 1.8735e+03 1.9687e+03 3.0820e+02 9.5620e+02 1.5147e+03 1.3097e+03 + 2.2788e+03 9.8560e+02 1.0746e+03 2.5270e+02 3.7630e+02 7.9250e+02 5.7400e+02 + 7.6020e+02 1.0342e+03 6.1020e+02 9.7030e+02 2.1356e+03 3.5000e+03 9.6240e+02 + 1.0740e+03 5.7010e+02 8.4780e+02 4.9630e+02 3.0560e+02 6.6450e+02 1.1679e+03 + 4.6340e+02 4.8920e+02 5.7440e+02 3.0060e+02 6.9350e+02 9.6110e+02 1.5552e+03 + 2.3913e+03 2.5820e+03 3.3292e+03 1.5751e+03 4.9480e+02 8.3360e+02 9.5630e+02 + 4.8040e+02 2.4300e+02 2.1740e+02 5.5760e+02 4.9730e+02 2.4210e+02 3.7750e+02 + 1.2040e+03 9.2500e+02 7.3360e+02 7.0540e+02 1.5745e+03 1.5486e+03 6.2420e+02 + 1.5617e+03 1.5823e+03 1.8837e+03 6.8430e+02 9.7020e+02 2.1293e+03 1.9587e+03 + 3.0620e+02 6.7120e+02 1.4375e+03 1.6334e+03 1.5689e+03 1.7059e+03 9.8960e+02 + 3.7300e+02 5.0590e+02 6.5750e+02 4.5790e+02 4.6280e+02 8.2290e+02 9.0920e+02 + 1.5065e+03 2.6417e+03 3.5000e+03 1.5003e+03 4.9070e+02 6.4540e+02 6.1500e+02 + 4.2090e+02 4.9450e+02 7.9180e+02 6.6450e+02 3.8830e+02 3.6150e+02 3.2320e+02 + 2.8210e+02 5.9430e+02 8.5010e+02 9.4770e+02 2.3605e+03 1.7966e+03 2.0389e+03 + 1.1835e+03 7.4030e+02 7.2170e+02 1.0111e+03 3.6760e+02 5.1740e+02 3.2430e+02 + 5.0280e+02 7.1550e+02 1.9930e+02 1.3320e+02 5.2510e+02 9.4250e+02 1.4068e+03 + 7.9170e+02 1.1468e+03 1.8318e+03 9.7260e+02 1.3956e+03 6.2110e+02 1.5426e+03 + 8.1000e+02 8.2080e+02 9.8150e+02 1.4449e+03 4.7020e+02 9.5520e+02 6.7900e+02 + 1.3711e+03 2.0752e+03 1.1705e+03 1.5271e+03 2.3890e+02 4.3480e+02 4.8090e+02 + 1.6620e+02 3.8960e+02 1.1350e+03 1.7697e+03 1.6554e+03 1.6769e+03 2.1109e+03 + 1.6486e+03 5.0090e+02 5.6180e+02 4.5490e+02 3.0740e+02 6.4100e+02 8.7590e+02 + 7.0460e+02 3.9260e+02 5.4200e+02 3.8660e+02 2.0530e+02 6.3220e+02 1.5175e+03 + 1.5044e+03 2.2253e+03 7.7290e+02 1.9026e+03 1.3921e+03 3.9860e+02 4.7330e+02 + 3.8870e+02 5.5900e+02 4.5210e+02 7.4930e+02 8.7580e+02 8.1440e+02 5.2170e+02 + 4.6250e+02 3.0900e+02 3.6930e+02 8.2370e+02 3.9610e+02 2.5300e+02 7.9790e+02 + 8.4560e+02 9.3260e+02 1.6636e+03 1.1356e+03 2.6926e+03 1.5965e+03 2.3681e+03 + 1.4078e+03 4.9590e+02 7.4700e+02 5.8150e+02 8.9520e+02 1.5404e+03 3.0986e+03 + 7.0510e+02 4.3800e+02 4.6350e+02 8.1680e+02 5.6720e+02 3.3330e+02 7.1220e+02 + 2.3473e+03 2.5224e+03 8.6130e+02 1.8593e+03 1.5972e+03 8.5690e+02 7.9750e+02 + 2.2970e+02 5.2880e+02 4.1330e+02 4.8110e+02 6.0020e+02 4.1370e+02 5.6420e+02 + 2.7790e+02 3.3920e+02 6.7850e+02 9.1280e+02 1.3985e+03 1.9409e+03 2.2623e+03 + 2.4499e+03 4.3820e+02 5.1030e+02 5.5390e+02 5.3970e+02 2.8490e+02 4.1180e+02 + 9.5260e+02 7.4050e+02 8.9620e+02 2.9550e+02 2.1300e+02 3.2200e+02 7.0860e+02 + 4.0850e+02 5.2840e+02 2.1890e+02 8.9800e+02 4.8910e+02 1.3172e+03 1.1817e+03 + 1.9901e+03 2.8559e+03 2.8837e+03 1.6421e+03 1.5241e+03 7.0910e+02 9.2330e+02 + 6.0580e+02 3.9210e+02 1.3375e+03 1.9588e+03 1.5818e+03 5.9730e+02 3.7170e+02 + 8.2110e+02 7.3510e+02 6.9160e+02 1.1641e+03 1.9877e+03 8.9050e+02 9.9480e+02 + 2.6524e+03 9.2820e+02 1.4807e+03 6.4690e+02 4.1890e+02 5.3980e+02 4.3360e+02 + 1.1107e+03 5.1520e+02 5.2240e+02 3.2640e+02 5.1770e+02 1.9850e+02 6.6690e+02 + 1.0096e+03 2.7020e+03 1.1184e+03 1.9502e+03 2.7032e+03 7.1820e+02 4.5630e+02 + 6.2420e+02 4.3720e+02 3.0400e+02 5.1810e+02 6.5410e+02 3.9870e+02 4.2950e+02 + 4.3130e+02 5.6730e+02 4.3760e+02 9.5660e+02 6.9570e+02 4.4790e+02 5.5960e+02 + 1.0555e+03 8.5930e+02 5.3420e+02 9.8270e+02 7.4920e+02 2*3.5000e+03 + 2.0221e+03 1.8472e+03 9.6020e+02 5.1010e+02 8.6970e+02 4.9870e+02 1.3926e+03 + 2.3870e+03 2.0329e+03 8.1010e+02 3.6450e+02 8.3110e+02 9.6140e+02 1.1973e+03 + 1.5942e+03 1.5643e+03 1.6284e+03 9.5010e+02 1.7789e+03 1.6770e+03 1.0870e+03 + 5.8150e+02 7.5650e+02 4.5360e+02 6.0080e+02 7.0740e+02 3.5080e+02 1.9980e+02 + 3.1350e+02 9.0780e+02 3.0230e+02 6.2450e+02 2.3335e+03 2.2056e+03 1.5981e+03 + 1.0957e+03 2.2981e+03 6.5830e+02 3.7810e+02 6.6590e+02 7.3120e+02 5.3060e+02 + 5.6650e+02 5.9220e+02 4.0090e+02 2.6520e+02 3.7260e+02 1.2343e+03 6.0540e+02 + 9.8960e+02 3.7850e+02 1.4750e+02 4.7110e+02 3.0040e+02 6.6060e+02 1.1252e+03 + 1.0045e+03 7.5250e+02 3.1809e+03 3.2024e+03 2.4157e+03 5.4320e+02 5.2710e+02 + 7.0120e+02 5.9770e+02 7.7930e+02 8.5130e+02 2.7337e+03 2.3289e+03 9.7530e+02 + 4.5170e+02 7.1370e+02 1.5012e+03 1.1768e+03 1.9806e+03 1.0539e+03 1.0739e+03 + 6.1010e+02 1.7034e+03 8.9900e+02 8.8160e+02 5.3260e+02 2.6950e+02 2.5710e+02 + 3.2110e+02 7.4160e+02 4.3770e+02 3.7120e+02 3.4970e+02 9.3090e+02 8.8550e+02 + 1.2465e+03 1.5481e+03 2.0073e+03 1.5464e+03 1.3129e+03 2.1852e+03 7.8130e+02 + 3.4010e+02 4.1010e+02 4.8230e+02 5.6170e+02 4.5860e+02 7.1590e+02 1.4350e+02 + 6.6570e+02 5.2850e+02 8.7370e+02 4.3540e+02 8.6210e+02 4.6460e+02 3.8350e+02 + 4.9210e+02 5.9470e+02 7.1590e+02 1.2635e+03 1.3632e+03 2.2872e+03 2.3963e+03 + 2.7881e+03 3.2682e+03 9.8320e+02 3.2250e+02 6.3980e+02 5.4340e+02 9.1440e+02 + 1.4906e+03 2.7625e+03 1.7121e+03 1.1016e+03 4.5260e+02 1.3611e+03 1.5778e+03 + 1.4721e+03 1.7346e+03 4.3200e+02 6.7540e+02 1.5252e+03 1.2400e+03 1.5544e+03 + 3.0890e+02 2.0550e+02 2.6000e+02 4.0900e+02 6.0210e+02 6.0560e+02 8.9600e+02 + 5.1560e+02 4.6700e+02 2.9890e+02 1.0786e+03 4.4090e+02 2.1598e+03 1.9523e+03 + 1.5676e+03 1.8170e+03 1.7893e+03 9.7410e+02 3.9820e+02 2.6410e+02 5.1230e+02 + 5.9270e+02 2.3800e+02 6.0420e+02 2.5840e+02 4.6580e+02 1.0033e+03 9.1090e+02 + 5.4810e+02 3.1010e+02 4.7660e+02 5.2220e+02 5.4780e+02 1.1314e+03 1.6794e+03 + 1.1218e+03 9.2350e+02 2.3802e+03 1.0049e+03 8.0220e+02 1.5017e+03 1.7057e+03 + 2.4750e+02 6.4110e+02 3.6460e+02 7.4700e+02 1.2911e+03 1.7253e+03 2.4979e+03 + 8.1800e+02 8.5010e+02 2.3435e+03 2.4464e+03 8.7040e+02 3.4720e+02 2.1710e+02 + 4.9410e+02 1.2253e+03 1.3133e+03 1.9035e+03 5.7930e+02 1.9450e+02 3.0490e+02 + 6.4710e+02 4.8910e+02 7.3190e+02 6.3000e+02 8.4380e+02 6.3100e+02 4.6250e+02 + 6.7030e+02 7.6200e+02 1.0084e+03 2.2872e+03 6.2260e+02 1.0530e+03 1.7647e+03 + 6.8360e+02 5.7300e+02 2.3310e+02 4.2560e+02 8.9690e+02 5.7060e+02 2.9000e+02 + 3.5680e+02 1.1678e+03 1.0959e+03 6.6470e+02 4.8640e+02 4.8720e+02 2.9730e+02 + 7.5110e+02 7.4190e+02 1.3479e+03 1.2156e+03 1.6071e+03 1.5558e+03 1.6780e+03 + 1.5929e+03 6.8120e+02 8.4800e+02 1.9449e+03 8.7870e+02 3.9640e+02 4.2600e+02 + 4.5340e+02 8.1830e+02 7.7540e+02 2.0123e+03 1.0155e+03 2.0957e+03 1.9389e+03 + 4.8900e+02 1.5231e+03 4.4270e+02 1.5880e+02 7.6870e+02 1.0029e+03 2.1306e+03 + 2.0912e+03 3.2300e+02 3.3720e+02 5.1250e+02 6.7200e+02 5.9420e+02 5.7510e+02 + 8.1100e+02 1.0343e+03 1.0823e+03 6.4570e+02 4.1900e+02 1.3462e+03 1.3955e+03 + 2.3138e+03 1.0219e+03 2.6895e+03 1.5905e+03 4.9750e+02 7.1400e+02 6.1390e+02 + 3.1470e+02 5.2690e+02 3.1440e+02 2.7260e+02 3.2430e+02 4.4150e+02 5.5400e+02 + 3.1970e+02 5.5890e+02 6.1130e+02 3.7210e+02 4.4320e+02 1.3686e+03 8.4400e+02 + 1.6952e+03 1.3911e+03 1.7353e+03 9.2080e+02 1.5212e+03 7.1180e+02 1.7191e+03 + 1.5300e+03 7.6920e+02 5.5980e+02 4.0600e+02 3.8070e+02 7.5850e+02 1.5484e+03 + 1.5831e+03 1.9012e+03 1.7928e+03 1.5413e+03 9.5290e+02 6.7000e+02 4.0150e+02 + 2.3730e+02 2.9880e+02 1.5661e+03 2.3169e+03 9.5200e+02 4.5680e+02 2.4870e+02 + 2.4970e+02 4.0830e+02 1.6820e+02 8.5480e+02 1.0549e+03 7.2820e+02 6.4910e+02 + 5.1030e+02 2.5330e+02 9.0870e+02 1.7274e+03 1.1657e+03 1.5896e+03 1.8532e+03 + 2.1529e+03 1.1255e+03 7.4460e+02 8.2020e+02 6.8910e+02 7.0900e+02 4.6320e+02 + 5.2450e+02 4.4950e+02 1.2152e+03 3.8860e+02 2.8580e+02 2.9450e+02 3.2970e+02 + 7.7890e+02 8.7160e+02 1.5646e+03 1.6202e+03 1.5621e+03 1.8593e+03 4.4040e+02 + 6.9930e+02 7.1790e+02 6.5770e+02 5.4100e+02 3.3840e+02 8.5530e+02 4.8440e+02 + 3.4450e+02 2.7550e+02 5.4380e+02 1.6305e+03 1.7495e+03 2.6684e+03 2.9424e+03 + 1.3652e+03 1.1869e+03 4.1340e+02 3.2170e+02 3.6110e+02 4.4380e+02 1.2833e+03 + 2.0063e+03 1.0608e+03 5.4220e+02 4.3090e+02 2.1250e+02 4.6580e+02 4.3660e+02 + 3.9470e+02 8.6930e+02 9.1680e+02 5.8890e+02 3.3220e+02 5.7650e+02 8.1660e+02 + 9.6580e+02 1.2003e+03 1.0588e+03 1.8715e+03 2.6043e+03 1.4681e+03 6.9040e+02 + 1.0424e+03 6.2550e+02 3.0560e+02 5.1570e+02 6.1010e+02 5.9780e+02 1.3740e+02 + 5.3360e+02 3.0800e+02 2.6300e+02 2.2600e+02 6.1250e+02 6.8470e+02 9.6560e+02 + 1.7019e+03 1.6120e+03 1.2134e+03 8.8060e+02 7.0590e+02 4.2140e+02 5.8980e+02 + 1.1872e+03 4.6950e+02 2.1390e+02 3.1510e+02 8.6330e+02 5.4880e+02 5.1580e+02 + 7.6270e+02 3.1860e+03 1.8753e+03 2.0375e+03 1.2105e+03 3.9080e+02 5.8740e+02 + 4.7630e+02 1.0622e+03 8.8420e+02 1.7577e+03 2.1658e+03 1.2787e+03 7.1030e+02 + 7.5940e+02 3.7310e+02 5.1810e+02 3.8310e+02 4.0050e+02 8.4860e+02 4.7110e+02 + 5.7460e+02 3.9010e+02 4.8690e+02 5.4460e+02 1.5223e+03 1.0242e+03 9.3710e+02 + 6.1150e+02 1.6105e+03 1.3595e+03 7.8860e+02 1.0030e+03 5.6330e+02 1.7940e+02 + 3.9150e+02 6.8050e+02 7.1420e+02 8.0160e+02 9.0860e+02 6.5870e+02 3.3790e+02 + 3.9520e+02 1.3081e+03 1.8685e+03 1.3360e+03 1.5225e+03 1.1704e+03 1.1533e+03 + 4.6000e+02 3.9000e+02 3.8550e+02 5.6780e+02 7.6070e+02 5.7720e+02 5.7810e+02 + 2.8930e+02 4.1170e+02 5.6470e+02 5.3700e+02 1.6924e+03 3.5000e+03 1.5884e+03 + 1.2589e+03 8.7150e+02 5.0400e+02 8.3060e+02 6.7350e+02 1.0723e+03 9.8110e+02 + 2.0969e+03 1.5359e+03 7.6830e+02 1.0590e+03 8.4720e+02 7.9560e+02 3.7480e+02 + 4.0540e+02 5.6360e+02 7.4050e+02 4.1040e+02 5.6990e+02 6.3580e+02 4.0610e+02 + 1.2159e+03 2.0427e+03 1.7425e+03 6.8890e+02 1.2010e+03 2.2120e+03 2.4149e+03 + 5.5770e+02 6.6450e+02 5.5370e+02 3.8970e+02 6.7200e+02 5.8950e+02 1.0594e+03 + 5.2170e+02 5.9520e+02 6.6630e+02 3.9580e+02 6.4780e+02 1.9268e+03 1.5963e+03 + 1.0184e+03 5.1860e+02 8.1640e+02 8.2830e+02 5.3270e+02 4.9930e+02 5.7440e+02 + 4.3720e+02 3.8490e+02 7.5500e+02 4.2420e+02 5.0730e+02 3.8710e+02 6.0290e+02 + 4.5050e+02 1.8010e+03 2.5501e+03 1.6887e+03 1.0313e+03 4.6160e+02 5.5410e+02 + 5.5530e+02 5.0450e+02 1.0603e+03 5.2980e+02 2.7450e+03 1.2114e+03 1.0395e+03 + 9.4750e+02 2.7280e+02 5.7580e+02 3.3250e+02 4.2890e+02 6.1900e+02 5.0810e+02 + 7.6070e+02 3.6600e+02 4.2430e+02 3.5540e+02 1.2983e+03 2.6011e+03 9.9940e+02 + 1.2083e+03 8.8930e+02 9.1610e+02 2.7903e+03 7.0980e+02 7.5430e+02 4.7890e+02 + 2.9790e+02 6.1060e+02 1.0976e+03 4.0850e+02 7.0820e+02 5.3930e+02 4.8370e+02 + 4.5960e+02 4.6300e+02 9.7330e+02 1.7770e+03 1.2952e+03 5.7920e+02 5.3540e+02 + 5.1430e+02 7.1390e+02 5.4610e+02 1.3580e+02 3.7500e+02 5.7540e+02 4.4420e+02 + 5.0740e+02 4.1330e+02 8.9300e+02 7.1740e+02 9.5670e+02 2.3482e+03 2.2518e+03 + 9.3440e+02 1.0731e+03 5.9060e+02 9.7790e+02 5.7380e+02 6.6500e+02 7.3320e+02 + 6.8040e+02 3.1012e+03 1.7843e+03 1.0235e+03 9.6370e+02 7.0100e+02 8.4960e+02 + 9.0310e+02 5.3490e+02 4.4700e+02 7.2070e+02 6.1620e+02 6.6320e+02 5.4860e+02 + 5.3270e+02 1.4002e+03 1.9148e+03 2.0486e+03 9.4520e+02 5.7860e+02 1.0150e+03 + 2.7878e+03 8.5640e+02 4.4170e+02 4.3930e+02 4.9070e+02 7.2950e+02 5.9590e+02 + 6.4480e+02 7.2340e+02 4.8680e+02 6.0420e+02 4.6530e+02 1.2120e+03 1.6896e+03 + 1.5521e+03 6.4950e+02 7.0680e+02 4.7030e+02 4.2410e+02 4.4660e+02 4.5360e+02 + 6.6070e+02 2.3460e+02 4.2960e+02 1.7940e+02 3.4160e+02 3.2180e+02 7.2140e+02 + 8.3590e+02 2.0203e+03 2.1273e+03 2.5090e+03 1.5742e+03 8.3150e+02 4.6780e+02 + 3.9900e+02 9.6810e+02 3.5640e+02 4.7740e+02 9.5060e+02 2.1115e+03 1.2818e+03 + 9.6800e+02 3.6290e+02 4.6520e+02 6.9000e+02 9.1640e+02 5.4550e+02 2.6770e+02 + 8.3740e+02 8.3410e+02 6.3860e+02 3.9920e+02 5.5850e+02 1.1647e+03 2.8084e+03 + 2.5623e+03 8.4370e+02 4.9230e+02 6.1590e+02 2.1663e+03 9.3110e+02 6.1550e+02 + 7.0130e+02 7.3850e+02 7.0810e+02 3.9080e+02 5.1960e+02 4.3490e+02 4.4740e+02 + 6.1430e+02 5.4650e+02 9.9620e+02 2.4012e+03 1.6042e+03 2.0390e+03 7.7880e+02 + 3.0020e+02 2.0150e+02 3.6180e+02 7.7230e+02 5.1740e+02 5.5910e+02 3.2300e+02 + 3.4010e+02 3.5600e+02 4.3570e+02 5.8340e+02 6.6610e+02 1.8106e+03 1.7912e+03 + 1.6471e+03 1.0658e+03 7.6020e+02 8.3250e+02 7.7780e+02 7.1010e+02 4.9760e+02 + 5.8210e+02 2.2398e+03 2.1842e+03 8.4440e+02 7.1310e+02 5.0610e+02 4.7100e+02 + 5.1430e+02 6.9300e+02 3.5140e+02 3.8560e+02 6.3680e+02 1.1121e+03 7.5810e+02 + 3.7530e+02 3.8790e+02 1.7139e+03 1.7414e+03 1.9302e+03 1.1159e+03 2.7230e+02 + 1.0817e+03 2.8436e+03 1.0550e+03 1.0488e+03 7.1760e+02 6.7850e+02 4.2900e+02 + 7.1430e+02 5.6160e+02 4.7740e+02 8.1360e+02 4.3830e+02 1.0294e+03 1.5441e+03 + 3.2137e+03 8.4100e+02 1.1442e+03 4.6890e+02 2.2190e+02 2.8900e+02 5.0360e+02 + 4.9990e+02 3.8960e+02 3.3830e+02 4.0980e+02 6.2050e+02 5.9880e+02 3.3760e+02 + 3.9730e+02 9.0070e+02 2.1852e+03 2.3648e+03 5.1430e+02 1.1610e+03 7.2270e+02 + 9.4940e+02 8.2840e+02 9.2740e+02 5.8150e+02 3.6200e+02 1.0991e+03 1.6462e+03 + 1.5413e+03 6.8110e+02 4.7300e+02 3.5240e+02 4.9960e+02 8.6130e+02 6.8030e+02 + 2.3590e+02 4.8020e+02 9.7470e+02 7.7470e+02 4.5210e+02 4.0670e+02 1.0257e+03 + 1.8894e+03 1.8170e+03 1.2768e+03 4.2370e+02 7.9930e+02 2.1933e+03 2.6618e+03 + 1.4404e+03 3.9210e+02 3.9880e+02 4.5780e+02 4.0970e+02 7.0950e+02 7.1690e+02 + 5.0230e+02 4.7990e+02 1.0738e+03 2.0843e+03 3.0588e+03 1.2250e+03 8.4490e+02 + 5.1940e+02 1.8890e+02 3.5280e+02 5.0590e+02 6.6880e+02 4.3590e+02 6.1230e+02 + 4.7610e+02 2.6530e+02 5.9550e+02 4.8590e+02 6.0120e+02 1.2262e+03 1.6265e+03 + 1.9509e+03 8.3350e+02 6.9850e+02 3.7460e+02 6.4280e+02 8.4670e+02 1.0488e+03 + 3.0690e+02 3.4870e+02 2.1283e+03 2.0715e+03 6.2050e+02 5.0720e+02 7.8580e+02 + 2.7180e+02 3.1850e+02 8.5810e+02 7.7540e+02 3.5720e+02 4.1220e+02 7.8570e+02 + 6.8440e+02 5.6550e+02 2.4470e+02 1.0054e+03 1.9970e+03 1.2472e+03 3.9310e+02 + 3.1050e+02 8.1160e+02 9.9890e+02 1.8336e+03 1.0234e+03 6.5530e+02 7.6570e+02 + 2.3000e+02 4.7850e+02 3.7950e+02 3.1290e+02 3.0890e+02 6.0430e+02 1.2232e+03 + 2.5111e+03 9.8340e+02 1.1435e+03 8.5960e+02 3.5950e+02 4.9330e+02 4.5920e+02 + 8.4810e+02 2.9540e+02 2.4000e+02 6.0730e+02 4.1820e+02 4.1570e+02 7.1830e+02 + 2.2630e+02 3.7300e+02 9.9200e+02 2.0360e+03 1.0145e+03 4.6200e+02 9.8350e+02 + 6.8850e+02 4.7620e+02 4.3930e+02 7.8300e+02 3.1990e+02 4.4040e+02 2.0583e+03 + 2.9530e+03 2.1079e+03 4.6800e+02 4.4550e+02 3.4110e+02 4.8160e+02 7.5230e+02 + 7.5450e+02 4.6370e+02 5.1740e+02 4.1570e+02 4.9640e+02 9.5350e+02 5.6660e+02 + 8.7090e+02 2.3472e+03 9.9580e+02 4.9890e+02 5.6920e+02 8.7900e+02 1.2734e+03 + 1.2429e+03 2.1990e+03 7.3160e+02 4.2210e+02 2.9750e+02 4.0950e+02 4.6980e+02 + 4.8490e+02 8.8040e+02 1.0345e+03 1.2221e+03 2.0971e+03 9.1800e+02 4.2860e+02 + 6.3070e+02 2.5590e+02 6.1820e+02 5.4840e+02 6.4550e+02 3.7640e+02 2.8980e+02 + 5.5160e+02 5.2870e+02 4.4020e+02 5.8720e+02 1.9460e+02 6.5370e+02 1.9051e+03 + 2.1894e+03 8.2380e+02 8.0810e+02 3.8730e+02 3.1570e+02 4.5150e+02 4.3740e+02 + 6.1940e+02 2.8870e+02 1.0826e+03 8.7220e+02 2.2737e+03 1.5301e+03 4.0170e+02 + 7.3130e+02 4.7290e+02 3.0740e+02 8.3090e+02 8.6640e+02 3.8620e+02 5.0100e+02 + 5.4290e+02 3.8780e+02 2.7970e+02 1.0577e+03 1.5943e+03 2.0879e+03 1.7112e+03 + 1.5846e+03 5.1980e+02 3.5630e+02 7.5420e+02 1.6849e+03 2.5322e+03 1.5579e+03 + 5.3370e+02 4.4420e+02 4.5380e+02 3.5100e+02 4.7650e+02 8.9790e+02 1.1654e+03 + 1.0849e+03 1.4516e+03 8.7980e+02 5.1220e+02 4.4910e+02 3.3190e+02 4.5800e+02 + 7.1190e+02 7.4690e+02 2.8370e+02 2.2390e+02 2.5340e+02 7.4550e+02 1.2884e+03 + 4.6090e+02 7.5800e+01 5.0930e+02 1.6383e+03 2.7128e+03 8.9430e+02 8.0060e+02 + 7.9990e+02 4.2440e+02 5.0050e+02 3.5700e+02 3.2230e+02 4.9790e+02 7.0280e+02 + 1.4653e+03 2.7323e+03 1.4108e+03 4.6050e+02 4.3180e+02 1.2290e+02 5.4170e+02 + 4.1120e+02 8.1740e+02 3.9430e+02 7.8040e+02 4.9280e+02 2.9840e+02 4.1640e+02 + 3.6950e+02 8.2310e+02 2.1740e+03 1.7924e+03 1.9613e+03 4.0310e+02 4.3640e+02 + 8.8930e+02 7.7810e+02 1.9485e+03 9.6160e+02 1.7562e+03 3.3250e+02 5.4350e+02 + 3.6600e+02 1.6511e+03 1.3461e+03 2.3107e+03 1.5978e+03 9.3950e+02 1.8239e+03 + 8.5190e+02 2.2270e+02 3.6020e+02 8.1510e+02 1.0513e+03 8.8200e+02 2.4580e+02 + 3.3520e+02 4.0030e+02 4.1070e+02 7.2990e+02 5.1910e+02 2.8540e+02 2.4820e+02 + 1.6432e+03 2.4213e+03 9.5260e+02 1.1537e+03 1.1711e+03 6.5420e+02 2.5400e+02 + 1.9660e+02 3.9990e+02 4.0780e+02 8.3330e+02 9.4100e+02 2.4084e+03 7.7880e+02 + 4.7930e+02 6.0420e+02 3.1500e+02 3.3550e+02 6.6700e+02 5.7680e+02 6.6890e+02 + 4.0790e+02 3.5720e+02 4.1020e+02 2.8240e+02 8.6970e+02 9.5400e+02 2.4108e+03 + 1.0348e+03 9.1400e+02 4.3280e+02 5.3900e+02 1.0223e+03 8.2100e+02 1.7341e+03 + 1.8689e+03 1.0041e+03 5.0470e+02 8.3030e+02 1.3879e+03 1.4450e+03 1.3720e+03 + 1.6767e+03 8.4780e+02 1.1970e+03 1.2261e+03 9.9540e+02 6.5970e+02 8.3200e+01 + 6.6660e+02 1.1267e+03 7.1890e+02 6.2260e+02 7.0940e+02 6.1820e+02 4.5740e+02 + 5.7390e+02 1.4950e+02 2.9860e+02 6.8030e+02 1.8540e+03 2.5373e+03 1.4019e+03 + 8.0620e+02 6.7130e+02 3.5220e+02 3.2580e+02 3.5080e+02 5.7290e+02 5.9570e+02 + 7.0050e+02 8.4230e+02 2.2241e+03 2.0379e+03 1.4631e+03 5.5850e+02 3.8740e+02 + 2.7550e+02 5.7200e+02 2.1580e+02 7.2350e+02 6.8680e+02 5.0230e+02 4.2410e+02 + 4.2390e+02 4.7750e+02 1.5214e+03 1.6344e+03 2.0314e+03 8.2800e+02 3.4930e+02 + 5.1700e+02 1.1238e+03 7.7570e+02 9.2690e+02 1.7932e+03 1.9712e+03 1.1038e+03 + 1.0440e+03 8.7230e+02 1.1511e+03 1.1478e+03 1.2565e+03 6.3980e+02 5.1780e+02 + 5.1430e+02 4.9470e+02 3.2000e+02 4.1680e+02 1.0055e+03 7.8100e+02 3.9270e+02 + 4.6190e+02 7.8070e+02 4.7860e+02 7.4300e+02 3.0700e+02 6.4630e+02 2.1490e+02 + 7.1680e+02 9.2900e+02 2.8671e+03 8.0000e+02 7.4910e+02 4.5210e+02 4.2370e+02 + 2.9570e+02 3.6930e+02 7.2410e+02 6.6580e+02 7.0350e+02 1.5194e+03 1.6433e+03 + 2.4210e+03 1.4464e+03 6.9530e+02 4.6190e+02 1.1473e+03 2.4190e+02 3.5890e+02 + 7.3880e+02 9.0550e+02 2.5120e+02 3.5920e+02 3.0860e+02 1.6040e+02 1.7021e+03 + 2.5962e+03 9.9020e+02 9.4900e+02 3.6570e+02 3.6170e+02 7.4540e+02 4.5500e+02 + 5.8820e+02 2.5816e+03 2.7623e+03 1.1010e+03 2.2862e+03 2.1249e+03 2.3297e+03 + 1.5725e+03 1.5509e+03 9.7950e+02 6.9330e+02 4.6350e+02 3.9300e+02 8.2760e+02 + 3.4140e+02 6.7800e+02 8.6220e+02 8.0120e+02 4.8280e+02 5.6150e+02 8.4530e+02 + 7.2070e+02 9.2200e+02 7.5310e+02 8.8370e+02 7.1900e+02 2.4368e+03 2.2040e+03 + 8.6940e+02 5.0680e+02 2.6080e+02 4.6860e+02 3.2140e+02 3.5550e+02 6.6310e+02 + 6.2300e+02 4.4820e+02 1.1527e+03 1.3342e+03 1.8007e+03 1.1633e+03 4.3020e+02 + 7.0590e+02 8.3850e+02 7.0770e+02 3.0210e+02 7.3940e+02 8.7360e+02 4.7100e+02 + 1.1040e+02 4.9250e+02 5.0000e+02 1.4600e+03 2.0086e+03 1.2567e+03 1.1389e+03 + 8.7360e+02 3.6440e+02 6.2750e+02 5.7350e+02 6.7810e+02 1.1895e+03 2.5807e+03 + 1.4687e+03 2.0618e+03 3.2175e+03 1.3666e+03 8.1700e+02 5.9720e+02 5.3610e+02 + 4.1470e+02 5.6060e+02 7.3310e+02 2.8260e+02 3.2510e+02 6.9590e+02 7.1920e+02 + 6.5930e+02 5.2010e+02 7.8320e+02 1.0062e+03 8.9070e+02 1.2394e+03 1.1018e+03 + 6.6860e+02 1.0207e+03 2.4846e+03 2.8717e+03 1.0772e+03 4.9550e+02 2.3430e+02 + 3.5140e+02 2.3150e+02 7.5960e+02 5.1240e+02 6.0450e+02 3.2980e+02 3.7750e+02 + 1.6519e+03 2.8720e+03 1.1274e+03 4.8310e+02 3.5470e+02 5.0100e+02 9.0740e+02 + 2.5760e+02 3.7010e+02 6.2070e+02 5.7100e+02 1.1100e+02 3.9110e+02 6.2720e+02 + 1.5098e+03 2.4280e+03 1.0247e+03 6.2480e+02 5.3270e+02 4.4800e+02 5.2890e+02 + 6.5060e+02 5.5940e+02 1.0817e+03 1.9029e+03 2.2914e+03 1.6628e+03 2.9892e+03 + 6.8160e+02 4.2730e+02 2.7040e+02 6.2330e+02 3.8320e+02 5.6800e+02 5.2830e+02 + 4.8830e+02 2.9220e+02 6.6640e+02 4.7660e+02 7.3320e+02 5.8390e+02 7.3760e+02 + 8.2200e+02 1.0498e+03 9.0780e+02 7.6550e+02 7.1360e+02 1.2502e+03 1.3372e+03 + 9.9050e+02 3.4820e+02 4.2800e+02 2.8200e+02 2.1960e+02 4.5090e+02 3.1700e+02 + 1.0392e+03 8.4950e+02 5.7760e+02 5.6160e+02 8.7700e+02 2.0731e+03 1.6580e+03 + 9.1770e+02 7.6010e+02 3.2000e+02 7.4010e+02 5.0060e+02 7.1150e+02 3.8380e+02 + 4.8680e+02 2.2240e+02 3.8800e+02 8.9270e+02 1.6080e+03 2.2371e+03 1.1941e+03 + 8.0170e+02 4.0070e+02 6.6310e+02 2*4.9920e+02 4.0800e+02 1.2144e+03 + 1.9985e+03 2.4894e+03 3.3280e+03 2.8131e+03 1.0748e+03 1.5020e+02 3.0450e+02 + 6.1950e+02 4.9290e+02 5.2080e+02 6.0210e+02 3.7080e+02 2.4670e+02 6.8250e+02 + 7.5320e+02 7.0870e+02 4.4670e+02 5.3810e+02 7.3770e+02 1.7515e+03 9.7700e+02 + 3.9590e+02 5.1080e+02 1.2987e+03 1.9116e+03 2.2715e+03 5.6750e+02 3.3520e+02 + 6.4310e+02 1.8840e+02 2.1580e+02 3.2960e+02 7.8320e+02 7.2720e+02 4.5060e+02 + 5.0360e+02 7.7420e+02 1.6631e+03 2.1328e+03 1.5265e+03 4.8250e+02 2.5370e+02 + 4.5590e+02 7.2720e+02 2.3520e+02 4.6410e+02 2.3110e+02 3.0790e+02 6.4320e+02 + 1.1333e+03 2.4877e+03 2.7628e+03 9.1630e+02 2.9950e+02 4.0300e+02 3.7580e+02 + 5.5330e+02 3.9050e+02 3.8110e+02 3.3700e+02 1.0020e+03 2.3107e+03 3.4234e+03 + 2.1188e+03 1.5981e+03 2.0370e+02 3.5330e+02 4.5050e+02 5.4160e+02 4.3510e+02 + 3.7010e+02 2.2800e+02 2.5500e+02 5.9100e+02 5.7900e+02 8.3350e+02 3.5700e+02 + 3.8950e+02 4.6560e+02 5.5630e+02 1.1591e+03 5.3200e+02 3.3060e+02 8.5940e+02 + 1.4824e+03 1.6372e+03 6.5770e+02 5.1960e+02 6.7470e+02 3.9550e+02 3.1180e+02 + 3.5400e+02 6.7440e+02 5.7910e+02 7.8850e+02 2.6350e+02 4.2640e+02 1.7630e+03 + 2.1138e+03 1.1485e+03 1.0695e+03 2.0250e+02 5.8300e+02 5.4840e+02 4.1040e+02 + 5.2630e+02 3.6000e+02 4.4280e+02 7.4530e+02 1.3186e+03 2.4956e+03 2.1051e+03 + 6.3110e+02 2.0470e+02 4.2610e+02 5.7680e+02 4.9810e+02 9.9960e+02 4.7660e+02 + 5.4250e+02 9.4760e+02 2.4266e+03 3.1768e+03 1.9216e+03 1.5110e+03 5.0260e+02 + 3.8580e+02 6.7110e+02 1.0582e+03 5.2000e+02 3.4310e+02 3.4980e+02 5.1180e+02 + 4.8630e+02 9.2740e+02 6.7740e+02 4.4740e+02 5.4480e+02 3.2780e+02 2.8000e+02 + 1.3316e+03 6.9020e+02 6.8550e+02 3.7740e+02 1.3953e+03 1.3651e+03 7.5610e+02 + 4.7360e+02 7.5850e+02 7.3580e+02 6.2280e+02 5.6520e+02 8.4460e+02 3.7810e+02 + 2.8740e+02 4.8670e+02 6.3760e+02 1.0580e+03 2.0859e+03 1.2893e+03 9.2260e+02 + 2.0310e+02 8.0550e+02 2.8970e+02 3.2630e+02 6.0660e+02 5.8830e+02 4.9320e+02 + 7.2990e+02 1.1960e+03 2.3362e+03 1.0629e+03 2.8440e+02 3.4690e+02 3.7510e+02 + 4.4020e+02 5.3920e+02 3.7520e+02 3.5870e+02 5.1950e+02 1.0679e+03 1.5898e+03 + 2.9490e+03 1.5922e+03 7.0770e+02 7.8020e+02 4.3400e+02 4.4720e+02 4.4990e+02 + 4.3560e+02 3.6660e+02 4.5410e+02 9.4410e+02 6.6280e+02 5.1010e+02 5.8810e+02 + 5.7490e+02 6.6580e+02 4.3440e+02 1.2180e+02 1.0819e+03 1.2887e+03 6.3280e+02 + 3.0950e+02 1.0833e+03 6.8600e+02 1.2021e+03 5.6120e+02 1.0141e+03 6.1090e+02 + 7.6500e+02 3.9670e+02 6.0670e+02 8.1760e+02 2.8010e+02 3.6820e+02 5.9020e+02 + 9.1600e+02 1.5047e+03 1.9522e+03 1.5424e+03 4.1170e+02 6.7330e+02 2.9950e+02 + 3.6410e+02 7.0150e+02 7.9690e+02 9.0630e+02 6.5660e+02 1.1244e+03 1.5135e+03 + 1.4911e+03 6.5370e+02 4.9420e+02 4.1550e+02 5.3120e+02 9.9820e+02 3.9340e+02 + 2.2570e+02 4.6690e+02 9.5030e+02 1.4822e+03 2.3102e+03 2.1219e+03 1.1773e+03 + 6.2720e+02 7.3960e+02 2.4090e+02 2.8380e+02 4.3950e+02 4.2550e+02 2.8580e+02 + 9.8170e+02 6.1550e+02 6.7860e+02 8.1180e+02 9.3340e+02 5.1490e+02 2.5610e+02 + 8.9400e+01 1.4334e+03 4.4250e+02 7.9210e+02 1.8361e+03 2.5132e+03 1.2980e+03 + 9.3530e+02 4.2550e+02 1.9670e+02 5.3600e+02 3.1967e+03 2.9274e+03 1.9592e+03 + 6.6450e+02 8.4810e+02 1.0513e+03 7.8510e+02 3.3870e+02 2.2830e+02 6.6970e+02 + 4.0790e+02 3.7063e+03 2.3945e+03 9.9330e+02 1.0272e+03 8.3610e+02 9.1050e+02 + 2.6635e+03 2.3023e+03 2.2436e+03 7.8800e+02 1.4686e+03 5.5250e+02 3.9690e+02 + 5.9780e+02 5.2740e+02 7.4480e+02 7.2490e+02 2.0638e+03 2.8476e+03 3.0629e+03 + 4.0983e+03 2.0032e+03 5.5060e+02 2.4640e+02 3.9090e+02 1.9000e+02 1.6280e+02 + 4.1710e+02 6.6350e+02 3.6270e+02 4.3380e+02 4.1490e+02 1.0265e+03 4.3900e+02 + 4.9090e+02 9.1690e+02 6.9650e+02 7.5220e+02 7.2140e+02 4.9580e+02 6.9750e+02 + 8.6940e+02 3.0378e+03 2.3150e+03 1.1521e+03 4.8370e+02 3.8270e+02 3.0680e+02 + 1.5123e+03 1.7875e+03 3.1796e+03 1.0415e+03 7.2750e+02 6.1010e+02 4.2220e+02 + 6.8770e+02 7.9280e+02 2.3020e+02 3.9950e+02 5.3740e+02 2.3430e+03 2.8660e+03 + 1.7105e+03 1.0660e+03 3.7000e+02 3.7370e+02 1.6972e+03 3.3309e+03 2.9078e+03 + 1.0865e+03 8.8870e+02 7.5620e+02 4.1950e+02 7.5070e+02 7.4500e+02 1.0395e+03 + 7.7720e+02 9.2950e+02 1.5482e+03 2*4.9000e+03 2.5536e+03 1.0246e+03 + 5.3520e+02 7.1270e+02 2.0140e+02 1.6420e+02 3.9540e+02 2.8880e+02 1.8290e+02 + 2.2170e+02 4.5200e+02 7.3800e+02 6.7090e+02 6.9400e+02 8.6150e+02 8.6810e+02 + 5.5460e+02 7.1740e+02 3.3590e+02 1.2852e+03 1.0558e+03 3.1506e+03 1.2363e+03 + 1.0343e+03 4.1530e+02 2.8470e+02 3.1720e+02 8.1720e+02 3.7348e+03 2.7831e+03 + 1.5889e+03 4.5580e+02 4.2160e+02 2.4810e+02 4.2210e+02 3.1110e+02 3.3420e+02 + 4.3820e+02 6.1990e+02 2.0267e+03 3.8566e+03 1.1989e+03 7.3490e+02 4.3470e+02 + 3.5670e+02 2.0010e+03 2.0332e+03 2.2434e+03 2.5097e+03 1.2270e+03 5.8560e+02 + 4.5680e+02 9.9840e+02 5.8840e+02 7.3750e+02 3.4840e+02 4.7640e+02 2.3408e+03 + 4.5871e+03 3.2152e+03 4.2749e+03 1.5989e+03 1.4119e+03 1.0412e+03 4.5180e+02 + 2.2180e+02 8.3620e+02 4.6100e+02 3.4670e+02 4.8020e+02 7.5510e+02 6.3450e+02 + 7.2310e+02 4.4010e+02 6.0380e+02 6.7480e+02 5.2160e+02 6.4530e+02 1.4868e+03 + 1.6855e+03 2.3309e+03 2.5499e+03 2.0933e+03 4.1020e+02 4.5400e+02 3.6490e+02 + 6.8500e+02 2.2212e+03 3.5140e+03 1.8031e+03 8.9480e+02 3.8810e+02 3.9700e+02 + 7.0280e+02 4.1620e+02 3.5590e+02 4.9170e+02 4.9860e+02 2.6930e+02 1.9907e+03 + 2.8141e+03 2.1197e+03 7.0720e+02 3.2910e+02 4.1900e+02 7.8600e+02 2.1589e+03 + 3.1861e+03 2.6788e+03 1.4245e+03 3.8100e+02 8.1780e+02 9.9000e+02 8.8980e+02 + 4.2150e+02 3.4820e+02 4.5740e+02 1.0475e+03 2.9548e+03 3.1223e+03 2.6900e+03 + 3.4622e+03 1.2827e+03 8.6840e+02 5.4970e+02 2.4410e+02 5.5580e+02 4.7270e+02 + 5.3320e+02 4.9620e+02 5.5200e+02 5.0450e+02 5.2640e+02 5.3760e+02 3.2610e+02 + 3.4630e+02 5.6750e+02 1.1238e+03 1.4813e+03 2.3655e+03 2.4979e+03 2.5356e+03 + 1.0284e+03 3.3080e+02 5.8070e+02 6.3410e+02 6.5240e+02 1.9950e+03 2.2926e+03 + 2.4101e+03 7.2800e+02 5.5260e+02 2.9370e+02 6.8850e+02 3.8580e+02 3.4580e+02 + 5.0740e+02 6.8190e+02 3.4670e+02 1.9806e+03 2.9374e+03 2.5971e+03 1.2121e+03 + 6.3710e+02 5.5760e+02 1.3465e+03 8.8280e+02 1.5442e+03 1.0918e+03 2.9044e+03 + 1.2612e+03 1.2658e+03 6.3040e+02 3.3600e+02 4.5970e+02 3.0010e+02 6.0270e+02 + 1.8379e+03 2.8448e+03 3.8213e+03 1.8308e+03 3.8657e+03 1.6776e+03 7.6160e+02 + 3.8990e+02 3.9340e+02 3.3140e+02 5.8480e+02 4.9440e+02 1.0255e+03 1.6720e+02 + 2.4500e+02 2.4950e+02 7.7150e+02 3.9160e+02 2.7800e+02 7.5830e+02 1.1432e+03 + 1.7211e+03 1.5316e+03 3.0671e+03 3.1778e+03 5.3710e+02 3.0920e+02 5.0060e+02 + 1.0997e+03 7.4530e+02 2.2503e+03 3.5465e+03 2.4240e+03 4.9060e+02 4.9190e+02 + 4.1450e+02 5.7410e+02 2.4910e+02 1.9150e+02 5.5310e+02 4.4740e+02 4.1790e+02 + 1.3203e+03 2.4362e+03 2.3996e+03 1.4920e+03 7.8850e+02 5.3530e+02 6.8850e+02 + 6.8030e+02 1.1484e+03 2.0132e+03 2.2897e+03 2.8809e+03 1.0259e+03 3.0970e+02 + 6.7350e+02 2.5170e+02 2.8880e+02 3.2330e+02 2.9644e+03 2.5602e+03 2.8181e+03 + 3.4430e+03 3.7388e+03 2.5585e+03 5.9480e+02 3.9440e+02 3.7440e+02 4.1560e+02 + 8.5740e+02 7.5890e+02 3.4950e+02 1.5510e+02 1.5160e+02 5.7680e+02 9.5560e+02 + 2.3840e+02 5.9840e+02 8.1310e+02 1.7330e+03 2.9747e+03 2.7895e+03 2.5463e+03 + 1.8952e+03 7.0320e+02 2.6830e+02 4.8820e+02 4.9030e+02 5.7660e+02 1.8374e+03 + 2.5314e+03 1.7820e+03 1.1213e+03 4.6720e+02 3.4450e+02 7.6130e+02 2.5690e+02 + 2.9090e+02 3.6110e+02 3.8390e+02 6.6100e+02 1.3080e+03 2.1621e+03 2.6337e+03 + 1.7287e+03 6.9490e+02 6.8300e+02 8.6780e+02 4.9520e+02 1.0744e+03 2.4426e+03 + 2.7175e+03 2.5032e+03 2.7645e+03 9.4750e+02 7.2410e+02 7.3800e+02 1.4200e+02 + 3.1660e+02 1.2029e+03 1.5815e+03 1.3678e+03 2.8119e+03 2.5567e+03 2.3404e+03 + 5.3630e+02 2.5200e+02 5.6810e+02 4.6320e+02 7.4310e+02 8.4180e+02 2.6330e+02 + 4.9130e+02 5.2620e+02 4.0400e+02 5.8880e+02 3.6100e+02 3.4230e+02 5.8510e+02 + 2.1218e+03 2.3701e+03 3.7102e+03 2.6592e+03 1.1789e+03 2.6690e+02 3.7470e+02 + 8.6580e+02 6.1320e+02 4.4430e+02 1.4909e+03 3.4518e+03 2.1597e+03 5.4340e+02 + 4.6570e+02 7.6870e+02 2.5040e+02 2.3750e+02 3.2790e+02 5.3020e+02 3.2490e+02 + 2.8530e+02 6.5580e+02 2.6472e+03 3.1970e+03 1.6140e+03 5.3170e+02 4.9110e+02 + 5.3450e+02 3.6770e+02 6.0310e+02 1.2976e+03 2.0338e+03 2.2992e+03 2.7947e+03 + 1.9837e+03 6.2420e+02 3.9350e+02 4.0520e+02 4.1750e+02 2.3584e+03 2.6336e+03 + 2.4201e+03 2.4862e+03 2.1051e+03 2.2745e+03 6.1500e+02 3.7720e+02 3.7170e+02 + 6.4490e+02 5.4640e+02 6.1100e+02 4.9650e+02 2.2230e+02 4.3650e+02 7.5020e+02 + 2.4360e+02 2.1870e+02 5.0520e+02 5.9580e+02 1.8993e+03 3.4245e+03 2.9993e+03 + 3.4139e+03 7.3470e+02 1.6000e+02 5.0880e+02 6.4810e+02 4.0010e+02 3.3640e+02 + 6.2180e+02 3.4337e+03 2.3077e+03 8.8410e+02 6.9270e+02 6.7890e+02 8.5100e+02 + 2.3970e+02 4.6820e+02 4.7910e+02 3.1420e+02 2.4180e+02 5.9930e+02 1.4473e+03 + 2.9316e+03 1.1750e+03 1.1214e+03 3.9370e+02 4.8720e+02 4.2350e+02 4.9330e+02 + 8.1110e+02 8.6710e+02 2.0070e+03 2.5519e+03 2.1314e+03 9.3500e+02 2.7430e+02 + 2.2710e+02 6.6190e+02 1.6759e+03 2.6410e+03 1.7590e+03 2.3658e+03 2.0864e+03 + 1.6311e+03 9.1320e+02 3.6280e+02 3.5910e+02 1.0943e+03 5.1610e+02 3.1950e+02 + 4.4490e+02 3.8660e+02 6.3170e+02 5.5120e+02 3.6560e+02 2.4430e+02 6.9100e+02 + 7.0340e+02 2.4584e+03 3.1806e+03 2.9487e+03 2.6460e+03 7.8340e+02 5.2990e+02 + 3.1140e+02 1.2919e+03 6.2580e+02 2.9710e+02 1.1103e+03 2.6254e+03 1.2086e+03 + 8.1460e+02 7.2400e+02 6.0040e+02 5.2880e+02 5.8610e+02 4.4080e+02 4.8750e+02 + 1.7040e+02 2.2060e+02 5.3610e+02 1.9822e+03 2.5880e+03 1.3053e+03 2.9900e+02 + 4.6440e+02 6.4980e+02 4.9470e+02 4.9770e+02 5.1270e+02 5.5980e+02 1.1942e+03 + 2.5374e+03 2.4679e+03 2.0172e+03 9.4190e+02 4.9390e+02 1.2180e+03 2.5734e+03 + 2.0623e+03 9.1760e+02 1.5726e+03 2.7761e+03 1.2564e+03 7.0940e+02 3.0390e+02 + 2.4470e+02 4.5380e+02 3.9030e+02 1.5550e+02 2.4000e+02 3.3900e+02 8.2060e+02 + 7.9600e+02 3.7030e+02 3.9580e+02 6.0500e+02 5.2460e+02 2.7335e+03 3.4445e+03 + 2.0030e+03 3.1801e+03 1.1941e+03 3.0550e+02 5.8780e+02 8.2880e+02 6.3800e+02 + 2.2860e+02 9.7400e+02 1.3101e+03 2.1508e+03 5.6760e+02 5.9210e+02 3.8370e+02 + 6.6160e+02 7.6190e+02 3.6860e+02 5.2330e+02 4.6230e+02 3.8380e+02 5.1100e+02 + 2.3955e+03 4.0033e+03 1.4632e+03 3.4880e+02 2.4090e+02 4.7100e+02 9.9680e+02 + 5.9170e+02 3.8680e+02 4.2280e+02 8.5180e+02 2.3212e+03 3.9843e+03 1.5860e+03 + 9.8160e+02 7.9240e+02 7.9030e+02 3.7697e+03 2.1426e+03 9.9970e+02 1.0561e+03 + 2.6387e+03 1.7180e+03 7.8720e+02 3.8580e+02 3.6490e+02 3.7750e+02 4.1780e+02 + 3.3080e+02 1.8430e+02 4.1420e+02 6.0180e+02 5.9570e+02 2.6750e+02 7.7990e+02 + 6.9070e+02 1.4842e+03 1.7382e+03 2.5795e+03 2.0626e+03 2.8823e+03 1.8241e+03 + 5.1820e+02 5.7870e+02 1.0487e+03 3.9830e+02 2.4760e+02 6.9370e+02 1.8993e+03 + 2.6895e+03 5.3800e+02 4.2260e+02 4.8530e+02 5.3050e+02 6.6130e+02 3.4410e+02 + 6.2170e+02 5.2970e+02 6.7790e+02 4.2970e+02 2.2300e+03 3.7284e+03 1.9940e+03 + 5.2840e+02 3.5520e+02 2.6590e+02 6.5520e+02 5.6830e+02 2.7150e+02 3.2470e+02 + 7.0620e+02 9.2210e+02 3.8272e+03 2.6604e+03 1.2471e+03 8.5380e+02 1.9919e+03 + 2.8358e+03 1.6622e+03 1.0000e+03 3.3161e+03 2.5024e+03 9.4070e+02 7.5160e+02 + 4.1360e+02 2.1120e+02 4.0330e+02 4.6280e+02 6.3730e+02 4.4180e+02 4.2580e+02 + 8.5520e+02 6.9950e+02 2.9890e+02 1.9150e+02 5.9260e+02 1.1538e+03 2.7247e+03 + 1.9628e+03 2.0093e+03 3.9837e+03 7.2230e+02 6.6130e+02 6.3460e+02 9.0300e+02 + 3.5600e+02 4.0030e+02 5.5780e+02 2.3300e+03 2.8481e+03 1.9138e+03 5.1320e+02 + 6.1050e+02 8.0180e+02 3.0910e+02 3.7320e+02 5.8750e+02 4.4310e+02 7.4950e+02 + 5.3470e+02 1.2356e+03 2.5961e+03 2.5601e+03 4.1110e+02 2.0680e+02 6.9160e+02 + 1.0849e+03 6.5120e+02 6.0750e+02 6.3040e+02 1.7280e+02 5.6900e+02 2.6698e+03 + 1.9140e+03 2.6849e+03 1.3417e+03 2.2434e+03 2.0402e+03 1.8248e+03 1.4196e+03 + 3.3275e+03 2.8990e+03 1.3652e+03 4.6630e+02 3.9900e+02 3.5760e+02 2.2720e+02 + 4.2910e+02 2.9100e+02 4.8450e+02 3.1620e+02 4.1150e+02 5.9230e+02 2.5330e+02 + 4.7940e+02 8.2740e+02 1.9934e+03 2.9694e+03 1.2618e+03 1.1886e+03 4.1917e+03 + 1.3424e+03 1.1118e+03 1.4292e+03 6.0710e+02 5.9540e+02 4.2620e+02 5.6010e+02 + 1.3721e+03 3.4046e+03 2.2168e+03 5.4480e+02 3.9330e+02 3.2860e+02 5.1970e+02 + 4.5200e+02 7.7600e+02 4.3650e+02 9.7630e+02 9.2180e+02 1.9972e+03 3.8505e+03 + 1.7342e+03 5.2270e+02 1.6280e+02 3.1800e+02 7.8230e+02 5.4550e+02 6.7020e+02 + 2.8390e+02 2.8340e+02 1.8610e+02 2.2986e+03 3.0690e+03 2.3951e+03 1.6768e+03 + 2.4487e+03 2.1314e+03 1.1260e+03 1.8336e+03 1.6627e+03 2.3408e+03 9.0410e+02 + 5.6420e+02 6.5520e+02 4.3570e+02 2.3890e+02 3.8250e+02 6.8390e+02 4.8120e+02 + 4.0920e+02 7.2090e+02 6.1890e+02 1.5630e+02 1.4130e+02 6.9440e+02 1.7341e+03 + 2.6209e+03 2.2496e+03 2.3968e+03 2.9479e+03 2.3379e+03 8.4040e+02 8.3890e+02 + 4.6330e+02 7.7600e+02 8.6420e+02 4.9330e+02 7.2510e+02 3.8037e+03 3.5009e+03 + 1.0003e+03 5.2120e+02 4.5760e+02 8.0390e+02 5.7590e+02 4.2190e+02 8.3710e+02 + 1.0953e+03 8.9330e+02 2.6133e+03 3.7930e+03 9.3420e+02 4.8820e+02 2.1030e+02 + 5.9710e+02 4.8220e+02 7.0110e+02 6.5750e+02 3.5360e+02 4.7330e+02 3.1090e+02 + 1.0672e+03 2.2024e+03 4.2361e+03 2.3698e+03 1.5704e+03 1.0952e+03 9.2050e+02 + 1.6402e+03 3.0926e+03 2.9593e+03 5.0050e+02 4.4420e+02 3.6950e+02 3.1680e+02 + 2.4090e+02 3.6660e+02 3.7520e+02 3.8370e+02 7.3910e+02 7.3000e+02 6.1200e+02 + 4.9530e+02 4.5850e+02 6.3760e+02 1.3194e+03 2.3172e+03 2.3783e+03 2.3537e+03 + 3.5564e+03 9.7820e+02 7.3200e+02 5.0000e+02 3.1670e+02 8.3240e+02 1.1582e+03 + 6.2570e+02 8.2520e+02 1.8082e+03 2.8692e+03 2.6038e+03 4.5790e+02 6.0380e+02 + 6.4950e+02 4.4350e+02 7.5610e+02 5.5230e+02 8.8320e+02 1.5201e+03 3.1086e+03 + 2.7401e+03 1.2817e+03 5.9960e+02 3.7200e+02 8.7860e+02 6.4690e+02 4.1250e+02 + 3.2140e+02 4.5760e+02 4.8350e+02 3.0650e+02 1.5153e+03 2.6815e+03 4.6785e+03 + 2.8615e+03 2.4851e+03 1.3262e+03 3.1120e+02 9.2010e+02 3.6143e+03 1.9838e+03 + 3.6560e+02 4.9030e+02 1.9940e+02 3.7430e+02 2.9190e+02 3.3540e+02 4.0310e+02 + 2.4430e+02 4.2940e+02 1.1640e+03 1.0382e+03 4.0250e+02 2.6450e+02 6.2490e+02 + 1.6790e+03 3.4399e+03 2.0499e+03 2.9700e+03 4.0632e+03 2.1035e+03 5.2710e+02 + 2.2360e+02 4.8890e+02 8.0700e+02 5.0010e+02 6.2930e+02 9.0670e+02 1.4137e+03 + 3.0793e+03 3.5360e+03 1.1486e+03 6.5210e+02 5.1380e+02 4.4290e+02 4.3560e+02 + 4.8260e+02 5.9890e+02 2.0549e+03 2.2254e+03 2.5344e+03 1.2530e+03 7.8910e+02 + 6.5010e+02 4.6910e+02 3.0990e+02 3.4490e+02 4.9950e+02 6.7900e+02 3.2420e+02 + 6.8280e+02 4.6960e+02 3.1194e+03 3.7457e+03 4.9000e+03 1.9870e+03 7.2600e+02 + 3.5640e+02 9.4300e+02 3.4034e+03 2.2843e+03 5.3250e+02 4.8370e+02 3.9700e+02 + 2.6230e+02 6.6460e+02 4.6180e+02 4.4760e+02 1.6380e+02 2.8380e+02 6.1650e+02 + 7.7130e+02 4.2150e+02 4.9160e+02 6.7290e+02 5.2430e+02 2.3476e+03 3.2285e+03 + 1.1452e+03 4.7222e+03 1.8756e+03 3.7370e+02 3.1620e+02 3.1190e+02 5.2600e+02 + 5.1340e+02 6.5040e+02 3.5290e+02 2.1457e+03 2.2615e+03 3.6509e+03 1.2050e+03 + 4.6550e+02 4.3360e+02 1.8060e+02 4.7570e+02 2.1430e+02 9.2030e+02 1.6130e+03 + 4.1831e+03 2.6754e+03 7.9950e+02 4.9480e+02 2.1350e+02 6.6640e+02 1.3677e+03 + 6.7760e+02 3.5420e+02 5.7500e+02 3.6360e+02 4.1810e+02 8.9970e+02 2.3422e+03 + 4.9000e+03 3.3546e+03 6.4840e+02 5.8970e+02 7.2880e+02 1.3965e+03 2.8609e+03 + 2.4428e+03 7.1130e+02 6.7450e+02 3.8940e+02 2.2900e+02 3.8430e+02 3.8220e+02 + 5.2870e+02 1.9690e+02 2.2110e+02 7.2600e+02 8.1010e+02 3.8220e+02 4.0120e+02 + 5.1080e+02 8.1290e+02 1.8469e+03 1.8989e+03 2.5292e+03 3.8786e+03 1.5563e+03 + 3.2380e+02 3.4430e+02 7.9320e+02 6.4800e+02 5.0610e+02 4.1500e+02 5.3700e+02 + 7.0260e+02 1.2468e+03 2.7664e+03 2.8091e+03 1.1177e+03 8.6260e+02 1.5890e+02 + 1.4270e+02 3.2990e+02 3.8990e+02 3.0529e+03 2.8436e+03 2.3623e+03 7.7660e+02 + 4.4270e+02 4.1230e+02 5.2540e+02 6.5700e+02 5.3880e+02 4.2100e+02 3.5830e+02 + 6.1340e+02 6.1320e+02 4.7940e+02 3.1391e+03 4.6477e+03 4.6553e+03 4.2030e+02 + 5.5830e+02 6.0880e+02 1.3632e+03 2.7058e+03 4.5787e+03 2.0466e+03 5.3760e+02 + 3.2430e+02 1.4450e+02 5.7290e+02 1.0248e+03 9.1350e+02 6.4860e+02 3.0550e+02 + 6.5700e+02 5.2490e+02 4.9330e+02 7.7900e+02 3.1370e+02 2.2550e+02 1.4307e+03 + 1.6524e+03 2.5821e+03 4.1472e+03 1.5309e+03 2.9320e+02 5.3090e+02 9.9220e+02 + 9.1900e+02 1.4550e+02 1.7780e+02 3.0610e+02 5.6360e+02 1.9662e+03 2.0558e+03 + 2.6318e+03 1.6776e+03 8.8220e+02 2.9930e+02 1.9100e+02 3.3810e+02 9.1150e+02 + 3.5916e+03 2.8288e+03 1.7353e+03 8.7050e+02 7.8510e+02 6.2560e+02 2.3890e+02 + 6.0530e+02 4.1840e+02 5.3170e+02 5.3000e+02 7.2330e+02 4.2030e+02 5.9780e+02 + 3.1077e+03 4.0458e+03 4.2533e+03 5.8690e+02 2.5960e+02 3.8180e+02 1.1266e+03 + 2.7176e+03 3.6057e+03 1.7484e+03 8.0390e+02 7.5720e+02 2.5880e+02 1.1417e+03 + 6.8620e+02 8.8340e+02 4.1000e+02 4.5840e+02 6.0750e+02 2.5060e+02 5.9790e+02 + 8.4950e+02 2.9360e+02 9.8900e+01 8.9220e+02 2.7261e+03 1.6833e+03 2.8102e+03 + 2.5955e+03 6.9600e+02 4.0810e+02 1.1372e+03 6.8840e+02 2.9030e+02 2.3650e+02 + 4.4500e+02 2.5210e+02 8.6480e+02 1.6753e+03 2.8791e+03 2.0772e+03 7.4430e+02 + 5.0900e+02 3.9810e+02 4.4170e+02 1.2328e+03 3.8368e+03 2.1260e+03 1.1757e+03 + 7.5340e+02 7.3650e+02 5.3870e+02 1.9250e+02 4.6710e+02 2.8860e+02 7.7070e+02 + 2.4580e+02 3.8620e+02 4.7090e+02 1.5802e+03 3.6843e+03 4.4999e+03 1.6510e+03 + 7.7540e+02 1.7960e+02 2.6060e+02 5.4890e+02 2.3101e+03 3.5700e+03 2.1198e+03 + 6.4910e+02 7.5890e+02 5.0960e+02 1.0474e+03 9.7270e+02 5.3810e+02 7.4700e+02 + 4.9740e+02 8.3190e+02 2.6350e+02 7.0520e+02 5.0910e+02 4.1810e+02 9.4100e+01 + 5.3210e+02 2.6984e+03 1.0011e+03 2.7297e+03 3.0901e+03 8.2290e+02 5.2830e+02 + 7.6720e+02 1.0580e+03 3.8020e+02 6.5230e+02 4.1670e+02 4.5680e+02 5.0700e+02 + 2.7317e+03 1.9890e+03 3.0262e+03 1.2339e+03 6.0250e+02 5.8530e+02 9.6420e+02 + 2.3188e+03 2.4329e+03 2.1655e+03 4.3950e+02 4.2980e+02 8.2510e+02 5.3780e+02 + 4.1400e+02 2.1030e+02 4.3230e+02 5.9580e+02 4.8690e+02 3.8600e+02 5.0510e+02 + 2.5215e+03 4.3868e+03 3.7815e+03 2.2242e+03 7.2080e+02 3.0500e+02 1.3490e+02 + 5.7120e+02 1.3799e+03 2.0002e+03 2.2361e+03 1.1974e+03 1.0581e+03 8.3360e+02 + 1.1306e+03 8.9380e+02 2.9540e+02 6.4740e+02 6.6290e+02 5.4900e+02 5.8450e+02 + 6.7520e+02 6.9670e+02 5.8110e+02 8.9890e+02 6.6260e+02 2.7898e+03 4.4160e+02 + 3.4179e+03 3.0589e+03 7.5540e+02 6.4280e+02 2.9680e+02 3.8930e+02 2.6440e+02 + 4.7180e+02 2.7250e+02 3.8800e+02 8.5570e+02 1.0370e+03 3.1126e+03 2.4794e+03 + 2.0095e+03 7.7190e+02 6.8250e+02 1.2421e+03 2.6699e+03 1.9771e+03 5.8940e+02 + 5.2060e+02 4.7990e+02 5.1680e+02 6.6640e+02 4.5080e+02 5.8530e+02 4.4190e+02 + 8.9240e+02 2.1730e+02 5.8780e+02 1.1825e+03 1.7262e+03 4.9000e+03 4.1855e+03 + 1.7998e+03 5.9960e+02 3.4930e+02 1.9900e+02 6.5220e+02 1.0608e+03 2.7634e+03 + 2.2480e+03 2.6931e+03 2.3683e+03 5.9620e+02 9.4060e+02 8.1190e+02 7.5010e+02 + 6.6030e+02 4.6270e+02 4.2020e+02 6.2910e+02 4.4240e+02 4.2300e+02 8.1780e+02 + 8.1200e+02 6.5820e+02 2.9988e+03 3.5300e+02 2.6586e+03 4.9000e+03 1.2259e+03 + 6.2720e+02 3.4880e+02 4.5180e+02 3.8570e+02 5.2540e+02 2.4320e+02 2.6780e+02 + 5.2050e+02 9.1220e+02 9.6970e+02 3.9114e+03 2.5021e+03 1.8290e+03 2.0311e+03 + 2.4316e+03 2.6348e+03 1.3034e+03 4.9830e+02 4.6190e+02 5.6800e+02 7.7840e+02 + 3.7040e+02 3.5790e+02 4.2750e+02 7.0300e+02 4.1070e+02 2.8520e+02 5.1590e+02 + 1.4081e+03 2.4801e+03 3.1641e+03 4.0004e+03 2.3151e+03 4.7970e+02 4.3850e+02 + 3.8510e+02 2.2680e+02 1.0707e+03 1.8333e+03 2.0523e+03 2.2989e+03 1.9607e+03 + 1.9092e+03 1.4162e+03 6.8710e+02 9.0840e+02 7.6330e+02 9.7320e+02 8.8220e+02 + 6.0780e+02 4.1780e+02 2.7130e+02 1.0220e+03 1.2019e+03 8.5900e+02 2.5241e+03 + 4.2690e+02 1.3694e+03 4.9000e+03 2.4700e+03 5.0880e+02 4.3800e+02 3.5860e+02 + 2.7900e+02 3.6120e+02 2.2580e+02 4.0910e+02 2.9040e+02 7.7270e+02 7.3500e+02 + 1.7840e+03 2.5858e+03 1.8554e+03 3.8777e+03 2.3034e+03 3.1962e+03 9.8450e+02 + 6.1050e+02 4.9160e+02 3.8060e+02 5.1660e+02 3.7900e+02 3.6350e+02 3.7690e+02 + 5.2050e+02 1.7440e+02 4.4470e+02 7.8860e+02 1.8798e+03 3.3460e+03 3.3662e+03 + 4.3170e+03 1.0231e+03 6.7040e+02 5.7320e+02 7.8750e+02 4.0750e+02 5.4770e+02 + 1.4601e+03 1.6501e+03 1.4746e+03 2.9707e+03 2.9444e+03 2.8413e+03 1.3463e+03 + 1.1547e+03 8.9770e+02 8.2970e+02 1.0109e+03 1.2044e+03 5.4780e+02 3.2600e+02 + 6.1720e+02 7.4540e+02 1.2833e+03 3.3339e+03 3.3930e+02 1.0091e+03 3.5297e+03 + 3.2163e+03 5.4440e+02 5.5530e+02 6.4250e+02 2.2010e+02 3.0990e+02 1.0215e+03 + 8.4330e+02 4.8310e+02 3.4930e+02 4.1190e+02 2.0796e+03 2.1406e+03 4.3741e+03 + 3.1597e+03 2.2439e+03 2.6002e+03 3.4720e+02 3.0270e+02 5.2240e+02 4.8800e+02 + 4.2640e+02 3.1490e+02 3.1090e+02 9.6890e+02 3.0970e+02 3.0450e+02 4.6800e+02 + 6.4800e+02 1.7061e+03 4.3607e+03 4.9000e+03 2.8547e+03 6.5110e+02 4.5230e+02 + 5.2030e+02 6.6320e+02 2.9000e+02 4.5040e+02 5.7880e+02 4.8620e+02 2.4094e+03 + 2.2814e+03 2.4663e+03 2.2936e+03 1.5902e+03 1.7640e+03 3.0180e+03 1.3970e+03 + 1.5925e+03 1.0698e+03 4.8590e+02 4.1420e+02 5.8600e+02 6.1540e+02 1.5703e+03 + 3.1082e+03 2.8720e+02 5.6030e+02 1.4639e+03 2.8731e+03 1.7123e+03 1.2114e+03 + 8.4460e+02 1.9650e+02 4.2130e+02 4.8980e+02 7.7620e+02 5.5920e+02 6.1170e+02 + 7.9780e+02 1.2130e+03 3.3091e+03 4.9000e+03 2.9450e+03 1.9458e+03 8.6270e+02 + 9.1570e+02 5.3570e+02 4.4250e+02 4.7380e+02 2.8870e+02 3.3530e+02 4.8930e+02 + 7.4910e+02 3.5450e+02 5.1060e+02 5.4670e+02 8.2690e+02 2.0951e+03 2.8554e+03 + 4.1959e+03 2.3563e+03 5.7990e+02 3.6470e+02 1.5869e+03 5.8690e+02 1.7610e+02 + 2.8090e+02 5.8050e+02 4.4730e+02 4.8860e+02 9.0270e+02 1.2197e+03 1.9700e+03 + 1.3741e+03 1.2411e+03 1.6814e+03 2.3494e+03 2.3337e+03 7.5300e+02 9.8790e+02 + 5.2030e+02 6.6530e+02 5.8360e+02 2.6229e+03 2.7562e+03 3.0270e+02 9.0140e+02 + 1.3329e+03 2.6655e+03 3.1903e+03 1.6907e+03 7.3960e+02 2.6360e+02 2.2680e+02 + 6.4950e+02 6.0430e+02 4.4560e+02 9.0450e+02 5.9070e+02 1.3805e+03 2.9898e+03 + 4.9000e+03 1.9051e+03 1.2596e+03 1.2534e+03 8.1240e+02 3.0830e+02 3.0340e+02 + 4.3180e+02 7.5610e+02 5.6740e+02 4.5690e+02 3.7460e+02 5.4440e+02 4.6420e+02 + 1.2878e+03 1.3041e+03 3.3479e+03 3.6148e+03 4.6609e+03 2.0406e+03 2.7690e+02 + 8.1750e+02 1.6786e+03 4.8970e+02 2.7870e+02 2.0490e+02 5.3130e+02 3.7240e+02 + 1.6790e+02 5.6100e+02 9.3070e+02 8.8630e+02 5.7550e+02 2.2793e+03 1.6777e+03 + 1.9638e+03 1.2112e+03 1.0216e+03 2.1173e+03 1.5582e+03 4.6240e+02 1.2122e+03 + 2.9810e+03 2.7422e+03 3.0160e+02 5.8270e+02 1.8396e+03 1.9038e+03 1.7991e+03 + 2.3882e+03 1.0521e+03 2.6840e+02 6.8540e+02 7.1000e+02 5.6830e+02 4.6070e+02 + 1.0580e+03 2.5910e+03 2.4893e+03 3.6983e+03 4.9000e+03 1.9404e+03 4.5490e+02 + 6.7180e+02 7.8630e+02 5.1180e+02 5.0410e+02 4.2650e+02 5.4610e+02 4.6470e+02 + 4.2380e+02 2.2720e+02 3.3000e+02 6.9860e+02 7.0440e+02 2.4484e+03 3.3047e+03 + 2.5153e+03 2.8544e+03 1.4685e+03 8.3590e+02 7.2540e+02 1.0181e+03 4.8410e+02 + 7.9760e+02 3.9820e+02 7.3850e+02 6.4350e+02 3.1680e+02 2.2980e+02 4.7520e+02 + 6.5340e+02 1.3243e+03 5.6500e+02 1.0781e+03 1.4656e+03 2.7384e+03 2.3830e+03 + 2.2281e+03 1.8631e+03 2.4709e+03 2.3901e+03 1.6487e+03 1.6558e+03 7.1500e+02 + 8.0360e+02 7.7420e+02 1.0157e+03 2.9052e+03 2.2010e+03 2.1055e+03 2.3840e+02 + 5.1340e+02 3.2360e+02 1.4880e+02 5.5320e+02 1.7615e+03 2.4776e+03 2.3175e+03 + 2.3476e+03 2.9553e+03 2.1967e+03 5.1140e+02 4.1570e+02 3.2080e+02 5.9050e+02 + 5.9540e+02 7.0320e+02 2.3410e+02 5.6780e+02 4.5210e+02 4.1170e+02 2.4460e+02 + 4.7180e+02 1.9970e+03 1.5531e+03 3.1154e+03 1.6960e+03 2.6636e+03 1.2157e+03 + 3.4180e+02 5.9360e+02 6.4960e+02 3.9310e+02 1.1740e+02 6.6810e+02 8.0280e+02 + 6.6460e+02 5.1800e+02 2.8280e+02 3.8670e+02 2.4660e+02 5.2280e+02 6.0370e+02 + 4.4350e+02 7.3070e+02 8.4860e+02 1.1446e+03 2.0572e+03 2.2051e+03 3.7696e+03 + 1.5426e+03 3.3153e+03 1.3899e+03 6.5920e+02 9.4190e+02 4.8170e+02 6.8230e+02 + 1.8389e+03 4.3381e+03 1.3836e+03 4.4670e+02 4.2670e+02 6.0920e+02 3.0560e+02 + 4.8690e+02 1.7466e+03 3.2862e+03 3.5314e+03 1.5834e+03 2.6030e+03 1.4779e+03 + 1.0142e+03 6.6650e+02 1.9270e+02 7.3550e+02 5.7390e+02 7.1810e+02 4.6800e+02 + 2.5380e+02 4.6610e+02 4.7790e+02 3.4810e+02 7.3390e+02 2.2031e+03 2.0636e+03 + 2.7173e+03 3.1672e+03 3.4299e+03 5.8940e+02 5.1370e+02 2.6460e+02 4.4970e+02 + 2.4000e+02 3.6980e+02 9.0730e+02 7.4890e+02 7.9610e+02 3.5340e+02 2.4040e+02 + 3.1850e+02 3.9640e+02 4.9330e+02 4.9110e+02 5.5500e+02 6.2080e+02 4.7790e+02 + 1.1626e+03 1.5187e+03 2.7861e+03 3.9983e+03 4.0372e+03 2.2989e+03 1.1182e+03 + 4.3570e+02 5.4570e+02 8.2410e+02 3.8760e+02 1.2266e+03 2.7423e+03 2.5286e+03 + 7.1630e+02 3.1630e+02 4.5960e+02 5.5440e+02 6.3840e+02 1.6346e+03 2.7828e+03 + 1.8205e+03 8.9390e+02 3.7134e+03 2.2866e+03 8.0460e+02 4.7990e+02 3.9720e+02 + 4.1620e+02 6.4280e+02 4.4400e+02 5.6770e+02 6.3670e+02 4.3160e+02 6.3770e+02 + 3.0910e+02 8.3540e+02 2.1135e+03 3.7828e+03 1.8128e+03 2.7302e+03 3.7845e+03 + 1.1214e+03 5.1690e+02 8.5120e+02 4.1370e+02 2.7440e+02 4.0050e+02 4.0290e+02 + 5.8520e+02 3.5370e+02 4.7400e+02 6.5230e+02 5.2610e+02 7.3130e+02 9.4150e+02 + 4.1680e+02 5.3450e+02 8.9440e+02 8.8300e+02 7.4700e+02 5.1290e+02 1.3561e+03 + 2*4.9000e+03 2.8309e+03 1.3622e+03 5.5770e+02 6.2830e+02 8.6650e+02 + 4.3870e+02 8.9840e+02 3.3417e+03 2.8460e+03 6.0660e+02 3.0430e+02 6.7530e+02 + 1.5474e+03 2.8899e+03 2.3454e+03 3.1742e+03 2.2797e+03 2.0653e+03 2.4905e+03 + 2.3478e+03 1.1748e+03 7.3550e+02 6.0770e+02 4.1770e+02 7.3440e+02 9.1440e+02 + 4.5720e+02 3.1360e+02 3.8560e+02 9.2190e+02 3.0440e+02 5.1250e+02 3.2669e+03 + 3.0879e+03 1.7823e+03 2.2070e+03 3.2174e+03 6.9860e+02 5.1300e+02 4.7660e+02 + 6.5730e+02 4.8680e+02 4.3270e+02 6.3530e+02 3.0860e+02 2.3140e+02 2.8670e+02 + 4.3340e+02 8.4500e+02 6.6030e+02 4.3660e+02 1.7040e+02 4.7820e+02 4.3350e+02 + 7.2430e+02 1.0432e+03 4.9950e+02 2.8022e+03 4.4533e+03 4.4834e+03 3.3820e+03 + 6.9390e+02 5.7850e+02 5.5730e+02 5.1190e+02 6.8850e+02 1.0923e+03 3.8272e+03 + 3.2605e+03 7.7820e+02 4.6660e+02 8.9030e+02 1.6431e+03 2.0530e+03 2.7728e+03 + 3.2210e+03 1.9609e+03 2.1114e+03 2.0373e+03 2.1869e+03 1.2874e+03 2.9600e+02 + 4.7140e+02 3.7970e+02 2.8560e+02 7.5860e+02 7.1010e+02 2.2720e+02 3.1140e+02 + 6.1380e+02 6.1310e+02 1.1502e+03 2.0112e+03 2.8102e+03 1.0646e+03 1.3151e+03 + 3.0593e+03 1.5619e+03 3.7130e+02 4.2810e+02 4.4530e+02 4.2590e+02 3.0490e+02 + 4.8750e+02 1.1150e+02 5.7240e+02 6.1460e+02 7.6140e+02 3.8460e+02 5.6630e+02 + 4.4780e+02 1.8510e+02 4.7420e+02 5.4310e+02 1.2484e+03 1.5057e+03 1.1748e+03 + 3.2020e+03 3.3548e+03 3.9033e+03 4.5755e+03 1.3124e+03 3.7820e+02 5.5520e+02 + 5.2150e+02 7.8180e+02 1.1041e+03 3.8675e+03 2.3970e+03 8.2080e+02 5.3680e+02 + 2.1656e+03 1.5534e+03 2.3780e+03 1.1140e+03 6.5850e+02 7.6220e+02 2.2958e+03 + 2.4141e+03 2.2176e+03 3.9110e+02 3.5770e+02 3.3460e+02 2.8650e+02 2.4580e+02 + 5.1060e+02 6.8390e+02 6.4630e+02 4.1970e+02 5.5130e+02 1.1256e+03 9.0650e+02 + 3.0237e+03 2.7332e+03 1.8517e+03 2.5438e+03 2.5050e+03 7.1440e+02 4.2400e+02 + 3.2710e+02 5.0580e+02 9.1310e+02 3.7860e+02 3.3910e+02 2.6630e+02 3.6290e+02 + 7.2890e+02 1.1854e+03 4.7210e+02 4.5910e+02 2.9050e+02 5.5310e+02 4.3500e+02 + 1.1134e+03 1.3373e+03 1.1157e+03 1.3174e+03 3.3323e+03 1.9860e+03 1.1223e+03 + 1.7070e+03 2.3880e+03 3.0930e+02 6.8630e+02 7.3620e+02 7.7210e+02 9.5380e+02 + 2.4154e+03 3.4971e+03 8.6800e+02 1.8226e+03 3.2808e+03 3.4250e+03 1.0263e+03 + 4.2760e+02 2.9880e+02 7.9740e+02 2.3024e+03 2.2507e+03 2.6650e+03 6.3550e+02 + 2.4360e+02 3.9610e+02 5.6410e+02 3.6150e+02 7.0550e+02 9.2900e+02 9.1340e+02 + 4.2020e+02 8.9620e+02 2.7030e+02 6.4060e+02 2.9097e+03 3.2021e+03 7.1200e+02 + 2.4481e+03 2.4706e+03 8.8010e+02 5.3300e+02 3.6770e+02 5.8610e+02 1.2665e+03 + 5.0580e+02 3.0930e+02 3.5300e+02 7.8110e+02 1.2083e+03 7.4820e+02 6.2910e+02 + 4.0730e+02 3.6650e+02 7.2430e+02 6.7850e+02 1.4530e+03 1.0485e+03 2.2405e+03 + 2.0572e+03 2.3492e+03 2.0425e+03 7.5500e+02 2.0894e+03 2.7228e+03 7.4940e+02 + 4.7230e+02 6.1090e+02 6.5180e+02 9.0880e+02 1.7310e+03 2.8172e+03 2.9008e+03 + 2.9340e+03 2.7144e+03 2.9822e+03 1.0638e+03 4.9510e+02 1.7620e+02 5.2030e+02 + 1.6460e+03 2.9828e+03 2.9277e+03 3.2650e+02 2.7140e+02 3.1920e+02 5.4360e+02 + 7.2780e+02 6.2220e+02 5.0940e+02 7.8010e+02 1.1896e+03 6.8360e+02 6.4160e+02 + 1.5398e+03 2.4093e+03 3.2393e+03 9.2170e+02 3.7653e+03 2.5405e+03 1.5236e+03 + 9.7230e+02 4.7940e+02 2.7620e+02 7.1850e+02 3.8930e+02 2.3110e+02 3.4230e+02 + 7.5720e+02 6.3970e+02 4.4230e+02 5.1890e+02 5.1900e+02 5.2420e+02 7.3190e+02 + 1.1911e+03 1.8951e+03 2.3733e+03 1.8495e+03 2.4294e+03 1.4914e+03 1.8400e+03 + 8.1200e+02 1.0828e+03 1.1816e+03 8.7890e+02 4.4160e+02 4.3010e+02 5.3820e+02 + 5.3650e+02 1.9017e+03 2.6058e+03 2.6616e+03 2.5099e+03 1.8774e+03 5.7720e+02 + 3.7690e+02 3.8090e+02 2.2190e+02 5.4710e+02 1.7121e+03 3.2437e+03 2.6351e+03 + 5.6310e+02 3.0060e+02 2.9430e+02 6.7690e+02 3.0760e+02 9.3000e+02 8.4260e+02 + 8.1780e+02 5.0970e+02 4.3140e+02 2.8020e+02 7.8410e+02 2.4184e+03 2.2540e+03 + 2.2149e+03 2.5945e+03 3.0141e+03 2.9915e+03 8.5660e+02 9.9760e+02 7.3600e+02 + 6.1500e+02 4.2420e+02 5.0790e+02 4.3600e+02 7.0000e+02 4.6550e+02 2.7460e+02 + 3.3590e+02 4.2530e+02 6.5600e+02 8.2090e+02 8.6810e+02 2.2683e+03 2.8575e+03 + 2.6030e+03 1.5375e+03 7.4220e+02 6.2610e+02 1.0388e+03 6.8260e+02 6.9400e+02 + 6.5570e+02 3.5060e+02 4.8600e+02 5.7570e+02 6.7030e+02 2.2827e+03 2.4493e+03 + 3.7358e+03 4.1194e+03 1.8684e+03 1.0319e+03 5.9760e+02 3.9220e+02 3.0470e+02 + 5.8070e+02 1.4278e+03 2.8088e+03 1.8703e+03 5.3440e+02 2.7070e+02 1.6180e+02 + 4.7090e+02 3.7990e+02 5.2290e+02 8.3200e+02 1.0166e+03 5.7990e+02 3.2390e+02 + 4.5590e+02 1.3271e+03 1.6437e+03 2.0590e+03 1.0627e+03 2.6202e+03 3.6461e+03 + 1.8672e+03 6.6670e+02 9.7410e+02 5.7520e+02 3.3870e+02 4.6510e+02 6.9800e+02 + 8.3730e+02 4.2270e+02 6.0380e+02 3.8570e+02 3.8580e+02 3.8970e+02 3.5870e+02 + 1.7522e+03 1.9869e+03 1.8180e+03 2.2569e+03 2.1298e+03 6.3660e+02 6.4470e+02 + 4.7460e+02 7.7040e+02 1.2779e+03 9.4110e+02 2.4390e+02 3.9000e+02 6.1080e+02 + 5.7500e+02 4.2420e+02 2.0246e+03 4.4604e+03 2.6255e+03 2.8525e+03 9.5890e+02 + 6.0040e+02 4.8350e+02 5.4310e+02 1.2008e+03 8.6570e+02 2.4608e+03 3.0321e+03 + 1.9607e+03 4.3750e+02 4.4400e+02 2.6090e+02 4.4790e+02 4.5440e+02 5.8020e+02 + 1.0008e+03 3.5940e+02 6.4720e+02 2.0390e+02 4.0310e+02 6.3090e+02 2.2375e+03 + 2.4164e+03 1.0615e+03 1.5352e+03 2.2548e+03 1.6444e+03 1.0730e+03 8.7990e+02 + 5.5410e+02 1.2600e+02 3.4230e+02 5.3110e+02 7.5310e+02 7.3600e+02 8.5160e+02 + 7.8990e+02 3.4040e+02 3.7280e+02 1.6249e+03 2.6159e+03 1.5821e+03 2.8199e+03 + 1.8472e+03 1.2010e+03 2.7820e+02 3.2760e+02 3.6290e+02 5.4550e+02 5.4690e+02 + 6.0000e+02 5.5880e+02 3.3740e+02 4.4560e+02 5.1340e+02 6.0570e+02 2.0851e+03 + 4.9000e+03 2.0771e+03 1.2853e+03 5.3340e+02 7.1530e+02 7.1780e+02 6.7510e+02 + 1.5137e+03 9.8650e+02 2.9357e+03 2.1170e+03 6.7410e+02 1.0239e+03 7.1860e+02 + 6.5960e+02 5.1030e+02 5.1980e+02 5.0920e+02 4.6530e+02 6.5880e+02 5.3490e+02 + 6.0420e+02 3.3930e+02 1.3911e+03 2.8597e+03 1.4398e+03 6.9400e+02 1.3406e+03 + 3.0968e+03 3.3809e+03 5.4320e+02 6.7610e+02 5.1920e+02 2.6440e+02 5.3450e+02 + 7.4940e+02 6.9370e+02 3.6740e+02 6.5100e+02 4.9110e+02 4.2640e+02 5.3780e+02 + 2.6975e+03 1.9465e+03 1.6487e+03 8.5250e+02 8.4260e+02 8.5360e+02 4.5810e+02 + 5.0270e+02 5.0780e+02 3.9480e+02 4.5340e+02 7.2800e+02 4.2820e+02 4.2950e+02 + 7.0800e+02 8.3300e+02 4.6340e+02 2.5214e+03 3.5702e+03 2.3641e+03 1.4533e+03 + 5.9830e+02 6.6620e+02 2.0360e+02 4.7900e+02 9.0870e+02 1.3842e+03 3.8430e+03 + 2.8715e+03 9.8960e+02 8.5410e+02 4.0320e+02 5.4060e+02 5.5310e+02 3.7410e+02 + 5.5290e+02 5.1420e+02 6.4150e+02 2.8960e+02 6.6270e+02 6.0970e+02 2.5486e+03 + 3.6415e+03 1.8130e+03 1.1498e+03 1.1214e+03 2.3000e+03 3.9064e+03 5.7710e+02 + 5.4340e+02 5.4880e+02 3.8310e+02 5.9230e+02 1.0050e+03 3.0280e+02 7.7270e+02 + 5.9120e+02 4.6300e+02 3.8530e+02 5.7530e+02 2.0776e+03 2.4878e+03 2.2459e+03 + 6.1820e+02 6.8720e+02 4.7250e+02 4.7970e+02 6.6100e+02 4.9970e+02 4.2190e+02 + 4.0960e+02 3.6210e+02 4.4190e+02 1.7760e+02 1.1027e+03 7.7850e+02 1.6922e+03 + 3.2874e+03 3.1525e+03 8.0190e+02 9.8130e+02 8.4660e+02 6.4520e+02 6.6140e+02 + 6.9090e+02 7.2960e+02 1.6980e+03 4.3417e+03 2.4981e+03 8.3930e+02 6.1900e+02 + 5.0250e+02 7.2940e+02 1.0629e+03 4.2400e+02 3.4740e+02 5.6920e+02 5.6060e+02 + 4.2080e+02 4.4140e+02 7.9480e+02 1.3564e+03 2.6807e+03 2.8680e+03 1.8746e+03 + 6.6550e+02 2.5203e+03 3.9029e+03 2.1743e+03 7.2590e+02 6.6340e+02 7.3780e+02 + 8.8440e+02 7.5360e+02 4.4790e+02 6.5530e+02 5.4430e+02 5.0690e+02 5.2460e+02 + 1.3223e+03 2.3654e+03 2.7145e+03 6.4760e+02 6.3190e+02 4.2240e+02 3.3670e+02 + 4.9330e+02 5.8520e+02 4.6180e+02 3.5440e+02 4.2300e+02 2.0050e+02 2.9770e+02 + 3.8490e+02 7.0420e+02 1.0019e+03 2.8284e+03 2.9782e+03 3.5126e+03 1.2796e+03 + 8.8640e+02 3.1820e+02 3.0430e+02 5.7670e+02 3.1250e+02 3.8230e+02 2.0190e+03 + 2.9561e+03 2.5502e+03 1.1859e+03 3.6360e+02 5.0460e+02 2.8730e+02 8.0130e+02 + 5.4400e+02 3.4300e+02 1.1703e+03 1.0067e+03 7.0790e+02 4.9300e+02 5.2190e+02 + 2.7157e+03 3.9318e+03 3.5872e+03 1.5228e+03 4.9570e+02 1.8385e+03 3.0328e+03 + 1.0936e+03 6.6260e+02 6.2000e+02 7.5220e+02 8.3530e+02 3.6640e+02 6.9990e+02 + 5.7410e+02 6.5400e+02 5.0570e+02 6.8860e+02 2.3736e+03 3.3617e+03 2.2458e+03 + 1.4325e+03 7.0230e+02 2.4810e+02 2.1290e+02 3.9370e+02 5.6360e+02 5.9900e+02 + 4.1930e+02 3.1550e+02 5.1190e+02 5.0960e+02 3.7920e+02 5.4010e+02 1.2376e+03 + 2.5349e+03 2.5077e+03 2.1695e+03 1.0380e+03 5.5070e+02 5.1280e+02 5.8030e+02 + 8.9460e+02 6.5430e+02 5.6510e+02 3.1357e+03 3.0579e+03 2.2742e+03 6.0070e+02 + 5.5750e+02 2.5530e+02 4.7130e+02 7.1720e+02 4.9380e+02 4.2300e+02 5.4860e+02 + 8.8640e+02 6.7520e+02 3.7420e+02 4.4780e+02 2.6826e+03 2.4379e+03 2.7023e+03 + 1.3283e+03 2.1730e+02 1.8624e+03 3.9811e+03 2.1991e+03 9.4040e+02 3.9520e+02 + 3.8810e+02 4.8390e+02 7.6150e+02 5.2510e+02 4.2120e+02 8.1020e+02 3.9790e+02 + 8.5140e+02 2.4419e+03 4.4991e+03 1.3896e+03 6.8470e+02 4.1510e+02 1.7630e+02 + 2.8660e+02 4.0370e+02 5.3020e+02 6.8100e+02 6.2490e+02 4.5300e+02 5.1150e+02 + 7.5580e+02 3.0970e+02 3.7480e+02 1.3232e+03 3.0593e+03 3.3107e+03 4.3920e+02 + 7.9300e+02 8.1390e+02 7.4800e+02 4.4870e+02 8.2060e+02 6.4010e+02 3.5010e+02 + 2.8941e+03 2.3047e+03 1.8134e+03 8.2690e+02 3.4330e+02 5.1450e+02 4.0510e+02 + 9.1580e+02 6.3810e+02 4.7540e+02 3.8720e+02 1.4785e+03 6.6480e+02 5.4010e+02 + 5.5490e+02 2.8401e+03 2.6451e+03 2.5438e+03 1.1048e+03 3.5440e+02 1.3851e+03 + 3.0706e+03 3.7265e+03 1.4827e+03 4.2110e+02 4.1290e+02 2.6450e+02 6.4070e+02 + 5.7440e+02 4.1500e+02 5.3290e+02 7.8820e+02 8.6340e+02 2.9180e+03 4.2823e+03 + 1.4966e+03 9.8740e+02 4.5290e+02 2.2660e+02 2.9730e+02 4.8540e+02 7.8670e+02 + 7.1980e+02 4.8610e+02 4.0210e+02 2.5560e+02 6.3390e+02 5.0190e+02 7.8640e+02 + 2.3127e+03 2.2772e+03 2.7313e+03 4.7620e+02 6.4180e+02 5.2470e+02 6.2200e+02 + 6.7010e+02 1.3187e+03 2.7580e+02 3.7640e+02 2.9796e+03 2.9001e+03 8.0090e+02 + 6.2350e+02 4.8150e+02 2.4510e+02 4.6310e+02 6.2720e+02 3.7520e+02 2.5850e+02 + 3.7570e+02 8.4720e+02 9.6590e+02 6.7590e+02 4.2420e+02 1.8644e+03 2.7959e+03 + 1.8246e+03 4.2430e+02 3.1690e+02 6.4380e+02 1.7229e+03 2.5671e+03 2.2125e+03 + 6.9550e+02 2.9330e+02 2.8790e+02 4.7170e+02 4.5880e+02 2.8480e+02 2.5350e+02 + 7.0430e+02 1.1046e+03 3.5155e+03 1.7639e+03 8.2110e+02 1.1179e+03 2.9730e+02 + 4.6640e+02 4.1720e+02 5.2400e+02 6.3290e+02 5.1340e+02 5.5150e+02 5.6470e+02 + 4.8850e+02 6.3670e+02 2.5640e+02 5.6350e+02 2.6607e+03 2.8505e+03 2.4191e+03 + 5.8190e+02 5.9100e+02 3.3970e+02 6.1980e+02 7.2500e+02 4.6320e+02 3.1530e+02 + 5.6120e+02 2.8817e+03 4.1342e+03 1.2728e+03 8.1370e+02 3.0460e+02 2.9370e+02 + 4.5760e+02 7.7810e+02 5.4460e+02 4.6720e+02 6.2620e+02 5.1910e+02 5.4710e+02 + 8.3100e+02 5.4550e+02 1.1700e+03 3.2861e+03 1.8980e+03 4.0740e+02 4.8630e+02 + 7.8110e+02 1.9608e+03 1.6791e+03 3.0785e+03 1.2474e+03 7.4270e+02 3.9340e+02 + 3.0990e+02 2.1640e+02 4.0880e+02 9.3890e+02 1.3132e+03 1.9331e+03 2.9359e+03 + 2.5836e+03 8.0850e+02 5.9990e+02 2.0030e+02 5.7180e+02 5.4320e+02 7.1080e+02 + 3.5040e+02 3.1900e+02 6.0260e+02 7.8240e+02 6.7350e+02 6.8940e+02 1.5740e+02 + 4.2110e+02 2.6671e+03 3.0652e+03 2.3907e+03 7.6840e+02 7.4300e+02 2.6110e+02 + 3.9260e+02 6.4240e+02 4.7520e+02 2.5200e+02 7.9930e+02 2.3079e+03 3.1832e+03 + 1.2928e+03 4.0840e+02 7.0100e+02 3.5940e+02 4.1980e+02 6.9040e+02 9.2090e+02 + 3.5400e+02 2.8860e+02 4.8330e+02 1.9810e+02 3.4290e+02 8.6010e+02 1.4741e+03 + 2.9231e+03 2.2954e+03 1.4243e+03 6.3780e+02 3.2390e+02 6.1170e+02 2.3589e+03 + 3.5451e+03 1.4817e+03 5.9290e+02 4.9800e+02 4.5460e+02 3.5570e+02 4.6330e+02 + 1.2101e+03 2.6060e+03 2.1515e+03 2.1803e+03 2.2293e+03 4.2990e+02 4.3140e+02 + 2.6800e+02 6.1720e+02 8.8900e+02 1.0770e+03 3.1860e+02 2.7790e+02 3.1680e+02 + 5.0500e+02 8.7250e+02 4.6280e+02 2.4910e+02 7.3990e+02 2.6554e+03 3.7979e+03 + 1.4950e+03 7.1560e+02 7.7020e+02 5.7100e+02 4.3240e+02 1.6530e+02 3.3180e+02 + 5.0540e+02 7.0960e+02 1.5583e+03 3.8253e+03 1.4476e+03 5.3470e+02 4.3980e+02 + 2.1690e+02 4.8210e+02 5.4790e+02 6.4430e+02 6.5520e+02 9.2880e+02 5.7410e+02 + 3.6300e+02 2.5120e+02 3.0410e+02 1.9452e+03 3.0435e+03 2.5093e+03 1.4356e+03 + 7.0540e+02 3.4890e+02 8.0360e+02 1.9724e+03 2.7279e+03 1.9190e+03 1.1788e+03 + 2.7190e+02 3.7290e+02 3.3710e+02 1.4162e+03 2.6139e+03 3.2350e+03 1.6180e+03 + 2.7039e+03 9.7900e+02 7.9330e+02 3.7340e+02 3.3080e+02 1.2372e+03 9.4440e+02 + 7.2680e+02 2.2120e+02 4.5890e+02 4.5590e+02 3.8240e+02 6.4340e+02 3.7570e+02 + 5.9860e+02 3.7150e+02 2.3004e+03 3.3898e+03 2.9230e+03 6.5740e+02 9.4100e+02 + 7.3330e+02 2.9130e+02 1.9180e+02 2.6550e+02 3.6930e+02 8.3760e+02 2.2001e+03 + 3.3718e+03 1.7886e+03 4.5890e+02 6.2420e+02 2.4880e+02 3.8560e+02 4.4550e+02 + 4.3640e+02 4.0980e+02 7.0960e+02 5.0840e+02 5.7570e+02 3.1820e+02 6.1720e+02 + 1.6389e+03 3.3751e+03 2.7203e+03 8.5700e+02 6.6420e+02 4.1560e+02 7.7560e+02 + 7.3790e+02 2.1329e+03 2.6165e+03 7.9920e+02 6.6040e+02 1.3223e+03 8.2720e+02 + 2.9822e+03 1.1136e+03 2.3474e+03 2.3433e+03 1.1968e+03 7.1490e+02 5.8450e+02 + 6.9470e+02 8.7500e+01 6.9870e+02 8.2830e+02 1.0069e+03 7.5380e+02 5.6020e+02 + 6.3060e+02 6.4570e+02 9.0000e+02 2.7740e+02 3.2240e+02 5.7040e+02 2.5955e+03 + 3.5522e+03 1.7581e+03 8.5750e+02 7.4690e+02 3.1200e+02 1.9660e+02 2.4760e+02 + 7.1010e+02 6.2990e+02 6.4110e+02 2.3836e+03 3.1137e+03 2.8531e+03 1.2260e+03 + 4.6140e+02 4.0250e+02 4.6060e+02 5.9210e+02 4.1280e+02 7.6220e+02 7.1650e+02 + 4.8910e+02 4.2300e+02 3.3120e+02 3.7180e+02 1.6858e+03 2.2881e+03 2.8440e+03 + 6.9860e+02 2.9130e+02 4.6160e+02 1.0648e+03 8.6360e+02 1.2346e+03 2.5105e+03 + 2.7597e+03 9.2830e+02 2.1077e+03 2.6692e+03 2.0578e+03 1.7620e+03 2.6576e+03 + 1.7539e+03 6.4260e+02 5.4250e+02 3.8220e+02 3.9170e+02 5.1060e+02 5.4510e+02 + 4.3490e+02 8.7510e+02 6.0330e+02 6.3440e+02 5.8030e+02 1.0060e+03 2.3420e+02 + 8.4690e+02 3.7480e+02 1.0756e+03 1.8435e+03 4.0139e+03 1.4914e+03 7.2580e+02 + 5.1940e+02 3.9660e+02 3.3050e+02 3.7310e+02 8.9140e+02 8.2610e+02 7.2230e+02 + 1.1467e+03 2.3006e+03 3.3894e+03 1.2744e+03 7.1460e+02 3.9720e+02 7.2310e+02 + 5.1650e+02 3.5140e+02 4.1570e+02 4.7980e+02 4.4730e+02 2.8120e+02 1.4280e+02 + 1.6620e+02 1.0251e+03 3.6346e+03 2.1284e+03 1.3826e+03 4.3260e+02 3.6020e+02 + 8.2420e+02 3.5280e+02 5.2280e+02 3.6143e+03 3.8672e+03 1.2942e+03 3.2007e+03 + 2.9748e+03 3.2616e+03 1.3317e+03 1.9028e+03 4.5990e+02 6.8560e+02 3.8860e+02 + 5.8590e+02 8.1260e+02 2.5130e+02 1.0199e+03 8.7160e+02 3.9380e+02 5.6680e+02 + 6.2680e+02 7.7180e+02 6.9140e+02 9.3750e+02 1.0371e+03 5.5740e+02 6.1870e+02 + 3.4115e+03 3.0856e+03 7.9390e+02 3.6490e+02 1.9830e+02 2.6660e+02 3.4730e+02 + 3.0680e+02 6.9750e+02 6.4280e+02 6.6450e+02 7.4010e+02 2.2676e+03 2.5210e+03 + 9.1170e+02 6.2660e+02 6.7080e+02 5.9260e+02 2.0710e+02 2.8720e+02 4.7340e+02 + 6.8790e+02 3.4910e+02 1.1530e+02 4.6670e+02 2.1080e+02 6.0860e+02 2.8121e+03 + 7.0760e+02 1.5856e+03 3.6850e+02 2.2210e+02 7.4480e+02 7.7960e+02 8.2600e+02 + 1.8292e+03 3.6129e+03 1.5590e+03 2.8866e+03 4.5044e+03 7.2590e+02 8.6740e+02 + 1.1003e+03 5.4660e+02 5.6780e+02 5.7970e+02 8.3120e+02 2.9700e+02 4.8020e+02 + 6.5670e+02 1.1493e+03 6.9980e+02 3.9410e+02 7.1780e+02 1.1110e+03 8.8890e+02 + 1.0297e+03 7.5700e+02 6.6770e+02 1.1846e+03 3.4785e+03 4.0203e+03 8.6620e+02 + 4.9520e+02 2.2430e+02 5.9150e+02 2.2730e+02 1.0153e+03 5.9210e+02 6.0490e+02 + 3.0140e+02 5.6860e+02 1.6709e+03 4.0208e+03 1.9505e+03 6.4700e+02 7.6830e+02 + 6.0300e+02 6.6690e+02 2.9870e+02 2.2970e+02 7.3600e+02 6.3110e+02 1.5800e+02 + 3.4430e+02 3.5910e+02 8.4300e+02 3.3992e+03 1.6413e+03 1.0018e+03 5.8630e+02 + 6.8440e+02 3.1270e+02 4.7690e+02 5.8050e+02 2.0523e+03 2.6641e+03 3.2080e+03 + 2.3280e+03 4.1848e+03 7.5190e+02 4.5780e+02 3.0590e+02 5.6030e+02 3.5590e+02 + 7.6410e+02 3.0620e+02 6.3920e+02 1.7690e+02 6.6690e+02 5.7880e+02 5.6300e+02 + 4.9810e+02 6.5120e+02 1.3418e+03 7.8020e+02 4.9210e+02 5.4970e+02 6.8390e+02 + 1.4187e+03 2.0121e+03 2.1818e+03 3.0920e+02 4.5290e+02 3.3070e+02 3.3430e+02 + 4.1480e+02 3.2920e+02 7.9180e+02 7.9270e+02 4.4700e+02 5.0650e+02 1.3517e+03 + 2.9023e+03 2.3212e+03 7.8010e+02 7.8840e+02 5.2480e+02 6.3290e+02 3.3740e+02 + 5.0330e+02 8.2870e+02 3.3080e+02 3.7570e+02 4.7300e+02 3.0490e+02 2.2513e+03 + 3.1319e+03 1.0898e+03 6.3920e+02 3.6930e+02 5.0560e+02 5.5580e+02 8.7050e+02 + 4.4020e+02 1.3450e+03 2.7979e+03 3.4852e+03 4.6592e+03 3.9383e+03 1.9092e+03 + 2.4850e+02 3.8740e+02 4.6190e+02 4.7680e+02 6.6670e+02 3.3190e+02 4.8110e+02 + 2.5230e+02 6.0670e+02 9.0640e+02 4.0550e+02 5.8540e+02 2.2020e+02 6.7360e+02 + 1.3682e+03 1.2266e+03 4.6940e+02 4.8010e+02 1.3300e+03 2.6762e+03 3.1801e+03 + 6.6040e+02 3.1110e+02 3.2010e+02 2.4890e+02 3.3200e+02 2.5910e+02 8.9830e+02 + 6.6410e+02 5.7300e+02 5.2890e+02 2.0719e+03 2.3284e+03 2.9859e+03 1.0394e+03 + 7.0530e+02 2.6920e+02 4.6410e+02 7.3940e+02 2.5530e+02 3.8330e+02 3.1300e+02 + 2.4530e+02 6.0960e+02 2.4429e+03 3.4828e+03 3.8679e+03 6.4670e+02 1.6830e+02 + 4.0830e+02 2.9790e+02 5.2060e+02 4.6100e+02 4.5230e+02 2.9400e+02 1.5426e+03 + 3.2350e+03 4.7928e+03 2.9663e+03 1.7552e+03 1.8300e+02 3.3590e+02 6.4760e+02 + 7.1770e+02 6.2300e+02 5.0340e+02 3.7690e+02 4.0260e+02 7.3660e+02 7.4210e+02 + 6.4200e+02 5.9620e+02 4.0200e+02 6.3520e+02 5.6990e+02 1.3653e+03 6.4770e+02 + 2.2850e+02 7.6760e+02 1.2656e+03 2.2921e+03 5.4780e+02 5.0970e+02 4.1250e+02 + 2.5670e+02 2.8640e+02 2.9390e+02 7.6210e+02 7.6820e+02 4.6900e+02 4.7200e+02 + 7.0970e+02 2.4682e+03 2.9593e+03 1.6207e+03 8.6540e+02 2.0000e+02 3.4510e+02 + 4.6220e+02 3.3810e+02 4.1440e+02 4.6010e+02 4.3420e+02 4.3180e+02 1.1470e+03 + 3.4938e+03 2.9471e+03 5.6270e+02 1.5350e+02 3.2880e+02 6.5860e+02 4.8620e+02 + 7.7780e+02 3.5040e+02 8.3620e+02 1.5140e+03 3.3972e+03 4.4475e+03 2.6902e+03 + 1.5280e+03 5.5750e+02 3.2730e+02 5.6590e+02 8.8180e+02 4.7300e+02 1.7910e+02 + 4.0710e+02 3.4570e+02 5.6820e+02 5.9850e+02 9.0740e+02 1.9050e+02 4.3530e+02 + 2.9630e+02 4.3880e+02 1.8574e+03 7.5380e+02 5.3920e+02 4.4720e+02 1.6650e+03 + 1.8551e+03 1.8726e+03 6.3490e+02 5.7610e+02 7.9130e+02 6.1440e+02 4.9820e+02 + 6.4540e+02 3.9320e+02 3.0750e+02 6.7930e+02 6.9370e+02 1.3469e+03 2.9203e+03 + 2.4944e+03 1.6355e+03 3.0790e+02 5.1370e+02 3.0950e+02 2.9200e+02 8.2900e+02 + 5.8140e+02 6.4480e+02 9.9140e+02 2.4517e+03 3.2707e+03 2.1496e+03 4.1100e+02 + 2.7090e+02 3.3080e+02 5.9480e+02 7.6160e+02 3.9350e+02 1.3610e+02 5.1370e+02 + 1.7691e+03 2.7994e+03 4.1287e+03 2.9099e+03 6.2740e+02 8.9850e+02 5.4080e+02 + 5.0110e+02 5.1660e+02 4.3480e+02 4.4440e+02 4.2970e+02 8.2340e+02 6.8190e+02 + 5.9510e+02 6.1020e+02 8.8190e+02 5.9760e+02 2.6230e+02 1.2110e+02 1.6250e+03 + 6.3580e+02 7.4160e+02 3.1240e+02 9.9850e+02 1.6507e+03 2.1961e+03 1.0966e+03 + 1.0304e+03 5.5160e+02 5.7870e+02 3.8100e+02 6.3880e+02 9.0900e+02 3.3730e+02 + 2.4840e+02 4.7210e+02 5.2890e+02 1.9564e+03 2.7330e+03 1.7077e+03 5.3510e+02 + 7.6750e+02 4.2210e+02 4.4600e+02 7.7960e+02 1.0825e+03 6.7380e+02 7.1960e+02 + 1.8839e+03 1.7578e+03 1.7211e+03 6.0360e+02 5.2900e+02 4.8600e+02 1.0148e+03 + 8.7450e+02 3.7290e+02 4.3770e+02 3.1210e+02 7.3610e+02 1.6718e+03 3.2342e+03 + 2.9706e+03 2.4895e+03 6.2230e+02 4.2070e+02 3.4970e+02 2.7360e+02 5.4510e+02 + 5.4180e+02 2.8390e+02 1.2141e+03 3.4140e+02 8.4310e+02 6.3130e+02 9.4820e+02 + 6.8060e+02 2.2130e+02 1.1470e+02 1.5227e+03 3.9390e+02 8.0900e+02 2.3816e+03 + 2.8722e+03 1.1716e+03 6.0630e+02 5.4130e+02 1.4920e+02 5.0500e+02 3.6534e+03 + 3.3456e+03 1.9795e+03 1.1904e+03 9.9840e+02 1.0301e+03 5.4230e+02 4.0180e+02 + 1.7310e+02 6.1680e+02 1.0152e+03 4.2358e+03 2.7366e+03 1.1221e+03 1.0238e+03 + 5.0550e+02 8.7280e+02 3.0440e+03 2.6312e+03 2.4272e+03 8.6970e+02 8.5850e+02 + 6.9480e+02 4.1410e+02 5.5970e+02 6.2140e+02 4.6620e+02 8.2470e+02 2.0350e+03 + 3.2544e+03 3.5005e+03 4.6837e+03 2.5018e+03 5.9680e+02 3.7710e+02 4.6720e+02 + 1.4580e+02 1.6580e+02 2.1710e+02 4.8170e+02 2.0220e+02 4.6260e+02 5.3320e+02 + 1.2692e+03 7.1100e+02 5.8620e+02 8.2130e+02 1.1615e+03 1.0542e+03 7.5080e+02 + 6.6430e+02 5.2170e+02 8.2070e+02 3.4718e+03 2.6458e+03 8.3080e+02 3.8490e+02 + 4.0700e+02 3.0690e+02 1.3509e+03 2.0088e+03 3.6338e+03 1.0492e+03 5.6030e+02 + 7.0770e+02 6.0060e+02 4.8860e+02 4.4190e+02 2.3160e+02 5.5240e+02 5.0540e+02 + 2.6778e+03 3.2754e+03 2.0459e+03 1.1262e+03 5.5880e+02 4.0560e+02 1.6081e+03 + 3.8068e+03 3.3232e+03 1.3786e+03 8.6880e+02 5.6400e+02 3.2470e+02 6.6230e+02 + 9.3460e+02 7.1700e+02 9.2490e+02 7.1060e+02 1.9616e+03 2*5.6000e+03 + 2.9184e+03 1.1431e+03 3.4630e+02 3.6770e+02 2.5660e+02 2.0190e+02 5.7680e+02 + 2.7270e+02 1.7680e+02 1.6730e+02 7.4560e+02 7.4210e+02 6.2400e+02 4.6540e+02 + 9.9870e+02 9.2350e+02 4.7940e+02 7.2090e+02 2.6270e+02 9.5170e+02 1.0582e+03 + 3.6007e+03 1.7263e+03 8.3270e+02 2.5430e+02 4.1260e+02 3.7720e+02 1.2457e+03 + 4.2684e+03 3.1807e+03 1.5118e+03 5.3090e+02 4.1100e+02 3.6660e+02 4.1570e+02 + 3.1190e+02 3.8270e+02 3.5640e+02 4.8210e+02 1.5003e+03 4.4075e+03 1.0307e+03 + 1.2233e+03 3.0460e+02 2.6340e+02 1.8915e+03 2.0517e+03 2.5639e+03 2.2308e+03 + 1.2110e+03 5.7240e+02 3.5340e+02 7.4650e+02 7.4050e+02 5.4900e+02 4.4710e+02 + 3.4320e+02 2.2966e+03 5.2424e+03 3.6745e+03 4.8856e+03 1.9848e+03 1.3973e+03 + 8.2680e+02 4.2440e+02 2.9570e+02 8.8070e+02 3.9890e+02 3.1740e+02 6.1300e+02 + 5.2990e+02 8.3850e+02 6.1760e+02 4.4980e+02 5.1990e+02 7.4520e+02 4.2570e+02 + 4.8320e+02 1.8929e+03 9.9410e+02 2.6639e+03 2.9142e+03 2.2117e+03 5.4650e+02 + 5.1590e+02 2.5450e+02 6.8650e+02 2.0602e+03 4.0160e+03 2.2141e+03 8.7030e+02 + 3.2040e+02 2.5150e+02 7.5970e+02 4.0930e+02 4.8540e+02 5.1920e+02 4.2750e+02 + 3.2640e+02 2.0978e+03 3.2161e+03 2.2433e+03 7.6880e+02 4.2800e+02 4.1630e+02 + 9.4760e+02 1.7482e+03 2.3047e+03 2.5557e+03 9.8580e+02 3.2020e+02 9.0850e+02 + 1.0436e+03 3.6430e+02 4.2800e+02 2.6200e+02 6.2740e+02 1.1932e+03 3.3769e+03 + 3.5684e+03 3.0743e+03 3.9568e+03 9.6420e+02 7.3960e+02 7.9360e+02 3.0590e+02 + 5.5470e+02 7.0190e+02 4.4740e+02 4.4440e+02 6.0020e+02 4.7120e+02 4.5140e+02 + 8.1520e+02 4.4350e+02 3.1700e+02 8.4390e+02 9.1480e+02 2.1724e+03 2.1870e+03 + 2.3198e+03 2.8978e+03 1.1268e+03 3.4240e+02 4.8620e+02 3.4810e+02 8.7700e+02 + 2.1498e+03 2.6201e+03 2.7544e+03 8.0540e+02 3.9670e+02 5.0210e+02 4.6530e+02 + 3.5720e+02 3.2190e+02 3.7530e+02 7.0310e+02 4.4450e+02 1.4199e+03 3.3570e+03 + 2.9681e+03 1.4159e+03 9.6160e+02 5.7090e+02 1.5607e+03 1.0676e+03 1.1101e+03 + 2.0562e+03 3.3193e+03 1.8168e+03 1.0618e+03 5.7080e+02 4.5580e+02 3.9350e+02 + 1.8420e+02 5.8070e+02 1.9519e+03 2.5433e+03 4.3672e+03 1.9398e+03 4.4180e+03 + 2.1817e+03 6.6520e+02 3.6930e+02 5.2360e+02 4.6050e+02 6.3170e+02 5.3800e+02 + 1.0974e+03 2.2340e+02 3.7940e+02 3.5990e+02 7.7630e+02 3.9120e+02 2.8750e+02 + 5.1070e+02 1.0292e+03 1.8916e+03 1.8348e+03 3.5053e+03 3.6318e+03 4.0810e+02 + 4.3460e+02 6.2340e+02 6.3490e+02 7.1380e+02 2.5718e+03 4.0531e+03 2.7702e+03 + 4.9480e+02 3.3180e+02 4.3570e+02 8.7570e+02 2.6930e+02 2.8580e+02 4.5240e+02 + 4.6110e+02 6.1350e+02 1.4196e+03 2.7842e+03 2.7425e+03 2.1306e+03 7.2190e+02 + 4.9870e+02 7.3020e+02 7.0180e+02 9.0010e+02 2.0205e+03 2.6169e+03 2.5246e+03 + 1.6244e+03 6.1640e+02 6.3420e+02 4.2200e+02 3.3780e+02 4.0700e+02 2.3080e+03 + 2.9260e+03 3.2206e+03 3.9348e+03 4.2729e+03 2.9240e+03 8.5530e+02 5.7890e+02 + 3.4810e+02 8.0770e+02 6.1440e+02 5.5930e+02 2.8970e+02 1.8300e+02 6.3580e+02 + 4.1450e+02 1.1645e+03 3.2170e+02 5.7400e+02 1.1997e+03 2.1464e+03 3.3997e+03 + 3.1880e+03 2.9100e+03 2.0805e+03 5.7900e+02 1.9940e+02 4.2980e+02 4.8980e+02 + 5.3210e+02 2.0018e+03 2.2654e+03 1.9611e+03 1.0721e+03 6.8950e+02 5.8130e+02 + 7.6690e+02 3.0790e+02 2.7600e+02 3.5290e+02 4.7870e+02 8.9410e+02 1.6044e+03 + 2.2089e+03 3.0099e+03 1.9622e+03 7.7110e+02 5.4810e+02 7.3090e+02 6.8040e+02 + 1.2466e+03 2.1292e+03 3.1057e+03 2.8608e+03 2.1496e+03 9.7700e+02 5.3760e+02 + 4.2830e+02 1.8150e+02 3.0020e+02 1.3046e+03 2.1961e+03 2.2596e+03 3.2136e+03 + 2.9219e+03 2.6747e+03 4.5810e+02 2.1610e+02 4.0950e+02 6.4400e+02 1.0575e+03 + 1.1538e+03 4.0130e+02 3.0100e+02 3.2540e+02 5.5240e+02 5.6300e+02 3.9750e+02 + 5.3360e+02 6.5020e+02 2.0050e+03 2.7087e+03 4.2402e+03 3.0391e+03 1.5742e+03 + 2.2400e+02 2.7930e+02 9.6650e+02 8.4310e+02 4.5170e+02 1.2179e+03 3.9450e+03 + 2.0226e+03 7.2130e+02 7.5430e+02 8.1570e+02 7.9350e+02 2.8500e+02 2.7340e+02 + 6.3420e+02 2.9640e+02 2.6550e+02 9.6490e+02 3.0254e+03 3.6537e+03 1.4628e+03 + 7.4900e+02 5.6710e+02 5.0500e+02 3.3050e+02 5.0200e+02 9.2710e+02 2.2404e+03 + 2.6277e+03 2.0262e+03 2.1246e+03 6.0690e+02 2.3380e+02 3.7220e+02 3.4100e+02 + 2.6953e+03 3.0098e+03 2.4505e+03 2.2619e+03 2.4373e+03 2.3647e+03 5.8570e+02 + 3.0020e+02 3.3370e+02 6.7350e+02 8.2710e+02 3.4470e+02 4.7720e+02 3.3380e+02 + 4.8270e+02 5.6180e+02 2.2210e+02 2.8590e+02 4.9930e+02 4.8340e+02 2.0023e+03 + 3.9137e+03 3.4278e+03 3.9016e+03 5.7160e+02 2.0650e+02 6.2510e+02 6.9730e+02 + 5.2320e+02 2.7260e+02 8.5440e+02 3.9242e+03 2.4153e+03 9.1740e+02 7.9690e+02 + 7.3390e+02 9.6180e+02 2.4600e+02 4.6970e+02 6.1190e+02 2.9140e+02 2.9320e+02 + 6.7030e+02 1.9976e+03 3.3504e+03 1.7905e+03 9.8110e+02 4.4200e+02 4.9590e+02 + 5.6590e+02 3.9480e+02 8.1640e+02 1.2799e+03 2.2945e+03 2.9164e+03 2.0133e+03 + 1.1237e+03 3.5710e+02 3.1360e+02 4.5370e+02 2.4274e+03 3.0183e+03 1.1461e+03 + 2.4123e+03 2.3423e+03 1.5130e+03 1.0014e+03 4.4950e+02 4.0590e+02 8.2330e+02 + 6.0320e+02 3.4210e+02 3.0630e+02 3.7470e+02 9.8610e+02 4.9880e+02 3.4600e+02 + 3.1910e+02 3.7370e+02 9.7840e+02 1.9987e+03 3.6350e+03 3.3699e+03 3.0240e+03 + 9.4720e+02 3.0310e+02 2.5810e+02 1.5812e+03 6.5660e+02 3.1800e+02 7.5650e+02 + 3.0004e+03 2.3709e+03 5.1680e+02 7.4440e+02 4.9370e+02 4.7070e+02 6.2350e+02 + 2.8120e+02 5.4500e+02 2.6320e+02 2.0570e+02 5.9060e+02 2.5046e+03 2.9577e+03 + 1.5695e+03 4.2260e+02 8.0090e+02 5.0720e+02 4.7440e+02 4.0680e+02 3.6750e+02 + 7.2560e+02 1.3609e+03 2.8999e+03 2.8205e+03 2.3965e+03 7.5400e+02 3.1260e+02 + 1.6594e+03 2.9411e+03 2.5467e+03 1.8741e+03 2.2797e+03 3.1727e+03 2.1061e+03 + 6.2790e+02 3.0300e+02 3.1480e+02 4.8650e+02 4.4900e+02 1.5020e+02 2.5270e+02 + 2.7590e+02 3.1700e+02 6.5000e+02 3.2850e+02 4.5330e+02 4.3920e+02 7.3190e+02 + 2.2235e+03 3.9365e+03 1.8063e+03 3.6344e+03 9.5490e+02 6.1080e+02 5.2650e+02 + 4.3090e+02 6.9050e+02 3.1300e+02 1.2300e+03 2.4339e+03 2.1437e+03 4.5240e+02 + 6.0580e+02 5.6040e+02 7.4980e+02 7.8340e+02 2.8900e+02 5.2090e+02 5.1740e+02 + 4.8300e+02 4.8110e+02 1.8421e+03 4.5752e+03 1.4374e+03 5.5240e+02 2.6790e+02 + 6.9690e+02 7.7110e+02 4.1690e+02 3.1060e+02 4.3070e+02 5.8520e+02 2.2107e+03 + 4.5535e+03 2.4637e+03 2.9540e+02 6.5790e+02 7.8800e+02 4.3083e+03 2.0816e+03 + 9.7620e+02 2.1093e+03 3.0157e+03 1.8722e+03 7.7550e+02 2.8270e+02 4.0050e+02 + 4.4740e+02 3.7270e+02 2.9410e+02 1.9360e+02 7.9500e+02 4.9660e+02 4.2900e+02 + 3.7650e+02 4.4470e+02 5.3340e+02 1.1498e+03 1.9305e+03 2.9480e+03 2.4512e+03 + 3.2940e+03 2.1240e+03 6.1260e+02 4.4770e+02 1.5833e+03 5.4200e+02 2.0750e+02 + 9.2760e+02 2.0306e+03 3.0737e+03 6.2770e+02 7.7860e+02 5.4620e+02 5.9340e+02 + 6.9570e+02 3.5210e+02 5.4750e+02 4.2650e+02 6.6300e+02 5.4680e+02 2.2349e+03 + 4.2610e+03 2.3745e+03 8.9910e+02 2.9000e+02 3.4770e+02 5.7100e+02 6.8150e+02 + 2.6420e+02 4.2290e+02 7.2920e+02 9.0280e+02 4.3739e+03 3.0405e+03 1.4959e+03 + 1.5472e+03 2.3507e+03 3.2409e+03 1.4220e+03 1.3595e+03 3.7898e+03 2.8599e+03 + 7.9680e+02 4.5240e+02 5.2180e+02 2.2710e+02 4.0500e+02 5.1010e+02 5.4950e+02 + 4.7460e+02 3.9810e+02 5.3920e+02 4.9130e+02 3.8100e+02 6.0690e+02 4.3750e+02 + 1.0073e+03 3.1140e+03 2.5582e+03 2.1288e+03 4.5528e+03 8.1270e+02 1.1453e+03 + 4.8030e+02 9.7760e+02 3.1610e+02 4.0670e+02 2.4510e+02 1.9038e+03 3.2550e+03 + 1.4607e+03 5.5250e+02 4.0160e+02 6.5570e+02 3.5740e+02 3.3420e+02 3.9790e+02 + 4.6510e+02 7.8840e+02 6.2920e+02 1.6010e+03 2.9669e+03 2.1492e+03 6.2730e+02 + 1.5490e+02 5.2510e+02 9.7580e+02 5.7740e+02 6.6290e+02 5.5730e+02 1.9620e+02 + 4.6390e+02 2.4549e+03 2.3195e+03 3.0685e+03 1.7543e+03 2.5639e+03 2.0440e+03 + 1.8088e+03 1.2576e+03 3.8028e+03 3.3131e+03 7.6850e+02 6.0840e+02 3.3520e+02 + 2.9500e+02 2.3970e+02 3.1470e+02 7.2210e+02 4.9620e+02 2.7970e+02 7.0370e+02 + 4.9030e+02 2.7790e+02 4.8390e+02 5.5660e+02 1.6293e+03 3.3937e+03 2.2853e+03 + 2.1149e+03 4.7906e+03 1.2083e+03 1.0777e+03 1.3564e+03 5.8820e+02 7.5160e+02 + 4.3960e+02 4.9480e+02 2.0222e+03 3.8909e+03 2.5456e+03 2.1540e+02 4.9970e+02 + 4.7630e+02 5.4200e+02 4.6840e+02 5.2430e+02 2.4960e+02 1.1164e+03 7.0480e+02 + 2.1169e+03 4.4006e+03 2.0384e+03 5.1930e+02 1.5130e+02 6.3250e+02 2.8260e+02 + 6.6270e+02 5.2360e+02 3.3010e+02 2.3070e+02 2.0840e+02 1.9978e+03 3.5074e+03 + 2.7373e+03 2.2566e+03 2.7985e+03 1.4616e+03 1.2567e+03 1.7894e+03 1.9386e+03 + 2.6752e+03 9.0790e+02 4.0880e+02 5.5300e+02 3.7530e+02 3.0950e+02 2.8420e+02 + 5.3210e+02 5.1950e+02 3.8450e+02 6.3130e+02 6.2000e+02 2.9910e+02 1.8100e+02 + 9.3990e+02 1.4521e+03 2.9953e+03 2.5709e+03 2.0976e+03 3.3690e+03 2.1567e+03 + 5.4870e+02 5.5860e+02 5.5990e+02 6.1490e+02 7.1950e+02 4.4050e+02 9.2460e+02 + 4.3470e+03 4.0010e+03 7.7040e+02 6.3080e+02 8.5520e+02 5.1490e+02 6.0010e+02 + 2.7140e+02 7.9390e+02 7.6030e+02 7.6180e+02 2.9866e+03 4.3348e+03 1.0423e+03 + 4.7030e+02 1.5490e+02 5.9090e+02 7.0630e+02 7.9080e+02 4.2590e+02 5.1090e+02 + 4.6630e+02 3.7170e+02 1.3335e+03 2.1639e+03 4.8413e+03 2.7083e+03 2.3434e+03 + 1.8055e+03 7.1420e+02 1.3244e+03 3.5344e+03 3.3820e+03 5.4550e+02 3.6560e+02 + 5.2560e+02 4.0050e+02 2.9730e+02 4.6590e+02 3.1230e+02 3.4230e+02 6.5220e+02 + 7.7890e+02 6.3210e+02 4.7920e+02 4.4440e+02 7.3960e+02 2.1177e+03 2.6482e+03 + 2.7180e+03 2.2171e+03 4.0645e+03 1.0080e+03 9.2370e+02 5.4580e+02 4.2350e+02 + 8.9320e+02 1.0832e+03 5.1760e+02 5.4250e+02 2.1664e+03 3.2791e+03 1.8494e+03 + 4.3480e+02 5.2960e+02 5.6630e+02 4.3570e+02 8.9910e+02 6.5540e+02 6.4610e+02 + 1.8178e+03 3.5527e+03 3.1316e+03 1.3888e+03 7.2760e+02 3.6630e+02 7.0330e+02 + 5.6530e+02 4.0220e+02 2.6610e+02 8.5930e+02 7.2830e+02 4.5270e+02 1.0284e+03 + 3.0646e+03 5.3468e+03 3.2703e+03 2.8402e+03 1.2593e+03 4.7740e+02 1.5140e+03 + 4.1307e+03 2.1429e+03 4.4140e+02 2.5620e+02 3.8920e+02 3.9660e+02 6.3870e+02 + 5.6700e+02 4.4210e+02 2.9500e+02 3.9130e+02 8.7010e+02 5.3010e+02 4.4000e+02 + 2.2150e+02 6.8530e+02 1.0145e+03 3.9313e+03 2.3889e+03 3.3943e+03 4.6437e+03 + 2.1088e+03 7.0340e+02 2.7480e+02 4.3490e+02 6.1160e+02 7.4720e+02 8.7060e+02 + 1.2734e+03 1.9300e+03 3.5191e+03 4.0411e+03 1.3697e+03 4.4110e+02 7.6110e+02 + 3.7660e+02 3.0920e+02 5.5870e+02 4.8270e+02 2.3419e+03 2.3809e+03 2.8964e+03 + 9.3960e+02 7.5430e+02 5.8520e+02 2.6920e+02 5.1440e+02 2.7010e+02 5.4220e+02 + 4.5330e+02 5.1440e+02 6.8210e+02 4.1480e+02 3.5651e+03 4.2808e+03 5.6000e+03 + 1.8661e+03 6.3150e+02 5.3250e+02 7.8370e+02 3.8896e+03 2.0462e+03 6.7270e+02 + 6.2560e+02 5.1950e+02 4.0450e+02 7.2860e+02 3.4590e+02 6.4600e+02 3.2840e+02 + 2.8230e+02 6.5350e+02 6.7890e+02 4.1120e+02 3.7610e+02 5.3220e+02 5.7320e+02 + 2.6829e+03 3.6897e+03 1.5251e+03 5.3968e+03 2.3727e+03 3.2890e+02 3.3830e+02 + 4.3400e+02 4.5560e+02 5.8640e+02 4.7430e+02 4.2080e+02 1.9691e+03 1.9968e+03 + 4.1724e+03 1.8571e+03 6.5400e+02 5.4070e+02 2.2710e+02 6.6210e+02 3.2150e+02 + 6.5510e+02 1.8264e+03 4.7806e+03 3.0576e+03 1.0254e+03 5.1100e+02 3.5540e+02 + 6.1210e+02 1.2217e+03 5.5930e+02 3.7230e+02 4.6180e+02 3.4750e+02 3.7560e+02 + 1.1086e+03 2.2815e+03 5.6000e+03 3.8338e+03 9.3120e+02 7.8510e+02 8.4670e+02 + 1.3437e+03 3.2696e+03 2.7918e+03 9.3940e+02 7.4780e+02 3.1740e+02 3.2280e+02 + 3.6390e+02 3.1250e+02 6.6120e+02 2.8350e+02 2.9470e+02 5.3480e+02 5.5140e+02 + 2.9770e+02 4.0700e+02 4.1280e+02 5.7880e+02 2.2685e+03 2.3524e+03 2.8905e+03 + 4.4327e+03 2.2664e+03 3.4570e+02 3.7650e+02 8.7580e+02 9.0400e+02 6.1450e+02 + 5.0020e+02 5.3870e+02 8.0920e+02 1.8188e+03 3.1616e+03 3.2104e+03 1.3026e+03 + 7.5830e+02 1.6590e+02 1.6470e+02 2.9080e+02 6.6030e+02 3.4891e+03 3.2498e+03 + 2.3375e+03 6.9180e+02 6.4280e+02 2.8810e+02 5.6100e+02 1.0610e+03 7.1550e+02 + 4.8850e+02 3.2180e+02 6.3300e+02 6.5170e+02 1.0884e+03 3.5876e+03 5.3116e+03 + 5.3204e+03 7.0380e+02 5.6000e+02 5.4150e+02 9.1480e+02 3.0924e+03 5.2328e+03 + 2.3346e+03 6.7880e+02 3.6640e+02 1.6280e+02 5.3280e+02 8.1570e+02 5.0200e+02 + 6.3890e+02 5.9550e+02 6.1370e+02 5.4670e+02 6.2530e+02 7.3440e+02 3.8430e+02 + 2.2820e+02 1.1571e+03 2.2371e+03 2.1084e+03 4.7397e+03 1.9892e+03 3.0390e+02 + 4.6780e+02 1.1751e+03 8.0490e+02 3.2710e+02 1.4410e+02 3.2810e+02 6.5360e+02 + 1.2389e+03 2.1364e+03 3.0078e+03 1.5959e+03 5.8420e+02 4.9130e+02 1.6700e+02 + 4.0380e+02 7.5230e+02 4.1046e+03 3.2329e+03 1.6520e+03 4.3240e+02 6.3680e+02 + 3.7640e+02 3.3220e+02 5.6590e+02 4.5050e+02 6.2740e+02 4.0340e+02 6.6220e+02 + 5.7670e+02 5.6280e+02 3.5516e+03 4.6237e+03 4.8609e+03 8.5480e+02 2.1900e+02 + 3.5070e+02 1.8574e+03 2.4129e+03 4.1208e+03 1.1699e+03 7.9760e+02 8.1730e+02 + 4.1320e+02 9.3100e+02 7.4760e+02 9.3920e+02 5.1590e+02 8.5270e+02 6.4770e+02 + 4.1110e+02 4.6380e+02 8.2780e+02 3.2910e+02 9.2400e+01 1.0906e+03 3.1156e+03 + 2.0710e+03 3.2117e+03 2.9662e+03 6.4340e+02 8.3060e+02 1.0349e+03 5.7770e+02 + 2.9710e+02 1.8420e+02 4.8530e+02 3.0430e+02 1.0339e+03 1.9722e+03 3.2904e+03 + 2.1637e+03 6.3950e+02 4.8960e+02 4.0960e+02 4.9480e+02 1.7257e+03 4.3850e+03 + 2.1605e+03 1.4047e+03 6.8160e+02 1.1426e+03 6.4030e+02 4.2550e+02 7.0150e+02 + 6.2320e+02 6.0370e+02 3.1200e+02 4.6990e+02 5.8920e+02 1.7732e+03 4.2107e+03 + 5.1428e+03 2.1089e+03 1.2280e+03 2.6340e+02 3.0330e+02 9.2200e+02 2.3165e+03 + 4.0800e+03 2.1516e+03 8.5370e+02 8.8350e+02 3.7000e+02 7.2330e+02 8.4540e+02 + 7.6200e+02 6.5020e+02 6.1920e+02 5.0140e+02 2.8380e+02 7.2210e+02 6.9230e+02 + 2.7060e+02 1.6710e+02 4.6060e+02 3.0839e+03 7.7150e+02 3.1197e+03 3.5315e+03 + 6.0040e+02 5.6210e+02 9.1360e+02 6.4500e+02 1.9230e+02 6.8840e+02 3.7680e+02 + 6.3790e+02 7.0570e+02 2.3465e+03 2.1056e+03 3.4585e+03 1.7107e+03 1.2179e+03 + 6.5660e+02 9.4900e+02 2.6500e+03 2.7805e+03 1.9253e+03 4.9440e+02 5.2620e+02 + 8.4150e+02 7.0150e+02 3.4210e+02 2.2340e+02 3.6140e+02 6.3770e+02 6.9730e+02 + 3.6740e+02 4.5710e+02 2.8817e+03 5.0135e+03 4.3217e+03 2.4378e+03 1.4297e+03 + 3.0390e+02 1.7800e+02 4.2520e+02 2.1119e+03 2.5322e+03 1.8462e+03 1.3683e+03 + 9.8760e+02 5.9940e+02 1.3126e+03 1.0824e+03 4.6950e+02 5.7130e+02 6.2920e+02 + 2.1430e+02 7.6060e+02 7.2310e+02 5.0230e+02 5.2810e+02 3.1070e+02 8.8830e+02 + 3.1883e+03 4.4550e+02 3.9062e+03 3.4958e+03 9.2260e+02 3.4250e+02 5.7480e+02 + 3.8950e+02 1.9780e+02 5.4070e+02 3.6770e+02 3.6690e+02 1.0209e+03 1.2442e+03 + 2.3416e+03 2.8336e+03 2.2984e+03 8.7510e+02 1.0117e+03 1.5244e+03 2.4052e+03 + 2.4466e+03 7.8030e+02 6.3030e+02 5.1100e+02 5.5530e+02 3.6870e+02 3.5490e+02 + 5.9230e+02 4.0660e+02 5.6110e+02 2.0740e+02 4.6160e+02 9.7000e+02 2.1927e+03 + 5.6000e+03 4.7834e+03 2.0314e+03 6.0780e+02 3.7260e+02 1.8500e+02 5.0830e+02 + 1.5062e+03 3.1581e+03 2.5692e+03 3.0779e+03 1.9908e+03 1.0711e+03 6.2000e+02 + 7.4670e+02 6.7390e+02 6.5610e+02 6.8360e+02 6.4170e+02 4.8750e+02 8.8010e+02 + 4.0270e+02 5.9340e+02 8.2950e+02 6.7340e+02 3.4272e+03 4.0870e+02 3.0384e+03 + 5.6000e+03 2.2001e+03 4.1640e+02 3.5260e+02 3.7000e+02 3.3220e+02 5.7280e+02 + 2.2240e+02 2.4520e+02 5.7460e+02 9.1800e+02 9.7050e+02 4.4701e+03 2.2371e+03 + 1.9326e+03 1.8881e+03 2.7790e+03 3.0113e+03 9.4480e+02 1.0841e+03 6.1980e+02 + 6.5830e+02 5.1970e+02 5.6810e+02 4.0240e+02 6.7840e+02 4.3860e+02 4.0560e+02 + 3.9190e+02 5.4120e+02 8.5680e+02 2.8344e+03 3.6162e+03 4.5719e+03 2.6459e+03 + 6.4490e+02 5.1150e+02 6.0440e+02 4.2470e+02 1.1095e+03 2.1032e+03 2.1822e+03 + 2.6273e+03 2.2955e+03 1.8613e+03 1.4671e+03 5.3640e+02 7.1640e+02 9.9340e+02 + 1.0533e+03 6.3210e+02 7.3210e+02 6.5290e+02 3.0710e+02 8.9020e+02 1.4225e+03 + 9.6740e+02 2.5538e+03 3.4460e+02 1.8543e+03 5.6000e+03 2.8229e+03 4.6410e+02 + 4.4190e+02 3.6930e+02 3.7190e+02 4.0840e+02 4.8010e+02 3.4440e+02 3.5590e+02 + 4.2420e+02 1.1193e+03 2.0598e+03 2.9552e+03 2.4112e+03 4.4317e+03 2.6324e+03 + 3.6528e+03 9.9020e+02 3.6340e+02 5.4780e+02 2.8110e+02 6.1170e+02 3.4750e+02 + 4.2160e+02 4.9380e+02 6.4180e+02 1.7340e+02 4.3730e+02 7.7570e+02 2.1930e+03 + 3.8240e+03 3.8471e+03 4.9337e+03 8.1500e+02 6.5880e+02 4.8180e+02 6.2030e+02 + 3.1280e+02 5.5380e+02 1.3818e+03 1.8752e+03 2.3201e+03 2.2751e+03 3.3651e+03 + 3.2472e+03 1.3064e+03 8.5540e+02 8.1920e+02 5.4530e+02 1.4841e+03 8.2920e+02 + 5.4250e+02 2.0010e+02 5.4320e+02 1.0081e+03 1.1224e+03 3.8101e+03 4.0040e+02 + 9.9040e+02 4.0340e+03 3.6758e+03 1.1550e+03 2.1620e+02 6.0470e+02 2.6150e+02 + 3.1080e+02 7.1140e+02 6.3690e+02 4.8690e+02 5.2750e+02 5.3730e+02 1.8534e+03 + 2.2465e+03 4.9989e+03 3.6111e+03 2.5645e+03 2.2630e+03 6.4520e+02 3.5800e+02 + 6.9010e+02 5.6760e+02 4.5290e+02 4.9570e+02 3.9640e+02 6.4820e+02 2.8570e+02 + 2.2090e+02 4.9800e+02 5.2180e+02 2.0094e+03 4.9837e+03 5.6000e+03 3.2625e+03 + 6.2110e+02 2.3850e+02 6.9140e+02 4.0710e+02 3.4900e+02 5.2740e+02 5.3330e+02 + 6.4480e+02 1.6140e+03 1.8989e+03 2.8187e+03 2.6213e+03 1.7214e+03 1.9247e+03 + 2.1705e+03 1.2072e+03 1.5311e+03 5.1010e+02 7.5670e+02 5.3790e+02 6.4400e+02 + 3.8090e+02 1.9466e+03 3.5522e+03 2.4740e+02 5.8940e+02 2.3103e+03 3.2835e+03 + 1.6343e+03 1.4117e+03 5.4920e+02 2.2310e+02 3.7980e+02 6.1160e+02 7.9710e+02 + 6.2180e+02 5.5180e+02 5.8340e+02 8.9030e+02 3.7818e+03 5.6000e+03 3.3658e+03 + 2.2971e+03 8.0280e+02 7.6990e+02 3.0320e+02 5.7610e+02 6.6280e+02 4.8260e+02 + 1.4690e+02 4.6420e+02 5.9040e+02 3.8720e+02 4.4400e+02 6.9940e+02 9.4830e+02 + 2.0943e+03 3.2633e+03 4.7954e+03 2.6929e+03 7.9840e+02 4.0800e+02 6.6000e+02 + 4.0920e+02 2.4140e+02 3.0660e+02 8.2540e+02 3.7500e+02 5.0640e+02 8.1080e+02 + 2.0991e+03 2.4428e+03 1.1912e+03 1.3702e+03 1.9015e+03 2.1452e+03 2.0412e+03 + 8.8470e+02 4.7140e+02 7.1900e+02 5.8430e+02 4.0760e+02 2.9976e+03 3.1499e+03 + 3.0660e+02 8.8490e+02 8.0740e+02 2.3314e+03 3.6461e+03 1.6592e+03 9.7340e+02 + 2.1630e+02 3.0580e+02 7.5790e+02 4.7010e+02 8.1310e+02 1.1529e+03 4.9980e+02 + 1.8575e+03 3.4169e+03 5.6000e+03 1.6862e+03 1.8443e+03 8.6730e+02 8.2260e+02 + 6.1500e+02 2.5830e+02 5.6180e+02 8.1090e+02 5.5860e+02 5.0470e+02 5.5860e+02 + 2.7830e+02 4.0940e+02 8.0220e+02 1.3786e+03 3.8261e+03 4.1312e+03 5.3268e+03 + 2.5201e+03 5.0480e+02 6.1410e+02 1.2700e+03 4.0570e+02 3.0950e+02 2.8110e+02 + 3.7890e+02 4.8680e+02 3.0090e+02 4.4990e+02 1.3058e+03 1.4826e+03 5.5280e+02 + 1.7284e+03 1.9545e+03 2.4777e+03 1.6529e+03 1.4724e+03 2.5317e+03 1.1323e+03 + 3.0730e+02 8.1100e+02 3.4068e+03 3.1340e+03 3.5830e+02 7.4830e+02 1.2394e+03 + 2.3997e+03 2.5102e+03 2.7294e+03 6.6630e+02 3.3180e+02 5.3440e+02 7.0650e+02 + 3.9370e+02 4.9100e+02 6.0990e+02 2.2287e+03 2.2204e+03 4.2267e+03 5.6000e+03 + 1.9775e+03 4.0440e+02 6.0540e+02 6.5070e+02 6.6310e+02 5.3620e+02 4.9500e+02 + 5.8220e+02 4.3090e+02 5.0110e+02 2.2190e+02 4.7630e+02 5.3490e+02 1.1772e+03 + 1.8725e+03 3.7769e+03 2.8746e+03 3.2622e+03 2.1686e+03 4.7850e+02 6.9220e+02 + 9.0560e+02 6.6850e+02 6.2260e+02 3.7200e+02 4.7890e+02 7.7770e+02 3.3850e+02 + 1.3000e+02 4.3920e+02 9.0110e+02 9.2800e+02 8.4550e+02 1.0633e+03 1.6970e+03 + 2.3488e+03 2.1768e+03 1.8975e+03 2.4682e+03 2.3738e+03 1.8536e+03 2.0957e+03 + 2.2567e+03 7.8930e+02 8.4050e+02 9.4750e+02 1.3579e+03 3.3202e+03 2.3787e+03 + 1.6212e+03 3.7490e+02 6.5100e+02 4.1190e+02 1.5860e+02 6.2560e+02 1.2732e+03 + 2.8315e+03 2.6486e+03 2.6830e+03 3.3775e+03 2.3946e+03 4.0390e+02 4.8300e+02 + 3.4090e+02 4.0430e+02 6.5520e+02 6.7760e+02 5.1260e+02 3.8660e+02 4.2340e+02 + 2.3980e+02 2.2690e+02 6.1070e+02 2.4280e+03 2.4070e+03 3.5605e+03 2.2468e+03 + 3.0441e+03 1.1087e+03 5.2960e+02 4.8130e+02 9.1120e+02 5.0470e+02 3.3050e+02 + 7.1520e+02 6.4900e+02 6.8290e+02 3.5710e+02 3.4170e+02 2.9020e+02 3.2450e+02 + 5.1910e+02 6.3130e+02 4.9890e+02 1.0645e+03 6.7610e+02 1.8140e+03 1.9592e+03 + 2.2005e+03 4.3082e+03 2.2832e+03 3.7889e+03 1.9781e+03 5.7100e+02 8.7220e+02 + 4.5180e+02 9.9770e+02 2.4646e+03 4.9578e+03 1.9257e+03 4.7810e+02 3.6430e+02 + 5.8150e+02 3.3990e+02 2.1290e+02 1.8968e+03 3.7557e+03 4.0359e+03 2.1054e+03 + 2.9749e+03 1.5472e+03 5.0760e+02 7.6120e+02 1.8130e+02 5.3180e+02 4.1320e+02 + 7.4630e+02 4.9680e+02 2.9540e+02 3.5630e+02 4.1660e+02 3.6870e+02 7.3000e+02 + 2.1678e+03 2.0968e+03 3.1055e+03 3.6196e+03 3.9199e+03 3.6040e+02 5.2190e+02 + 4.9980e+02 4.0070e+02 1.7880e+02 2.9510e+02 9.7310e+02 8.9700e+02 6.0510e+02 + 4.2370e+02 4.6200e+02 2.5930e+02 4.3510e+02 5.5510e+02 4.5560e+02 5.7230e+02 + 9.9550e+02 3.6020e+02 1.0478e+03 1.6530e+03 3.1841e+03 4.5695e+03 4.6139e+03 + 2.6273e+03 7.1220e+02 5.0160e+02 7.8850e+02 5.9840e+02 4.5570e+02 1.0267e+03 + 3.1341e+03 2.5309e+03 6.5720e+02 3.6890e+02 8.9770e+02 7.0940e+02 6.3420e+02 + 2.0326e+03 3.1804e+03 2.1447e+03 1.3250e+03 4.2439e+03 2.2177e+03 1.2157e+03 + 6.5590e+02 5.0210e+02 5.1320e+02 3.5050e+02 7.0460e+02 6.5500e+02 4.1660e+02 + 2.7870e+02 5.7750e+02 2.3550e+02 7.8280e+02 2.1157e+03 4.3231e+03 1.8371e+03 + 3.1203e+03 4.3252e+03 8.4550e+02 4.8020e+02 6.9970e+02 4.4550e+02 3.8670e+02 + 5.3640e+02 5.2540e+02 3.8620e+02 3.6020e+02 4.1090e+02 7.0440e+02 4.6840e+02 + 9.4500e+02 8.8110e+02 5.2880e+02 5.6700e+02 9.9580e+02 6.5080e+02 3.6620e+02 + 4.6220e+02 2.0106e+03 2*5.6000e+03 3.2354e+03 1.0722e+03 7.8020e+02 + 5.8410e+02 1.0745e+03 3.9310e+02 1.4823e+03 3.8191e+03 3.2526e+03 8.8530e+02 + 3.9260e+02 1.0723e+03 9.9890e+02 2.2057e+03 2.5508e+03 2.5029e+03 2.6054e+03 + 1.8510e+03 2.8463e+03 2.6833e+03 1.0915e+03 5.4690e+02 6.3020e+02 4.7450e+02 + 6.5220e+02 7.4020e+02 3.4040e+02 2.7500e+02 3.8260e+02 6.7710e+02 5.0120e+02 + 7.9000e+02 3.7336e+03 3.5290e+03 2.0425e+03 2.2307e+03 3.6770e+03 5.9020e+02 + 3.9020e+02 5.3280e+02 6.2870e+02 5.8730e+02 2.6890e+02 7.1240e+02 3.0260e+02 + 2.6190e+02 4.2210e+02 8.9690e+02 4.1040e+02 7.5290e+02 3.4150e+02 2.4860e+02 + 5.4870e+02 5.5230e+02 6.5420e+02 1.7200e+03 7.8530e+02 2.2056e+03 5.0895e+03 + 5.1238e+03 3.8651e+03 7.9750e+02 5.3750e+02 7.4510e+02 5.4020e+02 8.6610e+02 + 9.6270e+02 4.3739e+03 3.7263e+03 7.3540e+02 5.0890e+02 5.5990e+02 1.8805e+03 + 2.0684e+03 3.1689e+03 2.3571e+03 1.5523e+03 1.9534e+03 2.3900e+03 2.0472e+03 + 9.8970e+02 5.1600e+02 2.8810e+02 2.4870e+02 5.0250e+02 4.8220e+02 5.3590e+02 + 2.8380e+02 2.3010e+02 7.2030e+02 1.1439e+03 1.6705e+03 2.4770e+03 3.2117e+03 + 1.7120e+03 2.3525e+03 3.4963e+03 2.0133e+03 3.9460e+02 4.5810e+02 3.9070e+02 + 7.4420e+02 3.5540e+02 5.7230e+02 1.7980e+02 3.8450e+02 6.3330e+02 6.8680e+02 + 7.5060e+02 7.7610e+02 4.5880e+02 2.9420e+02 5.5370e+02 3.1020e+02 9.5560e+02 + 1.4073e+03 1.1668e+03 3.6595e+03 3.8341e+03 4.4609e+03 5.2292e+03 9.2960e+02 + 4.8500e+02 4.3640e+02 7.1430e+02 9.9530e+02 1.2521e+03 4.4200e+03 2.7394e+03 + 1.1134e+03 4.2260e+02 2.2114e+03 2.2670e+03 2.3705e+03 1.0882e+03 9.0230e+02 + 7.0250e+02 2.2409e+03 2.0753e+03 2.0827e+03 2.8490e+02 2.2550e+02 3.5250e+02 + 3.5500e+02 5.0270e+02 3.6190e+02 5.8580e+02 3.9990e+02 3.4720e+02 4.0960e+02 + 7.7110e+02 5.7310e+02 3.4556e+03 3.1236e+03 2.2474e+03 2.9072e+03 2.8628e+03 + 6.8020e+02 3.6160e+02 3.1530e+02 7.7660e+02 6.1300e+02 4.1580e+02 4.3160e+02 + 2.4310e+02 5.1960e+02 8.9400e+02 5.0030e+02 6.9110e+02 3.0950e+02 3.7450e+02 + 5.5880e+02 5.3760e+02 8.3410e+02 1.7150e+03 1.2985e+03 1.9249e+03 3.8083e+03 + 2.0405e+03 2.2249e+03 2.4027e+03 2.7291e+03 3.0320e+02 5.7770e+02 6.5820e+02 + 8.3230e+02 1.4523e+03 2.7605e+03 3.9967e+03 8.6720e+02 1.8528e+03 3.7495e+03 + 3.9143e+03 1.5043e+03 4.9700e+02 2.6570e+02 8.5810e+02 1.8585e+03 2.2959e+03 + 3.0457e+03 5.7200e+02 2.4470e+02 5.7290e+02 3.5430e+02 5.2920e+02 7.9400e+02 + 9.2360e+02 8.0390e+02 6.3580e+02 5.3980e+02 2.8890e+02 6.7990e+02 2.3512e+03 + 3.6596e+03 9.9740e+02 2.2747e+03 2.8236e+03 7.5300e+02 6.4730e+02 1.9080e+02 + 3.8320e+02 1.1563e+03 4.8990e+02 4.0520e+02 2.9410e+02 1.0612e+03 1.1681e+03 + 5.6540e+02 4.7360e+02 4.4200e+02 3.2030e+02 6.4390e+02 6.0630e+02 8.8690e+02 + 6.8320e+02 1.2597e+03 2.4892e+03 2.6848e+03 2.5486e+03 6.8570e+02 2.0748e+03 + 3.1118e+03 6.9090e+02 6.2880e+02 5.2970e+02 5.7580e+02 6.7220e+02 2.0720e+03 + 3.2197e+03 2.3417e+03 3.3532e+03 3.1022e+03 2.2504e+03 1.3210e+03 4.7060e+02 + 1.5680e+02 8.4170e+02 8.1470e+02 3.4089e+03 3.3460e+03 2.9580e+02 3.6920e+02 + 5.3780e+02 5.8390e+02 5.5250e+02 4.1700e+02 9.1790e+02 9.6440e+02 1.0164e+03 + 5.3830e+02 5.7100e+02 2.0671e+03 2.1311e+03 3.7021e+03 1.2231e+03 4.3031e+03 + 2.5448e+03 1.8052e+03 6.8370e+02 2.7070e+02 4.3810e+02 6.4120e+02 3.0780e+02 + 1.5880e+02 3.9020e+02 5.6650e+02 9.1780e+02 5.1350e+02 5.1790e+02 6.4240e+02 + 4.5330e+02 5.6740e+02 1.5055e+03 1.9050e+03 2.7124e+03 2.0883e+03 2.7765e+03 + 1.8336e+03 1.6044e+03 9.6300e+02 8.4740e+02 1.6064e+03 8.5640e+02 4.2990e+02 + 2.2050e+02 3.5040e+02 7.9740e+02 2.1024e+03 2.5330e+03 3.0419e+03 2.8685e+03 + 2.4661e+03 7.3490e+02 4.7020e+02 2.9530e+02 2.2340e+02 5.0910e+02 2.5057e+03 + 3.7071e+03 2.1062e+03 5.1220e+02 3.2860e+02 1.3930e+02 5.2600e+02 3.2250e+02 + 4.6190e+02 6.8590e+02 1.0435e+03 5.8920e+02 4.6160e+02 2.3890e+02 4.7290e+02 + 2.7639e+03 1.9846e+03 1.7609e+03 2.9651e+03 3.4447e+03 2.2475e+03 1.0721e+03 + 7.2410e+02 4.6540e+02 5.9110e+02 4.4380e+02 4.5940e+02 5.2660e+02 7.2190e+02 + 4.9790e+02 2.4630e+02 5.1940e+02 4.7140e+02 7.7930e+02 8.2730e+02 1.6167e+03 + 2.5923e+03 2.4993e+03 2.9748e+03 1.6039e+03 8.0550e+02 8.2020e+02 7.5580e+02 + 5.6940e+02 5.8450e+02 6.2150e+02 5.9870e+02 4.6050e+02 4.3880e+02 4.1030e+02 + 2.6088e+03 2.7992e+03 4.2695e+03 4.7079e+03 2.2611e+03 1.2430e+03 3.4620e+02 + 3.3470e+02 4.9980e+02 4.6210e+02 2.0268e+03 3.2101e+03 1.9691e+03 3.8160e+02 + 3.4840e+02 2.8710e+02 7.3560e+02 3.7140e+02 4.2900e+02 1.1762e+03 9.6420e+02 + 5.4320e+02 2.7870e+02 4.2810e+02 1.1217e+03 2.1622e+03 2.3593e+03 9.7140e+02 + 2.9945e+03 4.1670e+03 2.0262e+03 6.7160e+02 9.6110e+02 4.7170e+02 4.8110e+02 + 3.6240e+02 7.0090e+02 4.2950e+02 6.2570e+02 3.9350e+02 3.8570e+02 2.5580e+02 + 3.7660e+02 6.8570e+02 1.9651e+03 1.8813e+03 2.2169e+03 2.5793e+03 1.9593e+03 + 6.5920e+02 5.7520e+02 4.7950e+02 5.8740e+02 1.6828e+03 9.6320e+02 2.5600e+02 + 3.1710e+02 7.3760e+02 4.3640e+02 5.1770e+02 2.0411e+03 5.0976e+03 3.0005e+03 + 3.2600e+03 1.2361e+03 4.1650e+02 6.8320e+02 5.5710e+02 5.9270e+02 6.7760e+02 + 2.8123e+03 3.4652e+03 1.4802e+03 6.3360e+02 5.1140e+02 2.4170e+02 4.8690e+02 + 5.1040e+02 4.0280e+02 8.2880e+02 5.1230e+02 5.3000e+02 4.1100e+02 3.2250e+02 + 6.9220e+02 2.4356e+03 2.0459e+03 8.8970e+02 1.6467e+03 2.5769e+03 1.9881e+03 + 8.2930e+02 6.2710e+02 7.7650e+02 2.7740e+02 3.7960e+02 5.6620e+02 1.3928e+03 + 5.8310e+02 7.3990e+02 6.1000e+02 2.8430e+02 3.8630e+02 1.3394e+03 2.9896e+03 + 2.2624e+03 2.4360e+03 2.1442e+03 7.2260e+02 2.6850e+02 3.3550e+02 5.0150e+02 + 6.3530e+02 6.4270e+02 6.5520e+02 5.5430e+02 3.6450e+02 2.5790e+02 5.1570e+02 + 7.7200e+02 2.2858e+03 5.6000e+03 2.5415e+03 1.9585e+03 1.0144e+03 5.3040e+02 + 7.4220e+02 8.7990e+02 1.2387e+03 1.1134e+03 3.3551e+03 2.4575e+03 4.9940e+02 + 7.0400e+02 5.5140e+02 7.3720e+02 4.1620e+02 4.0310e+02 3.7430e+02 6.2030e+02 + 4.2680e+02 3.5270e+02 5.6570e+02 4.7330e+02 1.6844e+03 3.2683e+03 2.1831e+03 + 6.1580e+02 1.3857e+03 3.5392e+03 3.8638e+03 7.4510e+02 6.3380e+02 5.8000e+02 + 3.6630e+02 4.4060e+02 4.2720e+02 6.8350e+02 3.9320e+02 4.2300e+02 4.2310e+02 + 6.6660e+02 4.7220e+02 3.0829e+03 2.5541e+03 1.9189e+03 5.4750e+02 4.2490e+02 + 6.7090e+02 3.7350e+02 6.0580e+02 5.8430e+02 3.4300e+02 4.3080e+02 7.2980e+02 + 4.9270e+02 4.9470e+02 9.8460e+02 8.2900e+02 5.9810e+02 2.8816e+03 4.0802e+03 + 2.7019e+03 1.8332e+03 4.4330e+02 8.3410e+02 5.7100e+02 6.7720e+02 1.4719e+03 + 1.9824e+03 4.3920e+03 2.2990e+03 8.2020e+02 9.7300e+02 4.4350e+02 7.1660e+02 + 7.1440e+02 4.9080e+02 5.0360e+02 5.4890e+02 4.2110e+02 3.2580e+02 6.8600e+02 + 7.0510e+02 2.0510e+03 4.1617e+03 2.2689e+03 9.5030e+02 1.2573e+03 2.1754e+03 + 4.4645e+03 1.1082e+03 8.1390e+02 3.1750e+02 2.7650e+02 6.3150e+02 1.0676e+03 + 3.9060e+02 5.4450e+02 8.2340e+02 5.8360e+02 3.3150e+02 5.2080e+02 2.1314e+03 + 2.8432e+03 1.8321e+03 4.7880e+02 6.6760e+02 5.6820e+02 5.8290e+02 7.3200e+02 + 7.5770e+02 3.8370e+02 6.1130e+02 5.2540e+02 3.7250e+02 2.1360e+02 7.8940e+02 + 4.7900e+02 1.3264e+03 3.7570e+03 3.6028e+03 6.6500e+02 6.1390e+02 6.1270e+02 + 5.9540e+02 3.7840e+02 5.7850e+02 5.0290e+02 1.4571e+03 4.9620e+03 2.8549e+03 + 8.0650e+02 3.9820e+02 5.5460e+02 7.1100e+02 8.8490e+02 4.6550e+02 4.1910e+02 + 3.8090e+02 3.8070e+02 5.5120e+02 4.9950e+02 7.5400e+02 1.0796e+03 3.0637e+03 + 3.2777e+03 1.5859e+03 7.1030e+02 2.1530e+03 4.4604e+03 1.9345e+03 6.7210e+02 + 5.9890e+02 8.8970e+02 9.7190e+02 8.0650e+02 4.8570e+02 4.1970e+02 5.6420e+02 + 7.7360e+02 4.8600e+02 1.1599e+03 2.7033e+03 2.4833e+03 1.1123e+03 3.8340e+02 + 4.8750e+02 2.5280e+02 4.3490e+02 4.4630e+02 6.3810e+02 2.7420e+02 3.3640e+02 + 2.1100e+02 4.1240e+02 2.8230e+02 9.0640e+02 1.0553e+03 3.2324e+03 3.4037e+03 + 4.0144e+03 1.5182e+03 7.3990e+02 5.2070e+02 3.3660e+02 6.4740e+02 3.9950e+02 + 5.0390e+02 1.8666e+03 3.3784e+03 2.1939e+03 9.8790e+02 3.7670e+02 5.5130e+02 + 6.4440e+02 8.5040e+02 5.0700e+02 3.3130e+02 8.9350e+02 9.8690e+02 6.6520e+02 + 2.4820e+02 4.1270e+02 2.2118e+03 4.4935e+03 4.0997e+03 2.0799e+03 4.9220e+02 + 1.4067e+03 3.4661e+03 1.9959e+03 5.1010e+02 6.3020e+02 5.4240e+02 6.8140e+02 + 5.2100e+02 5.5320e+02 5.7530e+02 3.6320e+02 6.3300e+02 6.3610e+02 2.2028e+03 + 3.8419e+03 2.5666e+03 1.3376e+03 4.9820e+02 3.1370e+02 2.2210e+02 2.8690e+02 + 4.6680e+02 7.0690e+02 5.7010e+02 3.7980e+02 4.4800e+02 3.0610e+02 4.4670e+02 + 5.6150e+02 1.7749e+03 2.8970e+03 2.8659e+03 2.0399e+03 5.5830e+02 7.0470e+02 + 5.8190e+02 5.8010e+02 6.5830e+02 5.0690e+02 8.4710e+02 3.5837e+03 3.4947e+03 + 1.8599e+03 6.2470e+02 4.7150e+02 5.1750e+02 5.2150e+02 6.5800e+02 2.9520e+02 + 2.5530e+02 6.0910e+02 1.2213e+03 5.6170e+02 4.6940e+02 5.5740e+02 2.1995e+03 + 2.7862e+03 3.0884e+03 1.2334e+03 2.3810e+02 1.8851e+03 4.5498e+03 2.0229e+03 + 1.1138e+03 6.7660e+02 6.0940e+02 5.7420e+02 5.0680e+02 5.1080e+02 4.5440e+02 + 7.3650e+02 3.8170e+02 8.3070e+02 2.4705e+03 5.1419e+03 2.2007e+03 6.5620e+02 + 6.0100e+02 2.4500e+02 2.4660e+02 3.0260e+02 8.2580e+02 6.5770e+02 4.6890e+02 + 3.5140e+02 4.2050e+02 5.6750e+02 3.1710e+02 3.6320e+02 1.1091e+03 3.4963e+03 + 3.7837e+03 9.3580e+02 8.4350e+02 5.5620e+02 5.7810e+02 7.3700e+02 7.6370e+02 + 6.4640e+02 4.1760e+02 2.2930e+03 2.6340e+03 1.7320e+03 5.9570e+02 2.9070e+02 + 3.5950e+02 4.4250e+02 6.2970e+02 6.9920e+02 3.6510e+02 5.7520e+02 1.0459e+03 + 9.6710e+02 5.3370e+02 6.1410e+02 2.2182e+03 3.0230e+03 2.9072e+03 8.2880e+02 + 3.7140e+02 1.2255e+03 3.5092e+03 4.2589e+03 1.7033e+03 5.9280e+02 4.1880e+02 + 3.6680e+02 6.3090e+02 7.5000e+02 5.7590e+02 4.9780e+02 7.7160e+02 1.1351e+03 + 3.3348e+03 4.8941e+03 1.8177e+03 1.0240e+03 4.4450e+02 2.0050e+02 3.3420e+02 + 6.0850e+02 7.0070e+02 7.5210e+02 5.8330e+02 6.3480e+02 3.0930e+02 5.9760e+02 + 4.2580e+02 5.2220e+02 2.2489e+03 2.6025e+03 3.1215e+03 6.1630e+02 8.5660e+02 + 4.1160e+02 5.6040e+02 7.6260e+02 1.0958e+03 3.1360e+02 3.4580e+02 3.4052e+03 + 3.3144e+03 5.9210e+02 3.6230e+02 5.0020e+02 3.4060e+02 5.4450e+02 6.9110e+02 + 5.6190e+02 2.9940e+02 4.2380e+02 9.7770e+02 7.2720e+02 8.0800e+02 3.2570e+02 + 1.9688e+03 3.1953e+03 2.0015e+03 5.1720e+02 2.4230e+02 6.6230e+02 2.1388e+03 + 2.9338e+03 2.0873e+03 8.6260e+02 5.8300e+02 5.2180e+02 2.4030e+02 4.5520e+02 + 3.1460e+02 2.7240e+02 5.0670e+02 1.4161e+03 4.0177e+03 2.3825e+03 6.8780e+02 + 7.1480e+02 4.7640e+02 4.2140e+02 3.7810e+02 6.3670e+02 6.5640e+02 3.8000e+02 + 5.8330e+02 4.4000e+02 4.1610e+02 8.2000e+02 3.0560e+02 3.3930e+02 1.8226e+03 + 3.2577e+03 1.7985e+03 1.1773e+03 8.8890e+02 4.7060e+02 6.4720e+02 4.7420e+02 + 6.2470e+02 3.9800e+02 6.2780e+02 3.2933e+03 4.7248e+03 1.4150e+03 7.7450e+02 + 4.2990e+02 3.0860e+02 4.6740e+02 6.4680e+02 6.2340e+02 4.9970e+02 4.1810e+02 + 6.3000e+02 5.0860e+02 6.8100e+02 5.5070e+02 1.2789e+03 3.7555e+03 2.0268e+03 + 4.3620e+02 2.5890e+02 8.7700e+02 1.9931e+03 2.3851e+03 3.5183e+03 1.5958e+03 + 8.0950e+02 3.1840e+02 4.5430e+02 5.4180e+02 4.0610e+02 9.1800e+02 1.4715e+03 + 2.1196e+03 3.3553e+03 2.3601e+03 7.2010e+02 4.3150e+02 4.1560e+02 5.1730e+02 + 6.9250e+02 7.5080e+02 5.9580e+02 2.5550e+02 6.6520e+02 6.6440e+02 4.3510e+02 + 9.3370e+02 1.8110e+02 4.6210e+02 3.0481e+03 3.5031e+03 1.8135e+03 6.8010e+02 + 5.1530e+02 3.0340e+02 4.3370e+02 6.1990e+02 4.4150e+02 3.0280e+02 7.2510e+02 + 2.3869e+03 3.6379e+03 1.9381e+03 3.5000e+02 4.3350e+02 3.0960e+02 3.8120e+02 + 8.8810e+02 7.2210e+02 4.2430e+02 6.7940e+02 3.7460e+02 3.6010e+02 4.2330e+02 + 6.3590e+02 1.5527e+03 3.3407e+03 2.2420e+03 1.4889e+03 6.6740e+02 3.8550e+02 + 9.7730e+02 2.6959e+03 4.0515e+03 1.3894e+03 4.4460e+02 5.3500e+02 6.0070e+02 + 2.5760e+02 6.9940e+02 8.8550e+02 2.1863e+03 2.1628e+03 2.0233e+03 2.0952e+03 + 3.6060e+02 7.4490e+02 2.8410e+02 4.2930e+02 9.6680e+02 9.2880e+02 2.6950e+02 + 3.2990e+02 3.0520e+02 5.1420e+02 1.1985e+03 4.4700e+02 3.2330e+02 6.4820e+02 + 2.3078e+03 4.3404e+03 1.7191e+03 7.2820e+02 9.4630e+02 4.8700e+02 4.6060e+02 + 1.9350e+02 2.9290e+02 3.4370e+02 5.7270e+02 2.2784e+03 4.3717e+03 1.2494e+03 + 5.5020e+02 6.9910e+02 1.4040e+02 5.2240e+02 5.1850e+02 7.0560e+02 5.9350e+02 + 9.7890e+02 4.1870e+02 3.5750e+02 5.0540e+02 3.8250e+02 1.8267e+03 3.4783e+03 + 2.8678e+03 1.6200e+03 5.4770e+02 2.7090e+02 7.1200e+02 1.9929e+03 3.1176e+03 + 1.5061e+03 1.0768e+03 4.1280e+02 4.1690e+02 3.9900e+02 1.0238e+03 2.2376e+03 + 3.6972e+03 2.5565e+03 2.1607e+03 1.5512e+03 6.0140e+02 3.0070e+02 3.7200e+02 + 1.0891e+03 1.0006e+03 7.3190e+02 1.9110e+02 4.4940e+02 3.8470e+02 3.8360e+02 + 7.7860e+02 5.0010e+02 3.0420e+02 2.5840e+02 2.6291e+03 3.8741e+03 2.1281e+03 + 8.3020e+02 1.3046e+03 6.7250e+02 3.6380e+02 3.2300e+02 2.7520e+02 5.5820e+02 + 7.1430e+02 1.8656e+03 3.8535e+03 1.8997e+03 4.9630e+02 6.6270e+02 2.5920e+02 + 3.6540e+02 9.2840e+02 6.0890e+02 6.9470e+02 5.5170e+02 5.0330e+02 3.6160e+02 + 2.1170e+02 6.7880e+02 2.1126e+03 3.8572e+03 2.1045e+03 1.0820e+03 5.9880e+02 + 4.5770e+02 8.7650e+02 8.1180e+02 2.2206e+03 2.9903e+03 1.1105e+03 7.3970e+02 + 6.7880e+02 1.1269e+03 2.3304e+03 2.0708e+03 2.6827e+03 2.3589e+03 9.2650e+02 + 1.0711e+03 7.2580e+02 6.0990e+02 1.7730e+02 6.6780e+02 7.0700e+02 9.4710e+02 + 3.6030e+02 4.6770e+02 6.5040e+02 7.0100e+02 6.8090e+02 3.5470e+02 2.9990e+02 + 7.0700e+02 2.9663e+03 4.0597e+03 1.2560e+03 1.0341e+03 7.5060e+02 5.5550e+02 + 2.8630e+02 3.7850e+02 9.5120e+02 5.0570e+02 9.0090e+02 1.7167e+03 3.5585e+03 + 3.2606e+03 1.3764e+03 4.7790e+02 5.1500e+02 4.7390e+02 5.5460e+02 3.6120e+02 + 4.5760e+02 1.1107e+03 5.1080e+02 2.9490e+02 4.5200e+02 3.0440e+02 1.7223e+03 + 2.6150e+03 3.2503e+03 8.5960e+02 3.2810e+02 3.3220e+02 6.2120e+02 5.8620e+02 + 1.1533e+03 2.8691e+03 3.1539e+03 1.3379e+03 1.5592e+03 2.1113e+03 2.3368e+03 + 2.0800e+03 2.2948e+03 1.7118e+03 5.6580e+02 4.6730e+02 4.5760e+02 2.9330e+02 + 4.8640e+02 4.5290e+02 4.8020e+02 5.5300e+02 6.2730e+02 7.1830e+02 3.9000e+02 + 7.1460e+02 2.7480e+02 7.2430e+02 3.6240e+02 9.8870e+02 2.1476e+03 4.5873e+03 + 1.0776e+03 5.7920e+02 3.1210e+02 3.2600e+02 3.0760e+02 4.0770e+02 6.4390e+02 + 1.0796e+03 5.3290e+02 1.1023e+03 2.6293e+03 3.8735e+03 1.6956e+03 5.6770e+02 + 4.6050e+02 8.4350e+02 6.1190e+02 3.7820e+02 6.1130e+02 7.0540e+02 4.7160e+02 + 3.4430e+02 2.6870e+02 2.1230e+02 1.4331e+03 4.1539e+03 1.9665e+03 1.3826e+03 + 3.9790e+02 6.8840e+02 6.9340e+02 2.8070e+02 5.8460e+02 4.1306e+03 4.4196e+03 + 8.5510e+02 3.6579e+03 3.3998e+03 3.7276e+03 1.4406e+03 1.2276e+03 7.9110e+02 + 3.5970e+02 3.8710e+02 4.1490e+02 4.1950e+02 2.6170e+02 8.0360e+02 9.3160e+02 + 8.3070e+02 5.1250e+02 4.5780e+02 7.2320e+02 6.0150e+02 8.1510e+02 8.2530e+02 + 6.7590e+02 1.0206e+03 3.8989e+03 3.5264e+03 4.9930e+02 4.8750e+02 1.8730e+02 + 4.3890e+02 3.0840e+02 4.2360e+02 5.7850e+02 1.0226e+03 3.5860e+02 1.0440e+03 + 1.9951e+03 2.8811e+03 1.2441e+03 7.8450e+02 6.5860e+02 7.4050e+02 4.6470e+02 + 1.6370e+02 8.4830e+02 6.5340e+02 5.4420e+02 1.4360e+02 4.3310e+02 3.5110e+02 + 1.0515e+03 3.2138e+03 1.2493e+03 1.3401e+03 7.7540e+02 3.4950e+02 9.9100e+02 + 7.8760e+02 7.3560e+02 2.0378e+03 4.1291e+03 1.9332e+03 3.2989e+03 5.1479e+03 + 1.5948e+03 5.9170e+02 7.3160e+02 4.6590e+02 5.9400e+02 5.1010e+02 1.0309e+03 + 4.3790e+02 4.0600e+02 4.8690e+02 9.3150e+02 6.2630e+02 3.1590e+02 6.1850e+02 + 1.0262e+03 7.4290e+02 1.3002e+03 8.7100e+02 8.6980e+02 7.6470e+02 3.9754e+03 + 4.5947e+03 1.0431e+03 5.8770e+02 2.5300e+02 3.8930e+02 1.8540e+02 9.0380e+02 + 8.4180e+02 4.7180e+02 3.4870e+02 3.2390e+02 1.9227e+03 4.5952e+03 2.1067e+03 + 8.0910e+02 7.1850e+02 7.9060e+02 8.4980e+02 2.8550e+02 3.1020e+02 8.0200e+02 + 4.9410e+02 1.3040e+02 3.4080e+02 5.8830e+02 1.2545e+03 3.8848e+03 1.9292e+03 + 6.9070e+02 3.8540e+02 5.4070e+02 7.8660e+02 4.8600e+02 3.5510e+02 1.9413e+03 + 3.0447e+03 3.6663e+03 2.6605e+03 4.7827e+03 7.1020e+02 3.6330e+02 5.0460e+02 + 5.7610e+02 3.3340e+02 4.1450e+02 5.0690e+02 5.3520e+02 2.9680e+02 5.9270e+02 + 6.8160e+02 5.7310e+02 3.1930e+02 5.9980e+02 8.0240e+02 1.0548e+03 9.1440e+02 + 7.2400e+02 6.0040e+02 1.3162e+03 2.2420e+03 2.0862e+03 3.3160e+02 3.9150e+02 + 2.8230e+02 3.2680e+02 4.9490e+02 4.0690e+02 5.1040e+02 6.8300e+02 4.4750e+02 + 4.5830e+02 1.8417e+03 3.3169e+03 2.6528e+03 8.3380e+02 6.8850e+02 3.8000e+02 + 4.9670e+02 4.8820e+02 2.9100e+02 9.5880e+02 5.2310e+02 3.0930e+02 2.6960e+02 + 7.7410e+02 2.5729e+03 3.5793e+03 1.2592e+03 5.0290e+02 3.1540e+02 4.0280e+02 + 4.4450e+02 4.4720e+02 3.5630e+02 1.0789e+03 3.1976e+03 3.9831e+03 5.3248e+03 + 4.5009e+03 1.9516e+03 1.7460e+02 3.7200e+02 4.5790e+02 5.7750e+02 6.1310e+02 + 4.4320e+02 4.8370e+02 3.1400e+02 6.0740e+02 7.1580e+02 5.7490e+02 5.7310e+02 + 6.2830e+02 6.5090e+02 1.1926e+03 2.2147e+03 5.0140e+02 4.9910e+02 1.0032e+03 + 3.0586e+03 3.6343e+03 6.7450e+02 3.1560e+02 6.0700e+02 1.2470e+02 3.2580e+02 + 2.8930e+02 6.1930e+02 6.9640e+02 6.3640e+02 4.9690e+02 2.0258e+03 2.6610e+03 + 3.4124e+03 1.6904e+03 5.5000e+02 1.5640e+02 7.0720e+02 7.3430e+02 2.8730e+02 + 4.7330e+02 3.0530e+02 2.6300e+02 8.7090e+02 2.2773e+03 3.9804e+03 4.4204e+03 + 7.0770e+02 3.4640e+02 4.7090e+02 3.8580e+02 7.0300e+02 4.2070e+02 4.8390e+02 + 3.3340e+02 2.0408e+03 3.6972e+03 5.4775e+03 3.3900e+03 1.3172e+03 3.4090e+02 + 3.1280e+02 3.3580e+02 5.8550e+02 4.7260e+02 6.8830e+02 3.2930e+02 3.4590e+02 + 7.3510e+02 6.6260e+02 6.3560e+02 6.5220e+02 4.6670e+02 4.9630e+02 4.1570e+02 + 1.3644e+03 4.9970e+02 2.9640e+02 6.6460e+02 5.3790e+02 2.6195e+03 5.9400e+02 + 3.7220e+02 4.2170e+02 3.5360e+02 1.7080e+02 3.0140e+02 4.8240e+02 7.6140e+02 + 2.1870e+02 4.6610e+02 7.3270e+02 2.8208e+03 3.3820e+03 2.3015e+03 9.0460e+02 + 2.7530e+02 5.2960e+02 3.2410e+02 2.6720e+02 4.6770e+02 3.6740e+02 3.8980e+02 + 4.5510e+02 1.5742e+03 3.9930e+03 3.3681e+03 6.4790e+02 1.4670e+02 4.7420e+02 + 4.9140e+02 5.3450e+02 5.9530e+02 3.1330e+02 6.0460e+02 2.0273e+03 3.8825e+03 + 5.0829e+03 3.0746e+03 1.3494e+03 4.7250e+02 3.0210e+02 3.9340e+02 8.2030e+02 + 5.1360e+02 2.8260e+02 4.1370e+02 3.7860e+02 6.2840e+02 9.3510e+02 9.9640e+02 + 6.9620e+02 5.3580e+02 2.2310e+02 4.7400e+02 2.3321e+03 6.5050e+02 4.3040e+02 + 3.9380e+02 1.9451e+03 1.9589e+03 1.8529e+03 5.1550e+02 6.8730e+02 3.9620e+02 + 5.1240e+02 3.3180e+02 7.8170e+02 3.2300e+02 2.3390e+02 4.8870e+02 4.9560e+02 + 1.2117e+03 3.3375e+03 2.1102e+03 1.7284e+03 3.7180e+02 9.3090e+02 2.9300e+02 + 2.1950e+02 6.5790e+02 3.9570e+02 6.4510e+02 6.2940e+02 2.1808e+03 3.7380e+03 + 2.3481e+03 4.3060e+02 3.3000e+02 3.3750e+02 7.2760e+02 8.7650e+02 2.9980e+02 + 2.1410e+02 4.6990e+02 1.3044e+03 2.5437e+03 4.7185e+03 2.5475e+03 1.2111e+03 + 1.0422e+03 4.4420e+02 4.7270e+02 3.7480e+02 4.5390e+02 4.5370e+02 4.9660e+02 + 9.2120e+02 5.3480e+02 4.2680e+02 6.7170e+02 7.1870e+02 7.1810e+02 2.9950e+02 + 1.2400e+02 2.3404e+03 1.1097e+03 4.7700e+02 4.2180e+02 1.1950e+03 1.8048e+03 + 2.1432e+03 7.4200e+02 1.2307e+03 5.1670e+02 1.1115e+03 2.7560e+02 5.2260e+02 + 6.8390e+02 3.8470e+02 2.9410e+02 8.7300e+02 4.4810e+02 2.0269e+03 3.1235e+03 + 1.3075e+03 2.9800e+02 6.8270e+02 2.1500e+02 4.4980e+02 7.2900e+02 1.2242e+03 + 6.9540e+02 4.9420e+02 2.1170e+03 2.4215e+03 2.1407e+03 6.2090e+02 3.5460e+02 + 3.7320e+02 9.3120e+02 8.2860e+02 3.7950e+02 4.1810e+02 3.5360e+02 8.1210e+02 + 1.9577e+03 3.6963e+03 3.3950e+03 2.1305e+03 7.5140e+02 4.9550e+02 1.6990e+02 + 4.2030e+02 4.7120e+02 3.7110e+02 2.4300e+02 5.8510e+02 8.8490e+02 8.4200e+02 + 7.4860e+02 9.9790e+02 6.3500e+02 3.3640e+02 1.2040e+02 2.0682e+03 5.6920e+02 + 7.4690e+02 2.3816e+03 3.5903e+03 1.5798e+03 6.2860e+02 6.7120e+02 1.9830e+02 + 5.6560e+02 4.5667e+03 4.1820e+03 2.2450e+03 1.0539e+03 7.1200e+02 1.1995e+03 + 5.7410e+02 4.5380e+02 2.1250e+02 4.1580e+02 1.1090e+03 5.2947e+03 3.4207e+03 + 1.3498e+03 1.1001e+03 6.8070e+02 1.0626e+03 3.8050e+03 3.2890e+03 3.0339e+03 + 1.2064e+03 1.5012e+03 6.1890e+02 4.5430e+02 8.8160e+02 5.1810e+02 6.2620e+02 + 8.5360e+02 2.0350e+03 4.0680e+03 4.3756e+03 5.8547e+03 3.1273e+03 3.8140e+02 + 3.8070e+02 4.2580e+02 1.7000e+02 1.0020e+02 4.2520e+02 6.2330e+02 2.2560e+02 + 3.5680e+02 7.5360e+02 9.2500e+02 7.8660e+02 3.9500e+02 9.4710e+02 8.3770e+02 + 6.1430e+02 4.8960e+02 4.4890e+02 6.7470e+02 8.1230e+02 4.3398e+03 3.3072e+03 + 8.4910e+02 5.4390e+02 3.3470e+02 2.2050e+02 9.0030e+02 2.5110e+03 4.5422e+03 + 8.0720e+02 5.9540e+02 7.6540e+02 8.5410e+02 6.7820e+02 6.4240e+02 2.8110e+02 + 5.9930e+02 4.3040e+02 3.3472e+03 4.0943e+03 2.0459e+03 7.9930e+02 6.1340e+02 + 4.4960e+02 1.8004e+03 4.7584e+03 4.1540e+03 1.1130e+03 5.5380e+02 7.1320e+02 + 3.4090e+02 6.0040e+02 8.7300e+02 7.7060e+02 8.1320e+02 8.5760e+02 2.2094e+03 + 2*7.0000e+03 3.6480e+03 7.8880e+02 4.5790e+02 6.7640e+02 2.3330e+02 + 1.5080e+02 3.6660e+02 2.1270e+02 1.0690e+02 1.9170e+02 6.9610e+02 1.1638e+03 + 5.4680e+02 3.4280e+02 8.4750e+02 6.2000e+02 7.8080e+02 7.1860e+02 2.7020e+02 + 7.2690e+02 8.4700e+02 4.5009e+03 2.0131e+03 7.4380e+02 2.9770e+02 2.9560e+02 + 4.4220e+02 1.6208e+03 5.3355e+03 3.9759e+03 1.3151e+03 4.1520e+02 6.2250e+02 + 3.1260e+02 3.6100e+02 3.9890e+02 4.4770e+02 3.2230e+02 6.3260e+02 1.9446e+03 + 5.5094e+03 1.8861e+03 7.6450e+02 6.1070e+02 5.3190e+02 1.8269e+03 2.0517e+03 + 3.2049e+03 2.2308e+03 1.2017e+03 5.4710e+02 4.9450e+02 1.1329e+03 9.3450e+02 + 6.3860e+02 3.4770e+02 5.9370e+02 2.2966e+03 6.5530e+03 4.5931e+03 6.1070e+03 + 2.4810e+03 1.9829e+03 9.4730e+02 3.8660e+02 2.1170e+02 1.0535e+03 4.6200e+02 + 3.6950e+02 4.7390e+02 8.8050e+02 8.0900e+02 3.5080e+02 4.5120e+02 7.9050e+02 + 5.2870e+02 6.8940e+02 7.3500e+02 2.2871e+03 1.3769e+03 3.3298e+03 3.6427e+03 + 2.2117e+03 3.8630e+02 5.3700e+02 3.3690e+02 6.5830e+02 2.0602e+03 5.0200e+03 + 2.2141e+03 8.0410e+02 2.8060e+02 3.3530e+02 4.2870e+02 2.5430e+02 3.5790e+02 + 4.4730e+02 3.0340e+02 3.1230e+02 2.6222e+03 4.0202e+03 2.2433e+03 8.5910e+02 + 2.7650e+02 6.1880e+02 8.9080e+02 1.5773e+03 2.3047e+03 3.1946e+03 1.4067e+03 + 2.6940e+02 8.2000e+02 7.5910e+02 6.6620e+02 4.9020e+02 2.2950e+02 4.3540e+02 + 1.4276e+03 4.2211e+03 4.4605e+03 3.8428e+03 4.9460e+03 1.4963e+03 7.4630e+02 + 5.9760e+02 2.9640e+02 3.2910e+02 6.9650e+02 4.6340e+02 5.4670e+02 6.5310e+02 + 5.7070e+02 5.7450e+02 6.6860e+02 3.8250e+02 2.4580e+02 5.9810e+02 8.2280e+02 + 2.1724e+03 2.1870e+03 2.8997e+03 3.6223e+03 1.7243e+03 3.5360e+02 6.3760e+02 + 3.4270e+02 8.4770e+02 2.6872e+03 3.2752e+03 3.4430e+03 5.0080e+02 5.4870e+02 + 3.9580e+02 5.4380e+02 3.1740e+02 2.7040e+02 4.4370e+02 5.2850e+02 3.4090e+02 + 1.4919e+03 4.1963e+03 3.7101e+03 1.0913e+03 4.0220e+02 5.8590e+02 8.4420e+02 + 1.1416e+03 1.4458e+03 2.5702e+03 4.1492e+03 1.3119e+03 1.3849e+03 4.9030e+02 + 5.3110e+02 4.4380e+02 3.7190e+02 6.1840e+02 2.4399e+03 3.1792e+03 5.4590e+03 + 2.4248e+03 5.5225e+03 2.1817e+03 1.0830e+03 3.9100e+02 5.7050e+02 3.2390e+02 + 5.2360e+02 4.2440e+02 9.1180e+02 2.4450e+02 4.3910e+02 2.9350e+02 1.0180e+03 + 3.6750e+02 2.0560e+02 7.6980e+02 1.0474e+03 1.7147e+03 1.5546e+03 4.3816e+03 + 4.5397e+03 5.8560e+02 2.6420e+02 4.9980e+02 1.4852e+03 9.4980e+02 3.2147e+03 + 5.0664e+03 3.4628e+03 5.1330e+02 3.5290e+02 5.2210e+02 7.6870e+02 2.8350e+02 + 2.3150e+02 5.1880e+02 5.8760e+02 3.2920e+02 9.8670e+02 3.4802e+03 3.4281e+03 + 2.1306e+03 7.2060e+02 4.7800e+02 6.3830e+02 5.6190e+02 1.1889e+03 2.5256e+03 + 3.2711e+03 3.1558e+03 1.0459e+03 5.1850e+02 7.9440e+02 3.9640e+02 2.8610e+02 + 4.2900e+02 2.3080e+03 3.6575e+03 4.0258e+03 4.9185e+03 5.3411e+03 3.6550e+03 + 7.9540e+02 5.4550e+02 2.9620e+02 5.8060e+02 9.1300e+02 5.8480e+02 4.1420e+02 + 1.9340e+02 5.1090e+02 6.9210e+02 9.7550e+02 2.7020e+02 4.5360e+02 7.9050e+02 + 2.6830e+03 4.2496e+03 3.9850e+03 3.6375e+03 2.6006e+03 6.2070e+02 3.0550e+02 + 4.7690e+02 3.1280e+02 5.5510e+02 2.5023e+03 2.8318e+03 2.4514e+03 8.2570e+02 + 5.3540e+02 5.5030e+02 7.3280e+02 4.2820e+02 1.4820e+02 3.2140e+02 5.0500e+02 + 8.0940e+02 9.1120e+02 2.7612e+03 3.7624e+03 2.5437e+03 6.5440e+02 7.5700e+02 + 8.3980e+02 6.9600e+02 1.0825e+03 2.1292e+03 3.8821e+03 3.5759e+03 2.1496e+03 + 9.1310e+02 5.3630e+02 6.2850e+02 1.4800e+02 4.3670e+02 1.2862e+03 2.7451e+03 + 2.8245e+03 4.0170e+03 3.6524e+03 3.3434e+03 4.9470e+02 2.4070e+02 3.4900e+02 + 4.9520e+02 1.3386e+03 1.1086e+03 3.7970e+02 3.5260e+02 6.2050e+02 3.4850e+02 + 6.8710e+02 4.3260e+02 5.7570e+02 6.8890e+02 2.5063e+03 3.3859e+03 5.3003e+03 + 3.7988e+03 1.3715e+03 3.2010e+02 4.3150e+02 8.2820e+02 6.2640e+02 5.7330e+02 + 8.3150e+02 4.9312e+03 2.5282e+03 8.8810e+02 1.0977e+03 5.9580e+02 5.8010e+02 + 3.0600e+02 4.1730e+02 4.9120e+02 3.3890e+02 2.6660e+02 6.1810e+02 3.7817e+03 + 4.5672e+03 1.1875e+03 5.8300e+02 4.3540e+02 4.0810e+02 3.9110e+02 6.7320e+02 + 1.0931e+03 2.8005e+03 3.2846e+03 2.5328e+03 2.1246e+03 9.0280e+02 1.7410e+02 + 4.3640e+02 4.7770e+02 3.3691e+03 3.7623e+03 3.0631e+03 2.8273e+03 3.0466e+03 + 2.9559e+03 5.5960e+02 4.3190e+02 3.9380e+02 6.6450e+02 6.2080e+02 4.0260e+02 + 6.2530e+02 3.9080e+02 5.8560e+02 4.8010e+02 1.2550e+02 2.4030e+02 5.4660e+02 + 4.6760e+02 2.5028e+03 4.8922e+03 4.2847e+03 4.8770e+03 4.8520e+02 1.7980e+02 + 3.3410e+02 5.8270e+02 4.1830e+02 3.5560e+02 7.7380e+02 4.9053e+03 3.0191e+03 + 9.9200e+02 7.5810e+02 5.2380e+02 9.6930e+02 2.5900e+02 7.1230e+02 6.6880e+02 + 2.0880e+02 2.4570e+02 6.1680e+02 2.4970e+03 4.1880e+03 1.5639e+03 1.3808e+03 + 6.5460e+02 6.3950e+02 6.2050e+02 4.6280e+02 4.3790e+02 7.1280e+02 2.2945e+03 + 3.6455e+03 2.5166e+03 1.2909e+03 2.8820e+02 2.8690e+02 6.9050e+02 3.0343e+03 + 3.7729e+03 1.7570e+03 3.0154e+03 2.9279e+03 1.5027e+03 7.9210e+02 2.9540e+02 + 3.7130e+02 1.0456e+03 5.5790e+02 3.0570e+02 2.6760e+02 3.2900e+02 7.9710e+02 + 3.9690e+02 3.1300e+02 1.6760e+02 5.1320e+02 9.9960e+02 1.9039e+03 4.5437e+03 + 4.2124e+03 3.7801e+03 1.1528e+03 4.2840e+02 5.0420e+02 1.2297e+03 7.2350e+02 + 2.7890e+02 5.5560e+02 3.7505e+03 2.3709e+03 4.4310e+02 7.3400e+02 7.2610e+02 + 5.8910e+02 5.9150e+02 4.9210e+02 5.6620e+02 2.8900e+02 1.7410e+02 4.8310e+02 + 3.1307e+03 3.6971e+03 1.6936e+03 2.8950e+02 4.9520e+02 5.9600e+02 4.8220e+02 + 5.1730e+02 3.4950e+02 6.8210e+02 1.0553e+03 3.6249e+03 3.5256e+03 2.9957e+03 + 9.8180e+02 4.3120e+02 9.3200e+02 3.6764e+03 3.1834e+03 1.5954e+03 2.8496e+03 + 3.9659e+03 2.6326e+03 5.2510e+02 1.7940e+02 2.3480e+02 5.9760e+02 3.8590e+02 + 1.9450e+02 1.9130e+02 2.3590e+02 8.4430e+02 1.0104e+03 5.3200e+02 5.2830e+02 + 7.6780e+02 9.0080e+02 2.7794e+03 4.9207e+03 1.9298e+03 4.5430e+03 8.3330e+02 + 5.7210e+02 6.3390e+02 1.0273e+03 6.0110e+02 2.9580e+02 6.9800e+02 3.0424e+03 + 2.6796e+03 7.3250e+02 6.2440e+02 4.7810e+02 3.6700e+02 5.9570e+02 3.9780e+02 + 4.5420e+02 4.0980e+02 5.2810e+02 8.1520e+02 1.5736e+03 5.7189e+03 1.8135e+03 + 4.9310e+02 2.3970e+02 7.6570e+02 1.0509e+03 9.4780e+02 3.1030e+02 3.9140e+02 + 7.3670e+02 2.2107e+03 5.6918e+03 3.0796e+03 9.6590e+02 2.9200e+02 8.2870e+02 + 5.3853e+03 2.6020e+03 1.0110e+03 2.6366e+03 3.7696e+03 1.5304e+03 9.2500e+02 + 3.0270e+02 2.7860e+02 3.6530e+02 4.3950e+02 2.5360e+02 1.8130e+02 5.6250e+02 + 4.6570e+02 5.9490e+02 3.3630e+02 5.3610e+02 4.9900e+02 1.2660e+03 2.4131e+03 + 3.6850e+03 3.0640e+03 4.1176e+03 1.8713e+03 5.5300e+02 7.0180e+02 1.2356e+03 + 6.3450e+02 3.0520e+02 7.5670e+02 2.0306e+03 3.8422e+03 5.3550e+02 4.9980e+02 + 5.8990e+02 5.4960e+02 5.5250e+02 2.0100e+02 5.0050e+02 5.2370e+02 4.0570e+02 + 5.7770e+02 2.2349e+03 5.3262e+03 2.9681e+03 6.7740e+02 3.1760e+02 3.9290e+02 + 6.7660e+02 1.1439e+03 2.5040e+02 3.6570e+02 6.1330e+02 1.1422e+03 5.4674e+03 + 3.8006e+03 1.9541e+03 1.2281e+03 2.9383e+03 4.0511e+03 1.9983e+03 1.5891e+03 + 4.7373e+03 3.5749e+03 7.5650e+02 7.8240e+02 3.1490e+02 2.0130e+02 3.4790e+02 + 7.1680e+02 2.5650e+02 3.6680e+02 3.1200e+02 5.4910e+02 4.6700e+02 3.9340e+02 + 6.0990e+02 5.6780e+02 9.2550e+02 3.8924e+03 3.1977e+03 2.6610e+03 5.6910e+03 + 7.3340e+02 9.6020e+02 5.3600e+02 1.0142e+03 2.4730e+02 2.7140e+02 3.9070e+02 + 1.6464e+03 4.0687e+03 1.6319e+03 5.1850e+02 4.5390e+02 6.4130e+02 3.6710e+02 + 4.4640e+02 4.9860e+02 5.0940e+02 4.7000e+02 5.8740e+02 9.4800e+02 3.7086e+03 + 2.1492e+03 5.0240e+02 1.4200e+02 8.2700e+02 9.0630e+02 8.4800e+02 7.0800e+02 + 6.6030e+02 1.2880e+02 5.6760e+02 3.0686e+03 2.8993e+03 3.8356e+03 1.5287e+03 + 3.2049e+03 2.5550e+03 1.8133e+03 1.3961e+03 4.7536e+03 4.1414e+03 1.3264e+03 + 4.7390e+02 7.1030e+02 3.6440e+02 1.8280e+02 4.3310e+02 6.4270e+02 5.1840e+02 + 3.1830e+02 5.9320e+02 6.2320e+02 1.6800e+02 4.8460e+02 5.6860e+02 1.8771e+03 + 4.2421e+03 2.2853e+03 2.6437e+03 5.9882e+03 9.2520e+02 1.0332e+03 9.1910e+02 + 4.8720e+02 6.2800e+02 3.3320e+02 7.2220e+02 2.0222e+03 4.8636e+03 3.1820e+03 + 5.3970e+02 2.6580e+02 3.9030e+02 6.3270e+02 4.6000e+02 5.3650e+02 2.6520e+02 + 8.8900e+02 9.2500e+02 2.6461e+03 5.5007e+03 2.0384e+03 3.6580e+02 2.4040e+02 + 6.1980e+02 4.3380e+02 4.9260e+02 6.2760e+02 2.9850e+02 2.4440e+02 2.6660e+02 + 1.3160e+03 4.3843e+03 3.4216e+03 2.8208e+03 3.4981e+03 1.4385e+03 1.0658e+03 + 1.5863e+03 2.4233e+03 3.3440e+03 8.4210e+02 6.2430e+02 8.3880e+02 3.8920e+02 + 2.9570e+02 4.5640e+02 7.5040e+02 4.3680e+02 5.1750e+02 4.4150e+02 5.0150e+02 + 2.8740e+02 2.3260e+02 7.5200e+02 1.0675e+03 3.7441e+03 3.2137e+03 2.6219e+03 + 4.2112e+03 2.1567e+03 6.3730e+02 8.1980e+02 6.3120e+02 6.4590e+02 7.8460e+02 + 6.4030e+02 6.9760e+02 5.4338e+03 5.0013e+03 6.2040e+02 4.7130e+02 5.3720e+02 + 4.1360e+02 5.1240e+02 4.1270e+02 8.7950e+02 6.4110e+02 3.0360e+02 3.7332e+03 + 5.4185e+03 1.1000e+03 4.5600e+02 2.1190e+02 6.2910e+02 7.0980e+02 6.4150e+02 + 5.8840e+02 4.0970e+02 4.1610e+02 3.1680e+02 6.4360e+02 2.1639e+03 6.0516e+03 + 3.3854e+03 2.9292e+03 1.4882e+03 1.2292e+03 1.8158e+03 4.4180e+03 4.2275e+03 + 4.4780e+02 4.4700e+02 3.5700e+02 4.8150e+02 2.2250e+02 4.1120e+02 3.7980e+02 + 5.6920e+02 6.1180e+02 7.5840e+02 6.8380e+02 5.0470e+02 3.7820e+02 7.2730e+02 + 2.1177e+03 3.3103e+03 3.3975e+03 2.7714e+03 5.0806e+03 1.4032e+03 8.6190e+02 + 4.5940e+02 3.0440e+02 7.2310e+02 1.4188e+03 6.9580e+02 6.4450e+02 2.7080e+03 + 4.0988e+03 1.7166e+03 5.6900e+02 3.6480e+02 4.8770e+02 3.6390e+02 6.1870e+02 + 6.8430e+02 7.3230e+02 1.2270e+03 4.4409e+03 3.9145e+03 1.2568e+03 6.8550e+02 + 4.4360e+02 6.1460e+02 3.5200e+02 4.6230e+02 2.6740e+02 5.5050e+02 5.3980e+02 + 4.1350e+02 1.1794e+03 3.8308e+03 6.6836e+03 4.0879e+03 3.5502e+03 6.6970e+02 + 6.1800e+02 1.3494e+03 5.1633e+03 2.6786e+03 4.0120e+02 4.0840e+02 3.9660e+02 + 5.1690e+02 5.2830e+02 6.2150e+02 2.1270e+02 2.8550e+02 3.9640e+02 9.1120e+02 + 5.1440e+02 3.4400e+02 2.3690e+02 6.2870e+02 1.2221e+03 4.9142e+03 2.9862e+03 + 4.2428e+03 5.8046e+03 2.6360e+03 6.2200e+02 2.1150e+02 4.0550e+02 6.4470e+02 + 6.9720e+02 6.5600e+02 1.0960e+03 2.1801e+03 4.3989e+03 5.0514e+03 1.0806e+03 + 8.5990e+02 7.0900e+02 3.7840e+02 3.9570e+02 5.0520e+02 5.9150e+02 2.3419e+03 + 2.9761e+03 3.6205e+03 9.2870e+02 5.2150e+02 3.6380e+02 2.8540e+02 4.5370e+02 + 3.7890e+02 5.5300e+02 3.2860e+02 2.3470e+02 4.4040e+02 4.4970e+02 4.4563e+03 + 5.3510e+03 7.0000e+03 2.2152e+03 7.8310e+02 3.1730e+02 1.2161e+03 4.8620e+03 + 2.5577e+03 8.7180e+02 6.3050e+02 3.3110e+02 3.1540e+02 9.2410e+02 3.3890e+02 + 8.5330e+02 2.4600e+02 3.2560e+02 6.9090e+02 5.5580e+02 3.3110e+02 4.4820e+02 + 6.0640e+02 5.1830e+02 3.3537e+03 4.6121e+03 1.7095e+03 6.7459e+03 2.3727e+03 + 3.7370e+02 2.4650e+02 2.4270e+02 7.2240e+02 5.9400e+02 3.6230e+02 8.6790e+02 + 1.8647e+03 2.1559e+03 5.2155e+03 1.4053e+03 5.6860e+02 6.9670e+02 2.1470e+02 + 5.9510e+02 1.8100e+02 1.0261e+03 1.6374e+03 5.9758e+03 3.8220e+03 1.0526e+03 + 5.2930e+02 3.5610e+02 5.6900e+02 8.1650e+02 6.0740e+02 2.8880e+02 7.1650e+02 + 4.4810e+02 2.3530e+02 7.2680e+02 2.2815e+03 7.0000e+03 4.7922e+03 8.6840e+02 + 5.3590e+02 8.1730e+02 1.3395e+03 4.0870e+03 3.4897e+03 1.0197e+03 6.0200e+02 + 3.0110e+02 3.4980e+02 4.2710e+02 6.6970e+02 5.5560e+02 1.8060e+02 2.3480e+02 + 6.9530e+02 7.6080e+02 3.9670e+02 4.9060e+02 5.2810e+02 7.2820e+02 2.8356e+03 + 2.9405e+03 3.6132e+03 5.5409e+03 2.8331e+03 2.8360e+02 3.5620e+02 1.0064e+03 + 6.3130e+02 6.7350e+02 6.3120e+02 6.0400e+02 5.3320e+02 1.4286e+03 3.9521e+03 + 4.0130e+03 9.5310e+02 8.3390e+02 2.0930e+02 1.6390e+02 4.0230e+02 5.6350e+02 + 4.3613e+03 4.0623e+03 2.3375e+03 8.2600e+02 7.5690e+02 3.2350e+02 4.3960e+02 + 6.5300e+02 5.6970e+02 3.7970e+02 4.0490e+02 3.8630e+02 4.8280e+02 5.0740e+02 + 4.4844e+03 6.6395e+03 6.6505e+03 7.5820e+02 5.3620e+02 4.5980e+02 1.2870e+03 + 3.8654e+03 6.5411e+03 2.3346e+03 5.2420e+02 3.1370e+02 1.4320e+02 5.1170e+02 + 6.1960e+02 6.6380e+02 4.9650e+02 4.4060e+02 6.1410e+02 5.8360e+02 6.1200e+02 + 5.4590e+02 4.0600e+02 1.7640e+02 1.3076e+03 2.2371e+03 2.1084e+03 5.9246e+03 + 2.3005e+03 3.1480e+02 5.4090e+02 9.0610e+02 7.3320e+02 2.2480e+02 1.4410e+02 + 4.4050e+02 6.5530e+02 1.5841e+03 2.6705e+03 3.7598e+03 1.3788e+03 8.2560e+02 + 4.4550e+02 1.9810e+02 5.5650e+02 8.5390e+02 5.1308e+03 4.0411e+03 1.5128e+03 + 8.2330e+02 6.9480e+02 6.9210e+02 3.4930e+02 6.4390e+02 4.5510e+02 7.1000e+02 + 3.6220e+02 6.5640e+02 5.2220e+02 6.5050e+02 4.4395e+03 5.7797e+03 6.0761e+03 + 5.7960e+02 2.7330e+02 5.0480e+02 1.4019e+03 3.0161e+03 5.1510e+03 1.8864e+03 + 1.2106e+03 6.2380e+02 4.9000e+02 7.8220e+02 8.7740e+02 8.2050e+02 4.2640e+02 + 7.2270e+02 5.7740e+02 3.9300e+02 5.7850e+02 8.0050e+02 2.7570e+02 5.7900e+01 + 1.0960e+03 3.8945e+03 2.0710e+03 4.0146e+03 3.7078e+03 6.9580e+02 8.4320e+02 + 1.6436e+03 9.7740e+02 3.4550e+02 1.2740e+02 3.9050e+02 3.0470e+02 8.6180e+02 + 2.0509e+03 4.1130e+03 2.7046e+03 8.9110e+02 4.0080e+02 2.8840e+02 5.4370e+02 + 1.3704e+03 5.4812e+03 2.7006e+03 9.7360e+02 6.9180e+02 9.0880e+02 6.0130e+02 + 1.4160e+02 4.4650e+02 6.3170e+02 7.6580e+02 4.5680e+02 2.3660e+02 5.3430e+02 + 1.0241e+03 5.2634e+03 6.4285e+03 2.6362e+03 9.0370e+02 1.7120e+02 4.0730e+02 + 9.5120e+02 2.3165e+03 5.1000e+03 2.1516e+03 8.4850e+02 1.0335e+03 3.7610e+02 + 8.4420e+02 1.2540e+03 5.3040e+02 6.4900e+02 6.7980e+02 3.8890e+02 4.3190e+02 + 6.3570e+02 7.9970e+02 3.9560e+02 1.2770e+02 7.3850e+02 3.8548e+03 1.0758e+03 + 3.8996e+03 4.4144e+03 1.0461e+03 6.5810e+02 1.0255e+03 1.0318e+03 3.1000e+02 + 7.7850e+02 3.8530e+02 4.7690e+02 7.9620e+02 2.3465e+03 2.6320e+03 4.3231e+03 + 1.6140e+03 1.0194e+03 4.9940e+02 6.1070e+02 3.3125e+03 3.4756e+03 1.5696e+03 + 5.0420e+02 3.5820e+02 8.4810e+02 8.8480e+02 2.8980e+02 2.0090e+02 4.8370e+02 + 4.8260e+02 4.6650e+02 4.4460e+02 4.9440e+02 3.6021e+03 6.2668e+03 5.4022e+03 + 3.0473e+03 9.7580e+02 1.6030e+02 2.0520e+02 4.6550e+02 2.1119e+03 3.1652e+03 + 1.6201e+03 1.7671e+03 1.0874e+03 5.6350e+02 1.0200e+03 5.7200e+02 4.0280e+02 + 4.0410e+02 2.9300e+02 3.6210e+02 4.0040e+02 4.3980e+02 5.5220e+02 3.9110e+02 + 3.9780e+02 7.9470e+02 3.9854e+03 6.6660e+02 4.8827e+03 4.3698e+03 8.2470e+02 + 7.7660e+02 4.0090e+02 3.8460e+02 2.9490e+02 6.4070e+02 2.6690e+02 4.0110e+02 + 7.7990e+02 1.4265e+03 2.3416e+03 3.5420e+03 2.8730e+03 8.9950e+02 8.9600e+02 + 1.9072e+03 3.0065e+03 3.0582e+03 5.3600e+02 6.3030e+02 4.4960e+02 4.9890e+02 + 6.3670e+02 4.1250e+02 5.0280e+02 3.0390e+02 4.9980e+02 2.5200e+02 7.6080e+02 + 1.1951e+03 2.7408e+03 7.0000e+03 5.9793e+03 2.0314e+03 8.2430e+02 4.4880e+02 + 2.8100e+02 5.2560e+02 1.0002e+03 3.9477e+03 3.2115e+03 3.8473e+03 2.4885e+03 + 5.7030e+02 7.0300e+02 1.2481e+03 5.8390e+02 4.7020e+02 6.5110e+02 4.1670e+02 + 6.1400e+02 5.7210e+02 4.1100e+02 6.9120e+02 1.0447e+03 8.7240e+02 4.2840e+03 + 5.0300e+02 3.7980e+03 7.0000e+03 2.2001e+03 6.5450e+02 3.0410e+02 3.1480e+02 + 3.5590e+02 4.5630e+02 2.5600e+02 2.6740e+02 3.6200e+02 1.0207e+03 1.2411e+03 + 5.5877e+03 2.2371e+03 2.4158e+03 2.1811e+03 3.4737e+03 3.7641e+03 1.2810e+03 + 8.7130e+02 5.5280e+02 6.8980e+02 4.9530e+02 3.7490e+02 4.0490e+02 4.2600e+02 + 5.3850e+02 3.3860e+02 3.4840e+02 4.4470e+02 1.3208e+03 3.5430e+03 4.5202e+03 + 5.7149e+03 3.3074e+03 4.8390e+02 5.5820e+02 5.1790e+02 3.3840e+02 1.0500e+03 + 2.6290e+03 2.1822e+03 3.2842e+03 2.2955e+03 2.1228e+03 1.6191e+03 7.8400e+02 + 1.3649e+03 8.3520e+02 1.0345e+03 5.4650e+02 6.2060e+02 5.5280e+02 3.1630e+02 + 8.9520e+02 1.1093e+03 8.1770e+02 3.1923e+03 3.8880e+02 1.3267e+03 7.0000e+03 + 3.5286e+03 5.1070e+02 3.4130e+02 2.2720e+02 4.8370e+02 3.7150e+02 4.8020e+02 + 3.7670e+02 3.2300e+02 7.4670e+02 8.1150e+02 2.5748e+03 3.6940e+03 3.0140e+03 + 5.5396e+03 3.2905e+03 4.5660e+03 7.3610e+02 5.6280e+02 5.3380e+02 5.4780e+02 + 5.6380e+02 2.7780e+02 4.9320e+02 4.2640e+02 4.7670e+02 1.1150e+02 4.0960e+02 + 2.8600e+02 2.7413e+03 4.7800e+03 4.8089e+03 6.1672e+03 1.0481e+03 4.3230e+02 + 7.7290e+02 5.6370e+02 3.9400e+02 3.5120e+02 1.3394e+03 1.8040e+03 2.3201e+03 + 2.2751e+03 4.2064e+03 4.0590e+03 1.1299e+03 1.4466e+03 8.0110e+02 7.5260e+02 + 7.5760e+02 1.2590e+03 4.7400e+02 2.7170e+02 3.5830e+02 6.4190e+02 1.5931e+03 + 4.7627e+03 3.4540e+02 5.8850e+02 5.0425e+03 4.5947e+03 1.0350e+03 5.2150e+02 + 6.6430e+02 2.3420e+02 3.3220e+02 8.8450e+02 7.5110e+02 8.1420e+02 4.1790e+02 + 6.9180e+02 1.6494e+03 2.8081e+03 6.2487e+03 4.5139e+03 3.2056e+03 2.2630e+03 + 7.2280e+02 3.5630e+02 5.7870e+02 4.1300e+02 6.6810e+02 4.8220e+02 4.6620e+02 + 6.3430e+02 3.4760e+02 3.2490e+02 6.4160e+02 5.0380e+02 2.5117e+03 6.2296e+03 + 7.0000e+03 4.0781e+03 5.2630e+02 2.5360e+02 6.8410e+02 8.1230e+02 4.1240e+02 + 3.8310e+02 4.4870e+02 8.0580e+02 1.6229e+03 1.7889e+03 3.5233e+03 3.2766e+03 + 1.4377e+03 2.4059e+03 2.1705e+03 1.2890e+03 1.5509e+03 6.9740e+02 5.6790e+02 + 4.7200e+02 5.3240e+02 5.4090e+02 2.4333e+03 4.4403e+03 2.9230e+02 6.7850e+02 + 2.8879e+03 4.1044e+03 1.8503e+03 1.3976e+03 6.9990e+02 2.2110e+02 4.0070e+02 + 7.6800e+02 9.2960e+02 7.8140e+02 4.5950e+02 5.5350e+02 8.3000e+02 4.7272e+03 + 7.0000e+03 4.2072e+03 2.8714e+03 1.0352e+03 9.2780e+02 4.2120e+02 5.1520e+02 + 6.1410e+02 5.2100e+02 5.3720e+02 6.0110e+02 6.9900e+02 4.1520e+02 4.4270e+02 + 3.5770e+02 7.7470e+02 2.6179e+03 4.0792e+03 5.9942e+03 3.3661e+03 7.8520e+02 + 5.7240e+02 1.0571e+03 4.4710e+02 2.1210e+02 1.9340e+02 6.4700e+02 2.6430e+02 + 7.3890e+02 7.7420e+02 2.6239e+03 3.0535e+03 1.1472e+03 1.0175e+03 1.5681e+03 + 2.1452e+03 2.0412e+03 6.6620e+02 1.0172e+03 4.4880e+02 3.9680e+02 5.1340e+02 + 3.7471e+03 3.9374e+03 3.1040e+02 6.5540e+02 1.3259e+03 2.3314e+03 4.5576e+03 + 1.8563e+03 7.5390e+02 2.9210e+02 3.5860e+02 7.9190e+02 4.1510e+02 6.9290e+02 + 8.3610e+02 6.9970e+02 1.7655e+03 4.2712e+03 7.0000e+03 1.8097e+03 1.2860e+03 + 9.2950e+02 9.8080e+02 5.4710e+02 3.8890e+02 7.5020e+02 6.5170e+02 5.7420e+02 + 4.9700e+02 6.5460e+02 4.3750e+02 4.3620e+02 1.2409e+03 1.7087e+03 4.7827e+03 + 5.1640e+03 6.6584e+03 3.1501e+03 6.3350e+02 7.8860e+02 1.1476e+03 3.7760e+02 + 2.0540e+02 2.6860e+02 4.0040e+02 3.2070e+02 2.5150e+02 3.8370e+02 9.8020e+02 + 7.2450e+02 6.3970e+02 7.8110e+02 2.4431e+03 3.0972e+03 2.0910e+03 1.6552e+03 + 3.1646e+03 1.9774e+03 5.7160e+02 1.2029e+03 4.2585e+03 3.9175e+03 3.0040e+02 + 5.3060e+02 1.1759e+03 2.9996e+03 3.1378e+03 3.4117e+03 7.1900e+02 2.8390e+02 + 7.2260e+02 6.4000e+02 3.0320e+02 5.4560e+02 6.2720e+02 2.2287e+03 2.2204e+03 + 5.2833e+03 7.0000e+03 2.4719e+03 4.7940e+02 6.6250e+02 5.5040e+02 5.5490e+02 + 3.9210e+02 7.3060e+02 6.4760e+02 5.5100e+02 4.0380e+02 3.0350e+02 4.5510e+02 + 5.7900e+02 1.0964e+03 1.9853e+03 4.7211e+03 3.5933e+03 4.0777e+03 2.7108e+03 + 6.5550e+02 5.2960e+02 1.1573e+03 6.2020e+02 5.5560e+02 3.2330e+02 7.8360e+02 + 6.2920e+02 3.9650e+02 2.6700e+02 5.9830e+02 8.1030e+02 8.3890e+02 3.9690e+02 + 1.0741e+03 1.2524e+03 2.9360e+03 2.7210e+03 1.9983e+03 3.0853e+03 2.3738e+03 + 1.5263e+03 2.6197e+03 2.8209e+03 6.0920e+02 8.8290e+02 9.7500e+02 1.2754e+03 + 4.1503e+03 2.9734e+03 1.2990e+03 2.8850e+02 4.4620e+02 4.0340e+02 1.4880e+02 + 6.2850e+02 1.1163e+03 3.5394e+03 3.3107e+03 3.3538e+03 4.2218e+03 2.9933e+03 + 5.0140e+02 6.2990e+02 4.5520e+02 4.8200e+02 6.8870e+02 6.9340e+02 5.6090e+02 + 3.7050e+02 3.9420e+02 2.7750e+02 1.3780e+02 5.0010e+02 3.0350e+03 3.0087e+03 + 4.4506e+03 2.8085e+03 3.8051e+03 1.1248e+03 4.8470e+02 4.8500e+02 5.5570e+02 + 4.9910e+02 3.1870e+02 7.2470e+02 5.1720e+02 6.9760e+02 4.3760e+02 2.5870e+02 + 3.1910e+02 2.5370e+02 8.1760e+02 5.8940e+02 4.2410e+02 1.1843e+03 7.8840e+02 + 1.6713e+03 2.4490e+03 2.2005e+03 5.3852e+03 2.8540e+03 4.7361e+03 2.4726e+03 + 5.1660e+02 6.7060e+02 3.5240e+02 1.0428e+03 3.0808e+03 6.1973e+03 2.1239e+03 + 3.6220e+02 4.6720e+02 8.3180e+02 6.3250e+02 6.3380e+02 2.1182e+03 4.6946e+03 + 5.0448e+03 2.1054e+03 3.7186e+03 1.9747e+03 7.9960e+02 8.2800e+02 2.1770e+02 + 4.9760e+02 5.6250e+02 5.3850e+02 4.9470e+02 4.7820e+02 5.3070e+02 5.5140e+02 + 3.3810e+02 5.9820e+02 2.1678e+03 2.6210e+03 3.8819e+03 4.5245e+03 4.8999e+03 + 4.8040e+02 5.2050e+02 5.1500e+02 4.3440e+02 2.7260e+02 2.5510e+02 1.2175e+03 + 6.8630e+02 6.1510e+02 4.2100e+02 2.5950e+02 2.4260e+02 5.0250e+02 4.1380e+02 + 4.0750e+02 5.4270e+02 7.5750e+02 6.5050e+02 1.0751e+03 1.4534e+03 3.9801e+03 + 5.7118e+03 5.7674e+03 3.2841e+03 1.0739e+03 7.0130e+02 4.7190e+02 8.9660e+02 + 5.0320e+02 1.5018e+03 3.9176e+03 3.1636e+03 5.7130e+02 4.0010e+02 6.7310e+02 + 8.7440e+02 6.7000e+02 2.5407e+03 3.9754e+03 2.1447e+03 9.5140e+02 5.3048e+03 + 2.2177e+03 8.7660e+02 7.4310e+02 4.7470e+02 6.6090e+02 4.7960e+02 9.2770e+02 + 6.1310e+02 4.7050e+02 3.1560e+02 5.8150e+02 2.0230e+02 6.8590e+02 2.1157e+03 + 5.4039e+03 1.0272e+03 3.9004e+03 5.4065e+03 6.8240e+02 7.0480e+02 4.5440e+02 + 4.2780e+02 4.8210e+02 3.8690e+02 6.3490e+02 6.2780e+02 4.4760e+02 4.2030e+02 + 5.8750e+02 4.9030e+02 9.3120e+02 4.8230e+02 4.5010e+02 3.5990e+02 7.1880e+02 + 5.7490e+02 5.5380e+02 6.7850e+02 1.6671e+03 2*7.0000e+03 4.0442e+03 + 1.2198e+03 8.7270e+02 5.3960e+02 7.6800e+02 7.3590e+02 1.1067e+03 4.7739e+03 + 4.0657e+03 5.0570e+02 3.4670e+02 1.0179e+03 1.0929e+03 2.2057e+03 3.1884e+03 + 3.1286e+03 3.2568e+03 1.6055e+03 3.5579e+03 3.3541e+03 6.1740e+02 4.6780e+02 + 5.7650e+02 5.7810e+02 3.6220e+02 6.0870e+02 2.8540e+02 1.8440e+02 4.7880e+02 + 9.6240e+02 3.0870e+02 5.2380e+02 4.6670e+03 4.4112e+03 2.5531e+03 2.7883e+03 + 4.5962e+03 7.4060e+02 3.2210e+02 7.2860e+02 4.5260e+02 3.0840e+02 4.8920e+02 + 7.3630e+02 2.5960e+02 2.9430e+02 4.1910e+02 6.5450e+02 5.6500e+02 7.5580e+02 + 4.9980e+02 1.8290e+02 4.5610e+02 6.0630e+02 5.9180e+02 1.3228e+03 5.9460e+02 + 2.2056e+03 6.3619e+03 6.4048e+03 4.8314e+03 1.2404e+03 4.0230e+02 5.9650e+02 + 4.8830e+02 1.0633e+03 8.1680e+02 5.4674e+03 4.6579e+03 9.7580e+02 7.6530e+02 + 1.2104e+03 1.3762e+03 2.0684e+03 3.9612e+03 2.3571e+03 1.1588e+03 2.4417e+03 + 2.9875e+03 2.0472e+03 1.0101e+03 6.5640e+02 2.0980e+02 5.7720e+02 2.9910e+02 + 8.0570e+02 5.5870e+02 2.5500e+02 1.8010e+02 5.1260e+02 8.7250e+02 1.6118e+03 + 3.0963e+03 4.0146e+03 1.8296e+03 2.9406e+03 4.3704e+03 2.1594e+03 3.8640e+02 + 4.5410e+02 4.1510e+02 4.4470e+02 3.6810e+02 6.0500e+02 2.4320e+02 7.5040e+02 + 7.6240e+02 7.9890e+02 6.4660e+02 3.8900e+02 4.9280e+02 2.1680e+02 + 2*5.4490e+02 1.1221e+03 1.3317e+03 9.3230e+02 4.5743e+03 4.7926e+03 + 5.5761e+03 6.5365e+03 9.9220e+02 4.7750e+02 5.4260e+02 5.9510e+02 7.6490e+02 + 1.0818e+03 5.5250e+03 3.4243e+03 7.5500e+02 4.7020e+02 2.2114e+03 2.8337e+03 + 2.3705e+03 1.8731e+03 7.3080e+02 6.6410e+02 2.2409e+03 2.0753e+03 2.6034e+03 + 4.3520e+02 2.9740e+02 3.0630e+02 4.4280e+02 4.0260e+02 5.3730e+02 7.0820e+02 + 4.2700e+02 5.0040e+02 4.2440e+02 8.4110e+02 5.6060e+02 4.3195e+03 3.9045e+03 + 2.8092e+03 3.6340e+03 3.5785e+03 8.0710e+02 4.1990e+02 3.9910e+02 1.0141e+03 + 8.6030e+02 2.6920e+02 3.7220e+02 2.7750e+02 5.1970e+02 7.7700e+02 1.1747e+03 + 7.0320e+02 3.6980e+02 2.3420e+02 7.3180e+02 5.2200e+02 9.9130e+02 1.3378e+03 + 1.3979e+03 1.9266e+03 4.7604e+03 2.5506e+03 2.2249e+03 3.0033e+03 3.4114e+03 + 3.1260e+02 6.4240e+02 6.3140e+02 5.1770e+02 1.0795e+03 3.4506e+03 4.9959e+03 + 9.8620e+02 1.5297e+03 4.6869e+03 4.8928e+03 1.1601e+03 4.2590e+02 1.5970e+02 + 6.5790e+02 1.7109e+03 2.8699e+03 3.8071e+03 5.4960e+02 1.5200e+02 4.1700e+02 + 5.4470e+02 5.9650e+02 6.1340e+02 6.7260e+02 5.9310e+02 7.0730e+02 5.1730e+02 + 3.9620e+02 7.0840e+02 2.3512e+03 4.5745e+03 1.0297e+03 2.2747e+03 3.5295e+03 + 6.8870e+02 5.3120e+02 2.3450e+02 5.8180e+02 1.3528e+03 2.8270e+02 3.0480e+02 + 3.8150e+02 1.2034e+03 1.1998e+03 7.3590e+02 8.0540e+02 4.4670e+02 3.5220e+02 + 3.9360e+02 7.3330e+02 1.2330e+03 1.0545e+03 1.1513e+03 3.1115e+03 3.3560e+03 + 3.1858e+03 6.6490e+02 2.0748e+03 3.8897e+03 5.5340e+02 6.0340e+02 5.1210e+02 + 5.0330e+02 7.7430e+02 2.5900e+03 4.0246e+03 2.3417e+03 4.1914e+03 3.8777e+03 + 2.2504e+03 1.4206e+03 4.6690e+02 2.2130e+02 5.5290e+02 1.0300e+03 4.2611e+03 + 4.1825e+03 2.7850e+02 2.9920e+02 4.4380e+02 7.8360e+02 4.7440e+02 5.8860e+02 + 7.6340e+02 8.0670e+02 7.8430e+02 5.1310e+02 5.8140e+02 2.0671e+03 2.6639e+03 + 4.6276e+03 1.3000e+03 5.3789e+03 3.1810e+03 1.7929e+03 7.9230e+02 4.8840e+02 + 5.2380e+02 5.1430e+02 5.0880e+02 1.1200e+02 3.4520e+02 4.7210e+02 8.5290e+02 + 3.0740e+02 3.2100e+02 4.0460e+02 6.1160e+02 7.5400e+02 9.2280e+02 2.4139e+03 + 3.3905e+03 2.6103e+03 3.4706e+03 2.3496e+03 1.5980e+03 1.1305e+03 1.4906e+03 + 1.6339e+03 8.9720e+02 4.1950e+02 3.8790e+02 6.1860e+02 8.1230e+02 2.6280e+03 + 3.1663e+03 3.8023e+03 3.5856e+03 3.0826e+03 3.4480e+02 6.5250e+02 3.4380e+02 + 2.3600e+02 6.7650e+02 3.1322e+03 4.6338e+03 2.1062e+03 5.4410e+02 2.5730e+02 + 2.2310e+02 6.1890e+02 3.3880e+02 8.2930e+02 9.5940e+02 8.1440e+02 5.5030e+02 + 5.1990e+02 2.6000e+02 9.6570e+02 3.4549e+03 1.3900e+03 1.1173e+03 3.7064e+03 + 4.3058e+03 2.2475e+03 9.2990e+02 9.5280e+02 1.0187e+03 7.5220e+02 2.5730e+02 + 3.6390e+02 4.2450e+02 9.9160e+02 3.7470e+02 3.4220e+02 4.5690e+02 4.9750e+02 + 5.1370e+02 9.9010e+02 1.7794e+03 3.2404e+03 3.1241e+03 3.7186e+03 1.9712e+03 + 5.6500e+02 6.8030e+02 1.0063e+03 5.7810e+02 4.9400e+02 7.1570e+02 4.9690e+02 + 3.8110e+02 5.7540e+02 6.6310e+02 3.2610e+03 3.4990e+03 5.3369e+03 5.8849e+03 + 2.8264e+03 9.9690e+02 3.2070e+02 3.6490e+02 4.2740e+02 4.2660e+02 2.5335e+03 + 4.0126e+03 2.4613e+03 7.5230e+02 5.0340e+02 2.6730e+02 5.5730e+02 4.8740e+02 + 4.6860e+02 1.0311e+03 1.0412e+03 6.2350e+02 3.1100e+02 4.4490e+02 9.1760e+02 + 2.1622e+03 2.9491e+03 1.0625e+03 3.7431e+03 5.2087e+03 2.5328e+03 6.3660e+02 + 7.1300e+02 8.5500e+02 3.8890e+02 4.5980e+02 5.8220e+02 7.0290e+02 3.5580e+02 + 4.2300e+02 4.0090e+02 2.7390e+02 2.8380e+02 7.0220e+02 1.3777e+03 1.3406e+03 + 2.7711e+03 3.2241e+03 2.4491e+03 8.5300e+02 8.0530e+02 4.3080e+02 6.3340e+02 + 1.2388e+03 9.4620e+02 3.1690e+02 4.0900e+02 6.9780e+02 4.3030e+02 5.4880e+02 + 2.0411e+03 6.3720e+03 3.7507e+03 4.0750e+03 9.5130e+02 4.2470e+02 3.9680e+02 + 5.3850e+02 8.6560e+02 8.8480e+02 3.5154e+03 4.3315e+03 1.7134e+03 3.9280e+02 + 5.3960e+02 3.1910e+02 5.4160e+02 1.8960e+02 4.8750e+02 6.1380e+02 7.0730e+02 + 4.9240e+02 2.7420e+02 3.3110e+02 5.4960e+02 3.0445e+03 2.0459e+03 9.4890e+02 + 1.9755e+03 3.2211e+03 2.4852e+03 1.0248e+03 6.3930e+02 7.5240e+02 2.4470e+02 + 2.8380e+02 8.0370e+02 7.7410e+02 6.5480e+02 4.5350e+02 7.3800e+02 4.4450e+02 + 4.3400e+02 1.0398e+03 3.7371e+03 2.8281e+03 3.0450e+03 2.1442e+03 1.0473e+03 + 5.4440e+02 2.6560e+02 5.5950e+02 3.3190e+02 5.0100e+02 6.1220e+02 6.4280e+02 + 2.3240e+02 7.7690e+02 4.3680e+02 9.8500e+02 2.8573e+03 7.0000e+03 3.1769e+03 + 1.8253e+03 8.4710e+02 6.6960e+02 6.2940e+02 7.1360e+02 1.4430e+03 9.6580e+02 + 4.1939e+03 3.0719e+03 5.4710e+02 9.9920e+02 6.2070e+02 7.5200e+02 4.1070e+02 + 3.3330e+02 6.2320e+02 4.7520e+02 5.0970e+02 4.0600e+02 6.5860e+02 3.5590e+02 + 1.7694e+03 4.0853e+03 2.7289e+03 5.4110e+02 1.2257e+03 4.4240e+03 4.8298e+03 + 5.9300e+02 5.9960e+02 6.6690e+02 2.4460e+02 3.5950e+02 5.3750e+02 6.7280e+02 + 4.8850e+02 5.6550e+02 4.2970e+02 3.7900e+02 7.2810e+02 3.8536e+03 3.1926e+03 + 2.1295e+03 3.7660e+02 8.4980e+02 8.8350e+02 4.6850e+02 3.9010e+02 5.4430e+02 + 2.0690e+02 2.7470e+02 1.0336e+03 2.7730e+02 3.8330e+02 8.7650e+02 8.4520e+02 + 3.2460e+02 3.6020e+03 5.1003e+03 3.3773e+03 1.9756e+03 4.7990e+02 6.4680e+02 + 7.3080e+02 4.9720e+02 1.2831e+03 1.9332e+03 5.4900e+03 2.2990e+03 7.3960e+02 + 6.1720e+02 6.3440e+02 5.6900e+02 4.7990e+02 2.7460e+02 5.6300e+02 3.9800e+02 + 6.2460e+02 2.1970e+02 4.6040e+02 4.2480e+02 2.0510e+03 5.2021e+03 2.8362e+03 + 1.3334e+03 1.0254e+03 2.1754e+03 5.5806e+03 6.9780e+02 5.0690e+02 3.8920e+02 + 2.2560e+02 4.4520e+02 1.0397e+03 3.5720e+02 5.6090e+02 5.1340e+02 4.7820e+02 + 6.0030e+02 3.0880e+02 2.6642e+03 3.5540e+03 2.0310e+03 5.2670e+02 7.1240e+02 + 2.6980e+02 5.8010e+02 5.8030e+02 6.3790e+02 4.6270e+02 5.4510e+02 5.5940e+02 + 5.7350e+02 3.3590e+02 7.7000e+02 9.1090e+02 8.8510e+02 4.6963e+03 4.5035e+03 + 7.9770e+02 7.0720e+02 6.5160e+02 7.5110e+02 4.5060e+02 4.5340e+02 5.4680e+02 + 1.3089e+03 6.2025e+03 3.5686e+03 7.4580e+02 8.3370e+02 4.5660e+02 7.6490e+02 + 7.6250e+02 5.1760e+02 4.2590e+02 6.0600e+02 6.8000e+02 4.8300e+02 3.9810e+02 + 5.5750e+02 1.1604e+03 3.8296e+03 4.0972e+03 1.6222e+03 9.8950e+02 2.6912e+03 + 5.5755e+03 2.2306e+03 6.4680e+02 5.7850e+02 9.7330e+02 9.7820e+02 6.4710e+02 + 6.9250e+02 5.5630e+02 4.7530e+02 6.4500e+02 4.1220e+02 1.0521e+03 3.3792e+03 + 3.1041e+03 7.5080e+02 5.0360e+02 6.2830e+02 2.9780e+02 5.4580e+02 7.2590e+02 + 5.5620e+02 3.1080e+02 3.5210e+02 2.1620e+02 4.5360e+02 4.0700e+02 8.8980e+02 + 9.9480e+02 4.0405e+03 4.2546e+03 5.0181e+03 2.2336e+03 8.4580e+02 5.1610e+02 + 3.4570e+02 8.6610e+02 3.0200e+02 3.3470e+02 1.8799e+03 4.2230e+03 2.7424e+03 + 6.9440e+02 3.6460e+02 5.2020e+02 5.0770e+02 6.8520e+02 4.5940e+02 3.9500e+02 + 1.2826e+03 6.6570e+02 6.3000e+02 4.0610e+02 6.4450e+02 2.2118e+03 5.6169e+03 + 5.1246e+03 2.0799e+03 3.5940e+02 1.6651e+03 4.3326e+03 2.4949e+03 3.8500e+02 + 4.3510e+02 6.5420e+02 7.3730e+02 4.3310e+02 6.3520e+02 4.1080e+02 4.0290e+02 + 5.5060e+02 5.7280e+02 2.2028e+03 4.8024e+03 3.2083e+03 1.7504e+03 6.5980e+02 + 3.0100e+02 2.2330e+02 3.8970e+02 4.5430e+02 6.9890e+02 4.5880e+02 3.0010e+02 + 3.9820e+02 4.2520e+02 3.8910e+02 4.5380e+02 1.4392e+03 3.6213e+03 3.5824e+03 + 2.5498e+03 6.5040e+02 7.1460e+02 8.4780e+02 6.3710e+02 6.6780e+02 7.0750e+02 + 5.4250e+02 4.4796e+03 4.3684e+03 1.7834e+03 9.5590e+02 5.3360e+02 3.2920e+02 + 5.3150e+02 6.7930e+02 3.5130e+02 3.9890e+02 6.1830e+02 1.0480e+03 8.8580e+02 + 4.1780e+02 4.3230e+02 2.7494e+03 3.4827e+03 3.8605e+03 9.9870e+02 2.8040e+02 + 1.4254e+03 5.6873e+03 2.5287e+03 9.4100e+02 5.9490e+02 5.8390e+02 4.1400e+02 + 5.9300e+02 3.6560e+02 6.3320e+02 7.3650e+02 2.6910e+02 7.6700e+02 3.0881e+03 + 6.4273e+03 2.7509e+03 9.3280e+02 4.3510e+02 3.1070e+02 3.4110e+02 5.0710e+02 + 6.0180e+02 4.4890e+02 3.2340e+02 3.3550e+02 4.0240e+02 5.4550e+02 3.1790e+02 + 3.3120e+02 6.7120e+02 4.3704e+03 4.7296e+03 7.2070e+02 6.9080e+02 4.4420e+02 + 7.2260e+02 3.8420e+02 8.6400e+02 5.9880e+02 3.0890e+02 2.2930e+03 3.2925e+03 + 1.7406e+03 6.3390e+02 2.5870e+02 3.4860e+02 3.6910e+02 6.1240e+02 6.8450e+02 + 3.3250e+02 5.3770e+02 8.2390e+02 4.1360e+02 3.7940e+02 3.3330e+02 2.2182e+03 + 3.7788e+03 3.6340e+03 9.8020e+02 3.5230e+02 1.1376e+03 4.3865e+03 5.3236e+03 + 1.8780e+03 5.8720e+02 4.6660e+02 2.9330e+02 5.9070e+02 6.4640e+02 5.9320e+02 + 3.9280e+02 3.9470e+02 8.6440e+02 4.1685e+03 6.1176e+03 1.9432e+03 8.1080e+02 + 5.0550e+02 2.5630e+02 3.4980e+02 4.8350e+02 8.0870e+02 5.6950e+02 7.5030e+02 + 4.9080e+02 1.7500e+02 8.2180e+02 4.1450e+02 5.6930e+02 2.2489e+03 3.2531e+03 + 3.9019e+03 8.6430e+02 4.8750e+02 6.0690e+02 5.1860e+02 6.2110e+02 1.0518e+03 + 3.5720e+02 3.3570e+02 4.2565e+03 4.1431e+03 6.9580e+02 5.5430e+02 5.6670e+02 + 2.6550e+02 2.6650e+02 4.4050e+02 7.2510e+02 4.0810e+02 3.6990e+02 8.0400e+02 + 4.7650e+02 7.0190e+02 4.0900e+02 2.4610e+03 3.9941e+03 2.5019e+03 3.6450e+02 + 2.4230e+02 5.9360e+02 1.9255e+03 3.6672e+03 2.0873e+03 7.4040e+02 6.2780e+02 + 3.4010e+02 5.8320e+02 3.7930e+02 3.0040e+02 1.6870e+02 6.1560e+02 1.1399e+03 + 5.0222e+03 2.9782e+03 8.9310e+02 1.0215e+03 2.7590e+02 2.2810e+02 5.1070e+02 + 6.5240e+02 5.9000e+02 4.2600e+02 5.5340e+02 3.5780e+02 3.1050e+02 7.0980e+02 + 2.6220e+02 4.5470e+02 2.1203e+03 4.0721e+03 1.4489e+03 9.4750e+02 7.1300e+02 + 6.5060e+02 7.1210e+02 7.2920e+02 7.4680e+02 2.4580e+02 4.5500e+02 4.1167e+03 + 5.9060e+03 1.5768e+03 7.4080e+02 4.6970e+02 2.8850e+02 6.4120e+02 7.1650e+02 + 8.0440e+02 4.6810e+02 5.3930e+02 6.0840e+02 8.1150e+02 7.6880e+02 5.2080e+02 + 9.1370e+02 4.6944e+03 2.5335e+03 4.5890e+02 3.5870e+02 5.5020e+02 2.4913e+03 + 2.9814e+03 4.3979e+03 6.9170e+02 8.1300e+02 2.3990e+02 4.2820e+02 3.3350e+02 + 5.6860e+02 6.9960e+02 8.8830e+02 2.6495e+03 4.1941e+03 2.3601e+03 7.5880e+02 + 7.8120e+02 3.9590e+02 5.8770e+02 5.2420e+02 5.8030e+02 3.3550e+02 3.1860e+02 + 7.1350e+02 5.6780e+02 4.1050e+02 5.4040e+02 2.5440e+02 4.5160e+02 3.8101e+03 + 4.3789e+03 1.8141e+03 6.8990e+02 7.8570e+02 3.7720e+02 2.5700e+02 5.0120e+02 + 5.4670e+02 2.1400e+02 8.3920e+02 2.3869e+03 4.5474e+03 1.5820e+03 3.7960e+02 + 5.1340e+02 4.8430e+02 4.1560e+02 6.8460e+02 1.0041e+03 4.9300e+02 4.8860e+02 + 3.2220e+02 3.8430e+02 3.3710e+02 9.0650e+02 1.2064e+03 4.1759e+03 2.8025e+03 + 9.6610e+02 5.5390e+02 4.0020e+02 1.0548e+03 3.3699e+03 5.0644e+03 1.7565e+03 + 2.8300e+02 3.9170e+02 3.4150e+02 2.1870e+02 3.4020e+02 1.0869e+03 2.1863e+03 + 2.1628e+03 2.5291e+03 2.0952e+03 6.1460e+02 4.4330e+02 3.3760e+02 5.7870e+02 + 6.9720e+02 1.0691e+03 2.8420e+02 2.1360e+02 2.2870e+02 5.4910e+02 1.0580e+03 + 5.6330e+02 2.8520e+02 7.4480e+02 2.8848e+03 5.4255e+03 1.2853e+03 4.9030e+02 + 1.2933e+03 3.0190e+02 5.8190e+02 2.6360e+02 3.6290e+02 4.0610e+02 5.0310e+02 + 2.8480e+03 5.4647e+03 1.3363e+03 4.6170e+02 8.3980e+02 1.5570e+02 5.4250e+02 + 4.0420e+02 1.1588e+03 7.3340e+02 7.6050e+02 5.6640e+02 4.2180e+02 3.9250e+02 + 3.7840e+02 1.9202e+03 4.3479e+03 3.5848e+03 1.5105e+03 3.4780e+02 4.9100e+02 + 1.2254e+03 2.4440e+03 3.8970e+03 1.8651e+03 1.4043e+03 3.0260e+02 3.1560e+02 + 4.4700e+02 1.2084e+03 2.7970e+03 4.6215e+03 3.1956e+03 2.1607e+03 1.4878e+03 + 7.8070e+02 3.5610e+02 3.6580e+02 8.9590e+02 1.0467e+03 6.2130e+02 2.0160e+02 + 4.4600e+02 3.5150e+02 3.6180e+02 8.5170e+02 4.2970e+02 4.9300e+02 4.1200e+02 + 3.2864e+03 4.8426e+03 2.1281e+03 5.9100e+02 1.0084e+03 7.1400e+02 3.7180e+02 + 3.5500e+02 5.8550e+02 5.3650e+02 6.6850e+02 1.9112e+03 4.8169e+03 2.6548e+03 + 3.6820e+02 4.5860e+02 2.9540e+02 3.3580e+02 4.9030e+02 5.1810e+02 8.2850e+02 + 6.0640e+02 3.6440e+02 4.4200e+02 3.0090e+02 7.3570e+02 2.1126e+03 4.8215e+03 + 2.1045e+03 1.0990e+03 4.7000e+02 5.6580e+02 8.4890e+02 9.9670e+02 2.7758e+03 + 3.7379e+03 1.2886e+03 4.6160e+02 1.0908e+03 1.6021e+03 2.3304e+03 2.0708e+03 + 3.3534e+03 2.3589e+03 1.0189e+03 9.5760e+02 5.4000e+02 6.4220e+02 9.9500e+01 + 4.2520e+02 6.5980e+02 7.3120e+02 6.4970e+02 7.7780e+02 7.1880e+02 4.6940e+02 + 6.0250e+02 2.0460e+02 3.3450e+02 7.9450e+02 3.7079e+03 5.0746e+03 1.0398e+03 + 7.4730e+02 7.5720e+02 4.9000e+02 4.8980e+02 2.5480e+02 3.9950e+02 6.0750e+02 + 7.8780e+02 1.7071e+03 4.4481e+03 4.0758e+03 8.8220e+02 7.4960e+02 4.1630e+02 + 4.9150e+02 6.8860e+02 4.0990e+02 7.3620e+02 6.8640e+02 5.1100e+02 3.6610e+02 + 5.0290e+02 3.6510e+02 1.4400e+03 3.2688e+03 4.0629e+03 1.0339e+03 4.2360e+02 + 5.2790e+02 7.7240e+02 1.1414e+03 1.0420e+03 3.5864e+03 3.9424e+03 9.0000e+02 + 2.4403e+03 2.1113e+03 2.9210e+03 2.6000e+03 2.2948e+03 1.6903e+03 5.7170e+02 + 3.2990e+02 4.0330e+02 4.9880e+02 5.2170e+02 4.7870e+02 7.1930e+02 5.0230e+02 + 6.9750e+02 1.0343e+03 3.0970e+02 9.8090e+02 2.7610e+02 6.6790e+02 3.4410e+02 + 6.4880e+02 2.6845e+03 5.7342e+03 1.7152e+03 5.0500e+02 2.5600e+02 5.4770e+02 + 4.1640e+02 4.5030e+02 7.7650e+02 1.0373e+03 4.8400e+02 9.6300e+02 3.2866e+03 + 4.8419e+03 1.7712e+03 7.1950e+02 6.1910e+02 9.0690e+02 4.6560e+02 4.1810e+02 + 5.1990e+02 9.1480e+02 3.7760e+02 3.3020e+02 2.7840e+02 1.2350e+02 1.5138e+03 + 5.1923e+03 1.6809e+03 1.3374e+03 4.4290e+02 4.0970e+02 5.2390e+02 3.6160e+02 + 5.9220e+02 5.1632e+03 5.5246e+03 8.6580e+02 4.5724e+03 4.2497e+03 4.6595e+03 + 1.2674e+03 1.3901e+03 8.6710e+02 6.1540e+02 4.4640e+02 2.6620e+02 7.5230e+02 + 2.9700e+02 9.3090e+02 1.3243e+03 7.6100e+02 5.4840e+02 4.0240e+02 8.1780e+02 + 7.3050e+02 8.2190e+02 7.1010e+02 5.2290e+02 7.4730e+02 4.8736e+03 4.4080e+03 + 8.4420e+02 5.0590e+02 1.9350e+02 4.2020e+02 3.8420e+02 3.4430e+02 3.8310e+02 + 6.9090e+02 5.1450e+02 1.1029e+03 2.4939e+03 3.6014e+03 1.0604e+03 7.0050e+02 + 5.9380e+02 7.1600e+02 5.2860e+02 3.8670e+02 8.1300e+02 8.4030e+02 5.1180e+02 + 1.0670e+02 3.6250e+02 3.4010e+02 1.1141e+03 4.0172e+03 1.2482e+03 9.0900e+02 + 6.2800e+02 3.3200e+02 9.3700e+02 7.1080e+02 9.2150e+02 2.5472e+03 5.1613e+03 + 2.4165e+03 4.1237e+03 6.4349e+03 1.0134e+03 4.8950e+02 9.2260e+02 6.1740e+02 + 5.3700e+02 6.2150e+02 1.1426e+03 3.7580e+02 5.6270e+02 5.3730e+02 1.1949e+03 + 3.3470e+02 3.8160e+02 8.1560e+02 9.2460e+02 5.1650e+02 7.6480e+02 6.6670e+02 + 6.2200e+02 7.8530e+02 4.9693e+03 5.7433e+03 8.8620e+02 4.8930e+02 2.1160e+02 + 4.6410e+02 1.7270e+02 3.5400e+02 6.3590e+02 7.0120e+02 3.6820e+02 4.6800e+02 + 2.4034e+03 5.7440e+03 2.6333e+03 5.2190e+02 7.3840e+02 7.0500e+02 6.5280e+02 + 3.6050e+02 3.4650e+02 8.4430e+02 4.9270e+02 1.6430e+02 3.8590e+02 5.1390e+02 + 1.6553e+03 4.8559e+03 1.9570e+03 8.5310e+02 4.7690e+02 5.4250e+02 4.9770e+02 + 4.4330e+02 5.8100e+02 2.4266e+03 3.8058e+03 4.5828e+03 3.3257e+03 5.9783e+03 + 8.6780e+02 2.1830e+02 4.6080e+02 6.6300e+02 4.5870e+02 6.9520e+02 6.1690e+02 + 5.4660e+02 3.0120e+02 4.6210e+02 6.6250e+02 8.9560e+02 4.2260e+02 8.4360e+02 + 9.6780e+02 1.0324e+03 6.6390e+02 3.7890e+02 5.0540e+02 1.5116e+03 2.2420e+03 + 2.6077e+03 3.8810e+02 2.8930e+02 3.3770e+02 3.3280e+02 2.0930e+02 4.5570e+02 + 5.8320e+02 9.2290e+02 4.7680e+02 4.3190e+02 1.9101e+03 4.1462e+03 3.3160e+03 + 9.0040e+02 7.7610e+02 6.2270e+02 8.2190e+02 5.2960e+02 6.4110e+02 2.0200e+02 + 5.2270e+02 2.5020e+02 4.0830e+02 5.7530e+02 3.2161e+03 4.4742e+03 1.2861e+03 + 4.7050e+02 4.1040e+02 6.1120e+02 4.3590e+02 5.2040e+02 3.4390e+02 9.3280e+02 + 3.9970e+03 4.9789e+03 6.6560e+03 5.6261e+03 1.3976e+03 2.3010e+02 2.5830e+02 + 6.9290e+02 4.3540e+02 4.7740e+02 5.6460e+02 4.0420e+02 1.6400e+02 4.8950e+02 + 5.4320e+02 4.8210e+02 5.5410e+02 6.7270e+02 7.6050e+02 1.3471e+03 2.7684e+03 + 4.2670e+02 4.6200e+02 8.1630e+02 3.8232e+03 4.5429e+03 7.8040e+02 3.5940e+02 + 5.7950e+02 2.1400e+02 3.2770e+02 3.9760e+02 7.6970e+02 3.7040e+02 4.5730e+02 + 4.3670e+02 2.0258e+03 3.3263e+03 4.2655e+03 1.3842e+03 4.2900e+02 2.4340e+02 + 7.4550e+02 5.7550e+02 2.1910e+02 3.4820e+02 1.9240e+02 2.6690e+02 6.2680e+02 + 2.8466e+03 4.9755e+03 5.5255e+03 7.1500e+02 3.0010e+02 3.8310e+02 3.5480e+02 + 5.5140e+02 5.6290e+02 3.4570e+02 2.8070e+02 2.5511e+03 4.6215e+03 6.8469e+03 + 4.2375e+03 1.7553e+03 2.6920e+02 1.9790e+02 4.8860e+02 4.5750e+02 5.0610e+02 + 5.3810e+02 3.0810e+02 4.6740e+02 3.8490e+02 5.0790e+02 5.9980e+02 5.6030e+02 + 4.2570e+02 4.8840e+02 6.9730e+02 1.3916e+03 6.2890e+02 2.9880e+02 5.9840e+02 + 1.4996e+03 3.2744e+03 4.0770e+02 6.2750e+02 4.8970e+02 3.2850e+02 2.2590e+02 + 3.8010e+02 7.8960e+02 6.4450e+02 4.5320e+02 4.4100e+02 7.7440e+02 3.5260e+03 + 4.2275e+03 2.8768e+03 6.9190e+02 2.7820e+02 6.6590e+02 4.4270e+02 2.6680e+02 + 2.3490e+02 4.5170e+02 4.4920e+02 4.4370e+02 8.0670e+02 4.9912e+03 4.2101e+03 + 6.5230e+02 2.8110e+02 3.9020e+02 7.3940e+02 4.6010e+02 4.7660e+02 5.2410e+02 + 7.0420e+02 2.0273e+03 4.8531e+03 6.3536e+03 3.8432e+03 6.6710e+02 5.0540e+02 + 2.8910e+02 5.3010e+02 9.0980e+02 5.5730e+02 1.7260e+02 5.0180e+02 5.1020e+02 + 3.0960e+02 7.1370e+02 1.1015e+03 5.1860e+02 5.4160e+02 2.5330e+02 2.8410e+02 + 2.9151e+03 5.2160e+02 6.1230e+02 4.1000e+02 2.4314e+03 2.4486e+03 1.7237e+03 + 5.4820e+02 7.8620e+02 8.2930e+02 5.5170e+02 5.5650e+02 8.4750e+02 4.0340e+02 + 1.7840e+02 4.8880e+02 5.9270e+02 1.6127e+03 4.1718e+03 2.6377e+03 1.3871e+03 + 4.0820e+02 6.8640e+02 3.6570e+02 3.3130e+02 7.0150e+02 6.4250e+02 5.3250e+02 + 6.1990e+02 2.7260e+03 4.6725e+03 2.3481e+03 3.8710e+02 3.9340e+02 4.2980e+02 + 6.7230e+02 6.2920e+02 2.7140e+02 3.2050e+02 4.6900e+02 1.3331e+03 3.1797e+03 + 5.8981e+03 3.1844e+03 9.4310e+02 9.7400e+02 5.0170e+02 4.8040e+02 5.0060e+02 + 4.2700e+02 2.0490e+02 5.5300e+02 7.4960e+02 6.5060e+02 6.3720e+02 6.2660e+02 + 8.1010e+02 7.6970e+02 3.2850e+02 1.1770e+02 2.3404e+03 9.2610e+02 3.7060e+02 + 3.2870e+02 1.3999e+03 2.0838e+03 2.1432e+03 1.0915e+03 8.2860e+02 3.6910e+02 + 1.0913e+03 4.4820e+02 3.2990e+02 1.0206e+03 2.9010e+02 3.8180e+02 8.3630e+02 + 7.6090e+02 2.5336e+03 3.9043e+03 1.8953e+03 6.5900e+02 8.6380e+02 2.6270e+02 + 3.8500e+02 6.1540e+02 8.6710e+02 9.7110e+02 7.6490e+02 2.6462e+03 3.0269e+03 + 2.6758e+03 5.7040e+02 7.1410e+02 4.7500e+02 1.1020e+03 7.7510e+02 3.4260e+02 + 2.5430e+02 4.5450e+02 8.7450e+02 2.4472e+03 4.6203e+03 4.2437e+03 2.1305e+03 + 5.8270e+02 5.7740e+02 2.8630e+02 4.6460e+02 3.7080e+02 2.3000e+02 3.0110e+02 + 1.0986e+03 6.6500e+02 3.7560e+02 8.5210e+02 1.1227e+03 4.7520e+02 2.2920e+02 + 1.2700e+02 2.0682e+03 3.7430e+02 6.4570e+02 2.3816e+03 2.8722e+03 1.5231e+03 + 8.5350e+02 2.2570e+02 2.3380e+02 5.9660e+02 3.6534e+03 3.3456e+03 1.9795e+03 + 4.8610e+02 8.0930e+02 1.0326e+03 6.3650e+02 2.9690e+02 9.7600e+01 3.4960e+02 + 9.2440e+02 4.2358e+03 2.7366e+03 1.3672e+03 1.1100e+03 7.3210e+02 1.0697e+03 + 3.0440e+03 2.6312e+03 2.4272e+03 1.1018e+03 1.4069e+03 5.6870e+02 4.8810e+02 + 5.5150e+02 8.7100e+02 5.7830e+02 6.7090e+02 2.0350e+03 3.2544e+03 3.5005e+03 + 4.6837e+03 2.5018e+03 3.5970e+02 5.1480e+02 3.5270e+02 1.8400e+02 2.0240e+02 + 3.2290e+02 4.1330e+02 2.8350e+02 6.0240e+02 7.3720e+02 1.0518e+03 6.6340e+02 + 4.6820e+02 9.9090e+02 7.1880e+02 1.0374e+03 6.4990e+02 8.2270e+02 7.1560e+02 + 6.4730e+02 3.4718e+03 2.6458e+03 9.2890e+02 4.9200e+02 3.8430e+02 2.7880e+02 + 1.0772e+03 2.0088e+03 3.6338e+03 8.2740e+02 7.2850e+02 6.0200e+02 7.9940e+02 + 6.1280e+02 4.7450e+02 2.7100e+02 4.4030e+02 5.9660e+02 2.6778e+03 3.2754e+03 + 2.0459e+03 7.0760e+02 5.7320e+02 4.1810e+02 1.7424e+03 3.8068e+03 3.3232e+03 + 1.4452e+03 1.1152e+03 7.6470e+02 3.6430e+02 4.9800e+02 7.3530e+02 5.9010e+02 + 7.5290e+02 1.0282e+03 1.9616e+03 2*5.6000e+03 2.9184e+03 1.0450e+03 + 3.0820e+02 4.7910e+02 2.7730e+02 1.1380e+02 5.2980e+02 2.7460e+02 2.0450e+02 + 1.1500e+02 7.6340e+02 1.4395e+03 4.8920e+02 6.5420e+02 9.8240e+02 5.7670e+02 + 7.5930e+02 6.9520e+02 3.4550e+02 1.0206e+03 1.1207e+03 3.6007e+03 1.4712e+03 + 9.7880e+02 3.0940e+02 4.0480e+02 3.7980e+02 1.3010e+03 4.2684e+03 3.1807e+03 + 1.3962e+03 2.6490e+02 2.8170e+02 3.0760e+02 3.1990e+02 4.8810e+02 2.7840e+02 + 4.0950e+02 3.2390e+02 1.7761e+03 4.4075e+03 1.4138e+03 1.1201e+03 5.7980e+02 + 2.9330e+02 1.8915e+03 2.0517e+03 2.5639e+03 2.2308e+03 1.3800e+03 5.5690e+02 + 5.2610e+02 9.0270e+02 8.4360e+02 5.3650e+02 2.7540e+02 5.4650e+02 2.2966e+03 + 5.2424e+03 3.6745e+03 4.8856e+03 1.9848e+03 9.9480e+02 8.9620e+02 4.3530e+02 + 1.6750e+02 5.8920e+02 4.8330e+02 3.2330e+02 4.9040e+02 9.4150e+02 4.0260e+02 + 6.2720e+02 4.3310e+02 6.1040e+02 7.4540e+02 4.3600e+02 7.8110e+02 1.8929e+03 + 1.6281e+03 2.6639e+03 2.9142e+03 2.2117e+03 4.5000e+02 4.3530e+02 4.1660e+02 + 5.9370e+02 2.0602e+03 4.0160e+03 2.2141e+03 6.6000e+02 4.6220e+02 3.8160e+02 + 6.1910e+02 3.7460e+02 5.5380e+02 1.6320e+02 3.9090e+02 3.3520e+02 2.0978e+03 + 3.2161e+03 2.2433e+03 6.4730e+02 4.9530e+02 5.6090e+02 6.6570e+02 1.6568e+03 + 2.3047e+03 2.5557e+03 1.5189e+03 2.9080e+02 6.3430e+02 1.1950e+03 6.7390e+02 + 5.0200e+02 2.8280e+02 7.6120e+02 1.2623e+03 3.3769e+03 3.5684e+03 3.0743e+03 + 3.9568e+03 7.8430e+02 8.7200e+02 6.0840e+02 3.0380e+02 4.4060e+02 4.7090e+02 + 5.7080e+02 5.2470e+02 5.8760e+02 4.9680e+02 4.1260e+02 4.9880e+02 2.6230e+02 + 3.4170e+02 5.5300e+02 7.3880e+02 2.1724e+03 2.1870e+03 2.3198e+03 2.8978e+03 + 1.6160e+03 3.1710e+02 5.8020e+02 4.1260e+02 3.3320e+02 2.1498e+03 2.6201e+03 + 2.7544e+03 6.7860e+02 4.0670e+02 3.7620e+02 7.8310e+02 3.0690e+02 2.6130e+02 + 4.7770e+02 5.0100e+02 4.4160e+02 1.4215e+03 3.3570e+03 2.9681e+03 1.1352e+03 + 5.4580e+02 4.7330e+02 8.8500e+02 1.0037e+03 1.5936e+03 2.0562e+03 3.3193e+03 + 1.7811e+03 9.8170e+02 6.0430e+02 5.1220e+02 2.8380e+02 2.7330e+02 5.4060e+02 + 1.9519e+03 2.5433e+03 4.3672e+03 1.9398e+03 4.4180e+03 2.1817e+03 7.3420e+02 + 3.7250e+02 4.7540e+02 4.3690e+02 4.2850e+02 7.8790e+02 8.2410e+02 2.9360e+02 + 3.4330e+02 3.2260e+02 1.4639e+03 3.5080e+02 2.6730e+02 6.8080e+02 9.6100e+02 + 1.8916e+03 1.5852e+03 3.5053e+03 3.6318e+03 6.0250e+02 3.7140e+02 3.7270e+02 + 8.8740e+02 7.3370e+02 2.5718e+03 4.0531e+03 2.7702e+03 7.9650e+02 3.0980e+02 + 5.4030e+02 9.1340e+02 1.9060e+02 2.2480e+02 6.0150e+02 3.5710e+02 3.9740e+02 + 1.1060e+03 2.7842e+03 2.7425e+03 2.1306e+03 1.5530e+02 6.0960e+02 1.0736e+03 + 6.4010e+02 1.6700e+03 2.0205e+03 2.6169e+03 2.5246e+03 1.3917e+03 2.9460e+02 + 6.4670e+02 4.1210e+02 4.3110e+02 3.2110e+02 2.3080e+03 2.9260e+03 3.2206e+03 + 3.9348e+03 4.2729e+03 2.9240e+03 8.6860e+02 4.1350e+02 4.3940e+02 5.0000e+02 + 8.0070e+02 7.0510e+02 3.2250e+02 1.3870e+02 3.7350e+02 5.8390e+02 6.2270e+02 + 2.1370e+02 3.1790e+02 1.0934e+03 2.1464e+03 3.3997e+03 3.1880e+03 2.9100e+03 + 2.0805e+03 5.3310e+02 2.9230e+02 6.8370e+02 5.3400e+02 3.9010e+02 2.0018e+03 + 2.2654e+03 1.9611e+03 5.3460e+02 5.6060e+02 4.3420e+02 8.5050e+02 3.4220e+02 + 2.2370e+02 2.5380e+02 5.6620e+02 7.9990e+02 9.4570e+02 2.2089e+03 3.0099e+03 + 1.9622e+03 7.1160e+02 4.9860e+02 8.2890e+02 7.1520e+02 9.2890e+02 2.1292e+03 + 3.1057e+03 2.8608e+03 2.1496e+03 7.8650e+02 5.1870e+02 7.0100e+02 2.1280e+02 + 2.4710e+02 1.4580e+03 2.1961e+03 2.2596e+03 3.2136e+03 2.9219e+03 2.6747e+03 + 4.8760e+02 3.4090e+02 3.2100e+02 5.2870e+02 7.8500e+02 8.2750e+02 3.7050e+02 + 3.8580e+02 5.5260e+02 2.0780e+02 6.5970e+02 2.8470e+02 3.8340e+02 7.4240e+02 + 2.0050e+03 2.7087e+03 4.2402e+03 3.0391e+03 1.5468e+03 2.6080e+02 3.5510e+02 + 4.6110e+02 8.1200e+02 5.4100e+02 1.1748e+03 3.9450e+03 2.0226e+03 8.8220e+02 + 7.7300e+02 4.8120e+02 7.4530e+02 3.6640e+02 3.7920e+02 4.5430e+02 3.1010e+02 + 2.6700e+02 7.4550e+02 3.0254e+03 3.6537e+03 1.7142e+03 7.0130e+02 3.5680e+02 + 4.5520e+02 3.1430e+02 3.5000e+02 1.0821e+03 2.2404e+03 2.6277e+03 2.0262e+03 + 2.1246e+03 6.4220e+02 3.1920e+02 4.3770e+02 3.9420e+02 2.6953e+03 3.0098e+03 + 2.4505e+03 2.2619e+03 2.4373e+03 2.3647e+03 5.7160e+02 3.3930e+02 2.9800e+02 + 5.5250e+02 5.5210e+02 5.0070e+02 5.0840e+02 5.2110e+02 5.5380e+02 4.6540e+02 + 1.9930e+02 2.1390e+02 7.6050e+02 6.3460e+02 2.0023e+03 3.9137e+03 3.4278e+03 + 3.9016e+03 4.9120e+02 1.8910e+02 6.2050e+02 5.1140e+02 5.5600e+02 2.9700e+02 + 9.6820e+02 3.9242e+03 2.4153e+03 1.1233e+03 7.2970e+02 7.2420e+02 7.3480e+02 + 1.7140e+02 4.6930e+02 5.3710e+02 3.0520e+02 2.0520e+02 5.1330e+02 1.9976e+03 + 3.3504e+03 9.4820e+02 1.3377e+03 8.0680e+02 4.3060e+02 5.2830e+02 3.6920e+02 + 5.1720e+02 9.1340e+02 2.2945e+03 2.9164e+03 2.0133e+03 1.1137e+03 3.5340e+02 + 2.7290e+02 8.5980e+02 2.4274e+03 3.0183e+03 1.8963e+03 2.4123e+03 2.3423e+03 + 1.7259e+03 9.3290e+02 2.7550e+02 3.7230e+02 8.4260e+02 2.2890e+02 2.4260e+02 + 4.5200e+02 2.7880e+02 7.5590e+02 5.5100e+02 2.7780e+02 2.7150e+02 5.0000e+02 + 7.9490e+02 1.9987e+03 3.6350e+03 3.3699e+03 3.0240e+03 9.8880e+02 3.6590e+02 + 5.0320e+02 9.5460e+02 8.0770e+02 3.8650e+02 8.9890e+02 3.0004e+03 2.3709e+03 + 7.9050e+02 4.6130e+02 5.7310e+02 5.3660e+02 6.1670e+02 4.2300e+02 2.7190e+02 + 1.8260e+02 2.1730e+02 4.4990e+02 2.5046e+03 2.9577e+03 1.5101e+03 3.4080e+02 + 6.9080e+02 6.1870e+02 7.0020e+02 4.7840e+02 5.8140e+02 8.7050e+02 1.0125e+03 + 2.8999e+03 2.8205e+03 2.3965e+03 9.1260e+02 5.8040e+02 1.3528e+03 2.9411e+03 + 2.5467e+03 1.6258e+03 2.2797e+03 3.1727e+03 2.1061e+03 6.9500e+02 2.6600e+02 + 2.5730e+02 5.8820e+02 4.0640e+02 2.1650e+02 2.2330e+02 4.3900e+02 6.0000e+02 + 1.1569e+03 4.5020e+02 4.8480e+02 1.9860e+02 7.6260e+02 2.2235e+03 3.9365e+03 + 1.8063e+03 3.6344e+03 9.8510e+02 4.9620e+02 4.3250e+02 9.6210e+02 6.5830e+02 + 3.5180e+02 6.9510e+02 2.4339e+03 2.1437e+03 5.4860e+02 5.7520e+02 3.4260e+02 + 6.1610e+02 6.4960e+02 2.6330e+02 6.6030e+02 5.6080e+02 3.6710e+02 5.5410e+02 + 1.8421e+03 4.5752e+03 1.8384e+03 4.7620e+02 3.7920e+02 7.3120e+02 9.6950e+02 + 7.0900e+02 5.0170e+02 4.5120e+02 1.1082e+03 2.2107e+03 4.5535e+03 2.4637e+03 + 5.0340e+02 7.2590e+02 4.6760e+02 4.3083e+03 2.0816e+03 1.2269e+03 2.1093e+03 + 3.0157e+03 1.8722e+03 5.3180e+02 2.9880e+02 2.9490e+02 3.5810e+02 3.4440e+02 + 3.5590e+02 1.8990e+02 6.2900e+02 4.0860e+02 5.4450e+02 2.7910e+02 4.2450e+02 + 4.3350e+02 1.2217e+03 1.9305e+03 2.9480e+03 2.4512e+03 3.2940e+03 1.6337e+03 + 5.1770e+02 4.0940e+02 9.6950e+02 4.0060e+02 2.3450e+02 5.9500e+02 2.0306e+03 + 3.0737e+03 6.8320e+02 4.7720e+02 5.4510e+02 6.2390e+02 7.2380e+02 4.1200e+02 + 5.9050e+02 3.8850e+02 6.0900e+02 3.2560e+02 2.2349e+03 4.2610e+03 2.3745e+03 + 7.9310e+02 2.7560e+02 3.3880e+02 7.0020e+02 5.3550e+02 3.0560e+02 2.7930e+02 + 6.1770e+02 1.2120e+03 4.3739e+03 3.0405e+03 1.4224e+03 9.6560e+02 2.3507e+03 + 3.2409e+03 1.6193e+03 1.2099e+03 3.7898e+03 2.8599e+03 7.1410e+02 7.0400e+02 + 4.7600e+02 2.9870e+02 4.5150e+02 6.9500e+02 6.5410e+02 4.7020e+02 3.1370e+02 + 8.5910e+02 5.1290e+02 3.2580e+02 7.1550e+02 4.4730e+02 4.9070e+02 3.1140e+03 + 2.5582e+03 2.1288e+03 4.5528e+03 8.6130e+02 1.1783e+03 2.8300e+02 6.0550e+02 + 2.9520e+02 3.2220e+02 5.4240e+02 1.9038e+03 3.2550e+03 1.5476e+03 5.2710e+02 + 4.9610e+02 8.6140e+02 4.0670e+02 2.8750e+02 5.1330e+02 3.2420e+02 9.2560e+02 + 7.2010e+02 1.4741e+03 2.9669e+03 2.1492e+03 4.1330e+02 2.3700e+02 5.8020e+02 + 8.0490e+02 7.2090e+02 5.7910e+02 3.8590e+02 2.5880e+02 6.6870e+02 2.4549e+03 + 2.3195e+03 3.0685e+03 1.7194e+03 2.5639e+03 2.0440e+03 1.6455e+03 1.8512e+03 + 3.8028e+03 3.3131e+03 1.3441e+03 6.9560e+02 4.3550e+02 2.3950e+02 2.3060e+02 + 5.1360e+02 7.1130e+02 7.3440e+02 4.3080e+02 8.4320e+02 8.6220e+02 3.1410e+02 + 4.8960e+02 8.7700e+02 1.7735e+03 3.3937e+03 2.2853e+03 2.1149e+03 4.7906e+03 + 1.2572e+03 1.0919e+03 1.0079e+03 6.1420e+02 7.2410e+02 4.1400e+02 3.7890e+02 + 2.0222e+03 3.8909e+03 2.5456e+03 4.9010e+02 4.2590e+02 4.0310e+02 4.9430e+02 + 6.0150e+02 7.1240e+02 4.3290e+02 9.2430e+02 1.1333e+03 2.1169e+03 4.4006e+03 + 2.0384e+03 7.2760e+02 1.9420e+02 6.4200e+02 7.8110e+02 5.6370e+02 6.0910e+02 + 3.2630e+02 2.7880e+02 2.2130e+02 1.9978e+03 3.5074e+03 2.7373e+03 2.2566e+03 + 2.7985e+03 1.7658e+03 1.2097e+03 9.3990e+02 1.9386e+03 2.6752e+03 9.2800e+02 + 6.1580e+02 5.8690e+02 3.5420e+02 2.5230e+02 3.3730e+02 4.4650e+02 4.7400e+02 + 4.3430e+02 3.8760e+02 7.6070e+02 3.1830e+02 1.9840e+02 1.0948e+03 1.1232e+03 + 2.9953e+03 2.5709e+03 2.0976e+03 3.3690e+03 2.1567e+03 8.0100e+02 8.5300e+02 + 3.5170e+02 6.7210e+02 1.0109e+03 4.7640e+02 1.0120e+03 4.3470e+03 4.0010e+03 + 8.9580e+02 4.5980e+02 8.6440e+02 4.8570e+02 6.6290e+02 4.0550e+02 8.3090e+02 + 7.4770e+02 7.3670e+02 2.9866e+03 4.3348e+03 1.2702e+03 6.0030e+02 2.3820e+02 + 4.7740e+02 7.1870e+02 5.7330e+02 5.4200e+02 4.7690e+02 4.1020e+02 2.8570e+02 + 9.0660e+02 2.1639e+03 4.8413e+03 2.7083e+03 2.3434e+03 2.1750e+03 6.0030e+02 + 1.2600e+03 3.5344e+03 3.3820e+03 3.5190e+02 6.1560e+02 4.6500e+02 2.3200e+02 + 3.0040e+02 4.7000e+02 4.7860e+02 5.9780e+02 5.5290e+02 9.5190e+02 2.3840e+02 + 4.3390e+02 3.9430e+02 5.4450e+02 2.1177e+03 2.6482e+03 2.7180e+03 2.2171e+03 + 4.0645e+03 8.9230e+02 6.8710e+02 4.2230e+02 3.7070e+02 8.9160e+02 1.1356e+03 + 7.8970e+02 5.5020e+02 2.1664e+03 3.2791e+03 1.8494e+03 5.7430e+02 4.6170e+02 + 3.9440e+02 3.1660e+02 6.8830e+02 8.2110e+02 7.0080e+02 1.8178e+03 3.5527e+03 + 3.1316e+03 1.5609e+03 4.9680e+02 4.4260e+02 8.1080e+02 6.8560e+02 5.2660e+02 + 2.4610e+02 5.5980e+02 3.5180e+02 3.8760e+02 1.6760e+03 3.0646e+03 5.3468e+03 + 3.2703e+03 2.8402e+03 1.6600e+03 5.8220e+02 1.2411e+03 4.1307e+03 2.1429e+03 + 3.5140e+02 4.8570e+02 3.6880e+02 4.4960e+02 3.9540e+02 3.9720e+02 3.0070e+02 + 2.2640e+02 4.9050e+02 8.5360e+02 9.2360e+02 3.7870e+02 3.6170e+02 6.5880e+02 + 7.1720e+02 3.9313e+03 2.3889e+03 3.3943e+03 4.6437e+03 2.1088e+03 6.1360e+02 + 3.3520e+02 4.2880e+02 6.1750e+02 6.1840e+02 9.7370e+02 9.0190e+02 1.9300e+03 + 3.5191e+03 4.0411e+03 6.4070e+02 5.6410e+02 6.4260e+02 5.3200e+02 3.1110e+02 + 4.2790e+02 7.1980e+02 2.3419e+03 2.3809e+03 2.8964e+03 8.0210e+02 6.0770e+02 + 3.5950e+02 3.8440e+02 3.7540e+02 3.6460e+02 5.3240e+02 4.4030e+02 3.0930e+02 + 6.8160e+02 5.7540e+02 3.5651e+03 4.2808e+03 5.6000e+03 1.8661e+03 6.8140e+02 + 4.0790e+02 1.0194e+03 3.8896e+03 2.0462e+03 8.3560e+02 6.2810e+02 3.1730e+02 + 2.0070e+02 9.1700e+02 5.8580e+02 4.5280e+02 2.0700e+02 2.7320e+02 1.0153e+03 + 6.6170e+02 5.6060e+02 4.1850e+02 5.4050e+02 6.7710e+02 2.6829e+03 3.6897e+03 + 1.8098e+03 5.3968e+03 2.3727e+03 4.1400e+02 2.6550e+02 3.4820e+02 4.9220e+02 + 5.4440e+02 6.1290e+02 4.2540e+02 1.7336e+03 1.9968e+03 4.1724e+03 1.8571e+03 + 3.9940e+02 6.3540e+02 1.4670e+02 6.4520e+02 2.2580e+02 4.8020e+02 1.8264e+03 + 4.7806e+03 3.0576e+03 1.3069e+03 5.0200e+02 4.3940e+02 8.0950e+02 5.6030e+02 + 5.4110e+02 5.0210e+02 6.8220e+02 4.9490e+02 4.1480e+02 1.0378e+03 2.2815e+03 + 5.6000e+03 3.8338e+03 8.8540e+02 4.8100e+02 4.6750e+02 1.5915e+03 3.2696e+03 + 2.7918e+03 1.0179e+03 6.5370e+02 2.8510e+02 2.7480e+02 6.1030e+02 5.0010e+02 + 6.9940e+02 2.0080e+02 1.7050e+02 4.8930e+02 1.1217e+03 3.9110e+02 5.0550e+02 + 5.6800e+02 5.8190e+02 2.2685e+03 2.3524e+03 2.8905e+03 4.4327e+03 2.2664e+03 + 2.8580e+02 3.5980e+02 8.9890e+02 7.9840e+02 5.7970e+02 4.7060e+02 5.2340e+02 + 8.3610e+02 1.4077e+03 3.1616e+03 3.2104e+03 1.2653e+03 7.4590e+02 2.3160e+02 + 1.5880e+02 2.9700e+02 4.9610e+02 3.4891e+03 3.2498e+03 2.3375e+03 8.4200e+02 + 5.4650e+02 4.0290e+02 6.2460e+02 5.1410e+02 5.8250e+02 5.4850e+02 2.8810e+02 + 6.6950e+02 6.6590e+02 8.8240e+02 3.5876e+03 5.3116e+03 5.3204e+03 5.5200e+02 + 5.6510e+02 5.4510e+02 1.9892e+03 3.0924e+03 5.2328e+03 2.3346e+03 6.2380e+02 + 3.7640e+02 1.2080e+02 5.9040e+02 6.4680e+02 5.4690e+02 3.9260e+02 4.6550e+02 + 5.3640e+02 6.8460e+02 3.8340e+02 6.5390e+02 4.8910e+02 2.8270e+02 1.4432e+03 + 2.2371e+03 2.1084e+03 4.7397e+03 1.9892e+03 3.3280e+02 6.8810e+02 1.0143e+03 + 9.2670e+02 3.0180e+02 1.4380e+02 5.6830e+02 6.6390e+02 1.1792e+03 2.1364e+03 + 3.0078e+03 1.1699e+03 6.5070e+02 3.7540e+02 2.0740e+02 6.0260e+02 7.2620e+02 + 4.1046e+03 3.2329e+03 1.7585e+03 1.1681e+03 7.3620e+02 5.8530e+02 2.8020e+02 + 5.4860e+02 5.3640e+02 5.7100e+02 4.6050e+02 7.0400e+02 3.7730e+02 6.1280e+02 + 3.5516e+03 4.6237e+03 4.8609e+03 4.6240e+02 2.3560e+02 2.7890e+02 6.8180e+02 + 2.4129e+03 4.1208e+03 1.4627e+03 7.7580e+02 6.8810e+02 3.3890e+02 9.9080e+02 + 6.6650e+02 7.2910e+02 4.6010e+02 7.5390e+02 5.7500e+02 3.6620e+02 5.2660e+02 + 6.5050e+02 3.2950e+02 9.7100e+01 1.2832e+03 3.1156e+03 2.0710e+03 3.2117e+03 + 2.9662e+03 6.2230e+02 7.2640e+02 9.7800e+02 9.3230e+02 3.6480e+02 1.9830e+02 + 5.3590e+02 3.1250e+02 1.1483e+03 2.1381e+03 3.2904e+03 2.1637e+03 6.2000e+02 + 3.1680e+02 3.4140e+02 5.2610e+02 1.0434e+03 4.3850e+03 2.1605e+03 1.1862e+03 + 9.4120e+02 8.0570e+02 5.1970e+02 3.5000e+02 5.4350e+02 4.2660e+02 5.7230e+02 + 4.4440e+02 3.7930e+02 7.0710e+02 1.7086e+03 4.2107e+03 5.1428e+03 2.1089e+03 + 1.3115e+03 2.4920e+02 2.0810e+02 1.0293e+03 2.3165e+03 4.0800e+03 2.1516e+03 + 5.8520e+02 9.5250e+02 4.2110e+02 9.8690e+02 8.2260e+02 7.2080e+02 7.1130e+02 + 6.0480e+02 5.4540e+02 4.4070e+02 6.0670e+02 6.5700e+02 3.8330e+02 1.3530e+02 + 7.0180e+02 3.0839e+03 1.2709e+03 3.1197e+03 3.5315e+03 5.7920e+02 6.6920e+02 + 7.7390e+02 5.8730e+02 2.5830e+02 6.0720e+02 3.5900e+02 5.1610e+02 6.3280e+02 + 2.3465e+03 2.1056e+03 3.4585e+03 1.3345e+03 9.6430e+02 6.7590e+02 7.9410e+02 + 2.6500e+03 2.7805e+03 1.8034e+03 3.6040e+02 6.5310e+02 7.0570e+02 6.4870e+02 + 5.7650e+02 2.4020e+02 4.8390e+02 6.7090e+02 3.8930e+02 3.5360e+02 5.2010e+02 + 2.8817e+03 5.0135e+03 4.3217e+03 2.4378e+03 1.4872e+03 3.6080e+02 1.0640e+02 + 4.8290e+02 2.1119e+03 2.5322e+03 1.8413e+03 1.5840e+03 1.0387e+03 4.7160e+02 + 1.0057e+03 6.0790e+02 3.0870e+02 6.1330e+02 6.9520e+02 4.3350e+02 4.9570e+02 + 5.4360e+02 5.5070e+02 4.6770e+02 7.1520e+02 7.2190e+02 3.1883e+03 4.9920e+02 + 3.9062e+03 3.4958e+03 9.9080e+02 5.5360e+02 6.2050e+02 5.8950e+02 3.4120e+02 + 7.4070e+02 3.0280e+02 3.5490e+02 6.9650e+02 1.2286e+03 2.3416e+03 2.8336e+03 + 2.2984e+03 8.7310e+02 8.8060e+02 1.7499e+03 2.4052e+03 2.4466e+03 7.6210e+02 + 6.2720e+02 7.1250e+02 6.0890e+02 5.1870e+02 3.9870e+02 5.8620e+02 4.8890e+02 + 5.4010e+02 2.7080e+02 6.8650e+02 1.2980e+03 2.1927e+03 5.6000e+03 4.7834e+03 + 2.0314e+03 6.2460e+02 4.5770e+02 2.5980e+02 4.7600e+02 1.4514e+03 3.1581e+03 + 2.5692e+03 3.0779e+03 1.9908e+03 6.5840e+02 6.7120e+02 9.3930e+02 4.1360e+02 + 5.6980e+02 5.1080e+02 6.6690e+02 6.7370e+02 5.6020e+02 4.5710e+02 8.7500e+02 + 8.3250e+02 9.8110e+02 3.4272e+03 6.3040e+02 3.0384e+03 5.6000e+03 2.2001e+03 + 5.6400e+02 3.7280e+02 5.2530e+02 4.1330e+02 4.4060e+02 2.2710e+02 2.2440e+02 + 5.8730e+02 1.0182e+03 1.4055e+03 4.4701e+03 2.2371e+03 1.9326e+03 1.8881e+03 + 2.7790e+03 3.0113e+03 1.5971e+03 1.1014e+03 5.8030e+02 7.9170e+02 5.7470e+02 + 4.6470e+02 3.6260e+02 4.6380e+02 4.3820e+02 3.4410e+02 3.5010e+02 5.2010e+02 + 8.9060e+02 2.8344e+03 3.6162e+03 4.5719e+03 2.6459e+03 4.1710e+02 3.8860e+02 + 6.2330e+02 2.7070e+02 6.8850e+02 2.1032e+03 2.1822e+03 2.6273e+03 2.2955e+03 + 1.8613e+03 1.0506e+03 5.6300e+02 1.3978e+03 8.1710e+02 6.8080e+02 1.1815e+03 + 4.4860e+02 5.0390e+02 4.2880e+02 8.2290e+02 9.6550e+02 8.6410e+02 2.5538e+03 + 4.2090e+02 1.9087e+03 5.6000e+03 2.8229e+03 4.6670e+02 4.6960e+02 5.4660e+02 + 1.9620e+02 3.3940e+02 4.5340e+02 3.8690e+02 2.8290e+02 6.0490e+02 7.3680e+02 + 2.0598e+03 2.9552e+03 2.4112e+03 4.4317e+03 2.6324e+03 3.6528e+03 1.0710e+03 + 4.4790e+02 2.6210e+02 5.9200e+02 4.1960e+02 2.8190e+02 3.7130e+02 4.3350e+02 + 5.7620e+02 1.6070e+02 3.6400e+02 6.5930e+02 2.1930e+03 3.8240e+03 3.8471e+03 + 4.9337e+03 7.9130e+02 4.1640e+02 5.2060e+02 6.2790e+02 3.1290e+02 7.4940e+02 + 1.4213e+03 1.8752e+03 2.3201e+03 2.2751e+03 3.3651e+03 3.2472e+03 1.3866e+03 + 9.9350e+02 9.6100e+02 8.5290e+02 7.1260e+02 8.8220e+02 3.0810e+02 1.8640e+02 + 6.0680e+02 6.4590e+02 1.1703e+03 3.8101e+03 3.8230e+02 1.0091e+03 4.0340e+03 + 3.6758e+03 9.4080e+02 4.2380e+02 5.5380e+02 2.8350e+02 3.1930e+02 1.1320e+03 + 7.3540e+02 5.2540e+02 4.1450e+02 4.5940e+02 1.8372e+03 2.2465e+03 4.9989e+03 + 3.6111e+03 2.5645e+03 2.2630e+03 6.5340e+02 3.2900e+02 3.7850e+02 6.0620e+02 + 6.2860e+02 2.8200e+02 4.5560e+02 8.6690e+02 4.0730e+02 2.3290e+02 5.7720e+02 + 5.2470e+02 2.0094e+03 4.9837e+03 5.6000e+03 3.2625e+03 7.0550e+02 2.4900e+02 + 1.0557e+03 4.2340e+02 3.1540e+02 5.2170e+02 7.5990e+02 4.8520e+02 1.8092e+03 + 1.8989e+03 2.8187e+03 2.6213e+03 1.7301e+03 1.9247e+03 2.1705e+03 1.4336e+03 + 1.8601e+03 1.0790e+03 4.7320e+02 4.1740e+02 5.5610e+02 3.9220e+02 1.9466e+03 + 3.5522e+03 3.7220e+02 5.2140e+02 2.3103e+03 3.2835e+03 1.7252e+03 1.3690e+03 + 7.3110e+02 2.1300e+02 3.0710e+02 7.0480e+02 8.7250e+02 5.8080e+02 4.3760e+02 + 8.9060e+02 1.0669e+03 3.7818e+03 5.6000e+03 3.3658e+03 2.2971e+03 8.0330e+02 + 1.1660e+03 3.1460e+02 4.9260e+02 7.4530e+02 4.5920e+02 5.9130e+02 4.8010e+02 + 7.8670e+02 3.2300e+02 4.2090e+02 7.0210e+02 5.2570e+02 2.0943e+03 3.2633e+03 + 4.7954e+03 2.6929e+03 7.6810e+02 4.8480e+02 7.6880e+02 3.3930e+02 1.8290e+02 + 2.6120e+02 3.9460e+02 4.0100e+02 7.4980e+02 7.5710e+02 2.0991e+03 2.4428e+03 + 1.7716e+03 1.2689e+03 1.9015e+03 2.1452e+03 2.0412e+03 1.1391e+03 1.0027e+03 + 7.5660e+02 4.5790e+02 7.2430e+02 2.9976e+03 3.1499e+03 2.3740e+02 8.9130e+02 + 1.2861e+03 2.3314e+03 3.6461e+03 1.7943e+03 1.1640e+03 3.2790e+02 3.2770e+02 + 9.1380e+02 4.3360e+02 7.1630e+02 1.0048e+03 6.7360e+02 1.8575e+03 3.4169e+03 + 5.6000e+03 1.9045e+03 1.0978e+03 8.1640e+02 8.9560e+02 3.1910e+02 3.3990e+02 + 5.8310e+02 9.1010e+02 5.5620e+02 4.0990e+02 5.8410e+02 4.5220e+02 5.3300e+02 + 1.3481e+03 1.6028e+03 3.8261e+03 4.1312e+03 5.3268e+03 2.5201e+03 5.3920e+02 + 9.3080e+02 1.5468e+03 5.6060e+02 1.3560e+02 2.0270e+02 4.9850e+02 3.9600e+02 + 2.6390e+02 2.7960e+02 1.0589e+03 8.9750e+02 5.1790e+02 1.4384e+03 1.9545e+03 + 2.4777e+03 1.7013e+03 9.9350e+02 2.5317e+03 1.2399e+03 5.5430e+02 1.0356e+03 + 3.4068e+03 3.1340e+03 2.0770e+02 6.3860e+02 1.3880e+03 2.3997e+03 2.5102e+03 + 2.7294e+03 1.4871e+03 2.6520e+02 8.2480e+02 6.0530e+02 4.4390e+02 5.1980e+02 + 9.3760e+02 2.2287e+03 2.2204e+03 4.2267e+03 5.6000e+03 1.9775e+03 4.6080e+02 + 5.6320e+02 7.1810e+02 6.5970e+02 4.0300e+02 7.1600e+02 5.7940e+02 4.8710e+02 + 5.2110e+02 1.7610e+02 4.1530e+02 5.5700e+02 1.3320e+03 1.8725e+03 3.7769e+03 + 2.8746e+03 3.2622e+03 2.1686e+03 5.8680e+02 6.4700e+02 1.0017e+03 4.2740e+02 + 4.0680e+02 3.8950e+02 3.0500e+02 5.0520e+02 3.7920e+02 1.8380e+02 5.7860e+02 + 7.7670e+02 1.3037e+03 8.2500e+02 1.3203e+03 1.4159e+03 2.3488e+03 2.1768e+03 + 1.8975e+03 2.4682e+03 2.3738e+03 1.8536e+03 2.0957e+03 2.2567e+03 6.0810e+02 + 5.8680e+02 8.7520e+02 1.1949e+03 3.3202e+03 2.3787e+03 1.9969e+03 3.4250e+02 + 6.0160e+02 5.0320e+02 1.1780e+02 5.5250e+02 1.5081e+03 2.8315e+03 2.6486e+03 + 2.6830e+03 3.3775e+03 2.3946e+03 4.9320e+02 5.6280e+02 3.7740e+02 2.6270e+02 + 8.8090e+02 6.4850e+02 5.0950e+02 3.3900e+02 5.6480e+02 3.6280e+02 1.7220e+02 + 4.8300e+02 2.4280e+03 2.4070e+03 3.5605e+03 2.2468e+03 3.0441e+03 1.1832e+03 + 5.8820e+02 6.4970e+02 7.8730e+02 3.6570e+02 2.7830e+02 7.3140e+02 9.0570e+02 + 7.3010e+02 3.3840e+02 3.9080e+02 4.0510e+02 4.2860e+02 1.0497e+03 5.5940e+02 + 4.8690e+02 7.3570e+02 7.5590e+02 1.8140e+03 1.9592e+03 2.2005e+03 4.3082e+03 + 2.2832e+03 3.7889e+03 1.9781e+03 6.2240e+02 9.4270e+02 5.7160e+02 1.0459e+03 + 2.4646e+03 4.9578e+03 1.9257e+03 3.7630e+02 5.1720e+02 6.1220e+02 2.1230e+02 + 4.0120e+02 1.8968e+03 3.7557e+03 4.0359e+03 2.1054e+03 2.9749e+03 1.3127e+03 + 8.7850e+02 9.4490e+02 1.6650e+02 4.7330e+02 5.8610e+02 3.4610e+02 5.6660e+02 + 2.2880e+02 5.5590e+02 4.4440e+02 4.1250e+02 7.0230e+02 2.1678e+03 2.0968e+03 + 3.1055e+03 3.6196e+03 3.9199e+03 6.8810e+02 5.3420e+02 5.8000e+02 3.3390e+02 + 1.7840e+02 4.2020e+02 7.1890e+02 7.8290e+02 7.6490e+02 3.6590e+02 2.3280e+02 + 2.7230e+02 3.8960e+02 6.2070e+02 5.5260e+02 4.1540e+02 9.5470e+02 5.0120e+02 + 1.4312e+03 9.8340e+02 3.1841e+03 4.5695e+03 4.6139e+03 2.6273e+03 1.6483e+03 + 4.3700e+02 6.0790e+02 6.6380e+02 4.2490e+02 1.6640e+03 3.1341e+03 2.5309e+03 + 7.3840e+02 4.2380e+02 5.9660e+02 6.1020e+02 6.1330e+02 2.0326e+03 3.1804e+03 + 2.1447e+03 1.5673e+03 4.2439e+03 2.2177e+03 9.7860e+02 8.1450e+02 4.4960e+02 + 4.4160e+02 5.4310e+02 9.0570e+02 6.2440e+02 4.7170e+02 3.4830e+02 6.5600e+02 + 2.2330e+02 8.4050e+02 2.1157e+03 4.3231e+03 1.8371e+03 3.1203e+03 4.3252e+03 + 9.3420e+02 6.6100e+02 4.5280e+02 4.4210e+02 4.2910e+02 3.9120e+02 4.8890e+02 + 5.5640e+02 2.1560e+02 2.5220e+02 4.5200e+02 3.0310e+02 8.8700e+02 8.0730e+02 + 2.6590e+02 5.1590e+02 9.7250e+02 7.1920e+02 4.2460e+02 7.0400e+02 1.6642e+03 + 2*5.6000e+03 3.2354e+03 1.0149e+03 9.2970e+02 6.1180e+02 6.6030e+02 + 4.6570e+02 1.2719e+03 3.8191e+03 3.2526e+03 7.9070e+02 3.3990e+02 8.5390e+02 + 1.0091e+03 2.2057e+03 2.5508e+03 2.5029e+03 2.6054e+03 1.8030e+03 2.8463e+03 + 2.6833e+03 1.0007e+03 8.7290e+02 9.0420e+02 4.9330e+02 6.2590e+02 5.2480e+02 + 3.8060e+02 3.0490e+02 2.7070e+02 8.3580e+02 4.5740e+02 4.1010e+02 3.7336e+03 + 3.5290e+03 2.0425e+03 2.2307e+03 3.6770e+03 6.7090e+02 3.9170e+02 6.1390e+02 + 7.1280e+02 4.8940e+02 7.2810e+02 5.9660e+02 2.5890e+02 3.3140e+02 3.7090e+02 + 4.7480e+02 5.8860e+02 1.1012e+03 5.1180e+02 1.8350e+02 6.8990e+02 4.2000e+02 + 8.2350e+02 1.2426e+03 1.2036e+03 2.2056e+03 5.0895e+03 5.1238e+03 3.8651e+03 + 1.3074e+03 3.7820e+02 7.6640e+02 5.6500e+02 6.6040e+02 8.2560e+02 4.3739e+03 + 3.7263e+03 5.4630e+02 4.1410e+02 1.1310e+03 1.3428e+03 2.0684e+03 3.1689e+03 + 2.3571e+03 1.9919e+03 1.9534e+03 2.3900e+03 2.0472e+03 9.3470e+02 5.0380e+02 + 4.3090e+02 4.0230e+02 4.2070e+02 4.9090e+02 4.6930e+02 3.2150e+02 2.8540e+02 + 7.5430e+02 7.9280e+02 1.4414e+03 2.4770e+03 3.2117e+03 1.1759e+03 2.3525e+03 + 3.4963e+03 1.9935e+03 3.3920e+02 5.5470e+02 4.7690e+02 7.0360e+02 5.6140e+02 + 5.2460e+02 2.3760e+02 5.3690e+02 8.1430e+02 1.0999e+03 5.7600e+02 6.1650e+02 + 3.6120e+02 2.8440e+02 6.5710e+02 3.5400e+02 6.4690e+02 1.8235e+03 1.0869e+03 + 3.6595e+03 3.8341e+03 4.4609e+03 5.2292e+03 1.7934e+03 3.4940e+02 5.3980e+02 + 9.1480e+02 7.8430e+02 1.0844e+03 4.4200e+03 2.7394e+03 1.2791e+03 4.8540e+02 + 2.2114e+03 2.2670e+03 2.3705e+03 1.3635e+03 6.7750e+02 7.1870e+02 2.2409e+03 + 2.0753e+03 2.0827e+03 4.6620e+02 2.7760e+02 4.2720e+02 2.7150e+02 4.1790e+02 + 6.3210e+02 8.6990e+02 6.0890e+02 4.0350e+02 4.3780e+02 6.1520e+02 4.0500e+02 + 3.4556e+03 3.1236e+03 2.2474e+03 2.9072e+03 2.8628e+03 8.0520e+02 3.6650e+02 + 3.6800e+02 4.9560e+02 6.1900e+02 3.0290e+02 3.4840e+02 2.0580e+02 4.1110e+02 + 6.5840e+02 1.2777e+03 3.6510e+02 4.2550e+02 3.8550e+02 7.8520e+02 6.9280e+02 + 9.4870e+02 1.3170e+03 1.1400e+03 1.9249e+03 3.8083e+03 2.0405e+03 2.2249e+03 + 2.4027e+03 2.7291e+03 3.4520e+02 4.2060e+02 6.0370e+02 6.2000e+02 1.1326e+03 + 2.7605e+03 3.9967e+03 9.3180e+02 1.8528e+03 3.7495e+03 3.9143e+03 1.3733e+03 + 6.5750e+02 2.4220e+02 5.7940e+02 1.8585e+03 2.2959e+03 3.0457e+03 5.1170e+02 + 2.5850e+02 4.9690e+02 4.9920e+02 5.2840e+02 7.9640e+02 8.0310e+02 1.0020e+03 + 6.3320e+02 5.5700e+02 3.8380e+02 8.3090e+02 2.3512e+03 3.6596e+03 8.2800e+02 + 2.2747e+03 2.8236e+03 7.0020e+02 4.3320e+02 2.1760e+02 5.1510e+02 1.1620e+03 + 5.6150e+02 3.2790e+02 3.7150e+02 7.1350e+02 1.3660e+03 6.2270e+02 8.0190e+02 + 3.8250e+02 2.9070e+02 6.7720e+02 1.1180e+03 1.4417e+03 8.0280e+02 1.9181e+03 + 2.4892e+03 2.6848e+03 2.5486e+03 8.4380e+02 2.0748e+03 3.1118e+03 7.8210e+02 + 3.3280e+02 6.6460e+02 4.6410e+02 1.1056e+03 2.0720e+03 3.2197e+03 2.3417e+03 + 3.3532e+03 3.1022e+03 2.2504e+03 1.7302e+03 6.4220e+02 1.6030e+02 7.7560e+02 + 1.3781e+03 3.4089e+03 3.3460e+03 2.9490e+02 3.3240e+02 2*5.7170e+02 + 4.7890e+02 4.4000e+02 9.7570e+02 9.0650e+02 6.4280e+02 4.6810e+02 4.1160e+02 + 2.0671e+03 2.1311e+03 3.7021e+03 1.1803e+03 4.3031e+03 2.5448e+03 1.8052e+03 + 7.9340e+02 4.9230e+02 4.4790e+02 7.2590e+02 4.8060e+02 2.8530e+02 3.0000e+02 + 5.2970e+02 7.6870e+02 4.2650e+02 4.8380e+02 4.6270e+02 3.3280e+02 7.1590e+02 + 1.4455e+03 1.9050e+03 2.7124e+03 2.0883e+03 2.7765e+03 1.8336e+03 1.5959e+03 + 9.4410e+02 1.7162e+03 1.2119e+03 4.0130e+02 5.7080e+02 3.9380e+02 3.0580e+02 + 6.4190e+02 2.1024e+03 2.5330e+03 3.0419e+03 2.8685e+03 2.4661e+03 9.5140e+02 + 6.3430e+02 4.3420e+02 2.7880e+02 6.6780e+02 2.5057e+03 3.7071e+03 2.1062e+03 + 4.4380e+02 3.1100e+02 2.9180e+02 4.5660e+02 3.7160e+02 7.5900e+02 9.5000e+02 + 8.4940e+02 8.1280e+02 5.8930e+02 1.7650e+02 7.1000e+02 2.7639e+03 1.9846e+03 + 2.0551e+03 2.9651e+03 3.4447e+03 2.2475e+03 9.6150e+02 7.1670e+02 6.6750e+02 + 4.8940e+02 6.0750e+02 4.4290e+02 3.4150e+02 9.1690e+02 4.2040e+02 2.2790e+02 + 4.2570e+02 5.4320e+02 6.9050e+02 1.3451e+03 1.6588e+03 2.5923e+03 2.4993e+03 + 2.9748e+03 1.4712e+03 7.8240e+02 4.0490e+02 8.1660e+02 6.9280e+02 7.1270e+02 + 7.1700e+02 3.1080e+02 4.0440e+02 4.5310e+02 5.6760e+02 2.6088e+03 2.7992e+03 + 4.2695e+03 4.7079e+03 2.2611e+03 1.1966e+03 4.9240e+02 4.3000e+02 3.5180e+02 + 7.5570e+02 2.0268e+03 3.2101e+03 1.9691e+03 6.9950e+02 3.6380e+02 2.1370e+02 + 5.5890e+02 4.4900e+02 4.5150e+02 1.2131e+03 6.1550e+02 5.6390e+02 2.5730e+02 + 3.3110e+02 1.1177e+03 2.1622e+03 2.3593e+03 1.0019e+03 2.9945e+03 4.1670e+03 + 2.0262e+03 4.7060e+02 8.9450e+02 6.1930e+02 3.3450e+02 4.0960e+02 6.3000e+02 + 6.2240e+02 5.2730e+02 4.9680e+02 2.0140e+02 1.7450e+02 3.5620e+02 5.3610e+02 + 1.5036e+03 1.8813e+03 2.2169e+03 2.5793e+03 1.9593e+03 8.2930e+02 5.4620e+02 + 5.0430e+02 9.4320e+02 1.0579e+03 8.5870e+02 3.2800e+02 4.9470e+02 6.9110e+02 + 5.4010e+02 6.5410e+02 2.0411e+03 5.0976e+03 3.0005e+03 3.2600e+03 1.3016e+03 + 3.2830e+02 6.1920e+02 4.9880e+02 1.1856e+03 8.1610e+02 2.8123e+03 3.4652e+03 + 1.9589e+03 6.5340e+02 4.9630e+02 3.1210e+02 4.5430e+02 3.1110e+02 3.7740e+02 + 7.1050e+02 5.6030e+02 3.1560e+02 2.7450e+02 5.3350e+02 3.0490e+02 2.4356e+03 + 2.0459e+03 6.0160e+02 1.8275e+03 2.5769e+03 1.9881e+03 8.6220e+02 6.0580e+02 + 3.7490e+02 2.5320e+02 3.3760e+02 6.7140e+02 1.2966e+03 6.3500e+02 6.8770e+02 + 5.1230e+02 4.5450e+02 4.1400e+02 7.4310e+02 2.9896e+03 2.2624e+03 2.4360e+03 + 2.1442e+03 1.0138e+03 4.9470e+02 2.6950e+02 3.5350e+02 5.0620e+02 9.4430e+02 + 5.8250e+02 3.7170e+02 4.2530e+02 4.1660e+02 4.4230e+02 7.6180e+02 2.2858e+03 + 5.6000e+03 2.5415e+03 1.6178e+03 7.2070e+02 4.6460e+02 7.9060e+02 5.2950e+02 + 1.0809e+03 7.8690e+02 3.3551e+03 2.4575e+03 6.0720e+02 9.5080e+02 7.3280e+02 + 7.9910e+02 3.0610e+02 4.5000e+02 5.8920e+02 7.1000e+02 4.5660e+02 4.7280e+02 + 5.2720e+02 2.3500e+02 1.2077e+03 3.2683e+03 2.1831e+03 6.1950e+02 1.4547e+03 + 3.5392e+03 3.8638e+03 7.3140e+02 8.2340e+02 2.0170e+02 2.5900e+02 4.9880e+02 + 6.4750e+02 8.5480e+02 6.6160e+02 6.1060e+02 6.5960e+02 4.2740e+02 8.1890e+02 + 3.0829e+03 2.5541e+03 1.9189e+03 6.6010e+02 6.8510e+02 1.0691e+03 4.6450e+02 + 3.2250e+02 5.4360e+02 3.9210e+02 4.1890e+02 7.6320e+02 6.6130e+02 4.6980e+02 + 8.7640e+02 1.1087e+03 5.7120e+02 2.8816e+03 4.0802e+03 2.7019e+03 1.6696e+03 + 4.9590e+02 8.5920e+02 2.3860e+02 5.3400e+02 1.0977e+03 2.0327e+03 4.3920e+03 + 2.2990e+03 1.3249e+03 8.7420e+02 5.5840e+02 3.8310e+02 5.9940e+02 6.0960e+02 + 5.2340e+02 4.4240e+02 3.0220e+02 2.9180e+02 6.1780e+02 6.5530e+02 2.0510e+03 + 4.1617e+03 2.2689e+03 1.0708e+03 1.2597e+03 2.1754e+03 4.4645e+03 7.4890e+02 + 6.8910e+02 3.3420e+02 2.9720e+02 5.0410e+02 1.1085e+03 3.1620e+02 6.5650e+02 + 6.4770e+02 6.9410e+02 4.4250e+02 5.5640e+02 2.1314e+03 2.8432e+03 1.8321e+03 + 4.1130e+02 8.0480e+02 7.8340e+02 4.9490e+02 6.7760e+02 3.7250e+02 3.4950e+02 + 6.2250e+02 4.8610e+02 4.8530e+02 2.5040e+02 9.9940e+02 6.1580e+02 1.1599e+03 + 3.7570e+03 3.6028e+03 4.6910e+02 8.8590e+02 9.9190e+02 8.1200e+02 4.8600e+02 + 5.7040e+02 5.8110e+02 1.9333e+03 4.9620e+03 2.8549e+03 9.4990e+02 9.0860e+02 + 4.9270e+02 9.2610e+02 8.9020e+02 5.4540e+02 2.4810e+02 5.9870e+02 5.8200e+02 + 3.9400e+02 3.3120e+02 5.5360e+02 1.5033e+03 3.0637e+03 3.2777e+03 1.6580e+03 + 6.8220e+02 2.1530e+03 4.4604e+03 1.9345e+03 6.4620e+02 6.7850e+02 7.4060e+02 + 9.5580e+02 7.8750e+02 7.9810e+02 5.8410e+02 3.7930e+02 6.8090e+02 3.4590e+02 + 1.3861e+03 2.7033e+03 2.4833e+03 6.6510e+02 4.4910e+02 4.7930e+02 3.3180e+02 + 3.5380e+02 5.1750e+02 8.3770e+02 3.8940e+02 5.0440e+02 2.4470e+02 2.6920e+02 + 4.2310e+02 7.6350e+02 1.0675e+03 3.2324e+03 3.4037e+03 4.0144e+03 1.0767e+03 + 1.0762e+03 4.6480e+02 3.0180e+02 5.5660e+02 3.7870e+02 4.4840e+02 1.8666e+03 + 3.3784e+03 2.1939e+03 1.0779e+03 3.9870e+02 6.6800e+02 4.5700e+02 8.0930e+02 + 5.9790e+02 2.6130e+02 7.1090e+02 8.9340e+02 6.1760e+02 4.1880e+02 6.3620e+02 + 2.2118e+03 4.4935e+03 4.0997e+03 2.0799e+03 3.9650e+02 1.6037e+03 3.4661e+03 + 1.9959e+03 6.2650e+02 4.0070e+02 5.2070e+02 7.0170e+02 4.4090e+02 6.7210e+02 + 4.0990e+02 5.2840e+02 6.5720e+02 6.8960e+02 2.2028e+03 3.8419e+03 2.5666e+03 + 8.7510e+02 5.9790e+02 2.8160e+02 2.5470e+02 4.5090e+02 6.1770e+02 6.2160e+02 + 9.1540e+02 2.7020e+02 3.5030e+02 2.6420e+02 3.8240e+02 6.0720e+02 1.8479e+03 + 2.8970e+03 2.8659e+03 2.0399e+03 1.3681e+03 6.3970e+02 5.3810e+02 7.0030e+02 + 8.0170e+02 5.2490e+02 7.2140e+02 3.5837e+03 3.4947e+03 1.7727e+03 6.3330e+02 + 6.1030e+02 5.8680e+02 5.5080e+02 5.5280e+02 4.2960e+02 3.6140e+02 8.8690e+02 + 1.2161e+03 6.2410e+02 3.0830e+02 5.3090e+02 2.1995e+03 2.7862e+03 3.0884e+03 + 1.3804e+03 2.3080e+02 1.4725e+03 4.5498e+03 2.0229e+03 1.1224e+03 5.2540e+02 + 5.6590e+02 6.3000e+02 5.0210e+02 3.4490e+02 5.0030e+02 8.3260e+02 3.2130e+02 + 1.0795e+03 2.4705e+03 5.1419e+03 2.2007e+03 9.1020e+02 5.9500e+02 2.5060e+02 + 2.7150e+02 2.8590e+02 5.6280e+02 6.9570e+02 9.0310e+02 3.5770e+02 4.9790e+02 + 6.2960e+02 2.6570e+02 4.0130e+02 9.4010e+02 3.4963e+03 3.7837e+03 6.7950e+02 + 1.0630e+03 7.1300e+02 6.3900e+02 4.3900e+02 6.4430e+02 4.8270e+02 4.5530e+02 + 2.2930e+03 2.6340e+03 1.8621e+03 5.8310e+02 4.7580e+02 3.2990e+02 3.7850e+02 + 6.4310e+02 6.4840e+02 4.2340e+02 3.3270e+02 1.0751e+03 1.1407e+03 5.5840e+02 + 5.0070e+02 2.2182e+03 3.0230e+03 2.9072e+03 9.4390e+02 2.1430e+02 9.8560e+02 + 3.5092e+03 4.2589e+03 1.2979e+03 6.1740e+02 4.7380e+02 3.1710e+02 3.9650e+02 + 7.6250e+02 5.0910e+02 5.4460e+02 7.3690e+02 8.2280e+02 3.3348e+03 4.8941e+03 + 1.8177e+03 1.0308e+03 4.8490e+02 2.6110e+02 3.2140e+02 5.1400e+02 6.5140e+02 + 3.4260e+02 5.0920e+02 6.1590e+02 2.2180e+02 5.9120e+02 3.7330e+02 7.7870e+02 + 2.2489e+03 2.6025e+03 3.1215e+03 9.3000e+02 6.8700e+02 5.1310e+02 6.0540e+02 + 5.6920e+02 8.0790e+02 4.1960e+02 2.5700e+02 3.4052e+03 3.3144e+03 4.1130e+02 + 4.6500e+02 4.9080e+02 2.7070e+02 2.5050e+02 7.3010e+02 7.9130e+02 2.8590e+02 + 3.8140e+02 6.6580e+02 6.6780e+02 4.8810e+02 3.1640e+02 1.9688e+03 3.1953e+03 + 2.0015e+03 4.4120e+02 2.4650e+02 6.7600e+02 1.8066e+03 2.9338e+03 2.0873e+03 + 1.0847e+03 3.9410e+02 4.4650e+02 4.1780e+02 5.6110e+02 3.7310e+02 3.8330e+02 + 6.4540e+02 8.9120e+02 4.0177e+03 2.3825e+03 1.3378e+03 1.0549e+03 5.2110e+02 + 5.6170e+02 3.7680e+02 5.0480e+02 6.8870e+02 5.2300e+02 4.1540e+02 3.9340e+02 + 3.3410e+02 6.1100e+02 3.3720e+02 5.2670e+02 1.8226e+03 3.2577e+03 1.8526e+03 + 9.3540e+02 7.7260e+02 6.1050e+02 3.5620e+02 5.9440e+02 7.2560e+02 3.0840e+02 + 4.8560e+02 3.2933e+03 4.7248e+03 1.5624e+03 9.1490e+02 2.9030e+02 3.1700e+02 + 7.3870e+02 5.7070e+02 6.4730e+02 5.5400e+02 6.1870e+02 4.5450e+02 5.7430e+02 + 8.1340e+02 6.3070e+02 9.7830e+02 3.7555e+03 2.0268e+03 4.2610e+02 6.3430e+02 + 3.9880e+02 1.9931e+03 2.3851e+03 3.5183e+03 1.7890e+03 6.5670e+02 2.7720e+02 + 2.5990e+02 3.2360e+02 5.1930e+02 7.7430e+02 1.6885e+03 2.1196e+03 3.3553e+03 + 2.3601e+03 9.0190e+02 7.8230e+02 2.7740e+02 4.3540e+02 4.3380e+02 6.1320e+02 + 4.2190e+02 2.4450e+02 4.4970e+02 7.2430e+02 5.8350e+02 6.0430e+02 2.3450e+02 + 4.3010e+02 3.0481e+03 3.5031e+03 1.8135e+03 5.7600e+02 1.0411e+03 4.1640e+02 + 5.0130e+02 5.6080e+02 8.7900e+02 3.4120e+02 8.4160e+02 2.3869e+03 3.6379e+03 + 1.5551e+03 2.9380e+02 4.1670e+02 3.0960e+02 2.5540e+02 1.0151e+03 7.9370e+02 + 5.0300e+02 4.0110e+02 5.0020e+02 2.5160e+02 3.1170e+02 1.0771e+03 1.9558e+03 + 3.3407e+03 2.2420e+03 1.5495e+03 6.8840e+02 3.7990e+02 8.9400e+02 2.6959e+03 + 4.0515e+03 1.7342e+03 4.7330e+02 4.2120e+02 4.0880e+02 3.0400e+02 5.9350e+02 + 7.6910e+02 2.1863e+03 2.1628e+03 2.0233e+03 2.0952e+03 5.7080e+02 6.1110e+02 + 3.3900e+02 5.1290e+02 8.2470e+02 1.1218e+03 2.8670e+02 2.5120e+02 3.3410e+02 + 5.9180e+02 1.0379e+03 5.0630e+02 2.6660e+02 5.0830e+02 2.3078e+03 4.3404e+03 + 1.6990e+03 6.0840e+02 1.1795e+03 4.1540e+02 4.7840e+02 2.8300e+02 3.5480e+02 + 4.4830e+02 5.8690e+02 2.2784e+03 4.3717e+03 6.9430e+02 4.5520e+02 5.9760e+02 + 2.1320e+02 4.8750e+02 5.6600e+02 1.0740e+03 7.0160e+02 6.7590e+02 7.0580e+02 + 2.9770e+02 2.7270e+02 2.7780e+02 1.8267e+03 3.4783e+03 2.8678e+03 1.5355e+03 + 8.6540e+02 3.5790e+02 8.9540e+02 1.9929e+03 3.1176e+03 1.8373e+03 9.4490e+02 + 3.1730e+02 3.1650e+02 3.0250e+02 1.2061e+03 2.2376e+03 3.6972e+03 2.5565e+03 + 2.1607e+03 1.1352e+03 7.5910e+02 2.5420e+02 2.7810e+02 7.6680e+02 1.4473e+03 + 6.3090e+02 2.1250e+02 3.4800e+02 3.5740e+02 3.0220e+02 5.3090e+02 5.7520e+02 + 5.9400e+02 5.0670e+02 2.6291e+03 3.8741e+03 2.1281e+03 1.0527e+03 1.3138e+03 + 7.2730e+02 2.5480e+02 2.5820e+02 6.7560e+02 4.4370e+02 5.1530e+02 1.9264e+03 + 3.8535e+03 1.8997e+03 4.1850e+02 7.2370e+02 1.4540e+02 2.0650e+02 6.1460e+02 + 2.2320e+02 6.5680e+02 4.4760e+02 4.0580e+02 4.7290e+02 2.6190e+02 7.0270e+02 + 2.1126e+03 3.8572e+03 2.1045e+03 1.1243e+03 5.0530e+02 4.2840e+02 7.3880e+02 + 9.4010e+02 2.2206e+03 2.9903e+03 1.2411e+03 4.4340e+02 1.4081e+03 2.0110e+03 + 2.3304e+03 2.0708e+03 2.6827e+03 2.3589e+03 1.0117e+03 7.6400e+02 8.0120e+02 + 5.2760e+02 1.4150e+02 4.5910e+02 9.7920e+02 6.5590e+02 6.1530e+02 7.0270e+02 + 6.2360e+02 6.7480e+02 5.0290e+02 2.6460e+02 3.3270e+02 7.9260e+02 2.9663e+03 + 4.0597e+03 1.7709e+03 1.0370e+03 6.0960e+02 4.5380e+02 3.5050e+02 2.8740e+02 + 7.1010e+02 6.1700e+02 6.2420e+02 1.6076e+03 3.5585e+03 3.2606e+03 1.3081e+03 + 4.1910e+02 4.2200e+02 4.6410e+02 5.5570e+02 4.2480e+02 6.0650e+02 1.0501e+03 + 4.1680e+02 2.9370e+02 4.7300e+02 2.9610e+02 2.0700e+03 2.6150e+03 3.2503e+03 + 1.0885e+03 4.6370e+02 5.6960e+02 1.0089e+03 9.0380e+02 1.4163e+03 2.8691e+03 + 3.1539e+03 9.9720e+02 2.1236e+03 2.1113e+03 2.3368e+03 2.0800e+03 2.2948e+03 + 1.7198e+03 5.2630e+02 3.5470e+02 4.0870e+02 2.7260e+02 4.1890e+02 7.9220e+02 + 7.7450e+02 5.7620e+02 6.7440e+02 4.8650e+02 6.1670e+02 1.0153e+03 2.7500e+02 + 7.8880e+02 3.7300e+02 7.4690e+02 2.1476e+03 4.5873e+03 9.4360e+02 7.1660e+02 + 5.1470e+02 4.6330e+02 3.8210e+02 4.9680e+02 5.3620e+02 8.7620e+02 6.2010e+02 + 1.8936e+03 2.6293e+03 3.8735e+03 1.2899e+03 4.4210e+02 5.0530e+02 7.9590e+02 + 4.7630e+02 5.0730e+02 6.5030e+02 7.0650e+02 3.9190e+02 2.5470e+02 2.8490e+02 + 2.2360e+02 1.2069e+03 4.1539e+03 1.9665e+03 1.1241e+03 5.0900e+02 6.5240e+02 + 4.4250e+02 4.0720e+02 4.6000e+02 4.1306e+03 4.4196e+03 1.3307e+03 3.6579e+03 + 3.3998e+03 3.7276e+03 1.3124e+03 1.0910e+03 9.1340e+02 7.6940e+02 5.3470e+02 + 4.9130e+02 5.2980e+02 3.1790e+02 1.1081e+03 8.0960e+02 4.5840e+02 3.8380e+02 + 5.7800e+02 8.3060e+02 6.7920e+02 8.9870e+02 7.2990e+02 5.9030e+02 9.0930e+02 + 3.8989e+03 3.5264e+03 4.7380e+02 4.0320e+02 2.4220e+02 3.6440e+02 3.9790e+02 + 5.2890e+02 5.3210e+02 9.6800e+02 5.2110e+02 1.0378e+03 1.9951e+03 2.8811e+03 + 1.5364e+03 4.3410e+02 7.3110e+02 7.6740e+02 6.1360e+02 2.5210e+02 2.0490e+02 + 9.0380e+02 5.0970e+02 1.4690e+02 4.4750e+02 2.1710e+02 1.3081e+03 3.2138e+03 + 8.0630e+02 8.8430e+02 5.8700e+02 2.5620e+02 8.4180e+02 5.8330e+02 7.8170e+02 + 2.0378e+03 4.1291e+03 1.9332e+03 3.2989e+03 5.1479e+03 9.3090e+02 8.3000e+02 + 9.3650e+02 5.5730e+02 5.4590e+02 4.1200e+02 6.9200e+02 4.4730e+02 3.6670e+02 + 8.5930e+02 1.1481e+03 7.7170e+02 2.8080e+02 6.3970e+02 7.6140e+02 9.4320e+02 + 1.1218e+03 9.9310e+02 5.9110e+02 1.0779e+03 3.9754e+03 4.5947e+03 9.9450e+02 + 6.3450e+02 2.2630e+02 4.7930e+02 2.4300e+02 5.1920e+02 4.7240e+02 7.1690e+02 + 3.5920e+02 5.1800e+02 1.9227e+03 4.5952e+03 2.1067e+03 5.3980e+02 5.3070e+02 + 7.3110e+02 7.2020e+02 3.1780e+02 3.4700e+02 6.2900e+02 5.6230e+02 1.0890e+02 + 2.9340e+02 6.5370e+02 9.3760e+02 3.8848e+03 1.9292e+03 7.4840e+02 4.3330e+02 + 7.4300e+02 5.4300e+02 7.6840e+02 3.7420e+02 1.9413e+03 3.0447e+03 3.6663e+03 + 2.6605e+03 4.7827e+03 8.0910e+02 3.2660e+02 4.7880e+02 7.2440e+02 5.0550e+02 + 6.0880e+02 6.5200e+02 6.1320e+02 3.4460e+02 4.9220e+02 6.0610e+02 5.5920e+02 + 3.9520e+02 5.3290e+02 8.9130e+02 8.8020e+02 1.0670e+03 6.8810e+02 5.8430e+02 + 1.1258e+03 2.2420e+03 2.0862e+03 3.8570e+02 1.9360e+02 3.1720e+02 2.9210e+02 + 4.8310e+02 3.0520e+02 5.1890e+02 1.1890e+03 6.3870e+02 3.3990e+02 1.8417e+03 + 3.3169e+03 2.6528e+03 9.6820e+02 7.2040e+02 5.9770e+02 6.4320e+02 5.3090e+02 + 5.3670e+02 6.7160e+02 4.3480e+02 3.7450e+02 4.5830e+02 1.0598e+03 2.5729e+03 + 3.5793e+03 1.2542e+03 4.5670e+02 3.2240e+02 6.1370e+02 3.8640e+02 3.4550e+02 + 3.6320e+02 8.2780e+02 3.1976e+03 3.9831e+03 5.3248e+03 4.5009e+03 1.9516e+03 + 2.5410e+02 3.1670e+02 3.5050e+02 4.8740e+02 4.0820e+02 5.6980e+02 4.0110e+02 + 2.2840e+02 7.2560e+02 9.6300e+02 5.7000e+02 5.5040e+02 5.2960e+02 6.9830e+02 + 1.1911e+03 2.2147e+03 4.1590e+02 4.0020e+02 1.1913e+03 3.0586e+03 3.6343e+03 + 8.7870e+02 3.5090e+02 4.0010e+02 2.3490e+02 3.6220e+02 2.6990e+02 5.6290e+02 + 8.4850e+02 5.3540e+02 5.1990e+02 2.0258e+03 2.6610e+03 3.4124e+03 1.1115e+03 + 5.9840e+02 2.4320e+02 5.4680e+02 7.3820e+02 3.5000e+02 3.9470e+02 3.4790e+02 + 2.9340e+02 6.4490e+02 2.2773e+03 3.9804e+03 4.4204e+03 6.9060e+02 2.5800e+02 + 3.0100e+02 2.9600e+02 7.8300e+02 3.8650e+02 3.1870e+02 3.7600e+02 2.0408e+03 + 3.6972e+03 5.4775e+03 3.3900e+03 7.8940e+02 1.9560e+02 3.3960e+02 5.4660e+02 + 5.0600e+02 4.9710e+02 5.3420e+02 2.7580e+02 4.9170e+02 5.6750e+02 6.1810e+02 + 7.1050e+02 7.5890e+02 3.6120e+02 6.8840e+02 6.6780e+02 1.2312e+03 6.2310e+02 + 2.5580e+02 7.2570e+02 1.1681e+03 2.6195e+03 5.0580e+02 4.7970e+02 4.8140e+02 + 3.6130e+02 2.6900e+02 3.4960e+02 4.0240e+02 6.8500e+02 5.3850e+02 3.1390e+02 + 6.3250e+02 2.8208e+03 3.3820e+03 2.3015e+03 9.6570e+02 2.3880e+02 7.3480e+02 + 6.1170e+02 3.4180e+02 5.1140e+02 4.7240e+02 3.7430e+02 6.0070e+02 7.5420e+02 + 3.9930e+03 3.3681e+03 8.2990e+02 1.9270e+02 3.8920e+02 6.5620e+02 3.6250e+02 + 7.1850e+02 6.0860e+02 7.9580e+02 2.0273e+03 3.8825e+03 5.0829e+03 3.0746e+03 + 1.5577e+03 3.9670e+02 2.7190e+02 4.2030e+02 7.9990e+02 8.1180e+02 3.0200e+02 + 2.6170e+02 3.1860e+02 3.9480e+02 5.9780e+02 4.6640e+02 4.1160e+02 5.8990e+02 + 2.0810e+02 3.5030e+02 2.3321e+03 4.5990e+02 5.0040e+02 4.9610e+02 1.9451e+03 + 1.9589e+03 1.8529e+03 5.1180e+02 5.0390e+02 7.2690e+02 3.7700e+02 3.6360e+02 + 5.4080e+02 4.1010e+02 1.7850e+02 2.6750e+02 4.9120e+02 1.0525e+03 3.3375e+03 + 2.1102e+03 1.5971e+03 3.9210e+02 5.1100e+02 3.2500e+02 3.3840e+02 5.9020e+02 + 6.5650e+02 8.4300e+02 7.4000e+02 2.1808e+03 3.7380e+03 2.3481e+03 3.5630e+02 + 2.7820e+02 3.8120e+02 3.9300e+02 6.6060e+02 3.4530e+02 2.6530e+02 3.3480e+02 + 8.4490e+02 2.5437e+03 4.7185e+03 2.5475e+03 7.9620e+02 8.8080e+02 3.5600e+02 + 5.5950e+02 5.2050e+02 5.0880e+02 3.0850e+02 5.4000e+02 9.1290e+02 7.5860e+02 + 4.9340e+02 6.8450e+02 8.7620e+02 7.0950e+02 4.8200e+02 1.3250e+02 2.3404e+03 + 9.8830e+02 6.3900e+02 4.1320e+02 1.4106e+03 1.8048e+03 2.1432e+03 1.1034e+03 + 1.3183e+03 6.1300e+02 9.8070e+02 6.0160e+02 4.7900e+02 7.4650e+02 2.5000e+02 + 5.0940e+02 5.8540e+02 1.0960e+03 2.0269e+03 3.1235e+03 1.5041e+03 7.0260e+02 + 8.0830e+02 3.6290e+02 4.2540e+02 8.2670e+02 9.8180e+02 1.0518e+03 4.0930e+02 + 2.1170e+03 2.4215e+03 2.1407e+03 4.6440e+02 6.0010e+02 4.1460e+02 9.2310e+02 + 7.2610e+02 4.2690e+02 3.2590e+02 4.4730e+02 7.0400e+02 1.9577e+03 3.6963e+03 + 3.3950e+03 2.1305e+03 6.4750e+02 7.0200e+02 2.8440e+02 4.2970e+02 4.9020e+02 + 4.0090e+02 2.2510e+02 1.1003e+03 5.7590e+02 4.8390e+02 6.8200e+02 1.5312e+03 + 4.8130e+02 3.5370e+02 1.1610e+02 2.0682e+03 4.1760e+02 6.0520e+02 2.0508e+03 + 2.5132e+03 1.6967e+03 5.6490e+02 5.7660e+02 2.2490e+02 4.7800e+02 3.1967e+03 + 2.9274e+03 2.0109e+03 1.0683e+03 7.0640e+02 1.2751e+03 5.8920e+02 2.8680e+02 + 2.0570e+02 6.3560e+02 1.2745e+03 3.7063e+03 2.3945e+03 1.0598e+03 1.0011e+03 + 8.2580e+02 1.0958e+03 2.6635e+03 2.3023e+03 1.8762e+03 7.8530e+02 1.1784e+03 + 4.6490e+02 3.6570e+02 5.0990e+02 7.5310e+02 6.9420e+02 3.9550e+02 1.8119e+03 + 2.8476e+03 3.0629e+03 4.0983e+03 2.2247e+03 4.9840e+02 4.0840e+02 4.9290e+02 + 1.4690e+02 2.1330e+02 3.5940e+02 7.1890e+02 3.6270e+02 4.0890e+02 5.3550e+02 + 8.3070e+02 6.9700e+02 4.9200e+02 8.2320e+02 1.2051e+03 1.0985e+03 8.5300e+02 + 6.3850e+02 7.2990e+02 6.1170e+02 3.0378e+03 2.3150e+03 4.7050e+02 4.0630e+02 + 3.4000e+02 2.1980e+02 8.5800e+02 1.6666e+03 3.1796e+03 1.2527e+03 5.4370e+02 + 5.1620e+02 5.9580e+02 5.0090e+02 5.4620e+02 2.4020e+02 4.3760e+02 6.7720e+02 + 2.3430e+03 2.8660e+03 2.4415e+03 6.9380e+02 6.8470e+02 4.4020e+02 1.5340e+03 + 3.3309e+03 2.9078e+03 1.1133e+03 7.4650e+02 6.0570e+02 2.5630e+02 5.9030e+02 + 6.2890e+02 7.8900e+02 8.5090e+02 8.1450e+02 1.7997e+03 2*4.9000e+03 + 2.5536e+03 1.1097e+03 4.0370e+02 8.4180e+02 2.5240e+02 1.5090e+02 5.4100e+02 + 3.9750e+02 1.7910e+02 1.5750e+02 6.6650e+02 1.2614e+03 5.4430e+02 4.8810e+02 + 1.0614e+03 8.6710e+02 7.9630e+02 6.1870e+02 1.6320e+02 7.9760e+02 6.8980e+02 + 3.1506e+03 1.8518e+03 1.2620e+03 2.6970e+02 3.4040e+02 5.3480e+02 9.2400e+02 + 3.7348e+03 2.7831e+03 9.1420e+02 4.1460e+02 3.8500e+02 3.3240e+02 6.4220e+02 + 3.5890e+02 6.2590e+02 4.3250e+02 6.1790e+02 2.1494e+03 3.8566e+03 1.8274e+03 + 1.1251e+03 5.4330e+02 2.4800e+02 1.6042e+03 1.5902e+03 2.2434e+03 2.7891e+03 + 9.3170e+02 6.2150e+02 5.2550e+02 1.0435e+03 7.1800e+02 6.1590e+02 2.2320e+02 + 5.3720e+02 1.9919e+03 4.5871e+03 3.2152e+03 4.2749e+03 2.5659e+03 1.5672e+03 + 9.4700e+02 4.7600e+02 2.2120e+02 7.5980e+02 6.3490e+02 3.8290e+02 4.7770e+02 + 4.9230e+02 6.8360e+02 7.4800e+02 4.5410e+02 6.6920e+02 8.0130e+02 5.6510e+02 + 9.8050e+02 1.7510e+03 8.6680e+02 2.3309e+03 2.5499e+03 1.4497e+03 5.1230e+02 + 4.6560e+02 3.6360e+02 6.3870e+02 2.1238e+03 3.5140e+03 2.1129e+03 7.2820e+02 + 2.8940e+02 4.5620e+02 5.6100e+02 3.4380e+02 4.0200e+02 6.5150e+02 4.1870e+02 + 3.0460e+02 2.4436e+03 2.8141e+03 2.4726e+03 1.0114e+03 4.4520e+02 6.2250e+02 + 6.6910e+02 1.5175e+03 1.9312e+03 1.7058e+03 1.7446e+03 3.3780e+02 7.9240e+02 + 6.9570e+02 5.7720e+02 4.7980e+02 3.3710e+02 5.2430e+02 1.6454e+03 2.9548e+03 + 3.1223e+03 2.6900e+03 3.4622e+03 1.2572e+03 7.0330e+02 6.3680e+02 2.3960e+02 + 6.3180e+02 6.4620e+02 4.1770e+02 4.1620e+02 5.1330e+02 6.0540e+02 5.3340e+02 + 3.8120e+02 4.3400e+02 2.5710e+02 3.9630e+02 8.5180e+02 1.7875e+03 2.6508e+03 + 3.1109e+03 2.5356e+03 1.4687e+03 6.1370e+02 4.6570e+02 4.8640e+02 5.1710e+02 + 1.2739e+03 2.2926e+03 2.4101e+03 5.5950e+02 5.0090e+02 3.6830e+02 7.3740e+02 + 1.9760e+02 2.6360e+02 3.8460e+02 5.6450e+02 3.0670e+02 1.1654e+03 2.9374e+03 + 2.5971e+03 1.1352e+03 5.3870e+02 5.1350e+02 1.1561e+03 7.5920e+02 1.1039e+03 + 1.2312e+03 2.9044e+03 1.7057e+03 7.7290e+02 4.3190e+02 5.3880e+02 5.2270e+02 + 3.5470e+02 4.4760e+02 1.5847e+03 2.0625e+03 3.8213e+03 1.8078e+03 3.8657e+03 + 2.9871e+03 9.4860e+02 3.0290e+02 5.5060e+02 2.7710e+02 5.5750e+02 5.3370e+02 + 7.4070e+02 2.5170e+02 2.1090e+02 3.8080e+02 9.0740e+02 3.5350e+02 2.5230e+02 + 1.0223e+03 1.7700e+03 1.3409e+03 1.7029e+03 3.0671e+03 3.1778e+03 7.1000e+02 + 3.3630e+02 3.4860e+02 1.1045e+03 7.9770e+02 2.2503e+03 3.5465e+03 2.4240e+03 + 5.2990e+02 3.8340e+02 5.5030e+02 7.1420e+02 1.8900e+02 2.0860e+02 4.4860e+02 + 6.0580e+02 4.3460e+02 1.1003e+03 2.4362e+03 2.3996e+03 2.7065e+03 4.8250e+02 + 3.8110e+02 1.0111e+03 6.2420e+02 1.1934e+03 1.6656e+03 2.2897e+03 2.3849e+03 + 7.0940e+02 3.4670e+02 7.7530e+02 3.9120e+02 3.0120e+02 4.1970e+02 2.3644e+03 + 2.5602e+03 2.8181e+03 3.4430e+03 3.7388e+03 2.5585e+03 6.4540e+02 4.9920e+02 + 3.1680e+02 4.0870e+02 8.0930e+02 6.5710e+02 3.9520e+02 1.0950e+02 3.5890e+02 + 6.0870e+02 9.0970e+02 3.1480e+02 4.4410e+02 8.4180e+02 2.1817e+03 2.9747e+03 + 2.7895e+03 2.5463e+03 1.9423e+03 5.4770e+02 2.6240e+02 6.2860e+02 3.7650e+02 + 6.5040e+02 1.6982e+03 1.2980e+03 1.9098e+03 1.4833e+03 5.4750e+02 4.8800e+02 + 9.1360e+02 3.0850e+02 2.2280e+02 3.2710e+02 6.4400e+02 1.1767e+03 1.4063e+03 + 2.0269e+03 2.6337e+03 1.8891e+03 6.0500e+02 6.1950e+02 5.2150e+02 5.9500e+02 + 1.1184e+03 2.2746e+03 2.7175e+03 2.5032e+03 2.2739e+03 7.9050e+02 3.9460e+02 + 6.1850e+02 1.5720e+02 4.7130e+02 1.4366e+03 1.6768e+03 1.7487e+03 2.8119e+03 + 2.5567e+03 2.3404e+03 3.9820e+02 2.5720e+02 3.2430e+02 6.8700e+02 5.4240e+02 + 1.1475e+03 3.7470e+02 3.8150e+02 5.3970e+02 2.9270e+02 5.8020e+02 2.5200e+02 + 5.5830e+02 5.2590e+02 1.8682e+03 2.3701e+03 3.7102e+03 2.6592e+03 1.4143e+03 + 2.1340e+02 4.6840e+02 6.2690e+02 3.6410e+02 4.0790e+02 1.5618e+03 3.4518e+03 + 2.1128e+03 9.6380e+02 8.1310e+02 6.0080e+02 6.2230e+02 3.3810e+02 4.7520e+02 + 5.5020e+02 2.6370e+02 2.6750e+02 1.0187e+03 2.6472e+03 3.1970e+03 1.7681e+03 + 6.7230e+02 6.8190e+02 5.6120e+02 3.7540e+02 5.8420e+02 9.0610e+02 1.4196e+03 + 2.2992e+03 1.9010e+03 1.5797e+03 8.2320e+02 2.1740e+02 3.3050e+02 3.2780e+02 + 2.3584e+03 2.6336e+03 1.8773e+03 2.5081e+03 1.7682e+03 2.0884e+03 5.0810e+02 + 3.6480e+02 3.9530e+02 6.6580e+02 7.7620e+02 4.4170e+02 5.5490e+02 2.7490e+02 + 5.2160e+02 3.9160e+02 2.2100e+02 2.6460e+02 5.7430e+02 6.4120e+02 1.5532e+03 + 3.4245e+03 2.9993e+03 3.4139e+03 9.9350e+02 2.1310e+02 3.8290e+02 5.1420e+02 + 4.2150e+02 4.1690e+02 1.0466e+03 3.4337e+03 2.4898e+03 9.8000e+02 6.6050e+02 + 6.6630e+02 8.1310e+02 1.8160e+02 5.2530e+02 4.3660e+02 2.5060e+02 1.9850e+02 + 8.4520e+02 1.5414e+03 2.9316e+03 1.2458e+03 1.5559e+03 5.3890e+02 6.4160e+02 + 4.3320e+02 5.1570e+02 9.0220e+02 1.1472e+03 2.8437e+03 2.5519e+03 1.8898e+03 + 1.3350e+03 3.5970e+02 2.7820e+02 4.6380e+02 1.5802e+03 2.6410e+03 2.0892e+03 + 1.9072e+03 1.4236e+03 1.6715e+03 1.1275e+03 2.7170e+02 5.1900e+02 1.1420e+03 + 5.7280e+02 2.4960e+02 4.0460e+02 5.8070e+02 6.9270e+02 5.5860e+02 2.6360e+02 + 2.2040e+02 5.7910e+02 9.7400e+02 2.2207e+03 3.1806e+03 2.9487e+03 2.6460e+03 + 8.3110e+02 5.6510e+02 6.0020e+02 9.1220e+02 4.5900e+02 2.1400e+02 8.1780e+02 + 2.6254e+03 2.2959e+03 4.4990e+02 8.0930e+02 3.8780e+02 3.4780e+02 4.6160e+02 + 4.8970e+02 6.5330e+02 2.1020e+02 1.9390e+02 6.1400e+02 2.1172e+03 2.5880e+03 + 9.1740e+02 3.2830e+02 4.7640e+02 4.7730e+02 3.0230e+02 4.7740e+02 5.5130e+02 + 7.2690e+02 8.6710e+02 2.5374e+03 2.4679e+03 1.9021e+03 6.9180e+02 4.5080e+02 + 1.3242e+03 2.5734e+03 1.7543e+03 1.3416e+03 2.4816e+03 2.7761e+03 1.0306e+03 + 6.6780e+02 2.7920e+02 2.6170e+02 4.2820e+02 3.6720e+02 2.1280e+02 2.4140e+02 + 3.7720e+02 5.0490e+02 1.2447e+03 4.8460e+02 4.1910e+02 4.6740e+02 4.4710e+02 + 2.0574e+03 3.4445e+03 1.9242e+03 3.1801e+03 9.8000e+02 5.6750e+02 7.2610e+02 + 1.0171e+03 4.4950e+02 2.1670e+02 9.1090e+02 1.6563e+03 2.2506e+03 3.7940e+02 + 6.0050e+02 4.1630e+02 8.6700e+02 5.2110e+02 3.5570e+02 5.7910e+02 4.8580e+02 + 3.8040e+02 5.5310e+02 1.8293e+03 4.0033e+03 1.3912e+03 4.1860e+02 1.9970e+02 + 6.1860e+02 1.0779e+03 7.0500e+02 4.4630e+02 4.7810e+02 5.2140e+02 1.9789e+03 + 3.9843e+03 2.0404e+03 4.6180e+02 6.9600e+02 8.5680e+02 3.7697e+03 1.6345e+03 + 6.2080e+02 1.7189e+03 2.6387e+03 2.1605e+03 9.3290e+02 4.4470e+02 3.4160e+02 + 4.2040e+02 4.2130e+02 3.1520e+02 1.8350e+02 6.8700e+02 5.7680e+02 4.0500e+02 + 3.4470e+02 6.6850e+02 4.9380e+02 1.2771e+03 1.2518e+03 2.5795e+03 1.4788e+03 + 2.8823e+03 1.7216e+03 5.5240e+02 5.3560e+02 1.0283e+03 1.7910e+02 2.2750e+02 + 7.5440e+02 1.9665e+03 2.6895e+03 7.3100e+02 3.9140e+02 8.1090e+02 4.5800e+02 + 5.7860e+02 3.4420e+02 5.4440e+02 4.4200e+02 4.5330e+02 5.1130e+02 2.8980e+03 + 3.7284e+03 1.5843e+03 5.5210e+02 3.8300e+02 4.1820e+02 8.9080e+02 9.6520e+02 + 3.0360e+02 3.0210e+02 4.4240e+02 1.1200e+03 3.8272e+03 2.6604e+03 1.2570e+03 + 1.0861e+03 1.4882e+03 2.8358e+03 1.3885e+03 1.5542e+03 3.3161e+03 2.5024e+03 + 7.4700e+02 7.5310e+02 3.4130e+02 2.2870e+02 4.1190e+02 7.6240e+02 5.3530e+02 + 5.5600e+02 3.2450e+02 8.3610e+02 9.0970e+02 4.3360e+02 4.6120e+02 8.5400e+02 + 5.7380e+02 2.7247e+03 2.4704e+03 1.6567e+03 3.9837e+03 5.6330e+02 9.6860e+02 + 5.3140e+02 7.0040e+02 3.3780e+02 3.6850e+02 5.5190e+02 1.9874e+03 2.8481e+03 + 1.6594e+03 7.7680e+02 4.5160e+02 7.0220e+02 4.4680e+02 5.2260e+02 4.5230e+02 + 7.0330e+02 4.8480e+02 5.1660e+02 1.6201e+03 2.5961e+03 1.8756e+03 4.7680e+02 + 2.4630e+02 6.7680e+02 8.4080e+02 5.9680e+02 5.6820e+02 4.2380e+02 1.7510e+02 + 5.2760e+02 2.3001e+03 1.9326e+03 2.6849e+03 2.0948e+03 2.2434e+03 1.5278e+03 + 1.4001e+03 1.1735e+03 3.3275e+03 2.8990e+03 9.2650e+02 5.9970e+02 3.4230e+02 + 2.4110e+02 2.5690e+02 3.5620e+02 7.4700e+02 7.2150e+02 5.6260e+02 6.5640e+02 + 9.0660e+02 3.7110e+02 4.7130e+02 7.9870e+02 1.1816e+03 2.9694e+03 2.2485e+03 + 1.7479e+03 4.1917e+03 9.8090e+02 9.7530e+02 9.9470e+02 8.0460e+02 5.8180e+02 + 3.7510e+02 4.7370e+02 1.8509e+03 3.4046e+03 1.3316e+03 5.3430e+02 3.5190e+02 + 3.8730e+02 3.7990e+02 3.5050e+02 8.1950e+02 4.1410e+02 8.3540e+02 1.1228e+03 + 1.6428e+03 3.8505e+03 2.5423e+03 4.7330e+02 2.1270e+02 4.2950e+02 6.0510e+02 + 5.2940e+02 4.4200e+02 2.3460e+02 1.7330e+02 2.5070e+02 1.7627e+03 3.0690e+03 + 2.3951e+03 2.1498e+03 2.4487e+03 1.6335e+03 8.0340e+02 1.2199e+03 1.3666e+03 + 2.3408e+03 8.0550e+02 5.8810e+02 8.5210e+02 5.5770e+02 2.6820e+02 4.2310e+02 + 4.6450e+02 3.8520e+02 5.7820e+02 6.2760e+02 4.8420e+02 1.9370e+02 2.9710e+02 + 1.1094e+03 1.3642e+03 2.6209e+03 2.2496e+03 2.3249e+03 2.9479e+03 2.2454e+03 + 6.4710e+02 6.4780e+02 5.7590e+02 5.8620e+02 8.9900e+02 5.4060e+02 1.1622e+03 + 3.8037e+03 3.5009e+03 1.0055e+03 4.5570e+02 5.2930e+02 5.6720e+02 3.6170e+02 + 4.0620e+02 9.3380e+02 8.0470e+02 6.0230e+02 2.6133e+03 3.7930e+03 9.3200e+02 + 5.4310e+02 1.7260e+02 5.6240e+02 5.0580e+02 7.5740e+02 3.5140e+02 3.5290e+02 + 4.5350e+02 2.8700e+02 8.0550e+02 2.2591e+03 4.2361e+03 2.3698e+03 3.2769e+03 + 1.4118e+03 8.4750e+02 1.3975e+03 3.0926e+03 2.9593e+03 2.9790e+02 4.7770e+02 + 5.2500e+02 2.6330e+02 2.1810e+02 4.6270e+02 4.6330e+02 5.0940e+02 6.1920e+02 + 6.9500e+02 6.6580e+02 4.6690e+02 3.2480e+02 5.9020e+02 2.0036e+03 2.3172e+03 + 2.3783e+03 2.5683e+03 3.5564e+03 7.1340e+02 6.3040e+02 5.5820e+02 3.7130e+02 + 6.4720e+02 1.2550e+03 5.7280e+02 7.7250e+02 1.5913e+03 2.8692e+03 1.8973e+03 + 5.6870e+02 4.7970e+02 4.6350e+02 3.6360e+02 8.2930e+02 7.6460e+02 6.5170e+02 + 1.4331e+03 3.1086e+03 2.7401e+03 8.6490e+02 7.3310e+02 5.5390e+02 6.3700e+02 + 5.1620e+02 4.2980e+02 2.7740e+02 5.5490e+02 5.8510e+02 2.7570e+02 2.0721e+03 + 2.6815e+03 4.6785e+03 2.8615e+03 2.4851e+03 1.0942e+03 4.2930e+02 1.1479e+03 + 3.6143e+03 2.3742e+03 4.5030e+02 4.6810e+02 3.7820e+02 5.4760e+02 3.1240e+02 + 4.8670e+02 3.1400e+02 2.5690e+02 4.3550e+02 7.8280e+02 1.0206e+03 5.0080e+02 + 2.6940e+02 4.2680e+02 1.9011e+03 3.4399e+03 1.9781e+03 2.9700e+03 4.0632e+03 + 2.1445e+03 5.1180e+02 2.1450e+02 3.7810e+02 6.4640e+02 4.4970e+02 6.8260e+02 + 1.0033e+03 1.7795e+03 3.0793e+03 3.5360e+03 1.4152e+03 5.2240e+02 7.1490e+02 + 4.8720e+02 4.3150e+02 1.8920e+02 8.5010e+02 1.6311e+03 2.0498e+03 2.5344e+03 + 1.0624e+03 7.9570e+02 5.7250e+02 2.3030e+02 4.8180e+02 4.3750e+02 3.4300e+02 + 5.1340e+02 2.1510e+02 4.3670e+02 6.8210e+02 3.1194e+03 3.7457e+03 4.9000e+03 + 1.3801e+03 1.0845e+03 2.8710e+02 8.5890e+02 3.4034e+03 1.9818e+03 7.0380e+02 + 7.6930e+02 3.7870e+02 3.0300e+02 7.8750e+02 4.6680e+02 6.0020e+02 2.9320e+02 + 3.3520e+02 7.2500e+02 7.6030e+02 4.9050e+02 2.3100e+02 5.4030e+02 6.8140e+02 + 2.3476e+03 3.2285e+03 1.7669e+03 4.7222e+03 2.3140e+03 4.4430e+02 4.1600e+02 + 4.5710e+02 4.6070e+02 4.0700e+02 3.8010e+02 5.4330e+02 1.8105e+03 1.9823e+03 + 3.6509e+03 1.4261e+03 6.6120e+02 7.0180e+02 1.3160e+02 4.2730e+02 3.4370e+02 + 5.0860e+02 1.2196e+03 4.1831e+03 2.6754e+03 1.0946e+03 5.2420e+02 3.1670e+02 + 6.7700e+02 1.0093e+03 4.5300e+02 3.8850e+02 3.2500e+02 4.6760e+02 2.4320e+02 + 9.1730e+02 3.4097e+03 4.9000e+03 3.3546e+03 6.2330e+02 5.6070e+02 7.0430e+02 + 1.0851e+03 2.8609e+03 2.4428e+03 1.1424e+03 4.7800e+02 2.9520e+02 3.0150e+02 + 4.0460e+02 5.2850e+02 4.8180e+02 2.8370e+02 3.0560e+02 5.7030e+02 5.8750e+02 + 3.4530e+02 4.1910e+02 5.4660e+02 6.0900e+02 1.9913e+03 1.8002e+03 2.5292e+03 + 3.8786e+03 1.8313e+03 2.8300e+02 3.7770e+02 7.9430e+02 8.9430e+02 5.9310e+02 + 7.3210e+02 4.6820e+02 9.7960e+02 1.7765e+03 2.7664e+03 2.8091e+03 9.1910e+02 + 8.2140e+02 2.2610e+02 1.1800e+02 2.2020e+02 4.0670e+02 3.0529e+03 2.8436e+03 + 2.5100e+03 6.8690e+02 5.4700e+02 3.0150e+02 8.6400e+02 7.2380e+02 4.3690e+02 + 4.9510e+02 2.5570e+02 4.5020e+02 3.7090e+02 8.2190e+02 3.1391e+03 4.6477e+03 + 4.6553e+03 4.3810e+02 5.5830e+02 5.8210e+02 7.1800e+02 2.7058e+03 4.5787e+03 + 2.7763e+03 3.2950e+02 4.3770e+02 1.3780e+02 4.7090e+02 8.7440e+02 5.0190e+02 + 2.7880e+02 5.4610e+02 7.0620e+02 4.8440e+02 6.6700e+02 7.1980e+02 3.8870e+02 + 2.4850e+02 1.0900e+03 1.6568e+03 2.8312e+03 4.1472e+03 1.9071e+03 3.6220e+02 + 5.7170e+02 1.0636e+03 7.8330e+02 2.5100e+02 1.5980e+02 2.9910e+02 7.3710e+02 + 1.4428e+03 1.5185e+03 2.6318e+03 1.0425e+03 8.3020e+02 4.0880e+02 1.9640e+02 + 4.4460e+02 5.1350e+02 3.5916e+03 2.8288e+03 1.3229e+03 7.6350e+02 5.8250e+02 + 4.0450e+02 4.1120e+02 7.4220e+02 4.5560e+02 6.7530e+02 5.2930e+02 4.5060e+02 + 2.1890e+02 8.5750e+02 3.1077e+03 4.0458e+03 4.2533e+03 8.3590e+02 1.7700e+02 + 4.2510e+02 1.0621e+03 1.7114e+03 3.6057e+03 1.8563e+03 9.7890e+02 7.0090e+02 + 3.8050e+02 5.8580e+02 8.6680e+02 8.6420e+02 5.3950e+02 6.8840e+02 4.7860e+02 + 5.0300e+02 3.9950e+02 7.3830e+02 2.1130e+02 1.0190e+02 5.4830e+02 2.7261e+03 + 1.7976e+03 2.8102e+03 2.5955e+03 7.7040e+02 8.0790e+02 1.0975e+03 7.3220e+02 + 2.4670e+02 2.4040e+02 3.0810e+02 2.6640e+02 6.9890e+02 1.4153e+03 2.8791e+03 + 1.9369e+03 8.3970e+02 5.2740e+02 3.4630e+02 4.5160e+02 1.2947e+03 3.8368e+03 + 2.0019e+03 1.3480e+03 7.0550e+02 8.2740e+02 3.6410e+02 3.2300e+02 4.6500e+02 + 5.4990e+02 6.9800e+02 5.4560e+02 3.4110e+02 6.4630e+02 2.1809e+03 3.6843e+03 + 4.4999e+03 1.7725e+03 1.1060e+03 1.9710e+02 3.0960e+02 1.0824e+03 2.4076e+03 + 3.5700e+03 2.0389e+03 6.0030e+02 6.4640e+02 4.5360e+02 9.5070e+02 7.9510e+02 + 4.4250e+02 4.0490e+02 7.2050e+02 6.4530e+02 4.9410e+02 6.7270e+02 7.6110e+02 + 4.7120e+02 7.3500e+01 9.2910e+02 2.6984e+03 1.0833e+03 2.7297e+03 3.0901e+03 + 7.0540e+02 6.2500e+02 1.0611e+03 6.8970e+02 2.4990e+02 6.5790e+02 5.5590e+02 + 5.6270e+02 9.7840e+02 3.2423e+03 9.9920e+02 3.0262e+03 1.0006e+03 7.7650e+02 + 6.6840e+02 6.0980e+02 2.3188e+03 2.4329e+03 2.0285e+03 3.4030e+02 6.3210e+02 + 7.3500e+02 6.5580e+02 3.5100e+02 2.5530e+02 2.4380e+02 5.6610e+02 5.9410e+02 + 3.9340e+02 5.4430e+02 2.5215e+03 4.3868e+03 3.7815e+03 1.4495e+03 8.9350e+02 + 2.4940e+02 1.7880e+02 4.9540e+02 1.9000e+03 1.9867e+03 1.8375e+03 9.7380e+02 + 9.8050e+02 6.4370e+02 1.2262e+03 7.8670e+02 3.8050e+02 6.9680e+02 7.9440e+02 + 4.2570e+02 5.1120e+02 7.7970e+02 6.3440e+02 3.8540e+02 6.3450e+02 9.0930e+02 + 2.7898e+03 4.5250e+02 3.4179e+03 3.0589e+03 9.0880e+02 6.3570e+02 6.1880e+02 + 5.7460e+02 2.3580e+02 5.6900e+02 2.2830e+02 3.6090e+02 8.2160e+02 1.0996e+03 + 2.4500e+03 2.4794e+03 2.5780e+03 1.2916e+03 7.1400e+02 2.2100e+03 1.6422e+03 + 2.4731e+03 6.6340e+02 5.9520e+02 7.2190e+02 4.3710e+02 5.6520e+02 4.3920e+02 + 5.9320e+02 5.2800e+02 7.5620e+02 1.6520e+02 4.3190e+02 1.1834e+03 2.0395e+03 + 4.9000e+03 4.1855e+03 2.4312e+03 6.5810e+02 4.7180e+02 2.4510e+02 5.4990e+02 + 1.6782e+03 2.7634e+03 2.2480e+03 2.6931e+03 1.6676e+03 8.7250e+02 1.0476e+03 + 1.1354e+03 4.5320e+02 5.7410e+02 7.3300e+02 5.9480e+02 4.9550e+02 5.4860e+02 + 4.7040e+02 8.4160e+02 9.1140e+02 8.6720e+02 2.9988e+03 3.8490e+02 2.6586e+03 + 4.9000e+03 2.8537e+03 5.1240e+02 4.0310e+02 3.4490e+02 4.0940e+02 5.4770e+02 + 2.7920e+02 2.7450e+02 3.4900e+02 7.9050e+02 8.9460e+02 3.9114e+03 1.9010e+03 + 1.6534e+03 2.0433e+03 2.4316e+03 2.6348e+03 1.3741e+03 9.2110e+02 4.0240e+02 + 5.3160e+02 4.0930e+02 4.1770e+02 5.1370e+02 5.9270e+02 3.5110e+02 4.8230e+02 + 3.7350e+02 4.9110e+02 8.1400e+02 2.4801e+03 3.1641e+03 4.0004e+03 2.3151e+03 + 6.2820e+02 4.7270e+02 2.9400e+02 2.7760e+02 1.4428e+03 2.4830e+03 2.0199e+03 + 2.2989e+03 1.8441e+03 2.0192e+03 1.1150e+03 7.2290e+02 9.0290e+02 9.1430e+02 + 1.0614e+03 8.0590e+02 5.6870e+02 7.5220e+02 2.4380e+02 1.3209e+03 1.2231e+03 + 9.5240e+02 2.4828e+03 5.0570e+02 1.1895e+03 4.9000e+03 2.4700e+03 3.8740e+02 + 4.4210e+02 2.9610e+02 2.0290e+02 3.7790e+02 7.2710e+02 4.1540e+02 2.7770e+02 + 4.3770e+02 1.0914e+03 2.5008e+03 2.5858e+03 1.8840e+03 3.8777e+03 2.3034e+03 + 3.1962e+03 8.2520e+02 5.8840e+02 5.5580e+02 4.3520e+02 7.1500e+02 2.4150e+02 + 4.3170e+02 5.1480e+02 5.4730e+02 1.5050e+02 2.5480e+02 5.2170e+02 1.0114e+03 + 3.3460e+03 3.3662e+03 4.3170e+03 8.3780e+02 5.6420e+02 7.0660e+02 4.8980e+02 + 3.6680e+02 7.3570e+02 1.3389e+03 1.7852e+03 2.4919e+03 2.5768e+03 2.9444e+03 + 2.8413e+03 1.0881e+03 1.3590e+03 9.8900e+02 6.9520e+02 8.3170e+02 8.3320e+02 + 5.0610e+02 3.6800e+02 8.4460e+02 7.0170e+02 8.0660e+02 3.3339e+03 4.4270e+02 + 8.0770e+02 3.5297e+03 3.2163e+03 1.2114e+03 3.5370e+02 4.2880e+02 2.7030e+02 + 3.2860e+02 8.8490e+02 4.1070e+02 5.3750e+02 3.9140e+02 4.7630e+02 1.4626e+03 + 2.2374e+03 4.3741e+03 3.1597e+03 2.2439e+03 1.2666e+03 6.8510e+02 3.5040e+02 + 5.8650e+02 7.5480e+02 5.6660e+02 4.5200e+02 6.3130e+02 9.8310e+02 4.1850e+02 + 2.4530e+02 5.1310e+02 6.5010e+02 1.7119e+03 4.3607e+03 4.9000e+03 2.8547e+03 + 6.7630e+02 4.2250e+02 7.5630e+02 5.3060e+02 2.8540e+02 5.2490e+02 8.3190e+02 + 4.6040e+02 1.4292e+03 2.3347e+03 2.4663e+03 2.2936e+03 1.4503e+03 2.4320e+03 + 3.4166e+03 1.3940e+03 1.6923e+03 1.1504e+03 6.2190e+02 4.7080e+02 6.2660e+02 + 6.1520e+02 1.6656e+03 3.1082e+03 2.7660e+02 5.0510e+02 1.9672e+03 2.8731e+03 + 1.4149e+03 1.2524e+03 7.7520e+02 2.4740e+02 4.4440e+02 6.5480e+02 7.6970e+02 + 6.4160e+02 4.5870e+02 6.7390e+02 1.3420e+03 3.3091e+03 4.9000e+03 2.9450e+03 + 2.0539e+03 1.1488e+03 9.3730e+02 3.5380e+02 3.5880e+02 6.5260e+02 7.9860e+02 + 5.5120e+02 5.6920e+02 7.7010e+02 4.3050e+02 4.0910e+02 6.8460e+02 7.2570e+02 + 8.1820e+02 2.8554e+03 4.1959e+03 2.3563e+03 7.8750e+02 5.5450e+02 8.9900e+02 + 5.7970e+02 1.7190e+02 3.4240e+02 6.1250e+02 5.8910e+02 7.8940e+02 8.0750e+02 + 2.0195e+03 2.0016e+03 1.1428e+03 7.0750e+02 2.8338e+03 2.6235e+03 1.9957e+03 + 8.4880e+02 8.9270e+02 6.2410e+02 5.7070e+02 4.9230e+02 2.6229e+03 2.7562e+03 + 3.0530e+02 9.2970e+02 1.1794e+03 1.8583e+03 3.1903e+03 2.1820e+03 1.0491e+03 + 2.5430e+02 3.2890e+02 5.0530e+02 6.8680e+02 7.7780e+02 8.9900e+02 4.7110e+02 + 1.7998e+03 2.9898e+03 4.9000e+03 2.4769e+03 1.3492e+03 9.2780e+02 7.7210e+02 + 4.0230e+02 2.9380e+02 6.8180e+02 9.7570e+02 5.6520e+02 4.7430e+02 5.2460e+02 + 3.1730e+02 5.0750e+02 1.1649e+03 1.4508e+03 3.3479e+03 3.6148e+03 4.6609e+03 + 2.6517e+03 3.5690e+02 1.0859e+03 1.6546e+03 5.1010e+02 2.9710e+02 2.5260e+02 + 4.7720e+02 2.4580e+02 2.2260e+02 3.8290e+02 1.5214e+03 1.0321e+03 6.5630e+02 + 1.5343e+03 1.7842e+03 3.5022e+03 1.2340e+03 1.6481e+03 1.6851e+03 1.3960e+03 + 7.5480e+02 7.9850e+02 2.9810e+03 2.7422e+03 4.7990e+02 6.2800e+02 1.7160e+03 + 2.0820e+03 1.8984e+03 2.3882e+03 9.2500e+02 4.3850e+02 5.2070e+02 6.4150e+02 + 3.7760e+02 3.2960e+02 6.7590e+02 2.9255e+03 2.0540e+03 3.6983e+03 4.9000e+03 + 1.4498e+03 4.8900e+02 5.1850e+02 3.3280e+02 4.2850e+02 3.7990e+02 5.6460e+02 + 5.1420e+02 6.0520e+02 3.1930e+02 2.4080e+02 4.7770e+02 6.8560e+02 7.3510e+02 + 1.7330e+03 3.3047e+03 2.5153e+03 2.8544e+03 2.0092e+03 7.5440e+02 5.9730e+02 + 8.7810e+02 7.0050e+02 6.0640e+02 3.7300e+02 2.5970e+02 6.1630e+02 3.3760e+02 + 1.8840e+02 5.6900e+02 7.2930e+02 1.5152e+03 8.7270e+02 9.4990e+02 1.1593e+03 + 2.2909e+03 2.1100e+03 1.6823e+03 1.9951e+03 2.3617e+03 2.2256e+03 1.6271e+03 + 2.2665e+03 6.5360e+02 7.4160e+02 6.0720e+02 1.4544e+03 2.9052e+03 2.0213e+03 + 2.7431e+03 3.0690e+02 5.0160e+02 5.1590e+02 8.1800e+01 5.4040e+02 1.2840e+03 + 2.4776e+03 2.3175e+03 2.3476e+03 2.9553e+03 2.3551e+03 5.0210e+02 4.4510e+02 + 3.4310e+02 6.3280e+02 4.8790e+02 7.3230e+02 8.3610e+02 4.1400e+02 2.9770e+02 + 4.4840e+02 1.9300e+02 6.7820e+02 1.8790e+03 1.7808e+03 3.1154e+03 2.3703e+03 + 2.6636e+03 1.7664e+03 4.2970e+02 6.2390e+02 5.6740e+02 6.8840e+02 2.7140e+02 + 4.7030e+02 6.5320e+02 6.9020e+02 3.4170e+02 4.9760e+02 2.9130e+02 3.3720e+02 + 8.6020e+02 6.1620e+02 4.2750e+02 7.0940e+02 1.0423e+03 2.0689e+03 1.5421e+03 + 2.0636e+03 3.7696e+03 1.7722e+03 3.3153e+03 1.9824e+03 7.9140e+02 8.5780e+02 + 4.9280e+02 1.2156e+03 2.1213e+03 4.3381e+03 1.9360e+03 4.9450e+02 4.4120e+02 + 6.5400e+02 4.0790e+02 4.5060e+02 1.9348e+03 3.2862e+03 3.5314e+03 1.8471e+03 + 2.6030e+03 1.1317e+03 8.2840e+02 5.3220e+02 1.6490e+02 7.2410e+02 4.1120e+02 + 5.3050e+02 6.1480e+02 3.3140e+02 5.0170e+02 2.7430e+02 4.7080e+02 7.1060e+02 + 1.7529e+03 1.7289e+03 2.7173e+03 3.1672e+03 3.4299e+03 4.7950e+02 5.3380e+02 + 5.2360e+02 4.7590e+02 2.8150e+02 4.0050e+02 7.8030e+02 8.1750e+02 7.2040e+02 + 4.9470e+02 2.8960e+02 2.0270e+02 3.9160e+02 6.1910e+02 5.1210e+02 5.9380e+02 + 9.2440e+02 6.2740e+02 1.1847e+03 1.2382e+03 2.7861e+03 3.9983e+03 4.0372e+03 + 2.2989e+03 1.1676e+03 7.7870e+02 1.0037e+03 3.9890e+02 4.5440e+02 1.0594e+03 + 2.7423e+03 2.5211e+03 4.7290e+02 4.0560e+02 7.8250e+02 8.3740e+02 8.0940e+02 + 1.7045e+03 2.7828e+03 1.9740e+03 1.1579e+03 3.7134e+03 1.9951e+03 1.3863e+03 + 7.3720e+02 5.7470e+02 5.9250e+02 4.8720e+02 6.4130e+02 6.0330e+02 3.3400e+02 + 4.1570e+02 6.6750e+02 2.5780e+02 6.4840e+02 2.4687e+03 3.7828e+03 1.3569e+03 + 2.7302e+03 3.7845e+03 9.7340e+02 4.9150e+02 6.6080e+02 3.7910e+02 3.5740e+02 + 4.2280e+02 5.7070e+02 4.3620e+02 4.4110e+02 3.2130e+02 6.6660e+02 2.2940e+02 + 8.7100e+02 6.4890e+02 4.6480e+02 4.7300e+02 8.5750e+02 5.3350e+02 7.4410e+02 + 6.3260e+02 1.1698e+03 2*4.9000e+03 2.8309e+03 1.7239e+03 1.0524e+03 + 5.3600e+02 7.4750e+02 4.4950e+02 1.0745e+03 3.3417e+03 2.8460e+03 6.1830e+02 + 4.4110e+02 1.2032e+03 1.1320e+03 2.3303e+03 8.5480e+02 2.2846e+03 2.2797e+03 + 1.2697e+03 2.4905e+03 2.3478e+03 9.6450e+02 5.8280e+02 8.6480e+02 5.7190e+02 + 5.2640e+02 7.7780e+02 3.0350e+02 2.7460e+02 4.5380e+02 7.8360e+02 4.3800e+02 + 4.8030e+02 3.2669e+03 3.0879e+03 1.2485e+03 2.8503e+03 3.2174e+03 8.5230e+02 + 5.0530e+02 7.5080e+02 5.3110e+02 4.1170e+02 6.7470e+02 6.8580e+02 3.2770e+02 + 2.8540e+02 4.1560e+02 7.1690e+02 5.9740e+02 9.1820e+02 3.9290e+02 3.1070e+02 + 4.5320e+02 4.4370e+02 6.7170e+02 1.0899e+03 9.8300e+02 2.5853e+03 4.4533e+03 + 4.4834e+03 3.3820e+03 1.0737e+03 5.5710e+02 6.6810e+02 7.2380e+02 8.0830e+02 + 9.8250e+02 3.8272e+03 3.2605e+03 7.3520e+02 6.1930e+02 7.1480e+02 1.3423e+03 + 1.6086e+03 2.7728e+03 2.5174e+03 1.2555e+03 2.0293e+03 2.6685e+03 1.7790e+03 + 7.5640e+02 1.7700e+02 3.8970e+02 3.9180e+02 3.1310e+02 4.8570e+02 5.2740e+02 + 3.7960e+02 2.5860e+02 8.0590e+02 5.7560e+02 2.1028e+03 2.5224e+03 2.8102e+03 + 1.5618e+03 2.3072e+03 3.0593e+03 1.4207e+03 2.7440e+02 3.1030e+02 4.7060e+02 + 6.6640e+02 2.4470e+02 7.3880e+02 1.9930e+02 4.6810e+02 6.0440e+02 1.3101e+03 + 4.5230e+02 6.2520e+02 6.4320e+02 2.5910e+02 5.1700e+02 4.9570e+02 1.0659e+03 + 7.0710e+02 1.1236e+03 3.2020e+03 3.3548e+03 3.9033e+03 4.5755e+03 1.1498e+03 + 4.0050e+02 4.3730e+02 6.6910e+02 1.0732e+03 1.1745e+03 3.8675e+03 2.3970e+03 + 7.5540e+02 6.5920e+02 1.3937e+03 2.2419e+03 2.7999e+03 9.8760e+02 7.0580e+02 + 7.6720e+02 1.5645e+03 1.7869e+03 1.9613e+03 5.3710e+02 3.0450e+02 2.8150e+02 + 3.4730e+02 6.6960e+02 5.2750e+02 4.6310e+02 5.6300e+02 4.4880e+02 3.6900e+02 + 5.4410e+02 9.6040e+02 3.0237e+03 2.7332e+03 2.0136e+03 2.5438e+03 2.5050e+03 + 6.2660e+02 5.0220e+02 3.8600e+02 7.4310e+02 4.5940e+02 2.3290e+02 4.1860e+02 + 2.9560e+02 4.8310e+02 7.9370e+02 1.0141e+03 7.0180e+02 4.1460e+02 4.0050e+02 + 4.4840e+02 5.8590e+02 1.3778e+03 1.6438e+03 1.0725e+03 1.6526e+03 3.3323e+03 + 1.9349e+03 2.0867e+03 2.1863e+03 2.3880e+03 3.7790e+02 4.9890e+02 5.5320e+02 + 4.2060e+02 1.1308e+03 2.4154e+03 3.4971e+03 6.0690e+02 1.5312e+03 3.2808e+03 + 3.4250e+03 1.0433e+03 6.3830e+02 2.4810e+02 6.8180e+02 1.7405e+03 2.7565e+03 + 2.6650e+03 5.9280e+02 1.9220e+02 4.1960e+02 4.7390e+02 5.1220e+02 6.6700e+02 + 8.5820e+02 9.8270e+02 6.7090e+02 5.6150e+02 4.5260e+02 6.7250e+02 1.9286e+03 + 3.2021e+03 8.5560e+02 2.7524e+03 2.4706e+03 5.0270e+02 5.8700e+02 1.9210e+02 + 4.6120e+02 1.2365e+03 7.2110e+02 3.8430e+02 2.8340e+02 8.4070e+02 1.1312e+03 + 6.2340e+02 6.6840e+02 4.1590e+02 2.4350e+02 6.4210e+02 9.4280e+02 1.4622e+03 + 9.1130e+02 1.5916e+03 1.8418e+03 2.3492e+03 8.7000e+02 9.0210e+02 2.3841e+03 + 2.7228e+03 7.4250e+02 5.4960e+02 5.4490e+02 7.4210e+02 8.0930e+02 2.4009e+03 + 2.8172e+03 1.9843e+03 2.9340e+03 2.7144e+03 2.1479e+03 1.6062e+03 3.5940e+02 + 1.7340e+02 1.0932e+03 1.3275e+03 2.9828e+03 2.9277e+03 3.6140e+02 4.4860e+02 + 4.9620e+02 4.2410e+02 6.1670e+02 2.8890e+02 7.7000e+02 8.2060e+02 1.0349e+03 + 2.9220e+02 4.5960e+02 1.7442e+03 1.2466e+03 3.2393e+03 1.2061e+03 3.7653e+03 + 1.9746e+03 1.7742e+03 6.9770e+02 4.8010e+02 3.8080e+02 7.1300e+02 4.7450e+02 + 2.4490e+02 2.3050e+02 6.6530e+02 5.8600e+02 3.2250e+02 4.2460e+02 4.8250e+02 + 4.7230e+02 7.1010e+02 1.0381e+03 1.6237e+03 2.3733e+03 2.0880e+03 2.4294e+03 + 9.9670e+02 1.5127e+03 9.1220e+02 1.2263e+03 1.5875e+03 5.9980e+02 5.2240e+02 + 4.6500e+02 4.7400e+02 8.1070e+02 1.8543e+03 1.5945e+03 2.6616e+03 2.5099e+03 + 1.9621e+03 1.0756e+03 3.9860e+02 5.7210e+02 2.0920e+02 4.6320e+02 1.6373e+03 + 3.2437e+03 2.4319e+03 3.4370e+02 3.7190e+02 2.2920e+02 3.9090e+02 4.1540e+02 + 7.4280e+02 8.9340e+02 7.4860e+02 5.1320e+02 6.2370e+02 2.5850e+02 7.1890e+02 + 2.4184e+03 2.2109e+03 1.7006e+03 2.5945e+03 3.0141e+03 2.1128e+03 5.2500e+02 + 6.9870e+02 8.4180e+02 7.3630e+02 4.9380e+02 3.7070e+02 5.0000e+02 9.3620e+02 + 4.9280e+02 1.1900e+02 4.9880e+02 4.6950e+02 8.7420e+02 1.0693e+03 2.0511e+03 + 2.2683e+03 1.7403e+03 2.6030e+03 1.2860e+03 8.5190e+02 8.2890e+02 7.8470e+02 + 5.7760e+02 7.7320e+02 6.3280e+02 6.2450e+02 4.8030e+02 4.4480e+02 4.7110e+02 + 2.2827e+03 2.4493e+03 3.7358e+03 4.1194e+03 1.4144e+03 9.7490e+02 2.9190e+02 + 2.9360e+02 4.8120e+02 5.1160e+02 1.7524e+03 2.8088e+03 5.3710e+02 4.6600e+02 + 2.8980e+02 2.4700e+02 5.6750e+02 4.3540e+02 3.1300e+02 5.6550e+02 4.2160e+02 + 8.6920e+02 3.3490e+02 4.0770e+02 8.4460e+02 2.6923e+03 2.3244e+03 1.0301e+03 + 2.6202e+03 3.6461e+03 1.5144e+03 4.8660e+02 9.8060e+02 2.2980e+02 3.8100e+02 + 5.9360e+02 4.6380e+02 8.3200e+02 2.8790e+02 4.0230e+02 3.7450e+02 2.7160e+02 + 3.4290e+02 6.4490e+02 1.3611e+03 1.4234e+03 1.7085e+03 2.2569e+03 2.4017e+03 + 1.0487e+03 6.7670e+02 4.4970e+02 7.7770e+02 1.1239e+03 6.3680e+02 3.7060e+02 + 4.3360e+02 7.1380e+02 4.9050e+02 5.1250e+02 2.4269e+03 4.4604e+03 2.6255e+03 + 2.8525e+03 1.2877e+03 4.8680e+02 5.2220e+02 6.3420e+02 9.1030e+02 7.5850e+02 + 2.4608e+03 3.0321e+03 1.2063e+03 6.0660e+02 6.0190e+02 2.7050e+02 4.5660e+02 + 4.9090e+02 3.2400e+02 7.3720e+02 6.7390e+02 4.5800e+02 3.0790e+02 3.5860e+02 + 6.5080e+02 2.0902e+03 1.8236e+03 9.9680e+02 2.1528e+03 2.2548e+03 1.8056e+03 + 9.4990e+02 4.7670e+02 5.8710e+02 2.0370e+02 3.9480e+02 6.4670e+02 7.7650e+02 + 4.1850e+02 6.3310e+02 6.6570e+02 3.7140e+02 4.0500e+02 1.0131e+03 2.6159e+03 + 1.6656e+03 1.9514e+03 1.9082e+03 7.9200e+02 3.8330e+02 3.3640e+02 3.4130e+02 + 4.0440e+02 8.4460e+02 4.6770e+02 3.3820e+02 3.8450e+02 5.1970e+02 3.1340e+02 + 8.5340e+02 1.6006e+03 4.9000e+03 1.8482e+03 1.3456e+03 8.6840e+02 7.6200e+02 + 8.5680e+02 5.8820e+02 1.4048e+03 6.7560e+02 2.9357e+03 2.5371e+03 8.9380e+02 + 1.0196e+03 6.4950e+02 1.1089e+03 3.1860e+02 3.8640e+02 5.3340e+02 4.2270e+02 + 4.9430e+02 3.0290e+02 7.8340e+02 2.0790e+02 1.2070e+03 2.8597e+03 1.4547e+03 + 9.8840e+02 1.2708e+03 3.0968e+03 3.3809e+03 5.8050e+02 7.8450e+02 5.8440e+02 + 3.1000e+02 5.6110e+02 5.6970e+02 6.8560e+02 6.0250e+02 4.1820e+02 5.6070e+02 + 4.2630e+02 8.7220e+02 2.6975e+03 2.9435e+03 2.4223e+03 8.0170e+02 9.2880e+02 + 7.1860e+02 4.7960e+02 4.0580e+02 5.1140e+02 4.7870e+02 4.0550e+02 1.0594e+03 + 4.9320e+02 3.2140e+02 1.0042e+03 9.1920e+02 3.4530e+02 2.5214e+03 3.5702e+03 + 2.3641e+03 2.2593e+03 4.4240e+02 7.4230e+02 7.2550e+02 8.1630e+02 1.1013e+03 + 1.8631e+03 3.8430e+03 1.0961e+03 8.5820e+02 8.2260e+02 6.1080e+02 5.0470e+02 + 5.2420e+02 3.5310e+02 3.6220e+02 3.6920e+02 5.7040e+02 2.7580e+02 6.3220e+02 + 6.8210e+02 2.6344e+03 3.6415e+03 1.4718e+03 1.0442e+03 1.0728e+03 1.9310e+03 + 3.9064e+03 7.5640e+02 6.9000e+02 4.8590e+02 3.3280e+02 6.8850e+02 8.6890e+02 + 3.1440e+02 8.1300e+02 6.4150e+02 5.1770e+02 3.7730e+02 4.6770e+02 1.5246e+03 + 2.4878e+03 2.3922e+03 3.0570e+02 5.9930e+02 6.3860e+02 6.6090e+02 6.4830e+02 + 5.3380e+02 3.5100e+02 5.5610e+02 3.9570e+02 3.4540e+02 3.1270e+02 1.1401e+03 + 9.6990e+02 1.1990e+03 3.2874e+03 3.1525e+03 8.5350e+02 8.9650e+02 6.5370e+02 + 7.8970e+02 5.9220e+02 9.2080e+02 6.2440e+02 2.0919e+03 4.3417e+03 2.4981e+03 + 9.6930e+02 9.2760e+02 4.5850e+02 5.0990e+02 1.0403e+03 5.0020e+02 1.9270e+02 + 9.4920e+02 7.9840e+02 5.2370e+02 4.4480e+02 6.7280e+02 1.3627e+03 2.6807e+03 + 2.8680e+03 1.8398e+03 5.8120e+02 2.0323e+03 3.9029e+03 1.8833e+03 5.6460e+02 + 8.0200e+02 4.7740e+02 8.8230e+02 6.4600e+02 6.3710e+02 5.1470e+02 4.6170e+02 + 4.0620e+02 5.8520e+02 1.0793e+03 2.3654e+03 1.5653e+03 6.6500e+02 5.1290e+02 + 3.2610e+02 4.5860e+02 5.7460e+02 6.7710e+02 5.9230e+02 3.1580e+02 3.6750e+02 + 2.4150e+02 3.1850e+02 3.8770e+02 5.1730e+02 1.1502e+03 2.8284e+03 2.9782e+03 + 3.5126e+03 1.8461e+03 7.6850e+02 5.0470e+02 3.5470e+02 5.2310e+02 3.4250e+02 + 4.5300e+02 2.3323e+03 2.9561e+03 2.0798e+03 9.4160e+02 4.5430e+02 6.7330e+02 + 7.7290e+02 4.6210e+02 4.3700e+02 1.9120e+02 1.0133e+03 6.2780e+02 5.6010e+02 + 3.7120e+02 5.2420e+02 1.9302e+03 3.9318e+03 3.5872e+03 2.0262e+03 4.9830e+02 + 1.1244e+03 3.0328e+03 1.8618e+03 4.6340e+02 5.6600e+02 4.8880e+02 4.5230e+02 + 5.0680e+02 7.5600e+02 2.5090e+02 5.1840e+02 5.0200e+02 4.5550e+02 2.3024e+03 + 3.3617e+03 2.2458e+03 1.9614e+03 4.4910e+02 3.4740e+02 2.4180e+02 3.8610e+02 + 5.2830e+02 5.0140e+02 5.5030e+02 2.8390e+02 4.1380e+02 4.0700e+02 3.7390e+02 + 5.1690e+02 1.8222e+03 2.5349e+03 2.5077e+03 1.9406e+03 7.7630e+02 7.5260e+02 + 5.4920e+02 5.7880e+02 8.0530e+02 5.2060e+02 7.4910e+02 3.1357e+03 3.0579e+03 + 1.9851e+03 1.0278e+03 7.0740e+02 3.7790e+02 5.2870e+02 7.2830e+02 2.7140e+02 + 3.7750e+02 7.5280e+02 7.6150e+02 8.1840e+02 2.6060e+02 4.8110e+02 2.2443e+03 + 2.4379e+03 2.7023e+03 8.1120e+02 2.0400e+02 1.2572e+03 3.9811e+03 2.3445e+03 + 9.2020e+02 6.3140e+02 6.1390e+02 4.3620e+02 5.0180e+02 5.8240e+02 5.3230e+02 + 6.1190e+02 3.3540e+02 9.9760e+02 2.3700e+03 4.4991e+03 1.4869e+03 7.6330e+02 + 2.9090e+02 2.9970e+02 1.8200e+02 5.3500e+02 6.2570e+02 8.1590e+02 5.4440e+02 + 2.9070e+02 5.6920e+02 7.7380e+02 2.5330e+02 5.1790e+02 9.9210e+02 3.0593e+03 + 3.3107e+03 4.6690e+02 8.7120e+02 7.2850e+02 7.5270e+02 6.5890e+02 7.1390e+02 + 4.9740e+02 3.2320e+02 2.0040e+03 2.3047e+03 1.4361e+03 8.5330e+02 3.6880e+02 + 2.9150e+02 3.1380e+02 7.2050e+02 7.3440e+02 3.5670e+02 6.4270e+02 1.2738e+03 + 1.3238e+03 4.5060e+02 4.2530e+02 1.9098e+03 2.6451e+03 2.5438e+03 7.7200e+02 + 3.4600e+02 1.0251e+03 3.0706e+03 3.7265e+03 1.5075e+03 6.1290e+02 3.6660e+02 + 3.0590e+02 4.6710e+02 6.1320e+02 5.5180e+02 5.0090e+02 2.8770e+02 9.4780e+02 + 2.9180e+03 4.2823e+03 1.8117e+03 1.0246e+03 4.6580e+02 1.7750e+02 4.5890e+02 + 6.4960e+02 6.5800e+02 4.3510e+02 3.5640e+02 4.0140e+02 2.8000e+02 8.3780e+02 + 3.7860e+02 5.5450e+02 1.7465e+03 2.2772e+03 2.7313e+03 5.4540e+02 6.1300e+02 + 2*5.6950e+02 8.4950e+02 9.8680e+02 2.6260e+02 3.9530e+02 2.9796e+03 + 2.9001e+03 6.5000e+02 5.9550e+02 5.1170e+02 3.0550e+02 5.7240e+02 6.6880e+02 + 1.0886e+03 1.8760e+02 2.0390e+02 9.1400e+02 1.0496e+03 5.9140e+02 2.6990e+02 + 1.4893e+03 2.7959e+03 1.4757e+03 4.6450e+02 3.9590e+02 6.7020e+02 1.8080e+03 + 2.5671e+03 1.8679e+03 8.1850e+02 6.5670e+02 3.0390e+02 4.5880e+02 5.2990e+02 + 2.5760e+02 3.0740e+02 6.8820e+02 1.0458e+03 3.5155e+03 2.4692e+03 1.2024e+03 + 6.7080e+02 3.8710e+02 6.5010e+02 4.9850e+02 5.5020e+02 4.7070e+02 5.0860e+02 + 4.5470e+02 3.9190e+02 3.8610e+02 7.2340e+02 2.5410e+02 4.5660e+02 1.9185e+03 + 2.8505e+03 1.8418e+03 9.8960e+02 1.0698e+03 4.1200e+02 5.8220e+02 5.0140e+02 + 7.7250e+02 2.7280e+02 5.8200e+02 2.8817e+03 4.1342e+03 1.5986e+03 6.6650e+02 + 4.1300e+02 3.3090e+02 5.2920e+02 6.7840e+02 7.0550e+02 2.9680e+02 5.8280e+02 + 4.7580e+02 5.6290e+02 5.7780e+02 6.3170e+02 6.1050e+02 3.2861e+03 2.2683e+03 + 3.3530e+02 3.7080e+02 1.0102e+03 1.7434e+03 1.7839e+03 3.0785e+03 1.9985e+03 + 3.6000e+02 3.0330e+02 2.6210e+02 4.2480e+02 4.0360e+02 7.5500e+02 1.5827e+03 + 2.4987e+03 2.9359e+03 2.1636e+03 9.2640e+02 7.3040e+02 3.5410e+02 5.7400e+02 + 4.7020e+02 9.1360e+02 2.9050e+02 2.4840e+02 7.3850e+02 6.3360e+02 6.4050e+02 + 3.4300e+02 2.6520e+02 4.6430e+02 2.6671e+03 3.0652e+03 1.4953e+03 6.6150e+02 + 1.0669e+03 3.6490e+02 6.5590e+02 4.5420e+02 5.3000e+02 2.3850e+02 9.8610e+02 + 2.4835e+03 3.1832e+03 1.1957e+03 3.8650e+02 4.1720e+02 5.1340e+02 3.9700e+02 + 5.3480e+02 9.4900e+02 4.7060e+02 5.6620e+02 3.5970e+02 4.4280e+02 3.3810e+02 + 8.2080e+02 1.8221e+03 2.9231e+03 2.0024e+03 8.7720e+02 5.8350e+02 4.3600e+02 + 7.0490e+02 2.3589e+03 3.5451e+03 1.8660e+03 6.7390e+02 5.3510e+02 3.2870e+02 + 2.6850e+02 7.1060e+02 5.8670e+02 2.4095e+03 2.5092e+03 2.3287e+03 2.1412e+03 + 3.9040e+02 4.4140e+02 2.9190e+02 4.2510e+02 4.5460e+02 1.0744e+03 3.3020e+02 + 2.8180e+02 3.3290e+02 4.7440e+02 1.2749e+03 3.5120e+02 2.8570e+02 7.0700e+02 + 1.2669e+03 3.7979e+03 9.0020e+02 4.8100e+02 1.0783e+03 3.2790e+02 3.1390e+02 + 2.4070e+02 3.3030e+02 4.3860e+02 8.5720e+02 9.8420e+02 3.8253e+03 1.2806e+03 + 4.0020e+02 4.2520e+02 1.6980e+02 4.5270e+02 4.5710e+02 9.7280e+02 6.6990e+02 + 8.6330e+02 6.5610e+02 4.1000e+02 2.9280e+02 3.9630e+02 1.8008e+03 3.0435e+03 + 2.5093e+03 1.8968e+03 6.8850e+02 4.1740e+02 6.9970e+02 1.5493e+03 2.7279e+03 + 1.4747e+03 8.9900e+02 4.5910e+02 3.6250e+02 4.0710e+02 1.2821e+03 1.6120e+03 + 3.2350e+03 2.5341e+03 2.0251e+03 1.5580e+03 7.5470e+02 2.1320e+02 2.7810e+02 + 9.8040e+02 1.0911e+03 7.2910e+02 2.5800e+02 3.1910e+02 3.2360e+02 3.4170e+02 + 8.1740e+02 3.7640e+02 4.5160e+02 6.0350e+02 2.3004e+03 3.3898e+03 1.4363e+03 + 5.9020e+02 1.4363e+03 6.2970e+02 3.4510e+02 2.1440e+02 5.1520e+02 5.1340e+02 + 6.9760e+02 2.1095e+03 3.3718e+03 1.7125e+03 4.7600e+02 3.8380e+02 2.0110e+02 + 2.6140e+02 6.3060e+02 4.4360e+02 6.1330e+02 5.0600e+02 4.3160e+02 5.5970e+02 + 3.3280e+02 8.3520e+02 2.0146e+03 3.3751e+03 2.3150e+03 1.0114e+03 4.9720e+02 + 4.0750e+02 1.1294e+03 9.7880e+02 1.7762e+03 2.6165e+03 1.1840e+03 5.9490e+02 + 9.1900e+02 1.4267e+03 2.2129e+03 2.5690e+03 2.3474e+03 2.5537e+03 1.2612e+03 + 8.5010e+02 5.7300e+02 5.3550e+02 1.1690e+02 5.8520e+02 6.8660e+02 8.0220e+02 + 4.8150e+02 7.8920e+02 8.4280e+02 4.3760e+02 5.7480e+02 3.0330e+02 3.4080e+02 + 9.8650e+02 2.5955e+03 3.5522e+03 1.2379e+03 1.1638e+03 9.1780e+02 6.0030e+02 + 3.3540e+02 2.2660e+02 9.4720e+02 6.1850e+02 6.0840e+02 1.7153e+03 3.1137e+03 + 2.8531e+03 1.1129e+03 5.5090e+02 4.0710e+02 2.2320e+02 3.6970e+02 3.6050e+02 + 9.0750e+02 8.3750e+02 4.8560e+02 3.3870e+02 4.0210e+02 4.0050e+02 1.2802e+03 + 2.2881e+03 2.8440e+03 7.4010e+02 3.9490e+02 4.3710e+02 6.7210e+02 7.0520e+02 + 7.8140e+02 2.5105e+03 2.7597e+03 1.1572e+03 2.0919e+03 2.2512e+03 2.5146e+03 + 2.0097e+03 3.1629e+03 1.9093e+03 5.1920e+02 3.2020e+02 3.5000e+02 4.2870e+02 + 3.5190e+02 6.0860e+02 6.3810e+02 9.2810e+02 6.7930e+02 9.4060e+02 5.7010e+02 + 8.3980e+02 3.2960e+02 6.5740e+02 3.3290e+02 8.8370e+02 2.6095e+03 4.0139e+03 + 1.4358e+03 7.5530e+02 5.3670e+02 4.1320e+02 2.8590e+02 4.8250e+02 7.8200e+02 + 8.3090e+02 7.1860e+02 1.6533e+03 2.3006e+03 3.3894e+03 1.4020e+03 6.0210e+02 + 5.0970e+02 7.7930e+02 4.8550e+02 5.3970e+02 4.6030e+02 6.0210e+02 2.4900e+02 + 2.4470e+02 2.9890e+02 1.6920e+02 1.2715e+03 3.6346e+03 1.6215e+03 1.3924e+03 + 4.6500e+02 6.8360e+02 5.8900e+02 4.0020e+02 5.9570e+02 3.6143e+03 3.8672e+03 + 1.3601e+03 3.2007e+03 2.9748e+03 3.2616e+03 1.7636e+03 1.1449e+03 9.5040e+02 + 5.3830e+02 3.6280e+02 4.9410e+02 8.0300e+02 3.1740e+02 9.8330e+02 8.3030e+02 + 7.5680e+02 4.5340e+02 3.6890e+02 6.2320e+02 7.6860e+02 1.0073e+03 5.7930e+02 + 6.3320e+02 1.0869e+03 3.4115e+03 3.0856e+03 6.2180e+02 4.7930e+02 1.3820e+02 + 3.2470e+02 3.6790e+02 3.8670e+02 8.0960e+02 3.8970e+02 5.5250e+02 1.2334e+03 + 1.4838e+03 2.5210e+03 1.4141e+03 6.4950e+02 4.9600e+02 8.2930e+02 3.9230e+02 + 2.5690e+02 7.7430e+02 9.1280e+02 4.2590e+02 1.0030e+02 3.1490e+02 3.0810e+02 + 7.6870e+02 2.8121e+03 1.3126e+03 8.6770e+02 5.1450e+02 4.4120e+02 1.0306e+03 + 5.7870e+02 7.6200e+02 2.0281e+03 3.6129e+03 2.4509e+03 2.8866e+03 4.5044e+03 + 8.8740e+02 8.6260e+02 1.0015e+03 5.7650e+02 5.6120e+02 6.0630e+02 7.4400e+02 + 6.6060e+02 3.1790e+02 7.0100e+02 1.2624e+03 6.0360e+02 4.6680e+02 5.7010e+02 + 1.0102e+03 8.0800e+02 7.7880e+02 7.0310e+02 8.6190e+02 1.0565e+03 3.4785e+03 + 4.0203e+03 7.9560e+02 5.7740e+02 2.4470e+02 4.8160e+02 2.0310e+02 1.1342e+03 + 7.6220e+02 4.1970e+02 2.5820e+02 5.2680e+02 2.1399e+03 4.0208e+03 1.2306e+03 + 8.4040e+02 4.8390e+02 4.3450e+02 7.4720e+02 3.3550e+02 3.9950e+02 9.3480e+02 + 4.6480e+02 1.5510e+02 3.8350e+02 5.7780e+02 1.5184e+03 3.3992e+03 1.7667e+03 + 6.2670e+02 7.9420e+02 7.9760e+02 4.8780e+02 4.9990e+02 6.4240e+02 7.5890e+02 + 2.6641e+03 3.2080e+03 2.3280e+03 4.1848e+03 8.9640e+02 3.7980e+02 2.8450e+02 + 5.9090e+02 4.9900e+02 6.3800e+02 2*5.0690e+02 3.4200e+02 6.3800e+02 + 5.7750e+02 4.4650e+02 3.6190e+02 6.4250e+02 9.9020e+02 1.1112e+03 8.6180e+02 + 7.8920e+02 4.2700e+02 1.3560e+03 2.0474e+03 2.0351e+03 4.5140e+02 4.8350e+02 + 3.7140e+02 2.7680e+02 4.1340e+02 2.4400e+02 3.1670e+02 9.2690e+02 5.3720e+02 + 3.2490e+02 2.1513e+03 2.9023e+03 2.3212e+03 9.2950e+02 9.0530e+02 4.4370e+02 + 6.2370e+02 5.2000e+02 4.5730e+02 8.9550e+02 3.5490e+02 3.9870e+02 2.8500e+02 + 6.6460e+02 2.2513e+03 3.1319e+03 1.1255e+03 7.3390e+02 4.9030e+02 3.8720e+02 + 5.5520e+02 5.6330e+02 4.5580e+02 9.8530e+02 2.7979e+03 3.4852e+03 4.6592e+03 + 3.9383e+03 2.0345e+03 2.5630e+02 3.3560e+02 7.3300e+02 3.4460e+02 4.3310e+02 + 2.7750e+02 5.5740e+02 1.9710e+02 5.9820e+02 7.8020e+02 6.7250e+02 7.2940e+02 + 4.1330e+02 7.9370e+02 8.3610e+02 1.8935e+03 5.2420e+02 3.9520e+02 1.2253e+03 + 2.6762e+03 3.1801e+03 6.5730e+02 3.9610e+02 5.8820e+02 1.8300e+02 2.5550e+02 + 1.6570e+02 5.8130e+02 6.9250e+02 5.9870e+02 5.1410e+02 2.2470e+03 2.3284e+03 + 2.9859e+03 1.5400e+03 5.5370e+02 3.3000e+02 7.6470e+02 6.2920e+02 2.2190e+02 + 3.9350e+02 2.1550e+02 2.8150e+02 7.3740e+02 2.1524e+03 3.4828e+03 3.8679e+03 + 7.3530e+02 2.5520e+02 5.2390e+02 4.3350e+02 7.0770e+02 7.0270e+02 5.0680e+02 + 4.0090e+02 1.3702e+03 3.2350e+03 4.7928e+03 2.9663e+03 1.2355e+03 2.0230e+02 + 3.0230e+02 6.0190e+02 6.0940e+02 4.4160e+02 5.6530e+02 4.0820e+02 4.0590e+02 + 4.7190e+02 7.8430e+02 7.5780e+02 6.6280e+02 4.4260e+02 4.7830e+02 5.6060e+02 + 1.3892e+03 5.3970e+02 2.2350e+02 7.8740e+02 1.1310e+03 2.2921e+03 7.4440e+02 + 4.1380e+02 5.5290e+02 3.3360e+02 1.6610e+02 3.3200e+02 9.9080e+02 7.9070e+02 + 4.7810e+02 4.1950e+02 7.9810e+02 2.4682e+03 2.9593e+03 1.9947e+03 8.7810e+02 + 2.0510e+02 7.5080e+02 4.9240e+02 3.7270e+02 4.8500e+02 3.0310e+02 4.2660e+02 + 6.3360e+02 1.3381e+03 3.4938e+03 2.9471e+03 6.2520e+02 2.1860e+02 2.2210e+02 + 5.6570e+02 4.2770e+02 7.5890e+02 3.4330e+02 6.5490e+02 2.2039e+03 3.3972e+03 + 4.4475e+03 2.6902e+03 1.4898e+03 3.4320e+02 3.0080e+02 6.3490e+02 8.5170e+02 + 6.9040e+02 2.7980e+02 3.7300e+02 5.3060e+02 3.6550e+02 1.0567e+03 9.0870e+02 + 6.6290e+02 5.0440e+02 2.8390e+02 3.9720e+02 2.3297e+03 5.0760e+02 4.5300e+02 + 3.5290e+02 1.7261e+03 1.7077e+03 1.3963e+03 4.2570e+02 8.0800e+02 7.8770e+02 + 3.4860e+02 3.4760e+02 9.4400e+02 3.6300e+02 2.7620e+02 3.4250e+02 7.3310e+02 + 1.4184e+03 2.9203e+03 2.0053e+03 1.6180e+03 4.4090e+02 8.8200e+02 2.3470e+02 + 2.4840e+02 6.1190e+02 5.9150e+02 4.5280e+02 7.8040e+02 2.3154e+03 3.2707e+03 + 2.9770e+03 3.3230e+02 3.1490e+02 3.4830e+02 4.8730e+02 6.9430e+02 3.9760e+02 + 2.6770e+02 3.7310e+02 1.1148e+03 2.0071e+03 4.1287e+03 1.7777e+03 5.0340e+02 + 8.5420e+02 5.3020e+02 5.7550e+02 5.9180e+02 6.5850e+02 2.4290e+02 4.3350e+02 + 1.1037e+03 6.4730e+02 4.4050e+02 7.3290e+02 8.7030e+02 3.8890e+02 3.4250e+02 + 9.9000e+01 1.8070e+03 1.2108e+03 6.2370e+02 3.4130e+02 1.4198e+03 2.1679e+03 + 1.6450e+03 8.6110e+02 1.2899e+03 7.2160e+02 9.8690e+02 4.9480e+02 4.7280e+02 + 6.6470e+02 1.8940e+02 3.5360e+02 8.6630e+02 8.8960e+02 1.9140e+03 2.7330e+03 + 1.2597e+03 6.7330e+02 6.6540e+02 2.2100e+02 5.4270e+02 6.4600e+02 4.7950e+02 + 8.3140e+02 6.5770e+02 1.7796e+03 2.2572e+03 1.3452e+03 7.1520e+02 3.3490e+02 + 4.3160e+02 9.5710e+02 1.0750e+03 4.3970e+02 1.1480e+02 6.4640e+02 7.4440e+02 + 1.9821e+03 3.2342e+03 2.9706e+03 2.2112e+03 5.0150e+02 7.1640e+02 2.2120e+02 + 2.8070e+02 4.8800e+02 3.6950e+02 1.8560e+02 1.0977e+03 8.6530e+02 6.2440e+02 + 8.0660e+02 1.1557e+03 4.1390e+02 2.0350e+02 8.4400e+01 2.3341e+03 5.2680e+02 + 7.4090e+02 1.2929e+03 1.7951e+03 1.5245e+03 5.2470e+02 6.2410e+02 1.5780e+02 + 7.5270e+02 2.2834e+03 2.0910e+03 1.2465e+03 8.7080e+02 8.8590e+02 1.1585e+03 + 4.6950e+02 3.5170e+02 2.5290e+02 6.4240e+02 1.0420e+03 2.6474e+03 1.7103e+03 + 1.2374e+03 1.2885e+03 7.5830e+02 4.8910e+02 1.9025e+03 1.6445e+03 1.5170e+03 + 7.4200e+02 1.4441e+03 9.0810e+02 4.7850e+02 6.6800e+02 7.5000e+02 6.2990e+02 + 9.2730e+02 1.1590e+03 2.0340e+03 2.1878e+03 2.9273e+03 1.5637e+03 4.4650e+02 + 3.9110e+02 5.0430e+02 1.5660e+02 1.7170e+02 2.9170e+02 6.1420e+02 3.8340e+02 + 5.2430e+02 8.0660e+02 1.1332e+03 8.0050e+02 4.8980e+02 7.7420e+02 1.1755e+03 + 7.8650e+02 6.5250e+02 8.2200e+02 4.9670e+02 4.9610e+02 2.1699e+03 1.6536e+03 + 8.2740e+02 6.1010e+02 3.3010e+02 3.2010e+02 1.2244e+03 1.4921e+03 2.2711e+03 + 7.3560e+02 5.8970e+02 7.0870e+02 7.1510e+02 5.5940e+02 5.2050e+02 3.4390e+02 + 3.0150e+02 4.9200e+02 1.6736e+03 2.0471e+03 1.2122e+03 9.6600e+02 6.1420e+02 + 4.3950e+02 6.5330e+02 2.3792e+03 2.0770e+03 1.4462e+03 1.0846e+03 6.5050e+02 + 2.3200e+02 8.1680e+02 6.5290e+02 5.1070e+02 1.0254e+03 7.2100e+02 3.8180e+02 + 2*3.5000e+03 1.8240e+03 1.0235e+03 3.6900e+02 6.8070e+02 2.3740e+02 + 1.6910e+02 4.3750e+02 3.9350e+02 1.2250e+02 2.0120e+02 7.2010e+02 1.3657e+03 + 4.7050e+02 4.9910e+02 8.8000e+02 6.3970e+02 7.8560e+02 5.4100e+02 2.9690e+02 + 9.3480e+02 9.1700e+02 2.2505e+03 1.1541e+03 1.2206e+03 4.1090e+02 4.1340e+02 + 4.0320e+02 9.1930e+02 2.6677e+03 1.9880e+03 1.5268e+03 3.3960e+02 4.4070e+02 + 4.2350e+02 4.3490e+02 3.6960e+02 4.8990e+02 4.0330e+02 6.7600e+02 1.0504e+03 + 2.7547e+03 1.4891e+03 1.1088e+03 5.6210e+02 3.4970e+02 7.4790e+02 1.1031e+03 + 1.6024e+03 6.4050e+02 1.0827e+03 4.7380e+02 4.5390e+02 8.4010e+02 4.7710e+02 + 8.4670e+02 3.2690e+02 4.4960e+02 1.5520e+03 3.2765e+03 2.2965e+03 3.0535e+03 + 8.0000e+02 1.5601e+03 4.3800e+02 4.9460e+02 2.2710e+02 1.0418e+03 4.0290e+02 + 3.8930e+02 2.8990e+02 8.1130e+02 6.8870e+02 6.8320e+02 5.4260e+02 5.8060e+02 + 6.0590e+02 5.8490e+02 7.7100e+02 5.7520e+02 1.4116e+03 1.6649e+03 1.8214e+03 + 1.0987e+03 5.0510e+02 5.5040e+02 3.3240e+02 7.5400e+02 1.1045e+03 2.5100e+03 + 1.3058e+03 9.1380e+02 2.5800e+02 3.7060e+02 5.4890e+02 4.3200e+02 3.2330e+02 + 7.5720e+02 5.0910e+02 3.3050e+02 7.5070e+02 2.0101e+03 1.3907e+03 6.4350e+02 + 4.8500e+02 3.9310e+02 6.9500e+02 1.5524e+03 1.2181e+03 1.5973e+03 1.6171e+03 + 3.6410e+02 6.7890e+02 9.5800e+02 8.7670e+02 4.0470e+02 2.7360e+02 6.3640e+02 + 1.2355e+03 2.1106e+03 2.2302e+03 1.9214e+03 2.4730e+03 1.2996e+03 7.0020e+02 + 6.8390e+02 1.8030e+02 4.0520e+02 6.6690e+02 6.9460e+02 4.5970e+02 3.6390e+02 + 4.2390e+02 4.2160e+02 6.1510e+02 4.1570e+02 3.2630e+02 4.5490e+02 1.0803e+03 + 8.3610e+02 1.2506e+03 1.4903e+03 1.8111e+03 1.6937e+03 3.5460e+02 6.3800e+02 + 5.8850e+02 4.9950e+02 1.4403e+03 1.6376e+03 1.7215e+03 7.3830e+02 4.2070e+02 + 3.4940e+02 6.2540e+02 3.2350e+02 2.7340e+02 3.5920e+02 4.8800e+02 5.2400e+02 + 1.5547e+03 2.0981e+03 1.8550e+03 6.4900e+02 6.8070e+02 5.6600e+02 1.3182e+03 + 8.1900e+02 1.9097e+03 1.2201e+03 2.0746e+03 9.7870e+02 1.0207e+03 3.8360e+02 + 4.3520e+02 4.4300e+02 3.9800e+02 5.3760e+02 1.3467e+03 1.5896e+03 2.7295e+03 + 1.5821e+03 2.7612e+03 1.1335e+03 1.0159e+03 2.8150e+02 5.2900e+02 2.5130e+02 + 6.1660e+02 8.3660e+02 8.4790e+02 2.3500e+02 3.2770e+02 4.9990e+02 1.0539e+03 + 3.7460e+02 2.2850e+02 8.8570e+02 1.0653e+03 4.7400e+02 6.9030e+02 2.1908e+03 + 2.2699e+03 5.8460e+02 3.6870e+02 4.0720e+02 1.2485e+03 7.4360e+02 1.6074e+03 + 2.5332e+03 1.7314e+03 7.1210e+02 3.6060e+02 6.5550e+02 5.3870e+02 1.3850e+02 + 2.8140e+02 3.6530e+02 4.9480e+02 6.6890e+02 9.0900e+02 1.7401e+03 1.7140e+03 + 1.2424e+03 5.3300e+02 5.1190e+02 1.2390e+03 6.2760e+02 1.3099e+03 1.4751e+03 + 1.6355e+03 1.5779e+03 1.5376e+03 4.5730e+02 6.3240e+02 5.1570e+02 3.4510e+02 + 3.4760e+02 9.3450e+02 1.8287e+03 2.0129e+03 2.4593e+03 2.6705e+03 1.8275e+03 + 6.5280e+02 4.6800e+02 4.9820e+02 5.8390e+02 8.2900e+02 9.4470e+02 2.1530e+02 + 1.4520e+02 3.9280e+02 6.3590e+02 1.0880e+03 3.3510e+02 5.2500e+02 1.0693e+03 + 9.7750e+02 2.1248e+03 1.9925e+03 1.8188e+03 1.4520e+03 5.7150e+02 3.7020e+02 + 6.0900e+02 5.4340e+02 5.3810e+02 1.5131e+03 1.6989e+03 1.4964e+03 8.4670e+02 + 4.6050e+02 5.5110e+02 7.4500e+02 3.5020e+02 2.4450e+02 3.4480e+02 5.3540e+02 + 8.1950e+02 7.6110e+02 1.2151e+03 1.8812e+03 8.6780e+02 1.0274e+03 6.3810e+02 + 5.4340e+02 6.1080e+02 9.1660e+02 9.6440e+02 1.9411e+03 1.7880e+03 5.2480e+02 + 9.2960e+02 6.4180e+02 6.6780e+02 1.7820e+02 4.8750e+02 1.2617e+03 1.2534e+03 + 1.6164e+03 2.0085e+03 1.8262e+03 1.6717e+03 4.4050e+02 3.3420e+02 3.0990e+02 + 5.9060e+02 9.0890e+02 9.5470e+02 4.1060e+02 4.8420e+02 4.6560e+02 5.3080e+02 + 9.0090e+02 3.3150e+02 5.2410e+02 5.6560e+02 1.2820e+03 1.6930e+03 2.6501e+03 + 1.8994e+03 1.5406e+03 2.1780e+02 4.2960e+02 8.9650e+02 6.1110e+02 5.2450e+02 + 1.8558e+03 2.4656e+03 1.2611e+03 9.8810e+02 8.0090e+02 6.7390e+02 6.7700e+02 + 2.7330e+02 3.5440e+02 4.8740e+02 3.3280e+02 2.9080e+02 7.9400e+02 1.8909e+03 + 2.2836e+03 8.3890e+02 7.1040e+02 1.9070e+02 4.0030e+02 4.0820e+02 6.4800e+02 + 7.8270e+02 1.4022e+03 1.6423e+03 1.2990e+03 1.4845e+03 8.1620e+02 3.8210e+02 + 4.5390e+02 4.6900e+02 1.6845e+03 1.8811e+03 1.5316e+03 1.2008e+03 1.5233e+03 + 1.6769e+03 6.4270e+02 3.7440e+02 3.9970e+02 7.2060e+02 6.2880e+02 4.4940e+02 + 4.5740e+02 3.2710e+02 6.0340e+02 6.3420e+02 1.8620e+02 2.7030e+02 4.3340e+02 + 3.2320e+02 1.3155e+03 2.4461e+03 2.1424e+03 2.4385e+03 7.1120e+02 2.8000e+02 + 3.7380e+02 5.1280e+02 4.1400e+02 2.8780e+02 8.9010e+02 2.4526e+03 1.5096e+03 + 1.1015e+03 6.3590e+02 4.5350e+02 1.0340e+03 2.8060e+02 5.5340e+02 7.3250e+02 + 2.3680e+02 2.6610e+02 6.8380e+02 1.1886e+03 2.0940e+03 1.5996e+03 7.1010e+02 + 4.7370e+02 5.1990e+02 6.1240e+02 4.2520e+02 5.6440e+02 1.3583e+03 1.1252e+03 + 1.8228e+03 1.3333e+03 8.8310e+02 3.9450e+02 2.4560e+02 4.3610e+02 1.5171e+03 + 1.8864e+03 1.5094e+03 1.5077e+03 9.6770e+02 7.2930e+02 8.5220e+02 3.9840e+02 + 3.6590e+02 7.2660e+02 5.8160e+02 3.0040e+02 2.7190e+02 4.3290e+02 9.5240e+02 + 5.6550e+02 2.2760e+02 2.1610e+02 4.7480e+02 1.1250e+03 8.2830e+02 2.2718e+03 + 2.1062e+03 1.8900e+03 9.0520e+02 3.1380e+02 7.3200e+02 1.0593e+03 6.3680e+02 + 2.2710e+02 8.1780e+02 1.8753e+03 1.3544e+03 7.2410e+02 5.7310e+02 9.4610e+02 + 5.5450e+02 4.2990e+02 4.4920e+02 5.8250e+02 2.7120e+02 1.1500e+02 3.5950e+02 + 1.5654e+03 1.8485e+03 1.8579e+03 3.2530e+02 5.5420e+02 6.8880e+02 6.5350e+02 + 5.3090e+02 5.5920e+02 8.4280e+02 1.4245e+03 1.8124e+03 1.7628e+03 1.5944e+03 + 8.4600e+02 2.8920e+02 9.3260e+02 1.8382e+03 1.5917e+03 1.5066e+03 1.6804e+03 + 1.9830e+03 1.4166e+03 5.2830e+02 2.4920e+02 2.5880e+02 6.6830e+02 3.8790e+02 + 1.7690e+02 1.6800e+02 3.8690e+02 6.2110e+02 1.3341e+03 4.9270e+02 3.8470e+02 + 6.4200e+02 9.9200e+02 1.2732e+03 2.4603e+03 9.7140e+02 2.2715e+03 1.0723e+03 + 3.6700e+02 5.1530e+02 6.4190e+02 5.2580e+02 2.0380e+02 9.1610e+02 1.5212e+03 + 1.2530e+03 4.4610e+02 5.3370e+02 4.4340e+02 8.2870e+02 7.7600e+02 4.6650e+02 + 6.2910e+02 5.7230e+02 4.0290e+02 6.4300e+02 8.9940e+02 2.8595e+03 1.0779e+03 + 3.9850e+02 3.6610e+02 8.1200e+02 1.4974e+03 6.1220e+02 3.9420e+02 4.3370e+02 + 5.9830e+02 8.2670e+02 2.8459e+03 1.5398e+03 4.7660e+02 7.9060e+02 8.6690e+02 + 2.6927e+03 1.6647e+03 1.1225e+03 1.7636e+03 1.8848e+03 8.9150e+02 1.2243e+03 + 3.5420e+02 2.3000e+02 4.6570e+02 3.9730e+02 2.0860e+02 1.6540e+02 6.4490e+02 + 7.2950e+02 3.9720e+02 3.3470e+02 3.7740e+02 6.3700e+02 1.5335e+03 1.3093e+03 + 1.8425e+03 1.5320e+03 2.0588e+03 1.5398e+03 5.4090e+02 6.7640e+02 7.3560e+02 + 5.3540e+02 2.2330e+02 7.1490e+02 1.0671e+03 1.9211e+03 6.0730e+02 3.3200e+02 + 5.2920e+02 5.3730e+02 5.7860e+02 3.4350e+02 5.1140e+02 2.9260e+02 5.6480e+02 + 4.7570e+02 9.8500e+02 2.6631e+03 1.3356e+03 6.9060e+02 3.1980e+02 2.7150e+02 + 8.4740e+02 6.7850e+02 2.4090e+02 3.7280e+02 6.2300e+02 1.1347e+03 2.7337e+03 + 1.9003e+03 7.5010e+02 1.0688e+03 1.5450e+03 2.0256e+03 6.6090e+02 1.1939e+03 + 2.3686e+03 1.7874e+03 1.2044e+03 7.5540e+02 3.2530e+02 1.8060e+02 3.5720e+02 + 5.8070e+02 4.5610e+02 5.2680e+02 3.1720e+02 5.9290e+02 5.2170e+02 4.4760e+02 + 7.5170e+02 3.7460e+02 8.7260e+02 1.9462e+03 1.5988e+03 1.7852e+03 2.8455e+03 + 8.8590e+02 1.0064e+03 6.2340e+02 9.5940e+02 4.5840e+02 4.0680e+02 6.1570e+02 + 7.7890e+02 2.0344e+03 8.3330e+02 5.1490e+02 4.3230e+02 8.6880e+02 2.2150e+02 + 3.2170e+02 4.3090e+02 3.0800e+02 7.8410e+02 4.9210e+02 9.4750e+02 1.8543e+03 + 1.2055e+03 6.2290e+02 1.8760e+02 6.1370e+02 5.1060e+02 6.3260e+02 7.2640e+02 + 5.3850e+02 1.9990e+02 8.1050e+02 1.5343e+03 1.3106e+03 1.9178e+03 9.4760e+02 + 1.6024e+03 1.4448e+03 6.5660e+02 1.2951e+03 2.3768e+03 2.0707e+03 9.5610e+02 + 3.9390e+02 6.0100e+02 4.6040e+02 1.7050e+02 5.2610e+02 7.5910e+02 7.4020e+02 + 4.0670e+02 4.9180e+02 7.8500e+02 2.9000e+02 4.3290e+02 6.6300e+02 1.1832e+03 + 2.1210e+03 1.1518e+03 1.6325e+03 2.9941e+03 9.0020e+02 9.8840e+02 1.0144e+03 + 4.9450e+02 4.1550e+02 3.5330e+02 5.2680e+02 1.0693e+03 2.4318e+03 1.5910e+03 + 4.1650e+02 4.4640e+02 3.0540e+02 4.5360e+02 5.3790e+02 8.7770e+02 4.0050e+02 + 1.2061e+03 1.0481e+03 1.7701e+03 2.7504e+03 8.2020e+02 5.8490e+02 1.7190e+02 + 4.4010e+02 6.7130e+02 6.4180e+02 6.9540e+02 3.0210e+02 1.0410e+02 1.9590e+02 + 8.5880e+02 2.1921e+03 1.7108e+03 1.5177e+03 1.7491e+03 5.9660e+02 1.3377e+03 + 1.4320e+03 1.2588e+03 1.6720e+03 8.0980e+02 3.8770e+02 8.7560e+02 3.9420e+02 + 2.1530e+02 3.5760e+02 5.6390e+02 5.8720e+02 5.6270e+02 4.4800e+02 6.4990e+02 + 3.0870e+02 2.2290e+02 7.4640e+02 1.1375e+03 1.8720e+03 1.6068e+03 1.4024e+03 + 2.1056e+03 1.2668e+03 6.5380e+02 6.0910e+02 6.5250e+02 5.6680e+02 1.1675e+03 + 5.4020e+02 7.1850e+02 2.7169e+03 2.5006e+03 9.2000e+02 5.8320e+02 8.2050e+02 + 5.8760e+02 4.5850e+02 4.1400e+02 1.0882e+03 4.4020e+02 8.2420e+02 1.8666e+03 + 2.7093e+03 1.0960e+03 5.5000e+02 1.4500e+02 4.3150e+02 6.7000e+02 7.7460e+02 + 5.9200e+02 5.2210e+02 5.8750e+02 3.7140e+02 8.0670e+02 1.0694e+03 3.0258e+03 + 1.6927e+03 1.5551e+03 1.5249e+03 9.6200e+02 1.8337e+03 2.2090e+03 2.1138e+03 + 4.3640e+02 7.2060e+02 2.9060e+02 3.9690e+02 2.5010e+02 3.1190e+02 4.1630e+02 + 4.9730e+02 8.0140e+02 8.1890e+02 8.4520e+02 3.1460e+02 3.9310e+02 8.2470e+02 + 1.3146e+03 1.6551e+03 1.6988e+03 6.7810e+02 2.5403e+03 1.0402e+03 5.7770e+02 + 4.5750e+02 2.8690e+02 1.0247e+03 1.4829e+03 4.9920e+02 7.5790e+02 1.0493e+03 + 2.0494e+03 1.0401e+03 5.1800e+02 6.7040e+02 4.9190e+02 4.1900e+02 4.3470e+02 + 7.5270e+02 6.1650e+02 9.0570e+02 2.2205e+03 1.9572e+03 1.0974e+03 7.2650e+02 + 3.5360e+02 9.1070e+02 6.5310e+02 4.4720e+02 2.7350e+02 5.2830e+02 3.7920e+02 + 5.1240e+02 1.5785e+03 1.9154e+03 3.3418e+03 2.0439e+03 1.7751e+03 1.0722e+03 + 7.3380e+02 9.3070e+02 2.5817e+03 1.8119e+03 4.7570e+02 5.2180e+02 2.8630e+02 + 3.7140e+02 5.2730e+02 4.1740e+02 2.7490e+02 3.7660e+02 4.6270e+02 5.1370e+02 + 5.8940e+02 3.8550e+02 3.0520e+02 3.7800e+02 1.5415e+03 2.4571e+03 2.0727e+03 + 2.1214e+03 2.9023e+03 1.4486e+03 4.8430e+02 2.3250e+02 3.3960e+02 5.7110e+02 + 8.0080e+02 7.3530e+02 1.1796e+03 1.2983e+03 2.1995e+03 2.5257e+03 9.9690e+02 + 4.5720e+02 5.2820e+02 4.5970e+02 3.9670e+02 4.7240e+02 7.8500e+02 8.3040e+02 + 1.8480e+03 1.8103e+03 1.2268e+03 6.8980e+02 5.2540e+02 3.3900e+02 4.4080e+02 + 4.1320e+02 4.0300e+02 4.4060e+02 1.7940e+02 4.9900e+02 5.0070e+02 2.2282e+03 + 2.6755e+03 3.5000e+03 1.1068e+03 8.4260e+02 3.2290e+02 8.7950e+02 2.4310e+03 + 1.2622e+03 7.8340e+02 6.8250e+02 5.4250e+02 3.0310e+02 6.3680e+02 3.8570e+02 + 6.6180e+02 2.3350e+02 2.7600e+02 7.9170e+02 4.9970e+02 4.1580e+02 4.2000e+02 + 4.2330e+02 5.1770e+02 1.6768e+03 2.3061e+03 8.4590e+02 3.3730e+03 1.1468e+03 + 3.7000e+02 3.8420e+02 4.1160e+02 5.4180e+02 5.6250e+02 3.7200e+02 5.5770e+02 + 8.1270e+02 1.2150e+03 2.6078e+03 8.6580e+02 5.6530e+02 5.6490e+02 1.7600e+02 + 5.2660e+02 1.6760e+02 7.0680e+02 9.8320e+02 2.9879e+03 1.9110e+03 1.0398e+03 + 5.0560e+02 4.1130e+02 4.9580e+02 6.3960e+02 6.0830e+02 3.9700e+02 4.5920e+02 + 5.3070e+02 2.5470e+02 8.2280e+02 1.3545e+03 3.5000e+03 2.3961e+03 8.1080e+02 + 6.6100e+02 7.1720e+02 5.7630e+02 2.0435e+03 1.7449e+03 9.1880e+02 4.3250e+02 + 3.0480e+02 3.7810e+02 5.2960e+02 5.2300e+02 7.5300e+02 1.9970e+02 2.5550e+02 + 7.5020e+02 8.5840e+02 4.2020e+02 4.4650e+02 6.6550e+02 7.5980e+02 1.2488e+03 + 9.8360e+02 1.8066e+03 2.7705e+03 1.4134e+03 2.9740e+02 2.9870e+02 6.7580e+02 + 8.2800e+02 6.0710e+02 4.2000e+02 4.6180e+02 1.1196e+03 1.5461e+03 1.9760e+03 + 2.0065e+03 1.0148e+03 8.2510e+02 2.1250e+02 1.6110e+02 2.8570e+02 4.3780e+02 + 2.1807e+03 2.0312e+03 1.2992e+03 5.6470e+02 5.0300e+02 2.9000e+02 4.5890e+02 + 8.8610e+02 4.9670e+02 5.3510e+02 3.4930e+02 5.1680e+02 4.9020e+02 8.3870e+02 + 2.2422e+03 3.3198e+03 3.3252e+03 8.1650e+02 4.5290e+02 4.8750e+02 1.5949e+03 + 1.9327e+03 3.2705e+03 1.4688e+03 4.8320e+02 2.8210e+02 1.1970e+02 6.1330e+02 + 1.1544e+03 4.8710e+02 4.7690e+02 4.5680e+02 6.6030e+02 7.0860e+02 7.3210e+02 + 9.3220e+02 3.2340e+02 2.3640e+02 1.0805e+03 1.3395e+03 1.2212e+03 2.9623e+03 + 1.2102e+03 2.3820e+02 5.6970e+02 1.1767e+03 9.6520e+02 2.3150e+02 2.2260e+02 + 5.4430e+02 6.7400e+02 1.5579e+03 1.4254e+03 1.8799e+03 1.3008e+03 4.6880e+02 + 3.1770e+02 2.6290e+02 4.3770e+02 8.9740e+02 2.5654e+03 2.0206e+03 6.9310e+02 + 1.0997e+03 6.9990e+02 6.3950e+02 3.2120e+02 8.2790e+02 5.2910e+02 4.7550e+02 + 4.2480e+02 6.6270e+02 5.2570e+02 4.6750e+02 2.2198e+03 2.8898e+03 3.0380e+03 + 6.6670e+02 2.2540e+02 2.5720e+02 1.5198e+03 1.5080e+03 2.5755e+03 1.3845e+03 + 1.0515e+03 3.4960e+02 2.7030e+02 7.4880e+02 6.8280e+02 6.2810e+02 2.8920e+02 + 8.8100e+02 4.5700e+02 2.8620e+02 4.4040e+02 7.8730e+02 3.2450e+02 5.3900e+01 + 7.4250e+02 1.9472e+03 9.6760e+02 2.0073e+03 1.8539e+03 8.9610e+02 5.9680e+02 + 9.8630e+02 8.2570e+02 3.1100e+02 1.5500e+02 5.5640e+02 4.0380e+02 6.7460e+02 + 1.5402e+03 2.0565e+03 8.6250e+02 6.5930e+02 3.0700e+02 3.8070e+02 7.2700e+02 + 1.1424e+03 2.7406e+03 2.0193e+03 1.2683e+03 6.5320e+02 5.1340e+02 5.0990e+02 + 5.2370e+02 5.8390e+02 4.6410e+02 8.4520e+02 3.9500e+02 4.7420e+02 6.4050e+02 + 9.5900e+02 2.6317e+03 3.2142e+03 9.6140e+02 1.0501e+03 2.8730e+02 3.7950e+02 + 7.3490e+02 1.1377e+03 2.5500e+03 1.0354e+03 8.4220e+02 8.1720e+02 4.2160e+02 + 1.1872e+03 1.4157e+03 7.3500e+02 2.6480e+02 7.1530e+02 6.3800e+02 4.1750e+02 + 6.7020e+02 6.8460e+02 3.3560e+02 7.8100e+01 7.9180e+02 1.9274e+03 1.3582e+03 + 1.9498e+03 2.2072e+03 5.0530e+02 6.2440e+02 9.1120e+02 5.7300e+02 3.2080e+02 + 5.3990e+02 4.5630e+02 6.9280e+02 9.9260e+02 1.0474e+03 1.3899e+03 2.1615e+03 + 1.7053e+03 5.5970e+02 8.1130e+02 7.5320e+02 1.6563e+03 1.7378e+03 8.2320e+02 + 5.0750e+02 6.8450e+02 7.4790e+02 5.6070e+02 2.5320e+02 2.2300e+02 4.3130e+02 + 7.3710e+02 4.6770e+02 3.4660e+02 5.1880e+02 1.8011e+03 3.1334e+03 2.7011e+03 + 1.5237e+03 1.4229e+03 2.5790e+02 1.9710e+02 5.4590e+02 8.3770e+02 1.5826e+03 + 9.3520e+02 1.4355e+03 1.0889e+03 6.7630e+02 1.2363e+03 6.0460e+02 4.1380e+02 + 6.6700e+02 7.4260e+02 5.9040e+02 6.3930e+02 7.6700e+02 6.8850e+02 6.7200e+02 + 8.6660e+02 7.9280e+02 1.9927e+03 5.4660e+02 2.4414e+03 2.1849e+03 9.7170e+02 + 7.0730e+02 4.6610e+02 6.2810e+02 2.7550e+02 4.9200e+02 2.8090e+02 4.9670e+02 + 7.5770e+02 1.3304e+03 1.5370e+03 1.7710e+03 1.8576e+03 7.9850e+02 9.3890e+02 + 7.7880e+02 1.5032e+03 1.5291e+03 4.8160e+02 3.9910e+02 5.1160e+02 3.7870e+02 + 3.9970e+02 4.3640e+02 5.0140e+02 4.1690e+02 6.3480e+02 3.0100e+02 6.5300e+02 + 1.5297e+03 1.0438e+03 3.5000e+03 2.9896e+03 1.0352e+03 7.6800e+02 5.0230e+02 + 3.5820e+02 5.4450e+02 2.0543e+03 1.9738e+03 1.6057e+03 1.9237e+03 1.6275e+03 + 8.6300e+02 8.0840e+02 1.1221e+03 6.0510e+02 4.3250e+02 6.6890e+02 4.4890e+02 + 6.3670e+02 7.5730e+02 2.1330e+02 5.3550e+02 8.5410e+02 9.4440e+02 2.1420e+03 + 5.4090e+02 1.8990e+03 3.5000e+03 1.4841e+03 5.5730e+02 3.6920e+02 2.9320e+02 + 4.0350e+02 2.6580e+02 2.6170e+02 2.9860e+02 2.5900e+02 8.7410e+02 9.9830e+02 + 2.7938e+03 9.2190e+02 1.0101e+03 8.9420e+02 1.7369e+03 1.8820e+03 1.2642e+03 + 9.0080e+02 4.3030e+02 4.4150e+02 5.6210e+02 5.6540e+02 3.7680e+02 5.9240e+02 + 5.2110e+02 5.6570e+02 2.8430e+02 6.3510e+02 1.1735e+03 1.7715e+03 2.2601e+03 + 2.8574e+03 1.6537e+03 7.1840e+02 4.2340e+02 4.0180e+02 3.8540e+02 1.4839e+03 + 1.1028e+03 9.9820e+02 1.6421e+03 1.2892e+03 7.9640e+02 1.5431e+03 6.3120e+02 + 9.9270e+02 1.0007e+03 8.3530e+02 1.0939e+03 6.9660e+02 4.4420e+02 2.4950e+02 + 7.3510e+02 9.2400e+02 8.4430e+02 1.5961e+03 2.1420e+02 7.9310e+02 3.5000e+03 + 1.7643e+03 4.4400e+02 6.0180e+02 5.1370e+02 4.1400e+02 3.5220e+02 5.3970e+02 + 4.8480e+02 4.6750e+02 7.1550e+02 1.1215e+03 1.2816e+03 1.8470e+03 1.5070e+03 + 2.7698e+03 1.6453e+03 2.2830e+03 5.9180e+02 3.0160e+02 5.2240e+02 2.9660e+02 + 4.3790e+02 2.7030e+02 3.7750e+02 3.2870e+02 7.0220e+02 2.1620e+02 3.5830e+02 + 7.8500e+02 9.5020e+02 2.3900e+03 2.4044e+03 3.0836e+03 8.0390e+02 5.4880e+02 + 6.4100e+02 4.6900e+02 3.9040e+02 8.0420e+02 1.3366e+03 1.0464e+03 1.6515e+03 + 1.0305e+03 2.1032e+03 2.0295e+03 1.4094e+03 1.7198e+03 9.0920e+02 7.5240e+02 + 6.1650e+02 7.9080e+02 4.1250e+02 3.8000e+02 9.1100e+02 7.7330e+02 1.7986e+03 + 2.3813e+03 4.2280e+02 4.5240e+02 2.5212e+03 2.2974e+03 1.2676e+03 4.3450e+02 + 5.6820e+02 2.4500e+02 3.6530e+02 9.6130e+02 4.0350e+02 6.2510e+02 4.2780e+02 + 5.5240e+02 9.1370e+02 1.5440e+03 3.1243e+03 2.2570e+03 1.6028e+03 1.3432e+03 + 7.1590e+02 2.5590e+02 6.1370e+02 6.0120e+02 4.2690e+02 4.9250e+02 4.0830e+02 + 7.2740e+02 3.9660e+02 4.0320e+02 5.8130e+02 4.2220e+02 1.5410e+03 3.1148e+03 + 3.5000e+03 2.0391e+03 7.0350e+02 3.1660e+02 7.2820e+02 6.6020e+02 4.3720e+02 + 4.2410e+02 6.2810e+02 5.0350e+02 1.0666e+03 8.8540e+02 1.7617e+03 1.6383e+03 + 9.2230e+02 1.3511e+03 7.3950e+02 1.0865e+03 1.5305e+03 1.0249e+03 6.1850e+02 + 3.0780e+02 4.7370e+02 5.3460e+02 1.2921e+03 2.2201e+03 3.3710e+02 5.1250e+02 + 1.8154e+03 2.0522e+03 8.3460e+02 1.1103e+03 8.4000e+02 2.4770e+02 3.5080e+02 + 7.6880e+02 9.9800e+02 7.1710e+02 4.8150e+02 1.0036e+03 1.1593e+03 2.3636e+03 + 3.5000e+03 2.1036e+03 1.5514e+03 1.2045e+03 9.3940e+02 4.8190e+02 4.9410e+02 + 3.4000e+02 5.7460e+02 4.4650e+02 5.1130e+02 7.4790e+02 3.2580e+02 3.0010e+02 + 6.6940e+02 4.9730e+02 1.6502e+03 2.0396e+03 2.9971e+03 1.6831e+03 6.3970e+02 + 3.6850e+02 1.0210e+03 4.0920e+02 1.5890e+02 2.1460e+02 6.8970e+02 4.6060e+02 + 5.7780e+02 9.8400e+02 1.5707e+03 1.5268e+03 1.5473e+03 1.0541e+03 9.8610e+02 + 1.0919e+03 1.0012e+03 7.3130e+02 7.9120e+02 2.2910e+02 4.2170e+02 5.4150e+02 + 1.8735e+03 1.9687e+03 2.8790e+02 6.3620e+02 1.4156e+03 1.0809e+03 2.2788e+03 + 7.7100e+02 1.2615e+03 2.7730e+02 3.4620e+02 8.7180e+02 5.0800e+02 8.4680e+02 + 9.4110e+02 5.4440e+02 9.7620e+02 2.1356e+03 3.5000e+03 1.0700e+03 1.7635e+03 + 8.5840e+02 6.0060e+02 5.7450e+02 2.1900e+02 9.4030e+02 6.9820e+02 6.3260e+02 + 3.4160e+02 5.5150e+02 3.4300e+02 6.1770e+02 9.9370e+02 1.5552e+03 2.3913e+03 + 2.5820e+03 3.3292e+03 1.5751e+03 5.6590e+02 6.0610e+02 5.6460e+02 5.0150e+02 + 2.6020e+02 2.4590e+02 3.4370e+02 3.6380e+02 2.2480e+02 3.6120e+02 1.5392e+03 + 7.9290e+02 1.0080e+03 7.6860e+02 1.5234e+03 1.5486e+03 1.0673e+03 9.4160e+02 + 1.5823e+03 1.2345e+03 5.2690e+02 1.0182e+03 2.1293e+03 1.9587e+03 3.5610e+02 + 4.3450e+02 1.4718e+03 2.0288e+03 1.5689e+03 1.7059e+03 1.1037e+03 2.1430e+02 + 4.8300e+02 6.9290e+02 3.4170e+02 6.3740e+02 5.5100e+02 8.7970e+02 9.2170e+02 + 2.6417e+03 3.5000e+03 1.4979e+03 3.5650e+02 5.1050e+02 7.4000e+02 6.3580e+02 + 5.2070e+02 5.5210e+02 5.5700e+02 6.5630e+02 4.0720e+02 2.8040e+02 3.4170e+02 + 6.6630e+02 1.2074e+03 7.2070e+02 2.3605e+03 1.7966e+03 2.0389e+03 9.1090e+02 + 6.8370e+02 5.6060e+02 1.1003e+03 5.1380e+02 5.1020e+02 2.6710e+02 9.1570e+02 + 4.9930e+02 3.6860e+02 2.4780e+02 5.3360e+02 6.7720e+02 9.5990e+02 6.6730e+02 + 1.1752e+03 1.5026e+03 9.1600e+02 1.2631e+03 8.0200e+02 1.5426e+03 9.2430e+02 + 1.0998e+03 1.2476e+03 1.7121e+03 7.6970e+02 9.0230e+02 1.0048e+03 9.6610e+02 + 2.0752e+03 1.5454e+03 1.5271e+03 2.5010e+02 4.6280e+02 3.6900e+02 1.6870e+02 + 4.5410e+02 1.6061e+03 1.7697e+03 1.6554e+03 1.6769e+03 2.1109e+03 1.2887e+03 + 4.8240e+02 4.4680e+02 4.3040e+02 4.8230e+02 9.2230e+02 5.2400e+02 7.6740e+02 + 6.9290e+02 3.3830e+02 3.8600e+02 1.2320e+02 4.7670e+02 1.5175e+03 1.5044e+03 + 2.2253e+03 1.0401e+03 1.9026e+03 9.0560e+02 3.9760e+02 5.4330e+02 7.9860e+02 + 3.8090e+02 3.0650e+02 6.1090e+02 8.4580e+02 8.1360e+02 3.3190e+02 4.7040e+02 + 3.0050e+02 3.4100e+02 5.2410e+02 7.1080e+02 3.8460e+02 8.5570e+02 4.5870e+02 + 9.0520e+02 1.3477e+03 1.4052e+03 2.6926e+03 1.0727e+03 2.3681e+03 1.1979e+03 + 4.7590e+02 7.6770e+02 4.2970e+02 8.6130e+02 1.5404e+03 3.0986e+03 1.1374e+03 + 4.2930e+02 3.4830e+02 8.2650e+02 4.0590e+02 1.9650e+02 1.0724e+03 2.3473e+03 + 2.5224e+03 1.3579e+03 1.8593e+03 1.5972e+03 7.7910e+02 6.9860e+02 1.6500e+02 + 5.9840e+02 4.6010e+02 7.8600e+02 4.3720e+02 4.3870e+02 3.9000e+02 4.1290e+02 + 3.1600e+02 5.5330e+02 8.9260e+02 1.5750e+03 1.9409e+03 2.2623e+03 2.4499e+03 + 5.9000e+02 4.4550e+02 5.4870e+02 2.2860e+02 3.0810e+02 4.2290e+02 1.1661e+03 + 6.7730e+02 6.2430e+02 3.8690e+02 3.8200e+02 2.1000e+02 3.4250e+02 7.2120e+02 + 4.1930e+02 2.6250e+02 8.7080e+02 7.9070e+02 1.4400e+03 2.0601e+03 1.9901e+03 + 2.8559e+03 2.8837e+03 1.6421e+03 1.5364e+03 5.1510e+02 7.7100e+02 7.5420e+02 + 6.0030e+02 1.7754e+03 1.9588e+03 1.5818e+03 6.2670e+02 5.1440e+02 7.3310e+02 + 6.5740e+02 7.7310e+02 1.4203e+03 1.9877e+03 1.2705e+03 1.1287e+03 2.6524e+03 + 1.1521e+03 8.5140e+02 5.0310e+02 4.6060e+02 5.2040e+02 5.9850e+02 5.6770e+02 + 6.8070e+02 5.0880e+02 2.1490e+02 6.0470e+02 2.5050e+02 7.2300e+02 1.1781e+03 + 2.7020e+03 9.9290e+02 1.9502e+03 2.7032e+03 9.7520e+02 4.0560e+02 6.7460e+02 + 4.0190e+02 2.9170e+02 2.3010e+02 6.7770e+02 5.9290e+02 3.4680e+02 3.4300e+02 + 5.7840e+02 5.0510e+02 8.5520e+02 8.2340e+02 2.9420e+02 4.6920e+02 9.0300e+02 + 1.0275e+03 3.1080e+02 5.6910e+02 1.0539e+03 2*3.5000e+03 2.0221e+03 + 1.1879e+03 7.6980e+02 4.9370e+02 5.3450e+02 4.9960e+02 1.0908e+03 2.3870e+03 + 2.0329e+03 6.6380e+02 2.1860e+02 6.8110e+02 9.7260e+02 1.2136e+03 1.5942e+03 + 1.5643e+03 1.6284e+03 8.2990e+02 1.7789e+03 1.6770e+03 7.5720e+02 5.6840e+02 + 5.3250e+02 4.2570e+02 4.0960e+02 8.1800e+02 5.3810e+02 2.7550e+02 3.9160e+02 + 7.5020e+02 5.3240e+02 6.3360e+02 2.3335e+03 2.2056e+03 1.5529e+03 1.0429e+03 + 2.2981e+03 6.8640e+02 4.2850e+02 5.9310e+02 6.1040e+02 6.0260e+02 4.1710e+02 + 6.2910e+02 2.3800e+02 2.4980e+02 2.9080e+02 5.3280e+02 4.4530e+02 1.0799e+03 + 4.5380e+02 1.9550e+02 5.1040e+02 5.3760e+02 7.6990e+02 1.1448e+03 1.0354e+03 + 8.8470e+02 3.1809e+03 3.2024e+03 2.4157e+03 1.0456e+03 3.9630e+02 8.7720e+02 + 5.6630e+02 5.9850e+02 8.2460e+02 2.7337e+03 2.3289e+03 6.9050e+02 4.5020e+02 + 9.2560e+02 1.9435e+03 8.6870e+02 1.9806e+03 1.0886e+03 1.0545e+03 7.8120e+02 + 1.2552e+03 1.1494e+03 5.9890e+02 6.5700e+02 2.9840e+02 3.5270e+02 2.5900e+02 + 5.6760e+02 5.1760e+02 2.7200e+02 2.5670e+02 5.1820e+02 6.2690e+02 1.3962e+03 + 1.5481e+03 2.0073e+03 1.5464e+03 1.3932e+03 2.1852e+03 4.8420e+02 4.0750e+02 + 4.4140e+02 5.6050e+02 6.6130e+02 4.6360e+02 6.7460e+02 1.4920e+02 4.4710e+02 + 8.0750e+02 1.0034e+03 6.5390e+02 5.6710e+02 6.5080e+02 2.7900e+02 1.2380e+02 + 3.3750e+02 7.3390e+02 1.1553e+03 8.7750e+02 2.2872e+03 2.3963e+03 2.7881e+03 + 3.2682e+03 1.2632e+03 3.7880e+02 4.7400e+02 6.4450e+02 8.6270e+02 1.0908e+03 + 2.7625e+03 1.7121e+03 7.7140e+02 5.3800e+02 1.0117e+03 1.3130e+03 1.1552e+03 + 1.4191e+03 7.6040e+02 3.4350e+02 5.4660e+02 7.4450e+02 1.1531e+03 6.8450e+02 + 4.0540e+02 3.5120e+02 2.9130e+02 4.7700e+02 5.7870e+02 6.3780e+02 4.4460e+02 + 4.3800e+02 1.9830e+02 9.6430e+02 6.0290e+02 2.1598e+03 1.9523e+03 1.5931e+03 + 1.8170e+03 1.7893e+03 9.2810e+02 2.7260e+02 3.6670e+02 6.3010e+02 7.6130e+02 + 3.2190e+02 4.3470e+02 1.9640e+02 2.4870e+02 4.9020e+02 7.6730e+02 5.6010e+02 + 3.6860e+02 3.6350e+02 4.2920e+02 5.5790e+02 1.0052e+03 1.1440e+03 1.0330e+03 + 1.2642e+03 2.3802e+03 1.0732e+03 1.1438e+03 1.5017e+03 1.7057e+03 3.6320e+02 + 5.8370e+02 6.7160e+02 6.8290e+02 1.2188e+03 1.7253e+03 2.4979e+03 9.9160e+02 + 9.5240e+02 2.3435e+03 2.4464e+03 1.4247e+03 6.9770e+02 2.1470e+02 6.0980e+02 + 1.0084e+03 1.1048e+03 1.9035e+03 5.6050e+02 2.3970e+02 4.0400e+02 3.7190e+02 + 5.5430e+02 6.8200e+02 7.5950e+02 7.3880e+02 6.7270e+02 4.4800e+02 4.6990e+02 + 6.9960e+02 1.2629e+03 2.2872e+03 1.0969e+03 1.4970e+03 1.7647e+03 8.1550e+02 + 3.7210e+02 2.2160e+02 5.0540e+02 6.0320e+02 6.5190e+02 2.5910e+02 3.2150e+02 + 1.0169e+03 9.8930e+02 6.5330e+02 7.7260e+02 3.3230e+02 3.0120e+02 5.9520e+02 + 6.5910e+02 1.8988e+03 9.5410e+02 1.6544e+03 1.5558e+03 1.6780e+03 1.5929e+03 + 7.8920e+02 8.0690e+02 1.9449e+03 7.7520e+02 5.3180e+02 4.8030e+02 3.8150e+02 + 6.5160e+02 8.9050e+02 2.0123e+03 1.2617e+03 2.0957e+03 1.9389e+03 1.4820e+03 + 1.5231e+03 4.2530e+02 1.2400e+02 7.8910e+02 1.1704e+03 2.1306e+03 2.0912e+03 + 3.5020e+02 2.2340e+02 5.9210e+02 6.4360e+02 7.4510e+02 4.5840e+02 6.1400e+02 + 9.2770e+02 8.8760e+02 5.2150e+02 5.4020e+02 1.0616e+03 1.3140e+03 2.3138e+03 + 1.5143e+03 2.6895e+03 1.5905e+03 7.3880e+02 7.4060e+02 2.8600e+02 5.1890e+02 + 6.7870e+02 4.0600e+02 1.7770e+02 4.8600e+02 6.3740e+02 5.3270e+02 3.0440e+02 + 4.9870e+02 4.0080e+02 4.9110e+02 6.1970e+02 1.3599e+03 1.3246e+03 1.6952e+03 + 1.4096e+03 1.7353e+03 9.1490e+02 1.5212e+03 8.3610e+02 1.4967e+03 1.5300e+03 + 8.9090e+02 3.6680e+02 6.2250e+02 5.6980e+02 8.6210e+02 1.0520e+03 1.5831e+03 + 1.9012e+03 1.7928e+03 1.5413e+03 7.9570e+02 4.3250e+02 2.4280e+02 2.4100e+02 + 5.8140e+02 1.5661e+03 2.3169e+03 1.0967e+03 4.4730e+02 2.6780e+02 2.1430e+02 + 4.1080e+02 3.4430e+02 7.4080e+02 9.6050e+02 1.1221e+03 7.8340e+02 5.3570e+02 + 3.8990e+02 7.1140e+02 1.7274e+03 9.1770e+02 1.5896e+03 1.8532e+03 2.1529e+03 + 1.2436e+03 9.0070e+02 6.6440e+02 7.6600e+02 6.6700e+02 4.3870e+02 3.5430e+02 + 5.8440e+02 1.1188e+03 3.4860e+02 2.0830e+02 3.9620e+02 5.2540e+02 6.3090e+02 + 9.8490e+02 1.5646e+03 1.6202e+03 1.5621e+03 1.8593e+03 4.1440e+02 8.2820e+02 + 4.7630e+02 1.0068e+03 4.6350e+02 8.8280e+02 8.8860e+02 4.7460e+02 5.5580e+02 + 2.4930e+02 5.8980e+02 1.6305e+03 1.7495e+03 2.6684e+03 2.9424e+03 1.0866e+03 + 1.1672e+03 4.6500e+02 5.0520e+02 3.3690e+02 6.1040e+02 1.2891e+03 2.0063e+03 + 9.1120e+02 5.5600e+02 3.9730e+02 1.3660e+02 4.4080e+02 3.3590e+02 3.3980e+02 + 8.4530e+02 8.2030e+02 4.6590e+02 3.4880e+02 4.2180e+02 5.4030e+02 1.3437e+03 + 1.3996e+03 1.2902e+03 1.8715e+03 2.6043e+03 9.4810e+02 5.9660e+02 1.0681e+03 + 7.5190e+02 3.8420e+02 4.5210e+02 6.6240e+02 6.9770e+02 2.8950e+02 5.0940e+02 + 3.7930e+02 3.2590e+02 2.4790e+02 5.6130e+02 6.9590e+02 1.1709e+03 1.4618e+03 + 1.6120e+03 1.1166e+03 8.1120e+02 4.9000e+02 5.5130e+02 7.4850e+02 9.4940e+02 + 6.6970e+02 2.2280e+02 3.9330e+02 1.0163e+03 5.0290e+02 5.2490e+02 8.7060e+02 + 3.1860e+03 1.8753e+03 2.0375e+03 1.1195e+03 5.9380e+02 4.5460e+02 5.2780e+02 + 1.0227e+03 1.1043e+03 1.7577e+03 2.1658e+03 8.8250e+02 6.3330e+02 4.8760e+02 + 2.2510e+02 4.0930e+02 2.2080e+02 2.5230e+02 7.5360e+02 4.6990e+02 3.8620e+02 + 3.4760e+02 4.0220e+02 2.6610e+02 1.5223e+03 8.6860e+02 7.9930e+02 7.4970e+02 + 1.6105e+03 1.5621e+03 7.3240e+02 6.5920e+02 7.1630e+02 1.6680e+02 3.9500e+02 + 1.1179e+03 1.2376e+03 5.9530e+02 6.5260e+02 7.5550e+02 3.3230e+02 2.8180e+02 + 8.8640e+02 1.8685e+03 1.4053e+03 1.5225e+03 1.4227e+03 1.1502e+03 5.7940e+02 + 3.7040e+02 5.1650e+02 3.5260e+02 9.5180e+02 6.6580e+02 5.4060e+02 3.5240e+02 + 6.1840e+02 5.9080e+02 7.2050e+02 1.4997e+03 3.5000e+03 1.5884e+03 1.8821e+03 + 7.1080e+02 5.2630e+02 7.4170e+02 5.0850e+02 8.6070e+02 6.8870e+02 2.0969e+03 + 1.5359e+03 8.6370e+02 6.9860e+02 6.4020e+02 7.8170e+02 5.2650e+02 5.3600e+02 + 7.4070e+02 5.1530e+02 3.4520e+02 4.8060e+02 6.2450e+02 5.4570e+02 2.2125e+03 + 2.0427e+03 1.1295e+03 1.0518e+03 1.1360e+03 2.2120e+03 2.4149e+03 7.1770e+02 + 6.7820e+02 5.9200e+02 2.6510e+02 5.4950e+02 6.5540e+02 9.5590e+02 5.5420e+02 + 4.4060e+02 5.6830e+02 5.3450e+02 7.0870e+02 1.9268e+03 1.5963e+03 9.8370e+02 + 5.1860e+02 6.9740e+02 7.6330e+02 4.1050e+02 4.7440e+02 5.5620e+02 2.6310e+02 + 4.0020e+02 8.2440e+02 4.1950e+02 3.9830e+02 7.6870e+02 8.8290e+02 4.2270e+02 + 1.8010e+03 2.5501e+03 1.6887e+03 1.0243e+03 2.4600e+02 8.2140e+02 4.8670e+02 + 7.3770e+02 1.1292e+03 9.3830e+02 2.7450e+03 1.1998e+03 1.2509e+03 9.1130e+02 + 5.7500e+02 6.1310e+02 6.3220e+02 5.3430e+02 5.3810e+02 3.7050e+02 3.7110e+02 + 2.3300e+02 4.5650e+02 5.8560e+02 1.3832e+03 2.6011e+03 1.6340e+03 8.9320e+02 + 1.3836e+03 1.1536e+03 2.7903e+03 8.9890e+02 8.0500e+02 3.8060e+02 2.5770e+02 + 6.2120e+02 5.0880e+02 4.1930e+02 6.5850e+02 5.5660e+02 9.0070e+02 4.7910e+02 + 5.0200e+02 1.1890e+03 1.7770e+03 7.6280e+02 4.3710e+02 6.0180e+02 4.7610e+02 + 5.0080e+02 3.4000e+02 4.7750e+02 4.7110e+02 4.4300e+02 2.6240e+02 3.4770e+02 + 2.6370e+02 9.7580e+02 6.7410e+02 1.1853e+03 2.3482e+03 2.2518e+03 7.7370e+02 + 7.2110e+02 8.2750e+02 5.8500e+02 7.0050e+02 4.1620e+02 4.8710e+02 9.4920e+02 + 3.1012e+03 1.7843e+03 4.9360e+02 9.4170e+02 6.4920e+02 8.2690e+02 8.5880e+02 + 3.3560e+02 3.8230e+02 6.8280e+02 5.6320e+02 2.2650e+02 3.3960e+02 5.6030e+02 + 9.8050e+02 1.9148e+03 2.0486e+03 5.5980e+02 9.0350e+02 1.3183e+03 2.7878e+03 + 7.3520e+02 7.5860e+02 7.0890e+02 6.1800e+02 6.9590e+02 5.8770e+02 4.5910e+02 + 6.2430e+02 5.9540e+02 5.4210e+02 4.4070e+02 9.5090e+02 1.6896e+03 1.5521e+03 + 5.4150e+02 3.4180e+02 2.5940e+02 3.6070e+02 5.2790e+02 3.4270e+02 5.0360e+02 + 3.6140e+02 5.3340e+02 2.0520e+02 2.5610e+02 3.0870e+02 7.6690e+02 1.3666e+03 + 2.0203e+03 2.1273e+03 2.5090e+03 1.5742e+03 6.7420e+02 4.9640e+02 3.6220e+02 + 8.4690e+02 2.6250e+02 3.8070e+02 1.1232e+03 2.1115e+03 1.4450e+03 5.3200e+02 + 5.5460e+02 8.0070e+02 4.6150e+02 8.9380e+02 6.3540e+02 2.8030e+02 1.0097e+03 + 8.0070e+02 5.2060e+02 5.0970e+02 3.0250e+02 1.1916e+03 2.8084e+03 2.5623e+03 + 1.3223e+03 4.5620e+02 7.4990e+02 2.1663e+03 1.2886e+03 6.1320e+02 7.9010e+02 + 7.2330e+02 7.6170e+02 4.9550e+02 4.1200e+02 6.0740e+02 3.4680e+02 5.9580e+02 + 6.0930e+02 1.0138e+03 2.4012e+03 1.6042e+03 1.0373e+03 5.7970e+02 2.0330e+02 + 2.6490e+02 3.8930e+02 4.9280e+02 7.3940e+02 4.8250e+02 3.7620e+02 3.3760e+02 + 3.6990e+02 5.3300e+02 6.5460e+02 8.7770e+02 1.8106e+03 1.7912e+03 1.5473e+03 + 9.7390e+02 8.4820e+02 6.8470e+02 7.7800e+02 8.1570e+02 6.8440e+02 5.9210e+02 + 2.2398e+03 2.1842e+03 8.7680e+02 7.3580e+02 5.8750e+02 5.6670e+02 4.4120e+02 + 7.6950e+02 3.3690e+02 2.8720e+02 5.3910e+02 8.6110e+02 9.5980e+02 4.3180e+02 + 4.6890e+02 9.7490e+02 1.7414e+03 1.9302e+03 1.3435e+03 3.1190e+02 5.5170e+02 + 2.8436e+03 1.5648e+03 8.2650e+02 6.9940e+02 8.1290e+02 4.3580e+02 7.1790e+02 + 4.7430e+02 5.1930e+02 8.1360e+02 4.6660e+02 8.0580e+02 1.5441e+03 3.2137e+03 + 1.4341e+03 1.3820e+03 3.9240e+02 1.4830e+02 4.0270e+02 3.9380e+02 4.4140e+02 + 7.3860e+02 5.0820e+02 3.5670e+02 4.0710e+02 7.1310e+02 4.6000e+02 5.5980e+02 + 5.1930e+02 2.1852e+03 2.3648e+03 6.7070e+02 1.1679e+03 6.8430e+02 8.4870e+02 + 7.0150e+02 1.1838e+03 6.1760e+02 2.8310e+02 1.0532e+03 1.6462e+03 1.3646e+03 + 5.1850e+02 4.1920e+02 3.4530e+02 3.3390e+02 5.2050e+02 8.2010e+02 4.1330e+02 + 5.2880e+02 1.2096e+03 1.2578e+03 5.3000e+02 6.2520e+02 1.2430e+03 1.8894e+03 + 1.8170e+03 9.5320e+02 3.7050e+02 1.3987e+03 2.1933e+03 2.6618e+03 1.4221e+03 + 5.6330e+02 4.1230e+02 2.0940e+02 5.2040e+02 7.9170e+02 5.3440e+02 5.8540e+02 + 4.8030e+02 7.9330e+02 2.0843e+03 3.0588e+03 1.1811e+03 9.7590e+02 5.6200e+02 + 1.9300e+02 3.7340e+02 8.3280e+02 7.9960e+02 3.1860e+02 7.7330e+02 4.4030e+02 + 3.4690e+02 6.7530e+02 5.0260e+02 6.3890e+02 1.4094e+03 1.6265e+03 1.9509e+03 + 8.4540e+02 6.0720e+02 5.6420e+02 7.0470e+02 8.2800e+02 8.4150e+02 4.0900e+02 + 2.8200e+02 2.1283e+03 2.0715e+03 5.7170e+02 4.9830e+02 4.8210e+02 2.4150e+02 + 3.5170e+02 7.0420e+02 7.2710e+02 3.3990e+02 3.6300e+02 9.5680e+02 9.0740e+02 + 5.0940e+02 3.4910e+02 1.5741e+03 1.9970e+03 8.0080e+02 4.5610e+02 2.0040e+02 + 7.1060e+02 9.6610e+02 1.8336e+03 9.2290e+02 9.1140e+02 6.7790e+02 3.6800e+02 + 6.3190e+02 4.2090e+02 3.8770e+02 3.3320e+02 5.2720e+02 9.3240e+02 2.5111e+03 + 1.2073e+03 1.2914e+03 9.9090e+02 5.6860e+02 6.0540e+02 4.2920e+02 7.6190e+02 + 5.3800e+02 3.9780e+02 5.0620e+02 3.4260e+02 3.9220e+02 7.4230e+02 2.7320e+02 + 4.8020e+02 7.6960e+02 2.0360e+03 7.3570e+02 9.0410e+02 8.8960e+02 4.5240e+02 + 5.9110e+02 4.0540e+02 5.3030e+02 2.7570e+02 6.6950e+02 2.0583e+03 2.9530e+03 + 1.1933e+03 8.3230e+02 3.5070e+02 2.7060e+02 4.6560e+02 8.3910e+02 5.9930e+02 + 5.1640e+02 3.3630e+02 7.2790e+02 6.0140e+02 5.9570e+02 3.5450e+02 7.7870e+02 + 2.3472e+03 1.2183e+03 4.8050e+02 4.4780e+02 1.0096e+03 1.6747e+03 2.1044e+03 + 2.1990e+03 1.0607e+03 5.4210e+02 4.0730e+02 2.9290e+02 4.0160e+02 3.9110e+02 + 8.6590e+02 1.4126e+03 9.5980e+02 2.0971e+03 8.4220e+02 9.4650e+02 5.1740e+02 + 2.9890e+02 6.0880e+02 4.6230e+02 7.7430e+02 3.0650e+02 2.8530e+02 5.4150e+02 + 4.5670e+02 5.3770e+02 4.3660e+02 2.2940e+02 6.0830e+02 1.9051e+03 2.1894e+03 + 6.1300e+02 6.5190e+02 6.5090e+02 3.3450e+02 6.3860e+02 5.9560e+02 7.7290e+02 + 2.3880e+02 6.3490e+02 1.0457e+03 2.2737e+03 1.5301e+03 3.6570e+02 4.2230e+02 + 4.9600e+02 2.8810e+02 6.8170e+02 9.1380e+02 4.3700e+02 4.0270e+02 3.7010e+02 + 2.9110e+02 4.6510e+02 5.6450e+02 1.5943e+03 2.0879e+03 1.3906e+03 1.1418e+03 + 4.7170e+02 3.2780e+02 7.5800e+02 1.6849e+03 2.5322e+03 1.5579e+03 4.9690e+02 + 4.7640e+02 4.3060e+02 2.6900e+02 6.0850e+02 7.0660e+02 8.6380e+02 9.7450e+02 + 1.1241e+03 9.9250e+02 4.3240e+02 4.8950e+02 2.8510e+02 5.6910e+02 7.9010e+02 + 1.1358e+03 3.0480e+02 2.0680e+02 3.0300e+02 5.7200e+02 1.0092e+03 5.1270e+02 + 2.9020e+02 6.0980e+02 1.3082e+03 2.7128e+03 1.1408e+03 6.8470e+02 8.2890e+02 + 4.9100e+02 5.1530e+02 1.7160e+02 3.7150e+02 5.8360e+02 7.6840e+02 1.4225e+03 + 2.7323e+03 8.9500e+02 3.9460e+02 5.2130e+02 1.3510e+02 4.2060e+02 5.8490e+02 + 7.3570e+02 6.3450e+02 4.6670e+02 7.6880e+02 4.7700e+02 2.2020e+02 4.0440e+02 + 5.7400e+02 2.1740e+03 1.7924e+03 1.7099e+03 5.5340e+02 4.4930e+02 9.6320e+02 + 9.3110e+02 1.9485e+03 8.4180e+02 9.0540e+02 3.1380e+02 3.6880e+02 3.3570e+02 + 7.8230e+02 1.3003e+03 2.3107e+03 1.5978e+03 1.0277e+03 1.9187e+03 8.1210e+02 + 3.9360e+02 4.5120e+02 1.0926e+03 1.2950e+03 6.7090e+02 3.3160e+02 4.6320e+02 + 3.8910e+02 4.3310e+02 8.9930e+02 5.4660e+02 4.7460e+02 3.5260e+02 1.6432e+03 + 2.4213e+03 1.0597e+03 1.1323e+03 1.0466e+03 5.9970e+02 3.1720e+02 2.3790e+02 + 5.7450e+02 5.6620e+02 7.8590e+02 7.4710e+02 2.4084e+03 8.1520e+02 4.0830e+02 + 7.4850e+02 2.3420e+02 4.5420e+02 8.0450e+02 6.4180e+02 5.4560e+02 4.8380e+02 + 5.0730e+02 4.0850e+02 2.9320e+02 8.0260e+02 8.7270e+02 2.4108e+03 1.1650e+03 + 6.8060e+02 4.0250e+02 4.8310e+02 8.8200e+02 6.1690e+02 2.1216e+03 1.8689e+03 + 9.7720e+02 4.8400e+02 9.0630e+02 1.1091e+03 1.3591e+03 1.0934e+03 1.6767e+03 + 1.0706e+03 1.1318e+03 6.3640e+02 5.3380e+02 4.4610e+02 1.0580e+02 5.7780e+02 + 6.1730e+02 7.9310e+02 6.3800e+02 7.1260e+02 7.1420e+02 5.6860e+02 4.4530e+02 + 2.7370e+02 3.0050e+02 4.5710e+02 1.8540e+03 2.5373e+03 1.7718e+03 1.0752e+03 + 5.2560e+02 4.3650e+02 3.0350e+02 1.9950e+02 6.5020e+02 6.9180e+02 5.9950e+02 + 1.0920e+03 2.2241e+03 2.0379e+03 8.2220e+02 4.5570e+02 3.2460e+02 4.1550e+02 + 5.9580e+02 3.9720e+02 7.1930e+02 6.1730e+02 5.0090e+02 3.0350e+02 4.4230e+02 + 4.2300e+02 1.5214e+03 1.6344e+03 2.0314e+03 1.1623e+03 3.4010e+02 5.0990e+02 + 6.8490e+02 7.6800e+02 1.2334e+03 1.7932e+03 1.9712e+03 1.7471e+03 7.0650e+02 + 1.4394e+03 1.3781e+03 1.0024e+03 1.4042e+03 1.0707e+03 4.8470e+02 3.6900e+02 + 3.6360e+02 5.6090e+02 4.9560e+02 9.4130e+02 7.8830e+02 5.4220e+02 6.8340e+02 + 9.5530e+02 3.8740e+02 1.0206e+03 3.4660e+02 5.3960e+02 3.6350e+02 9.1710e+02 + 1.1175e+03 2.8671e+03 1.2044e+03 6.0140e+02 4.6840e+02 4.9020e+02 3.2620e+02 + 5.2490e+02 9.8570e+02 9.3210e+02 6.1310e+02 1.5194e+03 1.6433e+03 2.4210e+03 + 1.3033e+03 6.4330e+02 4.7380e+02 8.3850e+02 4.3620e+02 2.3290e+02 6.2910e+02 + 5.0780e+02 4.8590e+02 4.0670e+02 2.9440e+02 1.5530e+02 9.3940e+02 2.5962e+03 + 1.2639e+03 1.1937e+03 2.9920e+02 6.4250e+02 6.0070e+02 3.3570e+02 3.7490e+02 + 2.5816e+03 2.7623e+03 1.0558e+03 2.2862e+03 2.1249e+03 2.3297e+03 1.5725e+03 + 1.5509e+03 9.7040e+02 6.6960e+02 4.1720e+02 6.6780e+02 9.3720e+02 3.7840e+02 + 1.0803e+03 9.9120e+02 7.3260e+02 5.3410e+02 6.2830e+02 5.2490e+02 5.7540e+02 + 9.8340e+02 5.5850e+02 4.6360e+02 8.6380e+02 2.4368e+03 2.2040e+03 6.6440e+02 + 4.7760e+02 2.1570e+02 4.0760e+02 4.0220e+02 2.6970e+02 8.4240e+02 7.9750e+02 + 5.3770e+02 9.0830e+02 1.3753e+03 1.8007e+03 1.2170e+03 5.6320e+02 4.5630e+02 + 8.1980e+02 4.8790e+02 2.5190e+02 6.5710e+02 5.9480e+02 3.4780e+02 1.3870e+02 + 5.7760e+02 3.5340e+02 1.2363e+03 2.0086e+03 1.2233e+03 9.4560e+02 6.6680e+02 + 2.7510e+02 8.3810e+02 6.7480e+02 6.6210e+02 1.0556e+03 2.5807e+03 1.4419e+03 + 2.0618e+03 3.2175e+03 1.1726e+03 8.0860e+02 6.9160e+02 5.8840e+02 5.8210e+02 + 4.9840e+02 7.0250e+02 4.0270e+02 4.9340e+02 8.2350e+02 9.3910e+02 5.4050e+02 + 3.8620e+02 6.4910e+02 8.2510e+02 8.9960e+02 9.3210e+02 1.0338e+03 8.4090e+02 + 6.1030e+02 2.4846e+03 2.8717e+03 8.5110e+02 4.9750e+02 2.2770e+02 2.5120e+02 + 3.5030e+02 8.1720e+02 6.9490e+02 6.6430e+02 3.0850e+02 5.8780e+02 9.4540e+02 + 2.8720e+03 2.0277e+03 6.9100e+02 4.9260e+02 8.1300e+02 1.0408e+03 2.9640e+02 + 3.3570e+02 6.9520e+02 5.4240e+02 1.1270e+02 3.3610e+02 5.2920e+02 1.5098e+03 + 2.4280e+03 1.2832e+03 6.7640e+02 6.7100e+02 4.8690e+02 5.4600e+02 3.7140e+02 + 4.3220e+02 1.3602e+03 1.9029e+03 2.2914e+03 1.6628e+03 2.9892e+03 8.8220e+02 + 4.6730e+02 4.3390e+02 6.6790e+02 3.8280e+02 5.3800e+02 6.5510e+02 4.5070e+02 + 3.5600e+02 6.1550e+02 7.9560e+02 5.0750e+02 3.3840e+02 4.3530e+02 8.4290e+02 + 8.5640e+02 9.2090e+02 6.5900e+02 5.9220e+02 1.4079e+03 1.2669e+03 1.5993e+03 + 3.5710e+02 5.6660e+02 2.8410e+02 4.0390e+02 3.0320e+02 2.0160e+02 5.7830e+02 + 9.3620e+02 6.0640e+02 5.1740e+02 9.3180e+02 2.0731e+03 1.6580e+03 7.7920e+02 + 6.1570e+02 3.5230e+02 7.1380e+02 4.7360e+02 5.4680e+02 6.0740e+02 5.0530e+02 + 1.4780e+02 4.2830e+02 8.8460e+02 1.6080e+03 2.2371e+03 1.0777e+03 7.9580e+02 + 2.9970e+02 6.5830e+02 4.4270e+02 4.8320e+02 4.5230e+02 1.2202e+03 1.9985e+03 + 2.4894e+03 3.3280e+03 2.8131e+03 9.3390e+02 2.6860e+02 4.0050e+02 4.3190e+02 + 3.2370e+02 5.7000e+02 4.9160e+02 3.0620e+02 2.4860e+02 5.0490e+02 4.9020e+02 + 3.3240e+02 3.4330e+02 7.7340e+02 9.4960e+02 1.4130e+03 1.5589e+03 6.2330e+02 + 4.9730e+02 1.0130e+03 1.9116e+03 2.2715e+03 6.9280e+02 4.0840e+02 4.3250e+02 + 1.5760e+02 4.5800e+02 3.4360e+02 4.3500e+02 5.4360e+02 6.5550e+02 5.4660e+02 + 9.7590e+02 1.6631e+03 2.1328e+03 1.7446e+03 5.7760e+02 2.1510e+02 7.0830e+02 + 4.3640e+02 1.6710e+02 4.4720e+02 1.8220e+02 2.4750e+02 1.0979e+03 9.6490e+02 + 2.4877e+03 2.7628e+03 9.2650e+02 2.7240e+02 3.9710e+02 3.6790e+02 6.5610e+02 + 4.6890e+02 4.3640e+02 3.9930e+02 9.4070e+02 2.3107e+03 3.4234e+03 2.1188e+03 + 1.5981e+03 1.5350e+02 2.1590e+02 5.2190e+02 5.4040e+02 2.0690e+02 7.8350e+02 + 2.8680e+02 2.6330e+02 3.7410e+02 6.4560e+02 5.2090e+02 6.7450e+02 4.1580e+02 + 5.4560e+02 7.3800e+02 1.3057e+03 7.0930e+02 3.0410e+02 5.0550e+02 1.3445e+03 + 1.6372e+03 4.6910e+02 5.4320e+02 4.7040e+02 4.6100e+02 2.8330e+02 3.3100e+02 + 5.3630e+02 6.1690e+02 3.9210e+02 4.7130e+02 6.8800e+02 1.7630e+03 2.1138e+03 + 1.5043e+03 5.2080e+02 2.8820e+02 3.7490e+02 7.3150e+02 3.8700e+02 5.4570e+02 + 3.7680e+02 4.5140e+02 7.9600e+02 1.1984e+03 2.4956e+03 2.1051e+03 8.5750e+02 + 2.5050e+02 3.1180e+02 5.8530e+02 5.2720e+02 6.1130e+02 3.7080e+02 5.0460e+02 + 1.1160e+03 2.4266e+03 3.1768e+03 1.9216e+03 1.5110e+03 5.4510e+02 3.3930e+02 + 4.1050e+02 6.1530e+02 7.4360e+02 2.5040e+02 4.7600e+02 4.7780e+02 4.9870e+02 + 6.8140e+02 6.0030e+02 6.5580e+02 4.3820e+02 2.5840e+02 3.3510e+02 1.9224e+03 + 6.3560e+02 5.4390e+02 3.7320e+02 1.4463e+03 1.0356e+03 6.3520e+02 5.0060e+02 + 9.0030e+02 5.3080e+02 5.4190e+02 3.2680e+02 1.0364e+03 3.0970e+02 2.9090e+02 + 2.6180e+02 6.2740e+02 9.7560e+02 2.0859e+03 1.2944e+03 7.0110e+02 4.0390e+02 + 1.0720e+03 2.9950e+02 3.5660e+02 6.6550e+02 5.2570e+02 8.4910e+02 7.5900e+02 + 1.1121e+03 2.3362e+03 8.3670e+02 3.1420e+02 2.4200e+02 4.1570e+02 5.7480e+02 + 6.6430e+02 3.5080e+02 3.2450e+02 6.4600e+02 1.2871e+03 1.5898e+03 2.9490e+03 + 1.5922e+03 9.2930e+02 9.9070e+02 4.2790e+02 3.3500e+02 3.7570e+02 5.1320e+02 + 5.5210e+02 4.5950e+02 5.9900e+02 5.0100e+02 5.0340e+02 4.7880e+02 7.3080e+02 + 5.5540e+02 3.1620e+02 1.0440e+02 1.1530e+03 8.0630e+02 5.6870e+02 3.4050e+02 + 1.3805e+03 8.5300e+02 1.3135e+03 1.3573e+03 8.3570e+02 5.9040e+02 1.1998e+03 + 4.4040e+02 4.3790e+02 6.5340e+02 2.1450e+02 4.3770e+02 5.1870e+02 6.8150e+02 + 1.2301e+03 1.9522e+03 1.5424e+03 6.5320e+02 1.0164e+03 3.6830e+02 3.7320e+02 + 5.1590e+02 7.5600e+02 5.3260e+02 8.8610e+02 1.5439e+03 1.5135e+03 1.3703e+03 + 5.6190e+02 7.3280e+02 5.1170e+02 9.2040e+02 8.0210e+02 3.9750e+02 2.2910e+02 + 4.8250e+02 6.7560e+02 1.3865e+03 2.3102e+03 2.1219e+03 1.0545e+03 7.6310e+02 + 3.4340e+02 2.6040e+02 4.4280e+02 4.0420e+02 4.6490e+02 3.1210e+02 6.5560e+02 + 7.4520e+02 6.4100e+02 1.0219e+03 1.1484e+03 8.5250e+02 2.7660e+02 1.1350e+02 + 8.7170e+02 +/ diff --git a/examples/egg/eclipse/include/grid/active.inc b/examples/egg/eclipse/include/grid/active.inc new file mode 100755 index 00000000000..e40f4aaf26b --- /dev/null +++ b/examples/egg/eclipse/include/grid/active.inc @@ -0,0 +1,55 @@ +ACTNUM + 80*0 26*1 31*0 34*1 24*0 39*1 19*0 43*1 15*0 46*1 12*0 49*1 10*0 50*1 9*0 + 52*1 7*0 53*1 6*0 54*1 6*0 54*1 5*0 54*1 6*0 54*1 6*0 54*1 5*0 55*1 5*0 55*1 + 5*0 54*1 6*0 54*1 6*0 53*1 7*0 53*1 6*0 53*1 7*0 53*1 7*0 53*1 7*0 52*1 8*0 + 52*1 7*0 53*1 7*0 52*1 8*0 52*1 8*0 51*1 9*0 51*1 9*0 50*1 10*0 50*1 10*0 + 49*1 11*0 49*1 11*0 48*1 12*0 47*1 13*0 47*1 13*0 46*1 14*0 45*1 15*0 44*1 + 17*0 43*1 17*0 41*1 19*0 40*1 20*0 39*1 21*0 37*1 23*0 36*1 24*0 35*1 25*0 + 33*1 28*0 31*1 29*0 30*1 30*0 28*1 32*0 27*1 33*0 25*1 35*0 23*1 37*0 19*1 + 42*0 14*1 47*0 7*1 195*0 13*1 39*0 30*1 27*0 37*1 21*0 41*1 17*0 45*1 13*0 + 48*1 10*0 51*1 8*0 52*1 7*0 53*1 6*0 54*1 6*0 54*1 5*0 55*1 5*0 55*1 4*0 56*1 + 4*0 56*1 4*0 55*1 5*0 55*1 5*0 55*1 4*0 55*1 5*0 55*1 5*0 54*1 6*0 54*1 6*0 + 54*1 5*0 54*1 6*0 54*1 6*0 53*1 7*0 53*1 7*0 53*1 7*0 52*1 8*0 52*1 7*0 52*1 + 8*0 52*1 8*0 51*1 9*0 51*1 9*0 50*1 10*0 50*1 10*0 49*1 11*0 48*1 12*0 48*1 + 12*0 47*1 14*0 45*1 15*0 44*1 16*0 44*1 16*0 42*1 19*0 40*1 20*0 39*1 21*0 + 37*1 23*0 36*1 24*0 35*1 25*0 33*1 27*0 31*1 29*0 30*1 30*0 28*1 32*0 27*1 + 33*0 25*1 36*0 21*1 39*0 17*1 43*0 13*1 48*0 8*1 128*0 25*1 31*0 35*1 23*0 + 40*1 18*0 45*1 13*0 49*1 9*0 51*1 8*0 53*1 6*0 54*1 5*0 55*1 4*0 56*1 4*0 + 56*1 3*0 57*1 3*0 56*1 4*0 56*1 4*0 56*1 3*0 57*1 3*0 57*1 3*0 56*1 4*0 56*1 + 4*0 55*1 5*0 55*1 4*0 55*1 5*0 55*1 5*0 55*1 5*0 54*1 6*0 54*1 5*0 55*1 5*0 + 55*1 5*0 54*1 6*0 54*1 6*0 53*1 7*0 53*1 7*0 52*1 8*0 52*1 8*0 51*1 9*0 51*1 + 9*0 50*1 10*0 49*1 11*0 48*1 12*0 48*1 12*0 47*1 13*0 46*1 15*0 45*1 15*0 + 44*1 16*0 43*1 17*0 41*1 19*0 40*1 20*0 38*1 23*0 36*1 24*0 35*1 25*0 33*1 + 27*0 31*1 29*0 29*1 31*0 28*1 32*0 26*1 34*0 24*1 37*0 19*1 41*0 16*1 44*0 + 10*1 51*0 6*1 70*0 25*1 31*0 35*1 23*0 40*1 18*0 45*1 13*0 49*1 9*0 51*1 8*0 + 53*1 6*0 54*1 5*0 55*1 4*0 56*1 4*0 56*1 3*0 57*1 3*0 56*1 4*0 56*1 4*0 56*1 + 3*0 57*1 3*0 57*1 3*0 56*1 4*0 56*1 4*0 55*1 5*0 55*1 4*0 55*1 5*0 55*1 5*0 + 55*1 5*0 54*1 6*0 54*1 5*0 55*1 5*0 55*1 5*0 54*1 6*0 54*1 6*0 53*1 7*0 53*1 + 7*0 52*1 8*0 52*1 8*0 51*1 9*0 51*1 9*0 50*1 10*0 49*1 11*0 48*1 12*0 48*1 + 12*0 47*1 13*0 46*1 15*0 45*1 15*0 44*1 16*0 43*1 17*0 41*1 19*0 40*1 20*0 + 38*1 23*0 36*1 24*0 35*1 25*0 33*1 27*0 31*1 29*0 29*1 31*0 28*1 32*0 26*1 + 34*0 24*1 37*0 19*1 41*0 16*1 44*0 10*1 51*0 6*1 70*0 25*1 31*0 35*1 23*0 + 40*1 18*0 45*1 13*0 49*1 9*0 51*1 8*0 53*1 6*0 54*1 5*0 55*1 4*0 56*1 4*0 + 56*1 3*0 57*1 3*0 56*1 4*0 56*1 4*0 56*1 3*0 57*1 3*0 57*1 3*0 56*1 4*0 56*1 + 4*0 55*1 5*0 55*1 4*0 55*1 5*0 55*1 5*0 55*1 5*0 54*1 6*0 54*1 5*0 55*1 5*0 + 55*1 5*0 54*1 6*0 54*1 6*0 53*1 7*0 53*1 7*0 52*1 8*0 52*1 8*0 51*1 9*0 51*1 + 9*0 50*1 10*0 49*1 11*0 48*1 12*0 48*1 12*0 47*1 13*0 46*1 15*0 45*1 15*0 + 44*1 16*0 43*1 17*0 41*1 19*0 40*1 20*0 38*1 23*0 36*1 24*0 35*1 25*0 33*1 + 27*0 31*1 29*0 29*1 31*0 28*1 32*0 26*1 34*0 24*1 37*0 19*1 41*0 16*1 44*0 + 10*1 51*0 6*1 70*0 25*1 31*0 35*1 23*0 40*1 18*0 45*1 13*0 49*1 9*0 51*1 8*0 + 53*1 6*0 54*1 5*0 55*1 4*0 56*1 4*0 56*1 3*0 57*1 3*0 56*1 4*0 56*1 4*0 56*1 + 3*0 57*1 3*0 57*1 3*0 56*1 4*0 56*1 4*0 55*1 5*0 55*1 4*0 55*1 5*0 55*1 5*0 + 55*1 5*0 54*1 6*0 54*1 5*0 55*1 5*0 55*1 5*0 54*1 6*0 54*1 6*0 53*1 7*0 53*1 + 7*0 52*1 8*0 52*1 8*0 51*1 9*0 51*1 9*0 50*1 10*0 49*1 11*0 48*1 12*0 48*1 + 12*0 47*1 13*0 46*1 15*0 45*1 15*0 44*1 16*0 43*1 17*0 41*1 19*0 40*1 20*0 + 38*1 23*0 36*1 24*0 35*1 25*0 33*1 27*0 31*1 29*0 29*1 31*0 28*1 32*0 26*1 + 34*0 24*1 37*0 19*1 41*0 16*1 44*0 10*1 51*0 6*1 77*0 13*1 39*0 30*1 27*0 + 37*1 21*0 41*1 17*0 45*1 13*0 48*1 10*0 51*1 8*0 52*1 7*0 53*1 6*0 54*1 6*0 + 54*1 5*0 55*1 5*0 55*1 4*0 56*1 4*0 56*1 4*0 55*1 5*0 55*1 5*0 55*1 4*0 55*1 + 5*0 55*1 5*0 54*1 6*0 54*1 6*0 54*1 5*0 54*1 6*0 54*1 6*0 53*1 7*0 53*1 7*0 + 53*1 7*0 52*1 8*0 52*1 7*0 52*1 8*0 52*1 8*0 51*1 9*0 51*1 9*0 50*1 10*0 50*1 + 10*0 49*1 11*0 48*1 12*0 48*1 12*0 47*1 14*0 45*1 15*0 44*1 16*0 44*1 16*0 + 42*1 19*0 40*1 20*0 39*1 21*0 37*1 23*0 36*1 24*0 35*1 25*0 33*1 27*0 31*1 + 29*0 30*1 30*0 28*1 32*0 27*1 33*0 25*1 36*0 21*1 39*0 17*1 43*0 13*1 48*0 + 8*1 108*0 +/ diff --git a/examples/egg/eclipse/include/realizations/realization-0/eclipse/include/grid/PERM.INC b/examples/egg/eclipse/include/realizations/realization-0/eclipse/include/grid/PERM.INC new file mode 100755 index 00000000000..efca979a46e --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-0/eclipse/include/grid/PERM.INC @@ -0,0 +1,3604 @@ +PERMX + 8.8090e+02 7.9710e+02 2.5350e+02 1.8000e+00 6.8600e+01 3.7300e+02 4.6660e+02 + 3.9070e+02 9.3750e+02 1.6976e+03 3.4453e+03 2.1598e+03 7.2390e+02 3.2550e+02 + 3.5880e+02 5.2930e+02 7.3410e+02 5.1960e+02 5.2950e+02 2.2007e+03 2.1751e+03 + 1.4670e+03 1.2283e+03 6.3810e+02 6.4970e+02 7.8810e+02 1.0614e+03 1.0187e+03 + 5.5370e+02 5.4250e+02 8.9160e+02 5.2230e+02 5.1990e+02 3.6890e+02 4.8050e+02 + 2.9700e+02 4.9270e+02 7.2060e+02 5.6850e+02 7.0050e+02 1.0282e+03 8.1870e+02 + 9.3530e+02 7.3290e+02 9.1280e+02 1.6804e+03 2.5230e+03 3.0848e+03 3.3198e+03 + 3.2769e+03 1.0172e+03 7.0670e+02 2.8530e+02 5.3440e+02 4.8420e+02 4.2860e+02 + 7.5680e+02 1.2638e+03 6.8530e+02 7.3070e+02 1.0048e+03 4.1290e+02 3.5470e+02 + 3.2050e+02 4.1670e+02 6.6880e+02 3.7290e+02 4.5050e+02 5.6360e+02 2.8932e+03 + 3.5000e+03 1.9962e+03 6.8900e+02 3.6870e+02 5.3410e+02 6.5060e+02 6.9280e+02 + 3.9690e+02 9.2490e+02 2.0865e+03 3.5000e+03 2.2977e+03 1.1495e+03 8.4100e+02 + 1.0008e+03 5.0710e+02 7.7690e+02 7.5600e+02 6.1420e+02 4.2500e+02 6.8560e+02 + 7.4340e+02 5.1630e+02 4.8890e+02 5.3740e+02 3.1550e+02 3.1610e+02 6.3630e+02 + 6.2550e+02 3.9630e+02 1.0365e+03 8.9650e+02 4.2810e+02 3.8750e+02 6.5250e+02 + 1.0095e+03 1.8671e+03 2.9871e+03 2*3.5000e+03 3.0062e+03 6.2980e+02 + 4.3540e+02 6.0830e+02 5.3060e+02 5.4330e+02 8.6990e+02 8.3720e+02 5.8190e+02 + 9.6240e+02 8.4200e+02 3.8080e+02 2.7110e+02 1.5680e+02 8.7070e+02 8.9350e+02 + 3.4000e+02 4.1740e+02 3.7940e+02 1.5763e+03 3.5000e+03 3.1409e+03 8.1140e+02 + 2.6510e+02 5.7570e+02 4.1050e+02 5.4590e+02 4.0730e+02 8.4110e+02 7.8170e+02 + 2.4242e+03 2.1146e+03 9.6000e+02 1.0561e+03 5.9240e+02 5.3840e+02 4.3120e+02 + 5.9700e+02 4.3760e+02 5.6940e+02 8.7780e+02 3.5550e+02 8.6340e+02 6.0900e+02 + 6.6540e+02 3.6930e+02 2.8660e+02 7.6640e+02 8.7350e+02 5.9550e+02 1.0771e+03 + 1.6440e+03 4.4710e+02 3.3450e+02 2.9300e+02 7.8090e+02 9.1480e+02 2.5200e+03 + 2*3.5000e+03 2.8942e+03 9.5870e+02 6.4380e+02 7.9610e+02 9.0900e+02 + 5.4150e+02 3.8540e+02 6.3670e+02 6.6540e+02 6.0490e+02 7.6680e+02 4.8710e+02 + 3.3590e+02 3.1390e+02 6.1180e+02 9.9910e+02 4.0530e+02 2.6860e+02 7.9410e+02 + 9.6600e+02 2.4763e+03 1.9570e+03 7.0780e+02 5.7860e+02 6.4080e+02 6.3680e+02 + 2.9120e+02 5.9300e+02 6.3770e+02 1.0621e+03 1.4800e+03 2.1694e+03 1.7134e+03 + 8.1710e+02 6.7080e+02 7.1980e+02 7.1430e+02 7.3470e+02 4.5760e+02 4.4320e+02 + 4.8160e+02 3.7790e+02 5.6520e+02 6.5790e+02 7.3060e+02 7.3630e+02 1.8940e+02 + 4.0040e+02 5.7820e+02 5.7600e+02 5.6890e+02 8.4200e+02 3.5540e+02 5.1310e+02 + 5.3300e+02 7.0750e+02 7.9200e+02 1.6882e+03 3.5000e+03 2.9200e+03 1.8486e+03 + 1.8529e+03 9.9990e+02 1.0066e+03 9.0180e+02 6.3270e+02 4.1380e+02 8.1090e+02 + 5.6100e+02 3.1600e+02 5.2630e+02 7.7040e+02 7.0830e+02 3.1770e+02 8.9000e+02 + 1.1501e+03 4.4390e+02 1.3040e+02 6.3120e+02 1.8953e+03 3.2977e+03 2.3286e+03 + 1.2883e+03 3.5830e+02 4.2260e+02 4.9520e+02 2.9070e+02 4.0720e+02 4.3390e+02 + 3.0660e+02 1.0426e+03 1.1628e+03 1.8903e+03 2.1427e+03 1.3683e+03 8.3780e+02 + 1.2888e+03 7.5910e+02 4.5150e+02 2.2360e+02 6.6860e+02 5.0580e+02 8.0440e+02 + 6.1300e+02 9.8750e+02 6.3650e+02 5.2030e+02 3.1670e+02 5.6830e+02 2.5180e+02 + 3.9710e+02 9.1620e+02 4.7580e+02 5.1640e+02 5.3840e+02 3.5430e+02 5.5150e+02 + 2.6347e+03 3.4495e+03 3.5000e+03 1.1281e+03 1.5131e+03 1.3322e+03 9.5110e+02 + 9.6440e+02 7.1580e+02 3.7540e+02 4.5080e+02 3.4060e+02 4.2640e+02 9.6130e+02 + 1.3778e+03 8.1040e+02 5.6000e+02 8.5200e+02 1.0076e+03 4.6220e+02 8.0500e+01 + 3.4330e+02 2.8952e+03 3.5000e+03 2.6511e+03 7.3360e+02 4.9650e+02 2.8570e+02 + 2.9750e+02 3.7120e+02 3.3420e+02 2.9650e+02 7.9270e+02 5.2660e+02 7.5560e+02 + 1.3632e+03 1.8607e+03 2.1531e+03 7.6680e+02 1.2424e+03 1.0489e+03 5.6830e+02 + 3.5170e+02 4.1790e+02 5.9200e+02 3.4800e+02 6.9200e+02 9.6030e+02 9.4180e+02 + 4.7720e+02 3.3490e+02 2.1060e+02 1.7380e+02 4.1980e+02 3.7110e+02 2.5420e+02 + 6.0160e+02 7.4470e+02 4.6420e+02 1.5113e+03 2.2679e+03 2.9638e+03 2.0740e+03 + 2.3731e+03 2.8429e+03 1.9820e+03 1.2048e+03 8.2230e+02 7.2220e+02 9.8970e+02 + 7.4640e+02 2.8040e+02 5.3010e+02 7.1510e+02 8.2780e+02 8.8820e+02 5.5960e+02 + 9.3850e+02 7.0750e+02 2.8100e+02 7.3200e+01 6.3330e+02 1.7998e+03 + 2*3.5000e+03 7.5060e+02 5.0100e+02 5.8370e+02 3.4540e+02 3.1200e+02 + 3.5290e+02 3.0460e+02 5.2830e+02 4.0060e+02 5.6960e+02 6.7330e+02 1.1862e+03 + 1.0968e+03 1.6658e+03 1.7790e+03 1.4578e+03 6.6210e+02 6.1560e+02 3.5440e+02 + 5.6650e+02 6.1810e+02 2.9140e+02 4.5670e+02 4.8590e+02 5.4830e+02 6.9870e+02 + 3.3030e+02 1.8610e+02 2.5380e+02 2.7950e+02 2.9830e+02 5.7400e+02 5.0870e+02 + 1.1980e+02 3.4410e+02 1.8340e+03 2.6604e+03 1.7880e+03 1.9633e+03 3.3975e+03 + 2.3555e+03 7.7350e+02 3.9720e+02 2.8530e+02 6.0980e+02 3.8390e+02 2.2950e+02 + 4.7810e+02 2.6990e+02 1.0651e+03 8.8790e+02 4.3020e+02 6.6520e+02 9.2510e+02 + 3.2770e+02 5.9550e+02 6.3090e+02 1.5225e+03 3.5000e+03 3.1398e+03 5.5420e+02 + 9.3710e+02 4.7750e+02 5.4450e+02 7.3190e+02 3.7040e+02 3.7310e+02 4.5030e+02 + 5.6410e+02 6.9950e+02 5.2230e+02 1.3553e+03 1.2004e+03 1.5953e+03 1.6872e+03 + 1.4497e+03 9.2650e+02 7.4740e+02 4.2690e+02 3.6320e+02 5.3760e+02 5.0340e+02 + 4.3620e+02 6.5340e+02 5.7510e+02 7.6560e+02 3.4300e+02 4.4570e+02 4.9650e+02 + 2.8770e+02 4.3230e+02 1.3893e+03 5.1570e+02 7.1200e+01 1.2056e+03 1.8657e+03 + 2.1489e+03 1.8685e+03 1.8530e+03 3.5000e+03 2.8474e+03 1.2895e+03 3.3250e+02 + 3.2640e+02 4.4080e+02 7.7890e+02 3.0450e+02 5.3700e+02 2.4460e+02 7.0690e+02 + 7.6440e+02 3.5550e+02 2.9430e+02 6.3390e+02 3.1210e+02 6.6290e+02 9.6810e+02 + 2.6583e+03 3.5000e+03 2.2642e+03 3.5300e+02 5.8040e+02 8.1450e+02 6.9720e+02 + 6.1580e+02 4.7140e+02 8.4240e+02 6.2670e+02 6.8610e+02 6.5300e+02 6.9410e+02 + 8.3930e+02 8.1700e+02 8.7320e+02 1.6926e+03 1.8863e+03 1.6966e+03 1.0654e+03 + 4.0190e+02 5.7800e+02 3.1320e+02 2.7190e+02 4.4090e+02 3.2450e+02 4.0350e+02 + 6.0700e+02 6.7410e+02 3.5850e+02 4.3380e+02 5.3810e+02 7.2670e+02 1.0843e+03 + 3.7640e+02 3.0300e+01 2.9160e+02 2.3336e+03 2.6340e+03 7.3470e+02 1.1309e+03 + 3.0488e+03 2.9819e+03 1.0430e+03 5.9790e+02 3.5230e+02 4.5050e+02 4.5620e+02 + 5.2850e+02 5.4510e+02 1.5100e+02 8.8980e+02 6.8110e+02 4.2740e+02 2.4720e+02 + 4.2600e+02 4.6560e+02 7.9110e+02 1.2285e+03 2*3.5000e+03 2.1234e+03 + 6.1080e+02 1.0437e+03 6.3760e+02 5.7830e+02 6.4010e+02 4.9380e+02 7.4870e+02 + 8.3070e+02 4.0940e+02 1.4370e+02 4.5620e+02 7.0540e+02 6.8380e+02 6.8730e+02 + 1.1065e+03 1.9211e+03 1.8941e+03 1.1359e+03 5.0970e+02 2.7030e+02 4.1430e+02 + 3.6460e+02 3.2880e+02 3.5270e+02 2.2780e+02 4.1950e+02 6.8300e+02 7.0200e+02 + 7.4770e+02 5.9410e+02 4.8170e+02 5.4090e+02 4.6870e+02 1.5410e+02 3.5210e+02 + 2.6764e+03 1.9704e+03 1.1399e+03 1.8236e+03 2*3.5000e+03 1.3185e+03 + 4.7200e+02 3.7610e+02 4.8370e+02 2.7060e+02 4.6250e+02 8.8950e+02 4.4650e+02 + 4.4210e+02 4.4580e+02 2.5230e+02 4.8230e+02 5.2100e+02 3.1820e+02 9.7500e+02 + 7.2500e+02 3.5000e+03 2.4604e+03 2.4189e+03 6.8440e+02 7.3120e+02 2.4950e+02 + 3.4180e+02 4.5800e+02 6.2700e+02 6.7810e+02 3.4760e+02 6.4320e+02 5.7140e+02 + 2.8120e+02 4.2740e+02 7.3330e+02 4.2620e+02 7.7800e+02 1.6265e+03 1.9283e+03 + 1.8156e+03 1.0910e+03 2.8260e+02 2.4320e+02 1.9630e+02 3.4920e+02 2.9190e+02 + 5.1160e+02 4.6830e+02 2.1470e+02 6.1360e+02 7.5830e+02 5.0860e+02 4.8180e+02 + 8.1080e+02 4.3740e+02 1.6250e+02 8.4210e+02 2.7217e+03 2.9395e+03 9.3150e+02 + 1.4839e+03 2.3616e+03 2.9903e+03 1.8551e+03 9.8110e+02 6.4890e+02 2.5200e+02 + 3.0860e+02 3.3170e+02 9.2350e+02 3.0630e+02 4.1130e+02 3.2160e+02 2.7970e+02 + 9.5400e+02 4.5210e+02 1.4950e+02 6.5390e+02 2.3151e+03 2.8531e+03 3.1789e+03 + 1.1176e+03 5.7940e+02 7.7140e+02 8.3070e+02 4.7440e+02 3.3540e+02 3.9310e+02 + 4.9720e+02 1.1011e+03 2.9550e+02 3.3700e+02 5.3010e+02 3.6250e+02 3.9140e+02 + 2.9210e+02 2.3860e+02 6.0640e+02 2.0215e+03 2.7366e+03 1.6662e+03 5.6070e+02 + 3.4470e+02 3.9500e+02 4.8030e+02 5.7820e+02 3.6730e+02 4.9420e+02 5.7390e+02 + 2.6450e+02 3.1510e+02 8.8380e+02 2.7740e+02 5.7380e+02 7.3660e+02 7.9900e+02 + 9.9270e+02 2.0377e+03 1.9085e+03 7.5330e+02 1.1591e+03 2.6897e+03 3.5000e+03 + 2.3165e+03 5.3870e+02 1.0417e+03 8.3870e+02 3.2850e+02 3.2340e+02 5.2710e+02 + 7.8520e+02 5.5100e+02 3.7910e+02 2.4490e+02 8.2600e+02 4.7850e+02 1.4090e+02 + 5.0990e+02 1.8140e+03 2.5362e+03 2.7726e+03 8.9060e+02 6.2680e+02 7.9980e+02 + 3.3620e+02 6.1080e+02 3.2690e+02 3.2550e+02 6.8870e+02 7.8670e+02 4.7350e+02 + 4.6700e+02 4.7750e+02 7.4230e+02 6.2310e+02 4.0690e+02 4.0950e+02 6.6790e+02 + 1.5446e+03 2.2537e+03 1.6302e+03 7.4400e+02 5.1420e+02 4.8350e+02 9.1460e+02 + 8.5380e+02 4.4930e+02 4.1910e+02 5.0980e+02 4.9190e+02 4.7400e+02 5.2930e+02 + 3.3590e+02 4.5480e+02 1.0908e+03 8.5460e+02 2.1277e+03 2.2145e+03 8.1190e+02 + 6.1190e+02 1.3392e+03 2.3485e+03 2.5153e+03 2.7286e+03 1.0731e+03 8.2980e+02 + 7.0590e+02 3.9580e+02 4.2260e+02 5.0340e+02 4.6810e+02 2.6250e+02 2.4150e+02 + 5.1580e+02 7.6700e+02 4.6720e+02 3.4670e+02 1.5975e+03 1.5774e+03 2.6130e+03 + 2.5011e+03 1.3666e+03 5.3140e+02 6.4240e+02 6.8470e+02 4.6750e+02 6.9490e+02 + 4.2440e+02 4.7430e+02 8.1010e+02 4.5980e+02 1.4640e+02 4.7630e+02 8.2020e+02 + 4.5790e+02 6.6310e+02 5.7940e+02 6.6490e+02 1.4649e+03 2.9265e+03 1.2357e+03 + 4.1950e+02 7.7140e+02 8.7200e+02 7.8810e+02 6.2520e+02 3.1810e+02 5.3240e+02 + 4.3870e+02 7.1920e+02 3.5840e+02 9.0250e+02 2.5500e+02 3.3880e+02 1.4078e+03 + 2.1480e+03 1.6925e+03 1.8505e+03 1.3761e+03 7.2440e+02 7.6420e+02 1.6507e+03 + 2.7513e+03 2.7855e+03 2.2241e+03 6.8940e+02 7.7220e+02 6.2480e+02 7.5740e+02 + 5.7800e+02 6.1960e+02 2.6920e+02 4.4420e+02 4.9560e+02 5.0350e+02 3.0390e+02 + 9.5710e+02 1.5097e+03 1.7121e+03 3.5000e+03 2.2808e+03 1.3549e+03 3.9300e+02 + 7.2490e+02 8.3310e+02 3.4040e+02 5.3770e+02 4.2960e+02 2.3790e+02 3.6830e+02 + 5.0650e+02 2.2800e+02 3.2340e+02 7.8130e+02 7.6740e+02 5.9910e+02 3.1360e+02 + 5.3010e+02 8.4450e+02 2.7989e+03 5.1870e+02 7.1420e+02 5.3880e+02 7.1420e+02 + 6.5200e+02 4.6510e+02 2.2550e+02 4.8630e+02 5.7870e+02 7.0680e+02 6.2730e+02 + 1.6209e+03 4.0320e+02 5.9590e+02 9.9250e+02 9.5920e+02 2.1878e+03 1.7297e+03 + 9.7480e+02 4.8280e+02 6.7310e+02 1.1231e+03 2.6377e+03 3.0786e+03 1.7844e+03 + 1.0613e+03 1.4047e+03 5.5040e+02 6.5010e+02 8.7310e+02 4.8220e+02 8.4450e+02 + 5.1520e+02 3.7920e+02 4.6350e+02 3.8460e+02 7.2630e+02 1.0327e+03 2.9688e+03 + 3.3104e+03 1.8955e+03 2.0951e+03 6.2610e+02 6.9870e+02 2.3190e+02 1.5220e+02 + 7.1910e+02 8.3170e+02 5.6490e+02 5.9600e+02 2.7410e+02 3.2410e+02 7.6060e+02 + 3.6150e+02 4.8240e+02 5.6830e+02 5.3110e+02 2.3910e+02 1.4781e+03 2.2600e+03 + 6.2340e+02 6.4080e+02 9.0190e+02 5.6140e+02 3.4570e+02 2.9370e+02 1.6950e+02 + 5.2610e+02 5.0250e+02 1.0120e+03 9.2120e+02 7.3120e+02 9.8370e+02 1.1953e+03 + 1.5445e+03 2.2607e+03 1.9598e+03 1.1251e+03 8.2340e+02 4.3870e+02 4.5670e+02 + 9.8660e+02 1.8887e+03 1.5900e+03 1.8112e+03 2.3463e+03 8.1890e+02 4.3750e+02 + 6.4150e+02 8.3840e+02 3.8010e+02 9.4030e+02 6.8020e+02 5.3060e+02 4.0580e+02 + 5.9700e+02 1.0127e+03 1.0345e+03 2.8696e+03 1.8634e+03 3.2893e+03 1.0944e+03 + 5.4020e+02 5.2060e+02 4.5410e+02 1.0810e+02 3.2100e+02 3.4090e+02 6.8280e+02 + 4.5200e+02 4.3580e+02 3.7840e+02 4.5870e+02 3.4680e+02 3.3220e+02 5.0790e+02 + 3.6670e+02 2.1580e+02 8.9580e+02 3.0126e+03 1.2467e+03 5.7330e+02 4.3700e+02 + 7.5820e+02 5.5530e+02 2.8150e+02 2.4070e+02 2.6610e+02 3.0730e+02 7.3290e+02 + 7.3360e+02 1.4141e+03 1.5897e+03 1.8188e+03 1.9637e+03 6.0970e+02 8.3240e+02 + 1.0857e+03 3.9090e+02 2.2260e+02 5.0210e+02 1.2616e+03 1.5619e+03 1.7571e+03 + 1.3074e+03 2.1926e+03 1.8256e+03 1.1849e+03 7.9920e+02 6.2970e+02 3.3110e+02 + 5.6210e+02 5.4680e+02 5.2750e+02 1.6960e+02 4.1440e+02 1.5839e+03 1.2631e+03 + 2.5645e+03 2.7332e+03 2.6611e+03 1.1203e+03 4.5570e+02 4.6800e+02 6.5040e+02 + 2.0380e+02 3.3930e+02 4.9640e+02 6.8610e+02 7.8140e+02 5.7520e+02 3.9570e+02 + 7.2550e+02 5.6440e+02 6.2350e+02 3.0230e+02 5.0010e+02 6.1040e+02 8.9650e+02 + 1.9272e+03 1.8237e+03 6.0130e+02 3.5790e+02 2.3480e+02 6.2750e+02 6.8590e+02 + 3.7100e+02 5.2810e+02 1.1599e+03 7.5020e+02 1.6369e+03 1.9512e+03 1.5800e+03 + 1.9953e+03 8.6850e+02 1.0153e+03 3.1280e+02 6.8460e+02 3.5480e+02 1.7460e+02 + 3.1940e+02 1.7456e+03 2.5255e+03 1.0439e+03 1.3422e+03 1.5984e+03 1.5250e+03 + 1.2699e+03 1.8599e+03 1.4378e+03 4.0950e+02 4.4980e+02 4.1290e+02 7.1880e+02 + 3.8590e+02 3.5360e+02 1.6604e+03 1.7779e+03 1.7517e+03 3.4329e+03 3.4020e+03 + 9.7190e+02 3.4500e+02 3.9050e+02 5.8140e+02 3.2730e+02 4.5020e+02 1.7680e+02 + 4.2930e+02 3.7650e+02 5.1090e+02 4.6230e+02 6.9900e+02 5.3720e+02 4.7040e+02 + 2.8460e+02 3.6060e+02 9.5730e+02 1.7197e+03 2.6476e+03 1.6974e+03 6.4950e+02 + 2.7400e+02 1.8700e+02 4.6570e+02 5.0240e+02 7.4450e+02 1.0886e+03 1.0310e+03 + 9.7650e+02 1.2106e+03 1.8452e+03 8.9100e+02 1.2358e+03 8.3270e+02 9.4680e+02 + 1.8570e+02 3.5990e+02 6.2600e+02 1.7230e+02 3.5860e+02 1.6247e+03 2.1973e+03 + 1.7097e+03 5.9020e+02 1.0085e+03 1.2161e+03 1.0723e+03 1.6884e+03 1.6221e+03 + 7.0520e+02 2.2050e+02 6.6950e+02 4.5370e+02 6.1580e+02 9.7610e+02 2.2845e+03 + 2.5148e+03 1.0943e+03 2.2192e+03 1.7490e+03 1.2750e+03 7.6510e+02 3.1110e+02 + 7.2570e+02 4.9890e+02 5.9370e+02 3.3260e+02 5.4470e+02 2.9510e+02 7.0850e+02 + 3.9410e+02 7.4430e+02 9.6200e+02 5.1320e+02 2.4180e+02 3.5900e+02 1.2920e+03 + 1.0858e+03 2.6869e+03 1.6029e+03 8.7020e+02 3.8600e+02 2.4570e+02 7.0070e+02 + 9.6030e+02 1.5381e+03 8.6900e+02 9.9040e+02 1.9954e+03 1.0616e+03 6.4470e+02 + 6.3910e+02 9.8090e+02 1.3659e+03 1.3517e+03 4.0070e+02 3.2340e+02 3.3610e+02 + 2.1010e+02 5.3240e+02 1.4228e+03 2.7735e+03 1.7278e+03 7.1670e+02 3.3060e+02 + 8.9860e+02 1.0171e+03 1.5507e+03 1.6401e+03 3.7180e+02 4.7010e+02 2.2350e+02 + 9.1720e+02 9.4740e+02 1.5055e+03 2.1575e+03 1.8410e+03 9.5510e+02 2.0795e+03 + 3.0529e+03 1.0267e+03 3.5770e+02 3.0810e+02 4.3540e+02 6.3370e+02 7.1650e+02 + 3.7180e+02 3.4160e+02 3.0100e+02 6.8080e+02 5.6060e+02 4.3690e+02 3.7000e+02 + 7.9580e+02 9.0660e+02 1.0330e+03 1.5936e+03 2.8468e+03 1.7554e+03 7.8950e+02 + 1.0274e+03 7.0070e+02 3.7200e+02 7.0120e+02 9.8680e+02 1.5434e+03 1.5981e+03 + 2.0422e+03 9.1990e+02 8.4700e+02 7.1930e+02 5.7840e+02 5.4690e+02 9.2530e+02 + 8.0890e+02 3.7250e+02 6.4530e+02 4.5700e+02 5.4230e+02 4.2630e+02 1.3332e+03 + 1.7815e+03 1.6007e+03 4.0500e+02 3.0310e+02 3.3220e+02 8.5180e+02 1.2995e+03 + 8.9730e+02 4.9460e+02 5.6630e+02 4.7280e+02 5.7460e+02 1.2451e+03 1.6463e+03 + 2.2050e+03 7.1330e+02 4.8130e+02 1.1838e+03 2.6460e+03 1.1341e+03 5.4780e+02 + 1.9240e+02 1.7980e+02 4.0130e+02 6.9300e+02 8.8610e+02 5.0240e+02 3.5920e+02 + 2.4450e+02 8.6620e+02 4.7860e+02 6.6870e+02 7.7740e+02 7.6630e+02 1.5497e+03 + 1.8594e+03 2.5541e+03 1.3107e+03 3.0030e+02 6.6980e+02 5.2980e+02 6.7370e+02 + 1.5854e+03 2.2545e+03 2.7317e+03 1.1400e+03 1.0315e+03 7.1510e+02 6.2490e+02 + 7.7520e+02 5.6420e+02 3.7220e+02 7.2690e+02 3.9720e+02 5.6360e+02 5.4560e+02 + 3.1220e+02 3.3420e+02 4.1300e+02 1.5186e+03 2.7194e+03 9.4610e+02 6.0600e+02 + 6.0470e+02 4.2350e+02 7.5950e+02 1.3683e+03 4.0650e+02 5.5850e+02 6.2660e+02 + 6.9540e+02 4.8390e+02 1.7942e+03 2.0072e+03 1.0702e+03 1.0477e+03 4.5120e+02 + 1.4803e+03 2.0484e+03 2.3909e+03 1.3504e+03 2.8900e+02 3.7000e+02 2.9590e+02 + 1.3505e+03 7.0130e+02 3.9440e+02 4.7860e+02 2.4240e+02 8.2740e+02 7.6030e+02 + 1.1326e+03 9.3790e+02 1.2091e+03 1.8608e+03 9.8370e+02 9.0400e+02 4.2770e+02 + 4.7750e+02 7.1240e+02 8.3120e+02 9.6100e+02 1.1371e+03 2.6699e+03 1.5812e+03 + 5.1780e+02 6.2800e+02 4.4350e+02 6.7230e+02 6.9660e+02 3.9570e+02 8.6130e+02 + 3.4860e+02 3.3310e+02 3.4720e+02 1.0398e+03 8.3310e+02 1.7920e+02 4.0630e+02 + 1.3367e+03 2.0686e+03 1.4755e+03 7.5820e+02 2*4.2910e+02 8.5470e+02 + 5.5160e+02 9.4300e+02 3.0880e+02 6.6830e+02 3.6940e+02 1.2092e+03 1.5355e+03 + 1.0722e+03 1.3242e+03 4.5920e+02 6.4480e+02 1.0402e+03 1.5121e+03 2.6087e+03 + 1.4649e+03 2.4990e+02 1.8290e+02 8.4950e+02 6.3510e+02 6.7260e+02 2.9810e+02 + 4.2770e+02 1.6430e+02 3.5930e+02 6.7540e+02 7.8610e+02 1.6566e+03 1.7131e+03 + 1.2627e+03 1.1396e+03 5.7390e+02 3.3000e+02 2.6010e+02 3.5330e+02 8.5880e+02 + 1.6968e+03 2.6769e+03 1.3738e+03 1.8850e+03 7.4120e+02 3.0810e+02 5.5280e+02 + 3.5200e+02 3.4820e+02 2.2960e+02 5.9570e+02 5.9620e+02 4.1080e+02 4.2940e+02 + 8.7210e+02 9.0280e+02 4.4270e+02 6.5030e+02 1.4459e+03 1.6574e+03 7.9310e+02 + 6.9520e+02 5.3080e+02 6.6050e+02 6.8050e+02 6.4350e+02 4.9580e+02 3.6670e+02 + 6.5650e+02 5.8130e+02 1.5810e+03 2.7837e+03 1.7515e+03 9.4050e+02 3.5170e+02 + 5.1150e+02 6.4500e+02 1.6085e+03 2.1638e+03 1.5683e+03 4.3880e+02 2.4530e+02 + 6.0100e+02 6.5590e+02 1.9760e+02 1.6450e+02 3.1130e+02 4.7250e+02 3.0970e+02 + 1.2601e+03 1.4917e+03 1.7148e+03 2.3250e+03 9.0300e+02 9.7360e+02 3.8170e+02 + 2.0680e+02 5.6640e+02 6.9220e+02 8.3020e+02 1.7672e+03 1.9000e+03 1.1436e+03 + 2.6150e+02 4.8290e+02 5.8800e+02 2.3830e+02 5.6200e+02 5.0780e+02 4.4130e+02 + 4.3800e+02 7.4060e+02 4.3970e+02 6.3150e+02 6.8180e+02 4.9330e+02 6.8540e+02 + 5.3930e+02 1.2615e+03 1.8823e+03 8.8330e+02 5.0610e+02 8.0810e+02 7.0940e+02 + 6.8460e+02 5.3360e+02 4.2110e+02 3.2490e+02 6.8980e+02 1.5455e+03 1.1081e+03 + 7.1390e+02 1.3268e+03 1.5920e+02 6.9960e+02 6.7460e+02 8.8330e+02 7.6110e+02 + 2.2435e+03 2.0562e+03 6.4540e+02 4.7510e+02 5.8480e+02 5.5810e+02 5.4030e+02 + 2.8030e+02 5.8110e+02 6.2250e+02 9.1170e+02 1.0152e+03 1.9905e+03 2.4765e+03 + 1.8759e+03 8.8350e+02 2.7810e+02 3.8150e+02 1.9140e+02 5.7860e+02 1.4691e+03 + 1.8753e+03 1.1290e+03 1.2700e+03 5.7460e+02 3.5520e+02 3.1150e+02 4.4510e+02 + 5.2050e+02 3.9000e+02 4.2480e+02 4.0400e+02 4.5250e+02 4.6470e+02 4.4500e+02 + 4.4430e+02 1.3156e+03 5.1870e+02 5.3990e+02 2.0240e+02 1.7101e+03 2.5068e+03 + 6.2890e+02 5.4990e+02 3.1960e+02 2.4570e+02 4.2490e+02 3.3200e+02 4.6600e+02 + 9.5730e+02 5.1450e+02 1.2885e+03 2.4496e+03 1.7686e+03 7.4620e+02 4.4880e+02 + 3.7670e+02 5.5230e+02 4.4510e+02 7.5470e+02 2.3553e+03 1.6049e+03 9.5130e+02 + 4.2960e+02 5.6370e+02 6.7830e+02 3.9490e+02 4.5010e+02 6.9690e+02 1.5964e+03 + 6.8570e+02 1.6348e+03 1.9619e+03 9.5670e+02 1.3672e+03 2.8220e+02 3.5740e+02 + 4.9350e+02 1.0198e+03 1.4827e+03 1.7345e+03 1.8882e+03 2.1702e+03 1.3169e+03 + 2.2440e+02 2.2220e+02 3.1460e+02 3.0640e+02 2.5250e+02 2.1490e+02 2.6960e+02 + 4.8170e+02 6.2010e+02 4.2790e+02 2.7410e+02 7.3300e+02 7.3580e+02 7.2420e+02 + 6.3160e+02 1.5685e+03 1.1824e+03 2.2661e+03 1.3417e+03 5.8450e+02 4.0430e+02 + 8.8800e+02 4.0090e+02 2.8890e+02 3.1100e+02 1.2906e+03 8.9130e+02 1.9586e+03 + 1.6217e+03 1.5346e+03 4.4570e+02 3.2690e+02 2.5900e+02 7.2730e+02 6.0230e+02 + 4.4270e+02 1.1361e+03 2.6945e+03 1.7849e+03 7.9140e+02 7.9090e+02 7.2290e+02 + 6.6780e+02 3.4240e+02 7.9480e+02 7.1680e+02 1.9251e+03 2.5103e+03 1.0355e+03 + 9.9360e+02 2.1770e+02 5.1930e+02 4.7610e+02 4.2470e+02 7.1110e+02 1.9560e+03 + 1.9318e+03 8.3060e+02 1.0125e+03 7.4540e+02 3.7470e+02 1.2180e+02 5.0510e+02 + 6.4170e+02 5.7280e+02 4.3300e+02 4.2270e+02 5.8280e+02 5.4510e+02 2.2560e+02 + 1.7550e+02 4.1920e+02 6.3730e+02 7.0430e+02 4.1610e+02 1.3528e+03 1.6687e+03 + 2.2425e+03 1.1166e+03 6.5420e+02 3.4420e+02 5.6840e+02 4.3900e+02 3.1060e+02 + 4.9830e+02 8.4260e+02 1.2102e+03 1.6442e+03 2.3576e+03 9.2980e+02 5.5960e+02 + 4.8780e+02 5.4550e+02 4.3680e+02 7.9940e+02 4.8450e+02 1.6772e+03 1.6381e+03 + 2.9223e+03 1.7417e+03 9.0930e+02 8.3420e+02 2.2900e+02 4.2140e+02 6.2780e+02 + 1.4194e+03 1.7786e+03 9.7620e+02 1.1949e+03 5.5610e+02 2.2660e+02 5.7660e+02 + 8.4020e+02 1.5001e+03 1.6613e+03 1.7261e+03 1.6719e+03 6.4840e+02 5.8280e+02 + 8.7110e+02 3.0670e+02 2.4720e+02 2.6050e+02 4.2610e+02 6.1310e+02 6.3640e+02 + 5.7250e+02 3.6990e+02 2.5650e+02 3.7470e+02 3.1930e+02 4.6030e+02 4.7400e+02 + 5.4590e+02 3.5700e+02 1.4871e+03 2.1354e+03 1.4470e+03 1.0751e+03 3.6510e+02 + 4.6090e+02 5.3500e+02 2.4280e+02 4.0650e+02 7.8320e+02 1.9036e+03 1.5516e+03 + 2.2986e+03 1.7345e+03 4.5900e+02 3.6200e+02 1.3780e+02 5.8590e+02 6.9350e+02 + 6.9630e+02 3.0880e+02 7.8530e+02 7.2100e+02 6.5160e+02 2.4126e+03 1.8137e+03 + 5.7650e+02 2.4950e+02 2.9430e+02 8.9710e+02 8.4740e+02 2.2123e+03 1.3081e+03 + 5.6770e+02 3.4440e+02 5.4900e+02 8.3110e+02 1.2088e+03 1.1973e+03 1.6938e+03 + 2.1509e+03 9.4720e+02 3.9890e+02 3.3190e+02 6.8960e+02 7.6340e+02 6.5270e+02 + 6.0910e+02 4.8250e+02 9.7280e+02 6.4480e+02 4.2640e+02 7.0400e+02 8.5420e+02 + 3.5320e+02 3.8830e+02 1.8070e+02 2.6490e+02 2.7630e+02 5.9670e+02 1.7282e+03 + 1.6449e+03 7.7240e+02 9.6560e+02 5.0550e+02 7.8030e+02 5.1320e+02 4.9920e+02 + 2.4610e+02 4.2040e+02 1.0641e+03 1.0700e+03 2.5166e+03 1.2254e+03 1.3676e+03 + 6.5170e+02 7.0730e+02 8.1170e+02 1.0045e+03 6.8060e+02 4.3190e+02 5.2590e+02 + 1.2971e+03 8.4370e+02 2.1229e+03 2.1530e+03 1.0393e+03 7.3070e+02 7.2070e+02 + 1.1361e+03 2.2497e+03 1.4677e+03 1.2761e+03 6.6070e+02 7.3350e+02 5.8160e+02 + 1.0533e+03 1.5705e+03 1.6095e+03 1.2123e+03 9.5510e+02 5.3780e+02 3.1830e+02 + 3.9920e+02 5.4580e+02 5.4250e+02 6.1100e+02 5.0680e+02 3.4550e+02 5.8830e+02 + 5.0660e+02 3.3670e+02 6.7040e+02 6.5800e+02 6.0920e+02 6.2510e+02 5.1260e+02 + 5.3170e+02 5.2360e+02 7.3940e+02 1.5957e+03 1.8298e+03 1.4568e+03 6.0280e+02 + 4.7940e+02 2.5800e+02 9.2620e+02 7.5970e+02 6.2860e+02 5.7520e+02 1.7911e+03 + 1.9733e+03 2.8742e+03 1.5563e+03 8.1460e+02 9.1870e+02 4.9490e+02 4.2180e+02 + 6.6880e+02 5.8650e+02 2.9860e+02 7.7540e+02 3.9170e+02 7.8770e+02 1.0439e+03 + 1.7271e+03 1.5537e+03 1.7402e+03 5.5780e+02 1.9786e+03 1.5257e+03 1.1183e+03 + 1.0052e+03 6.1540e+02 3.1270e+02 1.3995e+03 8.5010e+02 1.3750e+03 1.3172e+03 + 7.9310e+02 8.9060e+02 5.8380e+02 5.1970e+02 4.4420e+02 2.6160e+02 6.4830e+02 + 8.0010e+02 4.8500e+02 6.9190e+02 3.6650e+02 3.1560e+02 2.8080e+02 7.3410e+02 + 5.6830e+02 4.1490e+02 6.7520e+02 3.9390e+02 7.3750e+02 7.9010e+02 1.8913e+03 + 1.9352e+03 1.1381e+03 5.5980e+02 7.3880e+02 5.4480e+02 5.7070e+02 7.8440e+02 + 9.6110e+02 4.0970e+02 5.7130e+02 1.9059e+03 3.3836e+03 2.1596e+03 1.5457e+03 + 7.3100e+02 4.1240e+02 5.0500e+02 7.7850e+02 7.4240e+02 5.0910e+02 3.7170e+02 + 4.1050e+02 4.4620e+02 3.1350e+02 8.2820e+02 1.4361e+03 1.6470e+03 2.1999e+03 + 1.7935e+03 1.8854e+03 1.6795e+03 1.7875e+03 6.4020e+02 1.4498e+03 1.0050e+03 + 1.1270e+03 2.2661e+03 1.7012e+03 8.0360e+02 7.6850e+02 6.2890e+02 5.5210e+02 + 6.0890e+02 2.7810e+02 3.4910e+02 5.3260e+02 3.8360e+02 4.5960e+02 8.4060e+02 + 6.7330e+02 2.6230e+02 3.1690e+02 3.5100e+02 5.5080e+02 4.2830e+02 5.3850e+02 + 1.0818e+03 7.1090e+02 8.5190e+02 1.9540e+03 1.3782e+03 1.0456e+03 7.6040e+02 + 8.0230e+02 3.7810e+02 1.9340e+02 6.5390e+02 5.5520e+02 4.6610e+02 5.4700e+02 + 8.0180e+02 3.5000e+03 2.6920e+03 1.1428e+03 9.8350e+02 5.5900e+02 3.0150e+02 + 4.7180e+02 4.8500e+02 6.3320e+02 2.7350e+02 3.7790e+02 4.8650e+02 4.3930e+02 + 4.1900e+02 1.4518e+03 1.0910e+03 1.3623e+03 1.3943e+03 2.5818e+03 3.5000e+03 + 1.7200e+03 2.3885e+03 1.9682e+03 2.1879e+03 1.0523e+03 1.0743e+03 7.0990e+02 + 9.2800e+02 4.4720e+02 3.4340e+02 6.9400e+02 6.3250e+02 3.7750e+02 4.3790e+02 + 4.3370e+02 3.9750e+02 3.7120e+02 7.4380e+02 6.0090e+02 4.2520e+02 4.1100e+02 + 4.1060e+02 2.6260e+02 3.7900e+02 5.3370e+02 4.8700e+02 5.8770e+02 1.5637e+03 + 1.7737e+03 1.0659e+03 1.1313e+03 5.2080e+02 1.1330e+03 5.9560e+02 3.5390e+02 + 5.0390e+02 4.4660e+02 6.0840e+02 7.1580e+02 1.3670e+03 2.2620e+03 3.5000e+03 + 1.5449e+03 8.1130e+02 4.8380e+02 4.2950e+02 6.4160e+02 7.2390e+02 4.5780e+02 + 3.8630e+02 4.3210e+02 3.3670e+02 6.7720e+02 4.1210e+02 5.3950e+02 1.1297e+03 + 8.6920e+02 1.7170e+03 1.8811e+03 2.3833e+03 3.2199e+03 3.0341e+03 2.1432e+03 + 1.4260e+03 9.5980e+02 1.1584e+03 7.5510e+02 9.7830e+02 3.7520e+02 2.8120e+02 + 3.8420e+02 5.6280e+02 2.6370e+02 4.7240e+02 7.0610e+02 3.3030e+02 3.6910e+02 + 7.2530e+02 6.6630e+02 7.4090e+02 7.6970e+02 4.3230e+02 3.0960e+02 4.6700e+02 + 5.2370e+02 4.6020e+02 8.1610e+02 1.9214e+03 1.9732e+03 8.0540e+02 4.1150e+02 + 2.0990e+02 8.5660e+02 9.7800e+02 1.7810e+02 4.1140e+02 4.8830e+02 3.5960e+02 + 5.3760e+02 6.1920e+02 2.4006e+03 3.0274e+03 1.7989e+03 8.1960e+02 4.7980e+02 + 3.3220e+02 4.4040e+02 5.3130e+02 4.6730e+02 5.9680e+02 3.6110e+02 4.2280e+02 + 4.3480e+02 5.1110e+02 1.1253e+03 4.8790e+02 9.8400e+02 8.7880e+02 2.9275e+03 + 2*3.5000e+03 2.8024e+03 3.3511e+03 2.1097e+03 1.6687e+03 5.0280e+02 + 8.3390e+02 7.9620e+02 2.9250e+02 5.2440e+02 5.5680e+02 1.0347e+03 6.3260e+02 + 5.2270e+02 5.5720e+02 3.2160e+02 3.0370e+02 8.4690e+02 4.4440e+02 3.9670e+02 + 5.2260e+02 4.1130e+02 1.6880e+02 5.9240e+02 5.8330e+02 5.7870e+02 1.2366e+03 + 2.1744e+03 1.1001e+03 8.9800e+02 3.1740e+02 2.7520e+02 1.0169e+03 1.0442e+03 + 2.9180e+02 7.9100e+02 4.1920e+02 4.4120e+02 1.6780e+02 6.3530e+02 2.0641e+03 + 3.5000e+03 3.4776e+03 6.8330e+02 4.3560e+02 4.0820e+02 4.8490e+02 4.7240e+02 + 3.1120e+02 7.2690e+02 3.3280e+02 4.6780e+02 4.7960e+02 2.7430e+02 2.0150e+02 + 2.8520e+02 6.1670e+02 8.4330e+02 2.1870e+03 2.9411e+03 6.6830e+02 1.9708e+03 + 2.6285e+03 3.0499e+03 1.8269e+03 1.5641e+03 1.0053e+03 3.4960e+02 2.7640e+02 + 3.7690e+02 6.2240e+02 2.8380e+02 5.8100e+02 6.3030e+02 5.0010e+02 3.6710e+02 + 5.5700e+02 4.3250e+02 4.2300e+02 4.8920e+02 4.4110e+02 5.4240e+02 3.2540e+02 + 6.6630e+02 9.5840e+02 4.0710e+02 1.3066e+03 1.1871e+03 1.4719e+03 1.3823e+03 + 5.0460e+02 2.9330e+02 5.4380e+02 6.6600e+02 6.6570e+02 4.5930e+02 6.3940e+02 + 7.2540e+02 5.2350e+02 8.7310e+02 1.3353e+03 3.3967e+03 3.3074e+03 1.2869e+03 + 1.0017e+03 6.5270e+02 4.4510e+02 4.4970e+02 4.1240e+02 5.6180e+02 4.0210e+02 + 2.9680e+02 3.2870e+02 8.6800e+01 1.2310e+02 1.8730e+02 4.7210e+02 6.1650e+02 + 1.8905e+03 1.7824e+03 1.8700e+03 8.4010e+02 1.6329e+03 1.8770e+03 1.3131e+03 + 9.4990e+02 1.5824e+03 1.8446e+03 2.6840e+02 4.9530e+02 7.0090e+02 4.7900e+02 + 5.5630e+02 8.6400e+02 4.2850e+02 5.3260e+02 4.3500e+02 6.9790e+02 2.9690e+02 + 2.9130e+02 6.1990e+02 4.4910e+02 2.8400e+02 6.4550e+02 9.4620e+02 5.1700e+02 + 1.8161e+03 9.5610e+02 3.4860e+02 6.2440e+02 4.6880e+02 3.3810e+02 2.1370e+02 + 6.9260e+02 6.9140e+02 4.1010e+02 6.4510e+02 8.6260e+02 3.9750e+02 7.9580e+02 + 8.6640e+02 3.1549e+03 3.2362e+03 1.3120e+03 8.8960e+02 5.1530e+02 3.0220e+02 + 4.5030e+02 6.5740e+02 6.7150e+02 5.1900e+02 3.9820e+02 3.9500e+02 2.8650e+02 + 9.8300e+01 1.0660e+02 4.7560e+02 6.9310e+02 1.6132e+03 1.7725e+03 7.2480e+02 + 7.8360e+02 8.3870e+02 1.7863e+03 1.3650e+03 9.4620e+02 1.8079e+03 1.6174e+03 + 7.8540e+02 2.6910e+02 3.8380e+02 4.0620e+02 8.9530e+02 6.5230e+02 2.4000e+02 + 4.9120e+02 7.3750e+02 8.6500e+02 3.4530e+02 6.9540e+02 1.3672e+03 6.8690e+02 + 3.2440e+02 8.0960e+02 1.1125e+03 1.5621e+03 2.2922e+03 1.0582e+03 3.7090e+02 + 4.1980e+02 7.3230e+02 4.8540e+02 3.4440e+02 2.6020e+02 5.1610e+02 5.2280e+02 + 4.0240e+02 8.6780e+02 6.1720e+02 7.2270e+02 1.6068e+03 1.2376e+03 1.6671e+03 + 9.4780e+02 9.6220e+02 4.3820e+02 3.2670e+02 2.4150e+02 3.6330e+02 5.9590e+02 + 7.0570e+02 6.5170e+02 3.9770e+02 2.3240e+02 1.9780e+02 5.3780e+02 7.2600e+02 + 1.4856e+03 1.5018e+03 2.0047e+03 6.9450e+02 5.5770e+02 1.2052e+03 9.7090e+02 + 1.1110e+03 1.3475e+03 1.6446e+03 2.3101e+03 1.6609e+03 1.1973e+03 1.4138e+03 + 4.2910e+02 1.1497e+03 8.8560e+02 6.5860e+02 4.5130e+02 6.0160e+02 5.0300e+02 + 4.0070e+02 5.2330e+02 9.2150e+02 6.2800e+02 4.1430e+02 4.9970e+02 1.1199e+03 + 1.7642e+03 2.5117e+03 1.2747e+03 3.0470e+02 3.3920e+02 6.9460e+02 2.0810e+02 + 1.9630e+02 6.9240e+02 2.7890e+02 2.0540e+02 5.3370e+02 6.8310e+02 8.9290e+02 + 1.1486e+03 4.1810e+02 1.6587e+03 2.1621e+03 1.0568e+03 8.0630e+02 3.4090e+02 + 5.6190e+02 8.6440e+02 4.4660e+02 5.6470e+02 6.1360e+02 8.3480e+02 6.3940e+02 + 3.0240e+02 2.5290e+02 7.0210e+02 8.0160e+02 1.6714e+03 1.8873e+03 1.3146e+03 + 4.8410e+02 2.8140e+02 3.0770e+02 6.7980e+02 9.6300e+02 8.3100e+02 1.2787e+03 + 1.5469e+03 1.9614e+03 1.7109e+03 1.7297e+03 1.2265e+03 8.5040e+02 6.1120e+02 + 5.1250e+02 3.8390e+02 6.5730e+02 5.6640e+02 5.5610e+02 8.5330e+02 7.6420e+02 + 3.3810e+02 3.2890e+02 1.1311e+03 1.4617e+03 1.2701e+03 1.2724e+03 1.1412e+03 + 8.0550e+02 6.4160e+02 5.2520e+02 3.9560e+02 2.8800e+02 8.3510e+02 2.4000e+02 + 1.5170e+02 4.3290e+02 8.2770e+02 8.5780e+02 1.3705e+03 1.0162e+03 1.1332e+03 + 1.7613e+03 1.0455e+03 7.7250e+02 1.7570e+02 3.2810e+02 3.8570e+02 4.3180e+02 + 3.1520e+02 1.1241e+03 1.3198e+03 6.0030e+02 4.1360e+02 7.2710e+02 8.5710e+02 + 6.5310e+02 1.1162e+03 2.5386e+03 1.4565e+03 5.3940e+02 2.1000e+02 3.6080e+02 + 7.2150e+02 8.8180e+02 5.0290e+02 9.5300e+02 1.2082e+03 1.6136e+03 1.5438e+03 + 8.8490e+02 1.2070e+03 1.4182e+03 7.4460e+02 6.4790e+02 6.0300e+02 5.0940e+02 + 6.0910e+02 1.4289e+03 1.0966e+03 5.6330e+02 4.1010e+02 6.7130e+02 7.0030e+02 + 1.1606e+03 1.5758e+03 1.7039e+03 6.7530e+02 1.1943e+03 3.6710e+02 3.6350e+02 + 6.7090e+02 3.7810e+02 6.2370e+02 6.2650e+02 2.0370e+02 2.1220e+02 6.5210e+02 + 1.0401e+03 9.8010e+02 1.0186e+03 1.0996e+03 1.3648e+03 1.6963e+03 9.6720e+02 + 6.9980e+02 5.4730e+02 5.3140e+02 5.0310e+02 2.7880e+02 7.6680e+02 1.0017e+03 + 4.9990e+02 2.5750e+02 5.1530e+02 7.8140e+02 8.3250e+02 1.6508e+03 1.9263e+03 + 1.1162e+03 5.2090e+02 2.7240e+02 4.2070e+02 3.3840e+02 1.0687e+03 8.9380e+02 + 1.0652e+03 9.0120e+02 1.5029e+03 8.5900e+02 1.4006e+03 2.0122e+03 8.3970e+02 + 1.5007e+03 6.7770e+02 5.3530e+02 6.0820e+02 6.0000e+02 8.4890e+02 7.8190e+02 + 2.4130e+02 4.3900e+02 8.1980e+02 1.5511e+03 2.3133e+03 8.6760e+02 9.6300e+02 + 8.9040e+02 4.5920e+02 4.9600e+02 7.5400e+02 3.2270e+02 4.7110e+02 8.8920e+02 + 6.8010e+02 5.4040e+02 3.4710e+02 5.2470e+02 1.2229e+03 7.6930e+02 1.1629e+03 + 9.9640e+02 1.5849e+03 2.0200e+03 1.0427e+03 3.8320e+02 6.8040e+02 7.0610e+02 + 4.8620e+02 3.6470e+02 5.7440e+02 1.1082e+03 4.7960e+02 3.2950e+02 3.9630e+02 + 9.0380e+02 1.7880e+03 1.8582e+03 1.9307e+03 5.5040e+02 4.5630e+02 2.3010e+02 + 6.1050e+02 4.6870e+02 4.2630e+02 5.3340e+02 5.6690e+02 6.9860e+02 7.5450e+02 + 9.7480e+02 1.5749e+03 1.2266e+03 1.6057e+03 1.5887e+03 9.2780e+02 5.3770e+02 + 3.7670e+02 4.5530e+02 9.1390e+02 7.3910e+02 3.5240e+02 3.9480e+02 6.9410e+02 + 1.4932e+03 1.9959e+03 5.0980e+02 7.1580e+02 7.2070e+02 6.8790e+02 4.0750e+02 + 4.0780e+02 3.7440e+02 2.9150e+02 1.1172e+03 6.0270e+02 2.9330e+02 4.0200e+02 + 4.1660e+02 9.8190e+02 4.0740e+02 9.4200e+02 1.5148e+03 1.1346e+03 1.5130e+03 + 1.1163e+03 7.4010e+02 7.3620e+02 1.0651e+03 4.9300e+02 3.9440e+02 6.3000e+02 + 4.9110e+02 1.1343e+03 9.0020e+02 3.8540e+02 7.4700e+02 1.5211e+03 1.7711e+03 + 2.2666e+03 7.1200e+02 3.7470e+02 7.4330e+02 3.1250e+02 3.1480e+02 1.2189e+03 + 6.0640e+02 4.6810e+02 5.6160e+02 4.8440e+02 4.9970e+02 1.0562e+03 1.1889e+03 + 1.6838e+03 1.8140e+03 1.6284e+03 5.0860e+02 4.3330e+02 6.3130e+02 7.8450e+02 + 3.3210e+02 4.6100e+02 7.0000e+02 1.0035e+03 9.5470e+02 1.7846e+03 7.7260e+02 + 1.0024e+03 4.7030e+02 3.2920e+02 6.2730e+02 2.1050e+02 2.2040e+02 4.6990e+02 + 7.9240e+02 5.4420e+02 5.9930e+02 5.7950e+02 6.8070e+02 5.0200e+02 9.4300e+02 + 4.9420e+02 1.4449e+03 1.2855e+03 1.7584e+03 1.8728e+03 1.0353e+03 1.1298e+03 + 1.3312e+03 7.1070e+02 3.5490e+02 5.2500e+02 4.6060e+02 6.1300e+02 5.9350e+02 + 5.8750e+02 1.5425e+03 1.6285e+03 1.8025e+03 1.0813e+03 3.7290e+02 5.3020e+02 + 6.1740e+02 4.0340e+02 6.5340e+02 6.8500e+02 5.6240e+02 5.2280e+02 2.4860e+02 + 4.4510e+02 7.9090e+02 4.3110e+02 9.2790e+02 1.4712e+03 2.2297e+03 1.7733e+03 + 9.8710e+02 6.0490e+02 7.6520e+02 7.9100e+02 3.5350e+02 2.8340e+02 9.3910e+02 + 7.4670e+02 2.3500e+03 1.7085e+03 8.2440e+02 6.2780e+02 3.8550e+02 5.2130e+02 + 5.0710e+02 6.4110e+02 3.0080e+02 7.3460e+02 7.2750e+02 6.8360e+02 6.2660e+02 + 6.2770e+02 4.7200e+02 6.8150e+02 8.2690e+02 7.5140e+02 1.2428e+03 8.5240e+02 + 1.2476e+03 1.2674e+03 1.9108e+03 1.1380e+03 9.2830e+02 7.7310e+02 3.3880e+02 + 4.9050e+02 6.6090e+02 4.3590e+02 4.4690e+02 3.5540e+02 1.0874e+03 2.0271e+03 + 2.2284e+03 6.7610e+02 4.5900e+02 3.9910e+02 5.6210e+02 3.2620e+02 6.2360e+02 + 9.5490e+02 4.8970e+02 4.7970e+02 5.2250e+02 5.1210e+02 4.0040e+02 6.6300e+02 + 1.2197e+03 9.5720e+02 1.4089e+03 1.9017e+03 1.9896e+03 1.3054e+03 7.1660e+02 + 3.3930e+02 4.2790e+02 3.1560e+02 9.4430e+02 8.2930e+02 2.5140e+03 1.7411e+03 + 5.5240e+02 6.4240e+02 3.8750e+02 5.8780e+02 4.4600e+02 5.9950e+02 2.0690e+02 + 5.1460e+02 7.2240e+02 4.8680e+02 4.7070e+02 6.1160e+02 3.2680e+02 6.4140e+02 + 1.7053e+03 1.2078e+03 1.1995e+03 1.0902e+03 1.8342e+03 1.7990e+03 2.0760e+03 + 1.8493e+03 1.2877e+03 4.9180e+02 5.0350e+02 5.2620e+02 5.9710e+02 1.6970e+02 + 4.3700e+02 5.8030e+02 1.8694e+03 1.6988e+03 1.8604e+03 8.1710e+02 5.5830e+02 + 1.0616e+03 7.0470e+02 3.3070e+02 6.3880e+02 4.4200e+02 3.3510e+02 2.1460e+02 + 8.3420e+02 5.9080e+02 4.9200e+02 5.2320e+02 6.9530e+02 7.7320e+02 1.0646e+03 + 2.1297e+03 2.1981e+03 1.8626e+03 1.1742e+03 4.9240e+02 3.0430e+02 4.1270e+02 + 4.3530e+02 9.9950e+02 2.6593e+03 2.0672e+03 3.4570e+02 6.2470e+02 4.6830e+02 + 6.5430e+02 7.7370e+02 4.8890e+02 3.1430e+02 3.7300e+02 5.6100e+02 3.1440e+02 + 3.2690e+02 7.3190e+02 2.4520e+02 6.8420e+02 1.7517e+03 7.5050e+02 1.3878e+03 + 1.6025e+03 8.5500e+02 2.2065e+03 3.4026e+03 2.8107e+03 1.6423e+03 3.8850e+02 + 6.3290e+02 5.4990e+02 6.4620e+02 4.4940e+02 3.9420e+02 8.9330e+02 2.3516e+03 + 2.0024e+03 9.6360e+02 4.3810e+02 4.8700e+02 9.6000e+02 1.0037e+03 3.1160e+02 + 7.4180e+02 4.2980e+02 3.0530e+02 1.5980e+02 6.9340e+02 6.7200e+02 8.9510e+02 + 6.0070e+02 6.3220e+02 5.0840e+02 6.1670e+02 1.0388e+03 2.2352e+03 1.3055e+03 + 1.0996e+03 5.8900e+02 5.3390e+02 4.5870e+02 5.4260e+02 7.1000e+02 2.7437e+03 + 1.2751e+03 2.9290e+02 5.0840e+02 5.4830e+02 4.2580e+02 8.4820e+02 6.4010e+02 + 3.2540e+02 2.3220e+02 5.4390e+02 3.3060e+02 4.0940e+02 3.9890e+02 2.2740e+02 + 2.7520e+02 7.1610e+02 1.0274e+03 1.4535e+03 1.8118e+03 1.8641e+03 1.2460e+03 + 3.4376e+03 2.6513e+03 2.7342e+03 1.1081e+03 5.9970e+02 6.4850e+02 7.3790e+02 + 4.8710e+02 9.7770e+02 8.8360e+02 8.5470e+02 1.5726e+03 8.0550e+02 4.4650e+02 + 1.2990e+02 8.9110e+02 1.3948e+03 4.0750e+02 7.9330e+02 6.9960e+02 4.0610e+02 + 2.2360e+02 3.3190e+02 5.5320e+02 5.9780e+02 6.2460e+02 7.8480e+02 4.7850e+02 + 4.9820e+02 6.3500e+02 1.9655e+03 2.0985e+03 1.5869e+03 5.2390e+02 3.6240e+02 + 5.5520e+02 8.6830e+02 1.6468e+03 1.7101e+03 5.7560e+02 2.6650e+02 2.8820e+02 + 3.6050e+02 7.0610e+02 1.1010e+03 5.0140e+02 3.1500e+02 5.7060e+02 4.8870e+02 + 5.4510e+02 4.9550e+02 4.1740e+02 2.2900e+02 2.3210e+02 3.9980e+02 7.3920e+02 + 5.1840e+02 7.9160e+02 9.2450e+02 1.6233e+03 1.5387e+03 2.4824e+03 2.9053e+03 + 1.5830e+03 1.4100e+03 4.4030e+02 5.3270e+02 9.3050e+02 1.6044e+03 5.4670e+02 + 1.6386e+03 8.8780e+02 1.1744e+03 4.7370e+02 1.9580e+02 6.8680e+02 1.5001e+03 + 7.6640e+02 4.9060e+02 8.8010e+02 4.7180e+02 5.0190e+02 5.0090e+02 6.0420e+02 + 5.7420e+02 8.8820e+02 9.2140e+02 8.5510e+02 7.6400e+02 5.9300e+02 1.8217e+03 + 1.7693e+03 1.5247e+03 8.2820e+02 4.7800e+02 5.7550e+02 1.0077e+03 1.5036e+03 + 1.7299e+03 6.0800e+02 3.8370e+02 1.4570e+02 4.9800e+02 3.5790e+02 8.4760e+02 + 6.0440e+02 4.6660e+02 8.1510e+02 4.5790e+02 3.3300e+02 2.6390e+02 2.4090e+02 + 3.2770e+02 1.6040e+02 6.5470e+02 2.9870e+02 2.7840e+02 9.9330e+02 7.5670e+02 + 7.0830e+02 1.3391e+03 1.5989e+03 3.3952e+03 3.5000e+03 2.4973e+03 1.2049e+03 + 7.1840e+02 1.5544e+03 1.5873e+03 1.3406e+03 1.4124e+03 7.3520e+02 6.6850e+02 + 2.8850e+02 1.7610e+02 4.3330e+02 8.1610e+02 6.2500e+02 3.4580e+02 5.9080e+02 + 4.8420e+02 9.6460e+02 7.1490e+02 4.2380e+02 1.8490e+02 6.0300e+02 9.9850e+02 + 4.4960e+02 5.9760e+02 7.5210e+02 9.9120e+02 2.5196e+03 7.2140e+02 5.5650e+02 + 6.7960e+02 7.3640e+02 7.1430e+02 7.5640e+02 2.6518e+03 4.2890e+02 2.8010e+02 + 3.4790e+02 4.1990e+02 5.0100e+02 4.1300e+02 5.1640e+02 5.3920e+02 1.5878e+03 + 6.5520e+02 3.8180e+02 3.0370e+02 1.7170e+02 2.5610e+02 3.5040e+02 5.1490e+02 + 4.0570e+02 2.2170e+02 1.1429e+03 8.1290e+02 9.4160e+02 4.8180e+02 4.4990e+02 + 2.2530e+03 3.4263e+03 3.3646e+03 1.5789e+03 7.4190e+02 1.5661e+03 3.0945e+03 + 1.6521e+03 1.0169e+03 4.0580e+02 5.9500e+02 2.3980e+02 4.6590e+02 3.7690e+02 + 5.2310e+02 5.7670e+02 3.2400e+02 3.0970e+02 3.4620e+02 1.0979e+03 5.5750e+02 + 2.8670e+02 5.2980e+02 4.4770e+02 3.7040e+02 3.6880e+02 5.8180e+02 5.9010e+02 + 1.0941e+03 3.1313e+03 6.7190e+02 1.0873e+03 8.6490e+02 5.6760e+02 3.6550e+02 + 1.0319e+03 2.0703e+03 7.4140e+02 2.7240e+02 3.8620e+02 4.1920e+02 4.7560e+02 + 6.6160e+02 5.5960e+02 6.0430e+02 1.2524e+03 8.5690e+02 6.1830e+02 6.3650e+02 + 1.2550e+02 2.3410e+02 4.6420e+02 4.9230e+02 6.1360e+02 2.4430e+02 5.9160e+02 + 8.3650e+02 7.3680e+02 4.0630e+02 4.6490e+02 1.4765e+03 1.6286e+03 2.3670e+03 + 1.9411e+03 2.9281e+03 3.2676e+03 2.9679e+03 1.3598e+03 1.0658e+03 4.8850e+02 + 5.8730e+02 5.6060e+02 4.9660e+02 8.3900e+02 6.3420e+02 5.0810e+02 4.3700e+02 + 4.6570e+02 3.8850e+02 5.4840e+02 8.0450e+02 2.7540e+02 2.4800e+02 3.8590e+02 + 2.7640e+02 3.1380e+02 5.9190e+02 1.0036e+03 8.7340e+02 2.5050e+03 9.7580e+02 + 9.9740e+02 8.5180e+02 4.0330e+02 4.6400e+02 2.0333e+03 2.5259e+03 6.6140e+02 + 2.8280e+02 4.2500e+02 8.9410e+02 6.2680e+02 4.7240e+02 5.5130e+02 7.4580e+02 + 8.9290e+02 7.1020e+02 1.0955e+03 3.3120e+02 4.2540e+02 5.5100e+02 4.5100e+02 + 3.2800e+02 9.0900e+02 4.8950e+02 3.3730e+02 1.1915e+03 5.5440e+02 5.1860e+02 + 2.9670e+02 5.3710e+02 1.2567e+03 2.0223e+03 2.5112e+03 3.5000e+03 3.0882e+03 + 1.2461e+03 1.5570e+03 6.9980e+02 5.6760e+02 2.9910e+02 3.8080e+02 5.4100e+02 + 5.7410e+02 5.4820e+02 2.3030e+02 5.3970e+02 5.5750e+02 3.2830e+02 2.6170e+02 + 5.9580e+02 7.5210e+02 3.4350e+02 3.9510e+02 3.8010e+02 3.6930e+02 5.6750e+02 + 7.4930e+02 8.2200e+02 2.3279e+03 8.8220e+02 7.8770e+02 4.8820e+02 4.1690e+02 + 7.1720e+02 1.6463e+03 1.7021e+03 1.1117e+03 4.3960e+02 5.5480e+02 6.7370e+02 + 6.3880e+02 4.0300e+02 4.2300e+02 5.0780e+02 5.0720e+02 4.3020e+02 7.8820e+02 + 4.3000e+02 4.4350e+02 8.5160e+02 7.0370e+02 5.6840e+02 1.0231e+03 4.7300e+02 + 4.0360e+02 7.1270e+02 7.1460e+02 4.8220e+02 4.6490e+02 4.1080e+02 1.4889e+03 + 1.7115e+03 2.1829e+03 3.5000e+03 2.7480e+03 7.2820e+02 7.6680e+02 7.7910e+02 + 7.0160e+02 6.0450e+02 6.4520e+02 5.1380e+02 5.5320e+02 3.2100e+02 7.1530e+02 + 6.3190e+02 9.3860e+02 2.4030e+02 2.6920e+02 4.0010e+02 4.8680e+02 2.5040e+02 + 2.8280e+02 3.7610e+02 5.9670e+02 6.7050e+02 7.3230e+02 7.8930e+02 1.7289e+03 + 1.0639e+03 7.0680e+02 3.7980e+02 3.4240e+02 1.1043e+03 1.5519e+03 2.1914e+03 + 1.0306e+03 6.7190e+02 6.8490e+02 5.2200e+02 5.2940e+02 4.2820e+02 6.2910e+02 + 5.0750e+02 5.1970e+02 4.1450e+02 3.7760e+02 8.6280e+02 6.1910e+02 4.7740e+02 + 3.5390e+02 6.6660e+02 8.0230e+02 4.4830e+02 2.2650e+02 5.7450e+02 5.8450e+02 + 4.7720e+02 5.1300e+02 7.6090e+02 6.9650e+02 7.3290e+02 3.4962e+03 + 2*3.5000e+03 2.6800e+03 4.9160e+02 1.1270e+03 1.0258e+03 9.6340e+02 + 6.7880e+02 2.9230e+02 2.3040e+02 5.9110e+02 3.6190e+02 7.7780e+02 6.2410e+02 + 4.8450e+02 3.1490e+02 6.6010e+02 4.1040e+02 2.0290e+02 3.4700e+02 5.6900e+02 + 4.9920e+02 5.1340e+02 1.1958e+03 9.7240e+02 2.3208e+03 1.1119e+03 6.8090e+02 + 2.3280e+02 3.7080e+02 1.0913e+03 1.1235e+03 2.0705e+03 1.2380e+03 9.4140e+02 + 4.9980e+02 5.0160e+02 6.1170e+02 5.0850e+02 5.9970e+02 5.9830e+02 4.6000e+02 + 4.5170e+02 4.3650e+02 5.9100e+02 5.8220e+02 8.0390e+02 4.4840e+02 4.0870e+02 + 6.6870e+02 3.4160e+02 4.4870e+02 4.8160e+02 4.1900e+02 5.5220e+02 1.0304e+03 + 7.2490e+02 4.0530e+02 5.2330e+02 1.8437e+03 2*3.5000e+03 1.8077e+03 + 1.1432e+03 8.0690e+02 6.6750e+02 3.8990e+02 4.4740e+02 2.4720e+02 2.1810e+02 + 1.7010e+02 8.4360e+02 5.8280e+02 6.3760e+02 3.1890e+02 5.0500e+02 6.6620e+02 + 4.9760e+02 3.8140e+02 2.8830e+02 8.8700e+02 4.2140e+02 3.7720e+02 8.6650e+02 + 1.6155e+03 2.1021e+03 1.0457e+03 1.7175e+03 2.8930e+02 2.7890e+02 8.6200e+02 + 1.5897e+03 2.2344e+03 7.3180e+02 1.3112e+03 5.2910e+02 4.5230e+02 6.6930e+02 + 2.1480e+02 4.8550e+02 5.2100e+02 5.3990e+02 5.1150e+02 8.1560e+02 4.4530e+02 + 5.1750e+02 4.3880e+02 4.7300e+02 6.5350e+02 7.6420e+02 3.4590e+02 3.2620e+02 + 4.5030e+02 2.1110e+02 3.1090e+02 8.3160e+02 8.0050e+02 8.6310e+02 9.5500e+02 + 1.6800e+03 1.2487e+03 1.8900e+03 1.5549e+03 1.5593e+03 8.1690e+02 1.5908e+03 + 7.8470e+02 4.5870e+02 4.2950e+02 3.9120e+02 5.8780e+02 8.4790e+02 5.0280e+02 + 3.5240e+02 6.0250e+02 3.4440e+02 2.8990e+02 7.5620e+02 3.5590e+02 7.1660e+02 + 5.3700e+02 6.0640e+02 4.2210e+02 4.5670e+02 1.1270e+03 2.3634e+03 1.0289e+03 + 1.7162e+03 1.8530e+02 2.2050e+02 5.1810e+02 1.1785e+03 2.2235e+03 1.2937e+03 + 1.0602e+03 7.8750e+02 5.0170e+02 6.2470e+02 5.4750e+02 6.0620e+02 6.1700e+02 + 4.5450e+02 9.9870e+02 8.3770e+02 3.1180e+02 3.0710e+02 4.2780e+02 3.7880e+02 + 1.5183e+03 7.1070e+02 5.3370e+02 3.9320e+02 4.7530e+02 5.6200e+01 1.9770e+02 + 7.9820e+02 8.1490e+02 5.0320e+02 1.1420e+03 1.8225e+03 1.0745e+03 2.0155e+03 + 1.1794e+03 2.0656e+03 1.8718e+03 1.1618e+03 1.5730e+03 3.4970e+02 2.7540e+02 + 6.7080e+02 8.0780e+02 5.9410e+02 4.7970e+02 3.1140e+02 4.8500e+02 5.4690e+02 + 3.2660e+02 2.4450e+02 7.9060e+02 5.6560e+02 4.0730e+02 6.9050e+02 3.9960e+02 + 6.4720e+02 1.5460e+03 1.6471e+03 1.7788e+03 1.0396e+03 4.8050e+02 8.1160e+02 + 2.8950e+02 9.0460e+02 2.0488e+03 1.1822e+03 8.7880e+02 1.1879e+03 4.3120e+02 + 6.5660e+02 5.1500e+02 6.1400e+02 8.1500e+02 7.6020e+02 5.6040e+02 7.0600e+02 + 5.8570e+02 3.5940e+02 4.6700e+02 3.5910e+02 8.6880e+02 1.0424e+03 3.6370e+02 + 2.2000e+00 6.7800e+01 4.0220e+02 5.6390e+02 5.7910e+02 1.1320e+03 2.3766e+03 + 4.8234e+03 3.0237e+03 7.3770e+02 2.3750e+02 5.8770e+02 5.9460e+02 5.8450e+02 + 5.4680e+02 5.3630e+02 3.0810e+03 3.0451e+03 2.3543e+03 1.6295e+03 6.4310e+02 + 5.9310e+02 7.2630e+02 8.3350e+02 7.9330e+02 6.5210e+02 4.7560e+02 7.2600e+02 + 8.7140e+02 6.4980e+02 4.7230e+02 3.2300e+02 4.0440e+02 4.9190e+02 7.3460e+02 + 9.8440e+02 5.6320e+02 8.6760e+02 5.2860e+02 7.4450e+02 6.5240e+02 2.2546e+03 + 2.3525e+03 3.5322e+03 4.3188e+03 4.6477e+03 4.5877e+03 2.0236e+03 6.2140e+02 + 3.7370e+02 5.4910e+02 5.1290e+02 7.1490e+02 7.8740e+02 1.0106e+03 5.0160e+02 + 1.0784e+03 5.6950e+02 5.0890e+02 2.7780e+02 2.1760e+02 3.7380e+02 5.6720e+02 + 3.9270e+02 4.6520e+02 7.8650e+02 4.0505e+03 4.9000e+03 2.7946e+03 1.2603e+03 + 5.7960e+02 3.3930e+02 5.4890e+02 5.8310e+02 2.8620e+02 9.6550e+02 2.9212e+03 + 4.9000e+03 3.2168e+03 1.2752e+03 7.1140e+02 6.1740e+02 5.8620e+02 7.7230e+02 + 8.4190e+02 6.2740e+02 5.0040e+02 4.9150e+02 6.4780e+02 3.0430e+02 4.1540e+02 + 4.3950e+02 3.0130e+02 2.9560e+02 7.3130e+02 9.5430e+02 6.1400e+02 8.2950e+02 + 1.1808e+03 4.1040e+02 3.5490e+02 2.1346e+03 1.4335e+03 2.6140e+03 4.1820e+03 + 2*4.9000e+03 4.2086e+03 5.6980e+02 3.0190e+02 5.7800e+02 5.9020e+02 + 6.4200e+02 1.1930e+03 8.0040e+02 5.6070e+02 1.8712e+03 9.2750e+02 6.6030e+02 + 3.1140e+02 2.8670e+02 5.4390e+02 6.3140e+02 3.9580e+02 2.6250e+02 5.5020e+02 + 1.3224e+03 4.9000e+03 4.3972e+03 1.2033e+03 3.9280e+02 3.9760e+02 4.3530e+02 + 6.7130e+02 6.1050e+02 1.0528e+03 1.5220e+03 3.3939e+03 2.9604e+03 2.0435e+03 + 1.0673e+03 1.1475e+03 6.6590e+02 6.4280e+02 7.7920e+02 6.8840e+02 3.1810e+02 + 1.3876e+03 3.7500e+02 3.6550e+02 6.4270e+02 7.4920e+02 3.5460e+02 3.0580e+02 + 6.0880e+02 7.6700e+02 7.2060e+02 1.2045e+03 1.7083e+03 5.5980e+02 2.5670e+02 + 4.3390e+02 6.8050e+02 1.9247e+03 3.5279e+03 2*4.9000e+03 4.0519e+03 + 1.4868e+03 5.3010e+02 6.5400e+02 9.9790e+02 5.4490e+02 6.3250e+02 7.2970e+02 + 6.9380e+02 6.1980e+02 8.9410e+02 4.3250e+02 3.9830e+02 2.4570e+02 5.1280e+02 + 7.2980e+02 5.6720e+02 3.1880e+02 1.0978e+03 2.8749e+03 3.4668e+03 2.7398e+03 + 1.6224e+03 5.2350e+02 4.1500e+02 6.2760e+02 3.2520e+02 4.4950e+02 5.0250e+02 + 1.0397e+03 2.0360e+03 3.0371e+03 2.3988e+03 7.6530e+02 9.1620e+02 6.6770e+02 + 5.2600e+02 8.0460e+02 4.3560e+02 3.8630e+02 4.0290e+02 2.5640e+02 5.6360e+02 + 9.0820e+02 5.7030e+02 8.1030e+02 2.0700e+02 3.5420e+02 6.2730e+02 3.5880e+02 + 9.2590e+02 8.7410e+02 5.0930e+02 4.6820e+02 7.0960e+02 6.0580e+02 7.5500e+02 + 2.3635e+03 4.9000e+03 4.0880e+03 2.5881e+03 2.5941e+03 4.3850e+02 9.1750e+02 + 6.3700e+02 5.8510e+02 2.7960e+02 8.5900e+02 1.0747e+03 3.6980e+02 8.1430e+02 + 9.1970e+02 8.1230e+02 3.6640e+02 9.7860e+02 1.2157e+03 3.4140e+02 9.6100e+01 + 6.4950e+02 2.6535e+03 4.6168e+03 3.2601e+03 1.5804e+03 2.8360e+02 5.2170e+02 + 5.2000e+02 2.5080e+02 4.7630e+02 4.3490e+02 3.6860e+02 8.3650e+02 1.8433e+03 + 2.6465e+03 2.1051e+03 1.5676e+03 1.1795e+03 1.0388e+03 9.8220e+02 2.7570e+02 + 1.5070e+02 5.4170e+02 5.3330e+02 4.1410e+02 7.0030e+02 8.7890e+02 8.2400e+02 + 4.9280e+02 2.7750e+02 5.3870e+02 3.0400e+02 2.9270e+02 1.0030e+03 3.1920e+02 + 3.9500e+02 4.9580e+02 3.8790e+02 5.1400e+02 3.6886e+03 4.8293e+03 4.9000e+03 + 1.7878e+03 2.0410e+03 1.7669e+03 9.6650e+02 7.9520e+02 8.4570e+02 3.7220e+02 + 4.5470e+02 3.2410e+02 4.4030e+02 9.9760e+02 1.0475e+03 1.0207e+03 6.7020e+02 + 8.5290e+02 7.9360e+02 4.6650e+02 9.2100e+01 3.4440e+02 4.0533e+03 4.9000e+03 + 3.7115e+03 1.0075e+03 4.8990e+02 2.5490e+02 2.8600e+02 3.2320e+02 4.5650e+02 + 2.6740e+02 6.7860e+02 4.3360e+02 6.6680e+02 2.0819e+03 2.6049e+03 3.0144e+03 + 2.0463e+03 2.2555e+03 9.5820e+02 3.5300e+02 2.7200e+02 5.2660e+02 7.3820e+02 + 5.8310e+02 6.6000e+02 3.0270e+02 8.6920e+02 3.8880e+02 3.7280e+02 2.4980e+02 + 1.5220e+02 2.7160e+02 3.8750e+02 3.9290e+02 4.3330e+02 6.8950e+02 5.5670e+02 + 1.1369e+03 3.1750e+03 4.1493e+03 2.9037e+03 3.3223e+03 3.9801e+03 1.2355e+03 + 8.5400e+02 6.2140e+02 5.7680e+02 7.2900e+02 4.8040e+02 2.5080e+02 6.5540e+02 + 4.3580e+02 1.1406e+03 5.8890e+02 5.1990e+02 4.3560e+02 8.0080e+02 2.8420e+02 + 1.1940e+02 4.8870e+02 2.5197e+03 2*4.9000e+03 8.2620e+02 7.6400e+02 + 4.7250e+02 2.4710e+02 3.5790e+02 4.0210e+02 3.3660e+02 5.1050e+02 4.7470e+02 + 6.0900e+02 7.9290e+02 2.3201e+03 2.0949e+03 2.3321e+03 2.4906e+03 1.0165e+03 + 7.2200e+02 5.0820e+02 3.2130e+02 4.8920e+02 5.0470e+02 3.8070e+02 5.4620e+02 + 6.5420e+02 6.4530e+02 7.2920e+02 1.9490e+02 2.0990e+02 1.9120e+02 2.9040e+02 + 3.3880e+02 6.6460e+02 3.0800e+02 2.0040e+02 2.3150e+02 2.5676e+03 3.7246e+03 + 2.5032e+03 2.7486e+03 4.7564e+03 3.2978e+03 7.2290e+02 3.2800e+02 3.6870e+02 + 9.5560e+02 4.4460e+02 2.6120e+02 5.5080e+02 3.8970e+02 8.4980e+02 8.0340e+02 + 3.8570e+02 6.8420e+02 8.9540e+02 2.6020e+02 5.7490e+02 5.9580e+02 2.7675e+03 + 4.9000e+03 4.3958e+03 7.1030e+02 9.7410e+02 5.9900e+02 7.1700e+02 7.4580e+02 + 3.0850e+02 2.9790e+02 2.9800e+02 7.8640e+02 5.1560e+02 5.6570e+02 1.1067e+03 + 1.3718e+03 1.9882e+03 1.7255e+03 1.3716e+03 5.8640e+02 1.1182e+03 6.0240e+02 + 3.4550e+02 4.7040e+02 4.2780e+02 3.5410e+02 6.8260e+02 4.4650e+02 9.0240e+02 + 3.4580e+02 3.5780e+02 5.5600e+02 2.7730e+02 6.0520e+02 1.2976e+03 2.8890e+02 + 5.9000e+01 1.1663e+03 2.6120e+03 3.0085e+03 2.6159e+03 2.5942e+03 4.9000e+03 + 3.9863e+03 1.0197e+03 2.6190e+02 2.7250e+02 5.4200e+02 4.7990e+02 5.0970e+02 + 3.9100e+02 2.9930e+02 7.4500e+02 6.7520e+02 3.7470e+02 4.9260e+02 7.9120e+02 + 4.9270e+02 6.4400e+02 1.3200e+03 3.7216e+03 4.9000e+03 3.1699e+03 4.8770e+02 + 9.1170e+02 6.7130e+02 5.1090e+02 6.8500e+02 4.2690e+02 6.3730e+02 4.0150e+02 + 5.6560e+02 7.9780e+02 6.0450e+02 7.8710e+02 9.0320e+02 1.1474e+03 2.3697e+03 + 2.6409e+03 2.3753e+03 9.8810e+02 3.5470e+02 3.2860e+02 3.1450e+02 2.3530e+02 + 4.7730e+02 1.9160e+02 3.5080e+02 7.0040e+02 4.6880e+02 5.7790e+02 4.9280e+02 + 4.9580e+02 7.1910e+02 1.0841e+03 4.1320e+02 4.0500e+01 1.7090e+02 3.2671e+03 + 3.6876e+03 1.7129e+03 2.5534e+03 4.2683e+03 4.1747e+03 2.0067e+03 5.6460e+02 + 4.2470e+02 5.6190e+02 5.3830e+02 5.5550e+02 4.6780e+02 2.9210e+02 8.8240e+02 + 8.5160e+02 3.2170e+02 2.5730e+02 3.7270e+02 5.0310e+02 1.0715e+03 2.2990e+03 + 2*4.9000e+03 2.9727e+03 7.0730e+02 1.0487e+03 4.4940e+02 8.2480e+02 + 8.5970e+02 5.8060e+02 5.6100e+02 8.4480e+02 3.9810e+02 5.3640e+02 4.2560e+02 + 7.2020e+02 6.2020e+02 8.5370e+02 1.4952e+03 2.6896e+03 2.2803e+03 1.6096e+03 + 6.6160e+02 2.9540e+02 6.3640e+02 3.8520e+02 4.1310e+02 4.8330e+02 2.8350e+02 + 4.4370e+02 4.8200e+02 4.7640e+02 7.0050e+02 4.2400e+02 6.1420e+02 9.5050e+02 + 5.7690e+02 1.1220e+02 2.5660e+02 3.7469e+03 2.7585e+03 2.2633e+03 2.5530e+03 + 2*4.9000e+03 2.7867e+03 4.3540e+02 3.3700e+02 3.5510e+02 2.1850e+02 + 3.6240e+02 1.0984e+03 4.2920e+02 7.2700e+02 4.1240e+02 2.5950e+02 6.2640e+02 + 3.9540e+02 3.9130e+02 9.0210e+02 2.1067e+03 4.9000e+03 3.4446e+03 3.3864e+03 + 6.2650e+02 6.1210e+02 2.2520e+02 3.4820e+02 6.4320e+02 6.0370e+02 8.6650e+02 + 8.8550e+02 6.3430e+02 2.9300e+02 2.6740e+02 5.2410e+02 5.6620e+02 4.5950e+02 + 1.1910e+03 2.2770e+03 2.6996e+03 2.5419e+03 1.1645e+03 2.3480e+02 3.1650e+02 + 2.8060e+02 5.5510e+02 4.3910e+02 4.8550e+02 4.8100e+02 2.7880e+02 6.1310e+02 + 8.8650e+02 3.5030e+02 3.8460e+02 1.1403e+03 5.8550e+02 1.8330e+02 1.7758e+03 + 3.8104e+03 4.1152e+03 1.2199e+03 1.7682e+03 3.3063e+03 4.1864e+03 2.5971e+03 + 1.0831e+03 7.3470e+02 6.5010e+02 2.5370e+02 3.9800e+02 8.0550e+02 2.5680e+02 + 6.4320e+02 5.1000e+02 3.1270e+02 9.9310e+02 5.1740e+02 2.3530e+02 7.5430e+02 + 3.2412e+03 3.9943e+03 4.4504e+03 2.2124e+03 7.8030e+02 7.4020e+02 6.7100e+02 + 4.6180e+02 4.3570e+02 4.6290e+02 8.9630e+02 1.0752e+03 4.6210e+02 3.2740e+02 + 6.1630e+02 5.2690e+02 2.7770e+02 2.7500e+02 2.4840e+02 2.2303e+03 2.8302e+03 + 3.8312e+03 1.4387e+03 3.8900e+02 4.6690e+02 3.9300e+02 5.8380e+02 6.8030e+02 + 3.9580e+02 6.2810e+02 3.7790e+02 2.4570e+02 3.7040e+02 6.7260e+02 3.4060e+02 + 7.0270e+02 7.1620e+02 7.2380e+02 9.5500e+02 2.8528e+03 2.7926e+03 7.8020e+02 + 1.9996e+03 3.7656e+03 4.9000e+03 3.2430e+03 6.1080e+02 9.8080e+02 6.7260e+02 + 1.8310e+02 3.6790e+02 4.7180e+02 7.3070e+02 3.5940e+02 2.8780e+02 4.5830e+02 + 3.7650e+02 4.0750e+02 1.5400e+02 5.1380e+02 2.5396e+03 3.5507e+03 3.8817e+03 + 1.6923e+03 8.2120e+02 9.4750e+02 3.6770e+02 8.0580e+02 4.0830e+02 3.3070e+02 + 8.3680e+02 6.7890e+02 6.5010e+02 4.5610e+02 6.6400e+02 5.5480e+02 6.9410e+02 + 2.2540e+02 4.4430e+02 1.1375e+03 2.6554e+03 3.1551e+03 1.3692e+03 3.3720e+02 + 4.6670e+02 5.6220e+02 8.2470e+02 5.8150e+02 4.4430e+02 4.4390e+02 4.4720e+02 + 4.6900e+02 4.1280e+02 3.5230e+02 3.4470e+02 3.6220e+02 1.1891e+03 1.7876e+03 + 2.9788e+03 3.1003e+03 1.1821e+03 4.1190e+02 8.2770e+02 3.2879e+03 3.5214e+03 + 3.8201e+03 1.1527e+03 8.2000e+02 8.3850e+02 3.6270e+02 4.6220e+02 5.5390e+02 + 5.0700e+02 3.4140e+02 2.9760e+02 7.1680e+02 7.5150e+02 5.6220e+02 4.9630e+02 + 1.3996e+03 1.9728e+03 3.6582e+03 3.5015e+03 8.8790e+02 4.9970e+02 5.3860e+02 + 5.6210e+02 4.3500e+02 6.7050e+02 3.2460e+02 4.4280e+02 8.1040e+02 7.0390e+02 + 1.4570e+02 5.0250e+02 5.5480e+02 5.7180e+02 5.5280e+02 6.0710e+02 8.8090e+02 + 1.2868e+03 4.0971e+03 2.2507e+03 4.0100e+02 7.6600e+02 7.2320e+02 8.3200e+02 + 7.7260e+02 3.1520e+02 3.2050e+02 5.7530e+02 8.1260e+02 2.8870e+02 7.3070e+02 + 3.5480e+02 4.5920e+02 7.9130e+02 3.0072e+03 2.1897e+03 2.5907e+03 1.4076e+03 + 5.6670e+02 8.2800e+02 1.7483e+03 3.8518e+03 3.8997e+03 3.1137e+03 8.3530e+02 + 7.1120e+02 5.9640e+02 8.8010e+02 5.1740e+02 6.6780e+02 9.9760e+02 4.1670e+02 + 4.7320e+02 2.6810e+02 3.8210e+02 8.3610e+02 1.8138e+03 2.3969e+03 4.9000e+03 + 3.1931e+03 1.6775e+03 2.8840e+02 7.3580e+02 8.4380e+02 4.3310e+02 5.7010e+02 + 5.7340e+02 3.7460e+02 6.2720e+02 8.5660e+02 2.0950e+02 3.5100e+02 6.7720e+02 + 6.6370e+02 6.3470e+02 4.5040e+02 4.9750e+02 2.1116e+03 3.9184e+03 1.3537e+03 + 5.6440e+02 6.3820e+02 6.1930e+02 5.3630e+02 4.8080e+02 2.2010e+02 6.9380e+02 + 5.4450e+02 7.4640e+02 7.7590e+02 1.1546e+03 3.6360e+02 5.5800e+02 1.6666e+03 + 2.6877e+03 3.0629e+03 2.4215e+03 1.4505e+03 4.9640e+02 5.8900e+02 2.0817e+03 + 3.6927e+03 4.3100e+03 2.4982e+03 1.5098e+03 1.4208e+03 6.8680e+02 7.2900e+02 + 6.9160e+02 4.7620e+02 6.6680e+02 7.0200e+02 4.2930e+02 3.6660e+02 4.5710e+02 + 5.4170e+02 1.4633e+03 4.1563e+03 4.6346e+03 2.6537e+03 8.4310e+02 6.2900e+02 + 5.5860e+02 2.5440e+02 2.0750e+02 7.2970e+02 6.8710e+02 5.2560e+02 6.2970e+02 + 3.3200e+02 3.7280e+02 5.6790e+02 3.4180e+02 4.6170e+02 5.5190e+02 6.4060e+02 + 3.3680e+02 2.1075e+03 3.1639e+03 2.0951e+03 5.5630e+02 8.8270e+02 6.5790e+02 + 6.7260e+02 4.4310e+02 2.1700e+02 4.6220e+02 3.6310e+02 8.1940e+02 6.9780e+02 + 9.0040e+02 1.5063e+03 2.2536e+03 2.5611e+03 3.1650e+03 2.7437e+03 2.1811e+03 + 6.5490e+02 4.0940e+02 6.2120e+02 8.7720e+02 2.6442e+03 1.7962e+03 2.5356e+03 + 3.2848e+03 1.6042e+03 8.2010e+02 5.5870e+02 8.6470e+02 3.8610e+02 8.1620e+02 + 9.0430e+02 4.0700e+02 4.1460e+02 3.4620e+02 7.4520e+02 2.8713e+03 4.0175e+03 + 2.6087e+03 4.6050e+03 2.3689e+03 4.6540e+02 5.7880e+02 3.6720e+02 1.3080e+02 + 3.1460e+02 5.1270e+02 6.4610e+02 6.2310e+02 3.4050e+02 2.1970e+02 3.2290e+02 + 5.6670e+02 3.9090e+02 5.1020e+02 4.9220e+02 4.0640e+02 4.5260e+02 4.2176e+03 + 2.0781e+03 5.9630e+02 3.1890e+02 4.5570e+02 4.6770e+02 2.8550e+02 1.6420e+02 + 3.2900e+02 5.4420e+02 5.5220e+02 2.7149e+03 2.2565e+03 2.4082e+03 2.5463e+03 + 2.7491e+03 2.1169e+03 5.9820e+02 1.2557e+03 3.2440e+02 3.4380e+02 5.1380e+02 + 1.3553e+03 2.6393e+03 2.4600e+03 1.5935e+03 3.0696e+03 2.5558e+03 9.7430e+02 + 1.2958e+03 6.1440e+02 3.8640e+02 4.8050e+02 6.9540e+02 3.8610e+02 3.0060e+02 + 4.8060e+02 2.1250e+03 2.6723e+03 3.5903e+03 3.8265e+03 3.7255e+03 1.9662e+03 + 6.3020e+02 3.9130e+02 3.8080e+02 2.4720e+02 3.9640e+02 4.7560e+02 5.8900e+02 + 6.7730e+02 4.0250e+02 4.4140e+02 4.2770e+02 6.6920e+02 7.6330e+02 3.7350e+02 + 4.1030e+02 4.5440e+02 1.1402e+03 2.6981e+03 2.5531e+03 3.9260e+02 2.8910e+02 + 4.4400e+02 5.4390e+02 6.6490e+02 3.4560e+02 6.3090e+02 8.8840e+02 2.2978e+03 + 2.2917e+03 2.7316e+03 1.2687e+03 2.7934e+03 1.8361e+03 9.6310e+02 4.8030e+02 + 6.5650e+02 2.4670e+02 2.7470e+02 6.1080e+02 1.7552e+03 3.5357e+03 2.0050e+03 + 6.8900e+02 2.0145e+03 3.1886e+03 2.4420e+03 1.3444e+03 1.2309e+03 2.8860e+02 + 5.6290e+02 3.6550e+02 7.3540e+02 3.6010e+02 5.5070e+02 2.4053e+03 2.4890e+03 + 1.4906e+03 4.8061e+03 4.7629e+03 1.4186e+03 4.1150e+02 6.8510e+02 3.8230e+02 + 3.8740e+02 4.5550e+02 1.5480e+02 4.0650e+02 5.6080e+02 4.4590e+02 5.0350e+02 + 7.8180e+02 7.1230e+02 2.8320e+02 2.6240e+02 2.6970e+02 6.4680e+02 2.4075e+03 + 3.7066e+03 2.3764e+03 1.2932e+03 3.1670e+02 1.8080e+02 7.4110e+02 6.7450e+02 + 9.8000e+02 1.0187e+03 1.9218e+03 2.1048e+03 1.6175e+03 2.5833e+03 1.7213e+03 + 9.6970e+02 8.4210e+02 8.4840e+02 3.3180e+02 5.0780e+02 5.8290e+02 2.7550e+02 + 3.2730e+02 1.2857e+03 3.0762e+03 2.3936e+03 5.2380e+02 1.0829e+03 1.9783e+03 + 2.5145e+03 1.8705e+03 2.2709e+03 7.2770e+02 2.5260e+02 6.7000e+02 3.9070e+02 + 6.0180e+02 8.2440e+02 3.1982e+03 3.5207e+03 2.2496e+03 3.1069e+03 2.4486e+03 + 1.8297e+03 4.6260e+02 4.7940e+02 5.8780e+02 7.6450e+02 4.9710e+02 2.4310e+02 + 5.2530e+02 3.4330e+02 3.9080e+02 4.3370e+02 8.3640e+02 3.4580e+02 4.3590e+02 + 2.6560e+02 4.0610e+02 1.1944e+03 2.2586e+03 3.7617e+03 2.1996e+03 1.1266e+03 + 2.9690e+02 3.1330e+02 4.4120e+02 8.4120e+02 5.0550e+02 1.8840e+03 2.0094e+03 + 2.7936e+03 1.8796e+03 9.9170e+02 4.4460e+02 1.6291e+03 9.3330e+02 1.2586e+03 + 2.7030e+02 2.4910e+02 2.7840e+02 1.6070e+02 4.9770e+02 1.7090e+03 3.8829e+03 + 2.1298e+03 5.8030e+02 3.6480e+02 1.0204e+03 1.9545e+03 2.3681e+03 1.2551e+03 + 6.9240e+02 3.0830e+02 2.5050e+02 9.0850e+02 9.9160e+02 2.4491e+03 3.0206e+03 + 2.5774e+03 6.0600e+02 2.9113e+03 4.2741e+03 2.6145e+03 4.2030e+02 4.5210e+02 + 5.2800e+02 6.9930e+02 6.9460e+02 4.0460e+02 4.8710e+02 4.0480e+02 7.8930e+02 + 5.5290e+02 4.3860e+02 5.9940e+02 6.5640e+02 6.0300e+02 8.1500e+02 1.5180e+03 + 3.9855e+03 2.4576e+03 1.7073e+03 8.1940e+02 7.4950e+02 4.2130e+02 7.2570e+02 + 1.0922e+03 1.9510e+03 2.0728e+03 2.1348e+03 1.4449e+03 5.8450e+02 7.3970e+02 + 5.4250e+02 4.4820e+02 6.5050e+02 6.2860e+02 5.7990e+02 3.0430e+02 5.4030e+02 + 3.3740e+02 5.2310e+02 1.8506e+03 2.4940e+03 1.9212e+03 4.9850e+02 2.6210e+02 + 4.7490e+02 1.0488e+03 1.3381e+03 1.4232e+03 6.2750e+02 5.1290e+02 5.5470e+02 + 8.6260e+02 1.2601e+03 2.3048e+03 3.0870e+03 1.0702e+03 4.5200e+02 1.2587e+03 + 3.7044e+03 1.8519e+03 5.5090e+02 1.6050e+02 1.1690e+02 2.7120e+02 9.8720e+02 + 8.9190e+02 3.6570e+02 3.2530e+02 2.3750e+02 6.4070e+02 7.3150e+02 7.2370e+02 + 7.0480e+02 8.3100e+02 1.4971e+03 2.6031e+03 3.5757e+03 1.2532e+03 4.1400e+02 + 5.3750e+02 6.8330e+02 4.4810e+02 1.8878e+03 3.1563e+03 3.8243e+03 1.7626e+03 + 9.5650e+02 1.2410e+03 4.6660e+02 9.1270e+02 6.1000e+02 4.2180e+02 7.8980e+02 + 4.9420e+02 3.5480e+02 5.7600e+02 5.8610e+02 4.9320e+02 3.0680e+02 2.0465e+03 + 3.8071e+03 2.3798e+03 7.0570e+02 4.1560e+02 5.7020e+02 1.1182e+03 1.3585e+03 + 3.3910e+02 5.9680e+02 3.9660e+02 6.6680e+02 2.9450e+02 2.5119e+03 2.8101e+03 + 1.8959e+03 7.6150e+02 4.1700e+02 2.0615e+03 2.8678e+03 3.3473e+03 7.5530e+02 + 4.8820e+02 1.7040e+02 2.6860e+02 1.0925e+03 7.5440e+02 5.3530e+02 3.6110e+02 + 2.8780e+02 7.7360e+02 5.6580e+02 8.2500e+02 1.2631e+03 9.6500e+02 2.6051e+03 + 2.1856e+03 1.0926e+03 4.4420e+02 3.8460e+02 4.1770e+02 9.7880e+02 2.1193e+03 + 2.4273e+03 3.7378e+03 2.0100e+03 7.2920e+02 8.4130e+02 5.9240e+02 1.0499e+03 + 4.7530e+02 4.5020e+02 8.4270e+02 4.3840e+02 2.3130e+02 3.8960e+02 1.1476e+03 + 7.6540e+02 3.6620e+02 5.7410e+02 1.8378e+03 2.8960e+03 1.8049e+03 5.8640e+02 + 5.9250e+02 3.7780e+02 6.8690e+02 1.1057e+03 9.6900e+02 2.7860e+02 6.7930e+02 + 5.3640e+02 1.3541e+03 1.5708e+03 2.6339e+03 2.1309e+03 5.7290e+02 5.3440e+02 + 1.5861e+03 1.9024e+03 3.6522e+03 9.8240e+02 4.2780e+02 1.1050e+02 7.6720e+02 + 7.5850e+02 5.7290e+02 4.6880e+02 3.7090e+02 2.9390e+02 5.8580e+02 5.9450e+02 + 1.0908e+03 1.1807e+03 2.3984e+03 1.8020e+03 1.9408e+03 4.6950e+02 3.3850e+02 + 1.9990e+02 4.2780e+02 6.4780e+02 2.3755e+03 3.7476e+03 2.0775e+03 1.2960e+03 + 6.7540e+02 2.5460e+02 4.2960e+02 7.2620e+02 4.6800e+02 2.5050e+02 5.7630e+02 + 6.1920e+02 4.5770e+02 4.2700e+02 7.7730e+02 1.4274e+03 7.4840e+02 5.7350e+02 + 2.7534e+03 2.3204e+03 2.1216e+03 4.3140e+02 5.8920e+02 9.0650e+02 6.7480e+02 + 4.5990e+02 6.1080e+02 3.7860e+02 7.8360e+02 8.0900e+02 1.7828e+03 3.8972e+03 + 2.4522e+03 8.2000e+02 6.1590e+02 6.1740e+02 4.3070e+02 2.2519e+03 3.0293e+03 + 2.3442e+03 3.9060e+02 2.9880e+02 5.4140e+02 7.6200e+02 4.8330e+02 2.7690e+02 + 2.5390e+02 5.1580e+02 3.5370e+02 1.4722e+03 3.0126e+03 2.4008e+03 3.2550e+03 + 1.0634e+03 1.1718e+03 3.1610e+02 3.9110e+02 8.2900e+02 1.0025e+03 1.6104e+03 + 2.4741e+03 2.6600e+03 9.3090e+02 3.3600e+02 5.2280e+02 7.2380e+02 2.1800e+02 + 6.6840e+02 5.9050e+02 4.6680e+02 2.9620e+02 9.5700e+02 4.0130e+02 4.5970e+02 + 4.9400e+02 6.1180e+02 5.5390e+02 8.6150e+02 2.4267e+03 2.6352e+03 2.3114e+03 + 7.9390e+02 6.1310e+02 6.6030e+02 3.9030e+02 3.7550e+02 3.8180e+02 4.9020e+02 + 5.5000e+02 6.6960e+02 2.2337e+03 2.0246e+03 1.3134e+03 1.7920e+02 5.0560e+02 + 8.5930e+02 7.8770e+02 2.1085e+03 3.1408e+03 2.8786e+03 8.4470e+02 6.5110e+02 + 7.0320e+02 6.6360e+02 4.1760e+02 2.8330e+02 4.7030e+02 3.6290e+02 1.0518e+03 + 1.9175e+03 2.7867e+03 3.4671e+03 2.6263e+03 2.0103e+03 2.3830e+02 3.2380e+02 + 3.9670e+02 8.2020e+02 1.3752e+03 2.6254e+03 1.9899e+03 1.6995e+03 8.9160e+02 + 2.1120e+02 5.4430e+02 3.6170e+02 2.7640e+02 2.6520e+02 4.7270e+02 5.6740e+02 + 6.1700e+02 4.5200e+02 3.4880e+02 3.5620e+02 9.7550e+02 6.5410e+02 3.7480e+02 + 3.1680e+02 2.3941e+03 3.5095e+03 6.3060e+02 4.5480e+02 2.8470e+02 5.3270e+02 + 4.7350e+02 4.3400e+02 5.7890e+02 6.6320e+02 3.9240e+02 1.8662e+03 3.4294e+03 + 2.4760e+03 9.0690e+02 4.8720e+02 4.0970e+02 4.4730e+02 4.0260e+02 1.0293e+03 + 3.2974e+03 2.2468e+03 1.3243e+03 5.9740e+02 6.5810e+02 7.4930e+02 3.4280e+02 + 5.0010e+02 6.0940e+02 1.0316e+03 1.5063e+03 2.2887e+03 2.7467e+03 2.0555e+03 + 1.1844e+03 2.6700e+02 4.3390e+02 3.9530e+02 7.1610e+02 2.5071e+03 2.4282e+03 + 2.6434e+03 3.0383e+03 5.7790e+02 2.8900e+02 1.6630e+02 2.5480e+02 5.6600e+02 + 2.6390e+02 1.6220e+02 2.7360e+02 5.2220e+02 4.8140e+02 4.0020e+02 3.8150e+02 + 7.3630e+02 6.3720e+02 8.2010e+02 6.9250e+02 1.8315e+03 2.1776e+03 3.1726e+03 + 1.4927e+03 6.1040e+02 3.4130e+02 7.6440e+02 5.2830e+02 4.9990e+02 3.0860e+02 + 1.0946e+03 1.0751e+03 2.7420e+03 2.2703e+03 1.3399e+03 4.2890e+02 3.4060e+02 + 2.2380e+02 3.8640e+02 3.8400e+02 5.3940e+02 2.5175e+03 3.7723e+03 2.4989e+03 + 7.6780e+02 8.2710e+02 7.1950e+02 2.9160e+02 4.6200e+02 6.1000e+02 1.6778e+03 + 2.6952e+03 3.5144e+03 3.1829e+03 2.3940e+03 1.7310e+02 5.0930e+02 4.9130e+02 + 2.8370e+02 2.1012e+03 2.7384e+03 2.7045e+03 1.6848e+03 2.1260e+03 8.1260e+02 + 4.7190e+02 1.0480e+02 5.3770e+02 5.9620e+02 4.7400e+02 3.9980e+02 2.3540e+02 + 4.9840e+02 7.3960e+02 2.1470e+02 2.9210e+02 4.7420e+02 7.9850e+02 9.4370e+02 + 3.6830e+02 1.5618e+03 2.0027e+03 3.1396e+03 5.5640e+02 4.5490e+02 7.8120e+02 + 8.1670e+02 4.5340e+02 6.0680e+02 5.6610e+02 1.9124e+03 1.0373e+03 2.3019e+03 + 3.3006e+03 1.0588e+03 3.8840e+02 7.2020e+02 4.3810e+02 3.0640e+02 5.6800e+02 + 6.0180e+02 1.2343e+03 2.2933e+03 4.0912e+03 2.4384e+03 8.3210e+02 6.3790e+02 + 3.0550e+02 4.6520e+02 9.7540e+02 2.2656e+03 2.4900e+03 2.8573e+03 7.9530e+02 + 4.8680e+02 2.1390e+02 4.2200e+02 4.6550e+02 1.5025e+03 2.4980e+03 2.4166e+03 + 1.7976e+03 7.8060e+02 6.3300e+02 6.9030e+02 4.4390e+02 3.1030e+02 3.1980e+02 + 1.9510e+02 9.6030e+02 5.8610e+02 4.8320e+02 4.6820e+02 3.2020e+02 4.1530e+02 + 3.6870e+02 2.2740e+02 5.4570e+02 7.5830e+02 4.6790e+02 1.7438e+03 2.9895e+03 + 1.7992e+03 1.2020e+03 5.1680e+02 4.7010e+02 6.4250e+02 5.1330e+02 6.7810e+02 + 7.0960e+02 1.7953e+03 1.6451e+03 3.2181e+03 2.4282e+03 5.0130e+02 6.2240e+02 + 2.3970e+02 5.0980e+02 7.3480e+02 8.1760e+02 4.1060e+02 5.1480e+02 8.9190e+02 + 2.4372e+03 3.3777e+03 2.5392e+03 8.6850e+02 2.5820e+02 3.3350e+02 9.6790e+02 + 2.2595e+03 3.0972e+03 1.3021e+03 5.2760e+02 3.0160e+02 5.0830e+02 7.7010e+02 + 1.2335e+03 2.2999e+03 1.9002e+03 3.0112e+03 7.9220e+02 4.1940e+02 3.1190e+02 + 4.3530e+02 7.3820e+02 5.9270e+02 4.9990e+02 7.2090e+02 5.7460e+02 6.6550e+02 + 5.0530e+02 5.3900e+02 6.7320e+02 3.1770e+02 3.0250e+02 2.2130e+02 1.9750e+02 + 3.0450e+02 6.3290e+02 2.4194e+03 2.3029e+03 1.2647e+03 1.0769e+03 5.1150e+02 + 7.5220e+02 3.9210e+02 7.0080e+02 3.5330e+02 4.2880e+02 1.3271e+03 2.1228e+03 + 3.5232e+03 6.9430e+02 1.2678e+03 4.0180e+02 3.9600e+02 6.7860e+02 7.1270e+02 + 7.4000e+02 4.2340e+02 4.9960e+02 2.1732e+03 1.3594e+03 2.9720e+03 3.0141e+03 + 1.8129e+03 7.8650e+02 7.2230e+02 1.1500e+03 3.1496e+03 1.6399e+03 1.7541e+03 + 4.5930e+02 8.8400e+02 4.0790e+02 1.7697e+03 3.0297e+03 2.1492e+03 1.8062e+03 + 1.2323e+03 7.8170e+02 4.2390e+02 4.0700e+02 4.2150e+02 6.2080e+02 7.0260e+02 + 5.3750e+02 5.6360e+02 7.5200e+02 4.0150e+02 5.4320e+02 5.9990e+02 5.2900e+02 + 7.7430e+02 5.8710e+02 5.1270e+02 4.4460e+02 4.5910e+02 6.4440e+02 2.7725e+03 + 2.5618e+03 1.4152e+03 5.6380e+02 5.0150e+02 4.1990e+02 1.0297e+03 8.9470e+02 + 3.3080e+02 5.0050e+02 2.5075e+03 2.7627e+03 4.0238e+03 1.2179e+03 6.1960e+02 + 1.0638e+03 4.6670e+02 4.6660e+02 6.8770e+02 5.0860e+02 3.0370e+02 5.9980e+02 + 2.7360e+02 6.5680e+02 2.1502e+03 2.4179e+03 2.0452e+03 2.4362e+03 1.7748e+03 + 2.7700e+03 2.4161e+03 2.1748e+03 1.6983e+03 7.4220e+02 3.8780e+02 1.0463e+03 + 1.8764e+03 1.5416e+03 1.8969e+03 1.1927e+03 8.1350e+02 8.4760e+02 3.7400e+02 + 2.8760e+02 2.1830e+02 6.3680e+02 8.3660e+02 4.9670e+02 4.9790e+02 3.3520e+02 + 2.0200e+02 3.9360e+02 7.4480e+02 6.5720e+02 3.0760e+02 7.4500e+02 3.1060e+02 + 5.0710e+02 8.6420e+02 2.6479e+03 2.7093e+03 2.8281e+03 8.6550e+02 4.3610e+02 + 4.4950e+02 5.0910e+02 9.7690e+02 1.1697e+03 5.4270e+02 4.1170e+02 2.1832e+03 + 4.7370e+03 3.0234e+03 2.7062e+03 5.1610e+02 4.8040e+02 4.3850e+02 9.7830e+02 + 4.3100e+02 8.2140e+02 5.3190e+02 3.9210e+02 5.0010e+02 2.2880e+02 8.3010e+02 + 1.2580e+03 2.3058e+03 3.0799e+03 2.0992e+03 2.6395e+03 2.3514e+03 1.6437e+03 + 7.6630e+02 1.3385e+03 1.7971e+03 1.6896e+03 3.1725e+03 2.0985e+03 1.1028e+03 + 9.9160e+02 5.8820e+02 5.7200e+02 3.4050e+02 3.2630e+02 5.0830e+02 6.4760e+02 + 2.2670e+02 3.9820e+02 6.9950e+02 7.9120e+02 2.7770e+02 3.9580e+02 2.6870e+02 + 4.4770e+02 5.6280e+02 4.0420e+02 8.2930e+02 7.3670e+02 1.0947e+03 2.7356e+03 + 2.1839e+03 3.0181e+03 8.8220e+02 7.4800e+02 3.7070e+02 2.3050e+02 6.9500e+02 + 5.0490e+02 5.1300e+02 6.0640e+02 2.0888e+03 4.9000e+03 3.7689e+03 2.3790e+03 + 5.7170e+02 5.7970e+02 2.0940e+02 4.7700e+02 5.5880e+02 5.0490e+02 2.0550e+02 + 5.0160e+02 4.1750e+02 4.9550e+02 2.7120e+02 1.8028e+03 2.3141e+03 2.3033e+03 + 1.7587e+03 3.6145e+03 4.9000e+03 2.4081e+03 3.3439e+03 2.7555e+03 3.0630e+03 + 2.4269e+03 1.9874e+03 8.3760e+02 1.1518e+03 5.4400e+02 3.1430e+02 4.6690e+02 + 6.2650e+02 6.2150e+02 4.3410e+02 4.9860e+02 4.1360e+02 3.6060e+02 9.1550e+02 + 6.4640e+02 2.3270e+02 4.9120e+02 4.4550e+02 3.4780e+02 4.1490e+02 4.3000e+02 + 4.5020e+02 8.6820e+02 1.8004e+03 2.4832e+03 2.0892e+03 1.1112e+03 5.5550e+02 + 8.1780e+02 6.2630e+02 2.8160e+02 6.7740e+02 5.5150e+02 4.4150e+02 1.0020e+03 + 5.9230e+02 3.1667e+03 4.9000e+03 1.9693e+03 7.1820e+02 2.9900e+02 3.5770e+02 + 8.8740e+02 9.2370e+02 3.9030e+02 3.4860e+02 4.5960e+02 1.6530e+02 8.1840e+02 + 6.5710e+02 7.0310e+02 1.2770e+03 5.1290e+02 2.4038e+03 2.6335e+03 3.3367e+03 + 4.5079e+03 4.2477e+03 3.0005e+03 2.3151e+03 2.3651e+03 1.2862e+03 4.2530e+02 + 9.5610e+02 4.7990e+02 4.2810e+02 2.3570e+02 7.7270e+02 5.8380e+02 5.0350e+02 + 6.3780e+02 3.0490e+02 3.5620e+02 3.6420e+02 6.7530e+02 6.0840e+02 5.2630e+02 + 4.7670e+02 3.2280e+02 2.8420e+02 3.2640e+02 6.1420e+02 6.9120e+02 2.6900e+03 + 2.7624e+03 1.7001e+03 8.2370e+02 2.4390e+02 7.8840e+02 7.8670e+02 2.2570e+02 + 4.6110e+02 2.7280e+02 6.1950e+02 4.3330e+02 3.9960e+02 3.3608e+03 4.2383e+03 + 2.5185e+03 6.1880e+02 6.4420e+02 3.8980e+02 6.2910e+02 3.9470e+02 4.5980e+02 + 4.9520e+02 3.5980e+02 5.3550e+02 4.8330e+02 4.4270e+02 4.6650e+02 4.7280e+02 + 7.5210e+02 7.7890e+02 4.0985e+03 2*4.9000e+03 3.9233e+03 4.6915e+03 + 2.9535e+03 1.9931e+03 5.8550e+02 9.4410e+02 4.1860e+02 2.3990e+02 5.0440e+02 + 5.6910e+02 9.5910e+02 8.0390e+02 3.6100e+02 4.9100e+02 2.7530e+02 3.0630e+02 + 7.1720e+02 3.6000e+02 3.7700e+02 5.1140e+02 3.9080e+02 2.6710e+02 4.3060e+02 + 7.6300e+02 5.7490e+02 1.1319e+03 3.0442e+03 1.9410e+03 8.5390e+02 3.6730e+02 + 1.8220e+02 8.9760e+02 6.3040e+02 3.8560e+02 6.9160e+02 5.8480e+02 3.8760e+02 + 2.0940e+02 9.4060e+02 2.8898e+03 4.9000e+03 4.8687e+03 8.1460e+02 6.9880e+02 + 5.7440e+02 5.3330e+02 3.0990e+02 6.5560e+02 6.4890e+02 4.3260e+02 5.9730e+02 + 6.2230e+02 5.9510e+02 2.6410e+02 3.5980e+02 7.4890e+02 1.1097e+03 3.0618e+03 + 4.1176e+03 1.5703e+03 2.7591e+03 3.6800e+03 4.2698e+03 2.5577e+03 1.5622e+03 + 7.4970e+02 4.6660e+02 5.0230e+02 3.4930e+02 4.0050e+02 7.4170e+02 4.3090e+02 + 7.7600e+02 5.8110e+02 2.7690e+02 4.0940e+02 3.8190e+02 6.5190e+02 4.7340e+02 + 4.7140e+02 5.0220e+02 1.8670e+02 5.0980e+02 3.7060e+02 6.7790e+02 1.6891e+03 + 2.2952e+03 1.7430e+03 8.9520e+02 3.1940e+02 2.9760e+02 3.7720e+02 6.9170e+02 + 5.9740e+02 3.6920e+02 3.1900e+02 1.0116e+03 5.5560e+02 5.0990e+02 1.9160e+03 + 4.7554e+03 4.6304e+03 1.6838e+03 7.8680e+02 6.1690e+02 4.7010e+02 3.6830e+02 + 7.7590e+02 5.1890e+02 3.7730e+02 3.9200e+02 2.3450e+02 2.6860e+02 1.7890e+02 + 1.7300e+02 6.7830e+02 3.3470e+02 2.6466e+03 2.4954e+03 2.6180e+03 1.5805e+03 + 2.2860e+03 2.6278e+03 1.9912e+03 2.0539e+03 1.5538e+03 1.6594e+03 5.8400e+02 + 3.6580e+02 3.8430e+02 3.3090e+02 6.7190e+02 4.9450e+02 4.8710e+02 4.2920e+02 + 3.5080e+02 5.3180e+02 3.2920e+02 2.0870e+02 6.0800e+02 5.7520e+02 2.3490e+02 + 7.8270e+02 5.1620e+02 2.1993e+03 2.5426e+03 1.6731e+03 3.2530e+02 4.6960e+02 + 6.2320e+02 5.0780e+02 4.1400e+02 5.7130e+02 5.9120e+02 6.8370e+02 6.7140e+02 + 7.3160e+02 2.3720e+02 7.8130e+02 1.7900e+03 4.4168e+03 4.5306e+03 1.3058e+03 + 8.0700e+02 6.5450e+02 3.0010e+02 3.5970e+02 4.9250e+02 8.1370e+02 4.1040e+02 + 3.7520e+02 4.0090e+02 2.4740e+02 8.0300e+01 2.5460e+02 3.9700e+02 5.7990e+02 + 2.2585e+03 2.4815e+03 7.7230e+02 6.4620e+02 6.2110e+02 1.7469e+03 2.4414e+03 + 1.9951e+03 2.5311e+03 2.2643e+03 5.7030e+02 2.8550e+02 6.9380e+02 6.0390e+02 + 7.4900e+02 1.0155e+03 3.1580e+02 4.5560e+02 5.9110e+02 8.2100e+02 3.4950e+02 + 8.5170e+02 1.1472e+03 3.7590e+02 2.9900e+02 1.0707e+03 7.8020e+02 1.3268e+03 + 3.2091e+03 1.8459e+03 2.8500e+02 3.5820e+02 1.0127e+03 3.4840e+02 2.3300e+02 + 4.7540e+02 5.0080e+02 6.4370e+02 4.6780e+02 1.0207e+03 4.7070e+02 6.9170e+02 + 1.4316e+03 2.1804e+03 2.3339e+03 1.8860e+03 7.6670e+02 5.4140e+02 3.5970e+02 + 1.7080e+02 8.7380e+02 8.1240e+02 7.0830e+02 4.4530e+02 6.4390e+02 2.0230e+02 + 1.9760e+02 3.1830e+02 7.1940e+02 1.9120e+03 1.5565e+03 2.8066e+03 5.6230e+02 + 6.7720e+02 7.9220e+02 6.5150e+02 1.2279e+03 3.0812e+03 2.3025e+03 3.2341e+03 + 2.3252e+03 9.0130e+02 1.1563e+03 6.9050e+02 6.7080e+02 7.8460e+02 3.7440e+02 + 4.9090e+02 5.6970e+02 5.0220e+02 3.3450e+02 3.9540e+02 9.2340e+02 7.1640e+02 + 3.9230e+02 6.6550e+02 1.1259e+03 2.4699e+03 3.5163e+03 1.2709e+03 2.8030e+02 + 4.0500e+02 7.9510e+02 3.9560e+02 1.5620e+02 6.6500e+02 4.6280e+02 2.4790e+02 + 5.5220e+02 5.8690e+02 7.2810e+02 1.0663e+03 3.5840e+02 2.3222e+03 3.0270e+03 + 1.8005e+03 8.1620e+02 3.8850e+02 4.5720e+02 5.8690e+02 3.9250e+02 5.1830e+02 + 4.4270e+02 8.0880e+02 5.8680e+02 1.8970e+02 4.0700e+02 7.3040e+02 7.3220e+02 + 2.3399e+03 2.6422e+03 2.9137e+03 6.9000e+02 1.9860e+02 4.2570e+02 5.9910e+02 + 6.4820e+02 8.7000e+02 1.9714e+03 3.1501e+03 2.7459e+03 2.3952e+03 1.5635e+03 + 1.4745e+03 9.1320e+02 8.8370e+02 3.4250e+02 4.6790e+02 6.2870e+02 5.7140e+02 + 6.0270e+02 9.3350e+02 6.0270e+02 6.3400e+02 3.9440e+02 1.1129e+03 1.7023e+03 + 2.3985e+03 1.5833e+03 1.0280e+03 5.8790e+02 5.4000e+02 6.9600e+02 4.8660e+02 + 3.7620e+02 7.5290e+02 5.6570e+02 2.4080e+02 5.3040e+02 6.1920e+02 9.6970e+02 + 1.0330e+03 8.3710e+02 2.5283e+03 2.4658e+03 1.8025e+03 6.2380e+02 2.3760e+02 + 5.2310e+02 3.5930e+02 3.3440e+02 3.3870e+02 1.2456e+03 1.0745e+03 5.0140e+02 + 4.1160e+02 4.1670e+02 7.6460e+02 1.1980e+03 1.7711e+03 3.5540e+03 9.4090e+02 + 5.8860e+02 2.8370e+02 2.4700e+02 7.4320e+02 8.9740e+02 2.6600e+02 1.0865e+03 + 1.9881e+03 2.2590e+03 2.3276e+03 2.8030e+03 1.0479e+03 1.3681e+03 5.4140e+02 + 6.0750e+02 7.4150e+02 8.3580e+02 6.2960e+02 1.0955e+03 6.7380e+02 4.4330e+02 + 5.4540e+02 4.8040e+02 1.8165e+03 2.2723e+03 2.6381e+03 2.3855e+03 1.1052e+03 + 8.9170e+02 3.1340e+02 4.8570e+02 5.5170e+02 6.0230e+02 5.2550e+02 6.5500e+02 + 1.6830e+02 2.3130e+02 5.6510e+02 9.5270e+02 9.0970e+02 1.4996e+03 1.2375e+03 + 2.2802e+03 2.3749e+03 9.0950e+02 3.4840e+02 7.0700e+02 6.9600e+02 5.4310e+02 + 3.1060e+02 1.0108e+03 7.9750e+02 3.8770e+02 2.3850e+02 4.2620e+02 9.0300e+02 + 7.3190e+02 2.7809e+03 2.6969e+03 1.2953e+03 3.4460e+02 4.4660e+02 5.9240e+02 + 2.3790e+02 1.3654e+03 6.6560e+02 8.1850e+02 1.0492e+03 1.4339e+03 1.2906e+03 + 1.3281e+03 2.8171e+03 1.7882e+03 1.7361e+03 8.7770e+02 4.9700e+02 4.2010e+02 + 6.8230e+02 8.5520e+02 9.0340e+02 1.6870e+02 4.5680e+02 5.8190e+02 2.6745e+03 + 3.2386e+03 2.5434e+03 1.3485e+03 1.7030e+03 7.3180e+02 5.1170e+02 7.3450e+02 + 3.5260e+02 5.4450e+02 1.1746e+03 7.0690e+02 4.2360e+02 3.8450e+02 6.6070e+02 + 1.0149e+03 6.5580e+02 1.4733e+03 2.3583e+03 2.6886e+03 2.8281e+03 1.7636e+03 + 5.0420e+02 5.4250e+02 8.7020e+02 5.1620e+02 7.3690e+02 6.4410e+02 7.1710e+02 + 6.4560e+02 3.0290e+02 3.1850e+02 1.2102e+03 1.4099e+03 2.6015e+03 2.7029e+03 + 7.3590e+02 5.9460e+02 1.7990e+02 5.1830e+02 6.0210e+02 6.2410e+02 8.7420e+02 + 6.9830e+02 7.7920e+02 4.3440e+02 7.0290e+02 2.3885e+03 2.5227e+03 2.2480e+03 + 1.3344e+03 1.2636e+03 6.6230e+02 4.8010e+02 4.4120e+02 6.7010e+02 6.2380e+02 + 4.1250e+02 3.0160e+02 7.5350e+02 1.7872e+03 2.7943e+03 1.9021e+03 5.6900e+02 + 5.1630e+02 7.9560e+02 4.3330e+02 2.8960e+02 4.0400e+02 3.1190e+02 5.9950e+02 + 5.6090e+02 4.7170e+02 4.2410e+02 3.0140e+02 9.8080e+02 6.2770e+02 7.0230e+02 + 1.4622e+03 1.8973e+03 1.7537e+03 2.3003e+03 6.5270e+02 6.4920e+02 1.2215e+03 + 6.1950e+02 5.2860e+02 4.0280e+02 5.8290e+02 8.6340e+02 6.2640e+02 4.2330e+02 + 7.1460e+02 3.0956e+03 2.4795e+03 3.1733e+03 4.0520e+02 4.4490e+02 6.4890e+02 + 2.2850e+02 5.8820e+02 1.0539e+03 5.7780e+02 4.5870e+02 4.0800e+02 5.1470e+02 + 4.4650e+02 1.6949e+03 2.2967e+03 2.3573e+03 1.6071e+03 2.2798e+03 5.6790e+02 + 4.0960e+02 6.6210e+02 1.0108e+03 2.1880e+02 5.1730e+02 6.2370e+02 1.0715e+03 + 2.4466e+03 2.4984e+03 2.2961e+03 5.2910e+02 5.8730e+02 5.4970e+02 4.8460e+02 + 3.2550e+02 3.1170e+02 3.7610e+02 7.9070e+02 7.1000e+02 5.4320e+02 8.1030e+02 + 6.3570e+02 6.8500e+02 9.2520e+02 3.8070e+02 1.4844e+03 1.7935e+03 2.4618e+03 + 2.6219e+03 1.2894e+03 8.7930e+02 1.0087e+03 5.1900e+02 3.7780e+02 2.7540e+02 + 6.2330e+02 7.1480e+02 8.8110e+02 5.5510e+02 1.7511e+03 2.2799e+03 2.5235e+03 + 1.6166e+03 4.9230e+02 5.0110e+02 7.0650e+02 5.5250e+02 5.6460e+02 7.1490e+02 + 5.5110e+02 5.8720e+02 2.9240e+02 5.2740e+02 8.4650e+02 4.4170e+02 8.6950e+02 + 1.2539e+03 3.1215e+03 2.4827e+03 1.1163e+03 7.3060e+02 8.1160e+02 6.3050e+02 + 2.5750e+02 3.7780e+02 6.3250e+02 1.0774e+03 3.2900e+03 2.3919e+03 9.5800e+02 + 7.9140e+02 4.2320e+02 4.1950e+02 3.7040e+02 3.9740e+02 3.0270e+02 4.0630e+02 + 9.3370e+02 6.7320e+02 5.7970e+02 5.5200e+02 4.0020e+02 6.6840e+02 1.9753e+03 + 9.4620e+02 1.5619e+03 8.4370e+02 2.2615e+03 2.0367e+03 2.6751e+03 1.2383e+03 + 7.5440e+02 6.5260e+02 3.0360e+02 4.7320e+02 6.8620e+02 5.0200e+02 4.9480e+02 + 3.8410e+02 2.2347e+03 2.8379e+03 3.1198e+03 8.9070e+02 6.0330e+02 3.6850e+02 + 7.2070e+02 5.0320e+02 7.5090e+02 8.9300e+02 2.6090e+02 4.0400e+02 6.8280e+02 + 5.9590e+02 4.6050e+02 5.8360e+02 1.2016e+03 7.5840e+02 1.8288e+03 2.6624e+03 + 2.7854e+03 1.3597e+03 1.0149e+03 3.6420e+02 3.8480e+02 4.2290e+02 8.1930e+02 + 9.9490e+02 3.5196e+03 1.6987e+03 5.6140e+02 3.6660e+02 3.9680e+02 4.3340e+02 + 6.2880e+02 4.6500e+02 2.5900e+02 5.8760e+02 6.4660e+02 4.3930e+02 6.7500e+02 + 7.2130e+02 4.2000e+02 9.7130e+02 2.3874e+03 1.0364e+03 7.8150e+02 1.7755e+03 + 2.5679e+03 2.5186e+03 2.9064e+03 2.5891e+03 1.5747e+03 7.4730e+02 3.6070e+02 + 4.1760e+02 4.1840e+02 2.5380e+02 4.3240e+02 3.0630e+02 2.6171e+03 2.3783e+03 + 2.6045e+03 6.0360e+02 5.0900e+02 8.3890e+02 8.3280e+02 3.3790e+02 4.2140e+02 + 6.0550e+02 3.4270e+02 2.8210e+02 6.5910e+02 6.9470e+02 6.3400e+02 6.4640e+02 + 9.1920e+02 7.8750e+02 1.7812e+03 2.9816e+03 3.0773e+03 2.6076e+03 1.5402e+03 + 3.5780e+02 3.9600e+02 3.5900e+02 6.7480e+02 1.6219e+03 3.7231e+03 1.9753e+03 + 4.9750e+02 6.3960e+02 5.7830e+02 5.9610e+02 7.3250e+02 5.3830e+02 2.2580e+02 + 4.4290e+02 7.8160e+02 2.6000e+02 5.0880e+02 4.6710e+02 2.7220e+02 6.9450e+02 + 2.4524e+03 2.1535e+03 2.5541e+03 2.2435e+03 1.9021e+03 3.0890e+03 4.7636e+03 + 3.9350e+03 1.4550e+03 6.5360e+02 5.0290e+02 6.1720e+02 4.2630e+02 5.4160e+02 + 5.8810e+02 9.0160e+02 3.2922e+03 2.8033e+03 1.1889e+03 4.8140e+02 3.3000e+02 + 9.2730e+02 1.1735e+03 1.9890e+02 4.9250e+02 4.8660e+02 2.0130e+02 1.5210e+02 + 5.8220e+02 5.5880e+02 5.7310e+02 7.5810e+02 5.8720e+02 3.4510e+02 6.9180e+02 + 2.2476e+03 3.1293e+03 2.0884e+03 1.1887e+03 4.1030e+02 3.8480e+02 4.8910e+02 + 3.3490e+02 1.5921e+03 3.8411e+03 1.2583e+03 3.8160e+02 2.8880e+02 6.7810e+02 + 7.9120e+02 1.2861e+03 5.4030e+02 3.0710e+02 4.1500e+02 6.9030e+02 2.1970e+02 + 5.9760e+02 4.3090e+02 2.3910e+02 1.9220e+02 1.1619e+03 1.0358e+03 1.4318e+03 + 2.5365e+03 2.6097e+03 2.1734e+03 4.8126e+03 3.7118e+03 3.8278e+03 1.9011e+03 + 5.0970e+02 6.2710e+02 9.1700e+02 4.2210e+02 8.5060e+02 1.5844e+03 2.2994e+03 + 2.8376e+03 7.5810e+02 3.5780e+02 1.5260e+02 1.3120e+03 7.5620e+02 2.0380e+02 + 6.6790e+02 5.8190e+02 3.7890e+02 2.6420e+02 4.1470e+02 5.6610e+02 5.3790e+02 + 6.3420e+02 1.0995e+03 5.0960e+02 4.2750e+02 7.2300e+02 2.7517e+03 2.9379e+03 + 1.1861e+03 3.9510e+02 2.3670e+02 4.1180e+02 9.9370e+02 2.3055e+03 2.3941e+03 + 6.1140e+02 2.8100e+02 3.5770e+02 4.1580e+02 5.9990e+02 9.2790e+02 6.4050e+02 + 3.9870e+02 7.5030e+02 2.9600e+02 7.3550e+02 4.4470e+02 2.2790e+02 3.2000e+02 + 2.0450e+02 4.7980e+02 6.0130e+02 5.8530e+02 9.5590e+02 1.3200e+03 2.2726e+03 + 1.4454e+03 3.4754e+03 4.0674e+03 2.7592e+03 1.6643e+03 4.6070e+02 5.7860e+02 + 1.0019e+03 1.9752e+03 2.3527e+03 1.6132e+03 7.2420e+02 1.3846e+03 6.3560e+02 + 1.6390e+02 6.1860e+02 1.7456e+03 4.2340e+02 3.6690e+02 8.1790e+02 6.0070e+02 + 4.9510e+02 4.3150e+02 7.4710e+02 4.7260e+02 6.8480e+02 7.5300e+02 8.4420e+02 + 5.4130e+02 7.4010e+02 2.0175e+03 2.4770e+03 1.7123e+03 9.2920e+02 3.8290e+02 + 6.4260e+02 7.6200e+02 2.4148e+03 2.4219e+03 9.4230e+02 2.5190e+02 2.5700e+02 + 5.0520e+02 2.5730e+02 7.4310e+02 6.3000e+02 4.3890e+02 1.0278e+03 4.1700e+02 + 2.0480e+02 4.2040e+02 3.8780e+02 4.4490e+02 1.5500e+02 3.1880e+02 3.2250e+02 + 3.6390e+02 1.0051e+03 1.1646e+03 7.3950e+02 1.9995e+03 1.8393e+03 4.7533e+03 + 4.9000e+03 3.4963e+03 8.8670e+02 6.3400e+02 1.7084e+03 1.9302e+03 1.3576e+03 + 2.1018e+03 8.4400e+02 8.1990e+02 3.4530e+02 1.2320e+02 4.6140e+02 1.0106e+03 + 8.1940e+02 4.8690e+02 7.4890e+02 5.4460e+02 8.1720e+02 7.9210e+02 3.4950e+02 + 2.1270e+02 6.2460e+02 6.3910e+02 6.9560e+02 7.7200e+02 9.5780e+02 1.5688e+03 + 3.5275e+03 1.8003e+03 6.0610e+02 5.9790e+02 5.6560e+02 1.0073e+03 1.1793e+03 + 3.7125e+03 8.8060e+02 3.6600e+02 3.8460e+02 5.0720e+02 6.4160e+02 6.5560e+02 + 3.2380e+02 4.2370e+02 9.8640e+02 7.5450e+02 3.5880e+02 3.7660e+02 1.3610e+02 + 3.8440e+02 2.6870e+02 8.1260e+02 4.9580e+02 1.8310e+02 9.8120e+02 7.2980e+02 + 9.0010e+02 5.0260e+02 5.5020e+02 3.1542e+03 4.7968e+03 4.7104e+03 2.3025e+03 + 1.8613e+03 1.8749e+03 4.3323e+03 2.3130e+03 9.5900e+02 5.5720e+02 9.0580e+02 + 4.3310e+02 6.5010e+02 3.3470e+02 7.9030e+02 3.4680e+02 4.1160e+02 5.8580e+02 + 3.6560e+02 1.0458e+03 8.9220e+02 3.9690e+02 6.6270e+02 5.8910e+02 5.6550e+02 + 4.4770e+02 8.2960e+02 7.8860e+02 1.5237e+03 4.3839e+03 2.5048e+03 1.1550e+03 + 1.1291e+03 6.4720e+02 3.7930e+02 1.9637e+03 2.8985e+03 9.4800e+02 2.5780e+02 + 4.0040e+02 4.8730e+02 4.5480e+02 6.9720e+02 6.0200e+02 5.3450e+02 1.0286e+03 + 4.8940e+02 5.8660e+02 5.8020e+02 1.4920e+02 1.9820e+02 4.2360e+02 4.9550e+02 + 2.5940e+02 4.9650e+02 4.4790e+02 6.6680e+02 1.1858e+03 5.8960e+02 2.7040e+02 + 1.5972e+03 1.5760e+03 3.3138e+03 2.7176e+03 4.0994e+03 4.5747e+03 4.1550e+03 + 2.8197e+03 6.3900e+02 4.2220e+02 5.7280e+02 9.6210e+02 5.8440e+02 6.2710e+02 + 5.2910e+02 4.5940e+02 2.4750e+02 3.6070e+02 2.0120e+02 5.7760e+02 7.4040e+02 + 3.0790e+02 4.0200e+02 4.1240e+02 3.4610e+02 2.4810e+02 8.8940e+02 1.2759e+03 + 1.7209e+03 3.5070e+03 9.5890e+02 9.4170e+02 7.7750e+02 2.5160e+02 5.0350e+02 + 2.8466e+03 3.5362e+03 1.0715e+03 1.3800e+02 4.8790e+02 4.8960e+02 6.0210e+02 + 3.6510e+02 4.1330e+02 6.2850e+02 9.6780e+02 3.4700e+02 8.8790e+02 6.0100e+02 + 3.8970e+02 5.8830e+02 4.0420e+02 5.2450e+02 9.7180e+02 4.5160e+02 2.9270e+02 + 9.8100e+02 1.1142e+03 3.1260e+02 2.4540e+02 4.5350e+02 1.8218e+03 2.8312e+03 + 3.5157e+03 4.9000e+03 4.3234e+03 2.2087e+03 2.1280e+03 6.9500e+02 6.0660e+02 + 3.7320e+02 3.7790e+02 5.5690e+02 3.6590e+02 5.3350e+02 2.9840e+02 4.0570e+02 + 3.2900e+02 1.5080e+02 2.3870e+02 6.4020e+02 5.0430e+02 3.8560e+02 3.7040e+02 + 7.2550e+02 3.0280e+02 6.9920e+02 8.9330e+02 1.6499e+03 3.2591e+03 2.5090e+03 + 9.7610e+02 3.7380e+02 3.1770e+02 6.9810e+02 2.3048e+03 2.3830e+03 1.0783e+03 + 3.9200e+02 6.1820e+02 8.7050e+02 7.2570e+02 3.2930e+02 4.6060e+02 6.5950e+02 + 4.2980e+02 5.1340e+02 5.9890e+02 5.2380e+02 4.4620e+02 5.9060e+02 5.8880e+02 + 6.2030e+02 1.1589e+03 3.2170e+02 4.0320e+02 6.9790e+02 5.6170e+02 7.0160e+02 + 4.2990e+02 3.3010e+02 1.5117e+03 2.3961e+03 3.0560e+03 4.9000e+03 3.8472e+03 + 1.7596e+03 8.5510e+02 6.6410e+02 5.3480e+02 5.8240e+02 7.4680e+02 4.6160e+02 + 4.2480e+02 4.2900e+02 6.3700e+02 6.9330e+02 7.4720e+02 9.0800e+01 2.7410e+02 + 3.4630e+02 4.4090e+02 2.6720e+02 4.7370e+02 4.9350e+02 4.2990e+02 5.5610e+02 + 8.3740e+02 2.5798e+03 1.9768e+03 2.3233e+03 5.3430e+02 3.4870e+02 5.4490e+02 + 8.0220e+02 2.1185e+03 3.0680e+03 3.0161e+03 7.8580e+02 6.6920e+02 5.1790e+02 + 7.2090e+02 6.4770e+02 6.0610e+02 5.4990e+02 6.5060e+02 6.5860e+02 4.5900e+02 + 7.9080e+02 6.7970e+02 5.7290e+02 3.4810e+02 8.9220e+02 8.8010e+02 4.2820e+02 + 3.8180e+02 4.9180e+02 3.9620e+02 3.3300e+02 2.9110e+02 6.1190e+02 5.1960e+02 + 1.2216e+03 4.8947e+03 2*4.9000e+03 3.7520e+03 4.0590e+02 6.6930e+02 + 9.8220e+02 7.2590e+02 7.0620e+02 3.0230e+02 3.7840e+02 4.6930e+02 4.0230e+02 + 6.4250e+02 6.7720e+02 4.6830e+02 2.7010e+02 5.9790e+02 4.8590e+02 2.0140e+02 + 4.2220e+02 4.3820e+02 3.8080e+02 4.9680e+02 1.2470e+03 1.3211e+03 3.2492e+03 + 1.8724e+03 1.0562e+03 3.8170e+02 2.9710e+02 9.8790e+02 2.5926e+03 2.8987e+03 + 2.2036e+03 5.3070e+02 3.3440e+02 5.0750e+02 1.0572e+03 4.7090e+02 7.4130e+02 + 6.6060e+02 5.5550e+02 5.1930e+02 4.2020e+02 5.9090e+02 5.7790e+02 6.3450e+02 + 6.0220e+02 3.8950e+02 8.8860e+02 1.4850e+02 4.0480e+02 3.7600e+02 3.2790e+02 + 4.5960e+02 1.2901e+03 7.3380e+02 5.7450e+02 5.1850e+02 2.5812e+03 + 2*4.9000e+03 2.5308e+03 1.8886e+03 8.6270e+02 7.3120e+02 6.4550e+02 + 4.5460e+02 2.6000e+02 2.4490e+02 1.5730e+02 6.6980e+02 5.5700e+02 5.4240e+02 + 3.0020e+02 3.4080e+02 8.7920e+02 4.3800e+02 3.4210e+02 2.6420e+02 3.1240e+02 + 5.2370e+02 3.2440e+02 1.0791e+03 2.2617e+03 2.9430e+03 1.8438e+03 1.8923e+03 + 1.8090e+02 3.5420e+02 6.4510e+02 1.9335e+03 3.1282e+03 1.7437e+03 1.1660e+03 + 7.0170e+02 3.9750e+02 7.4840e+02 5.4060e+02 7.1820e+02 3.5920e+02 6.1580e+02 + 5.7890e+02 7.6060e+02 5.6510e+02 3.5720e+02 4.6520e+02 5.2510e+02 7.4180e+02 + 7.1110e+02 5.0090e+02 5.8550e+02 2.8000e+02 1.5800e+02 3.6090e+02 1.0298e+03 + 1.1419e+03 8.1960e+02 1.8193e+03 2.3521e+03 1.3972e+03 2.5668e+03 1.9406e+03 + 1.4588e+03 1.8881e+03 1.5661e+03 8.2510e+02 5.1590e+02 3.7280e+02 2.7440e+02 + 3.9000e+02 7.8490e+02 4.5400e+02 5.6650e+02 3.9020e+02 2.3710e+02 6.4850e+02 + 4.9070e+02 3.1120e+02 5.5450e+02 6.6030e+02 4.2270e+02 4.5980e+02 6.7140e+02 + 1.8103e+03 3.3087e+03 2.1014e+03 1.4067e+03 5.0170e+02 2.4770e+02 6.0610e+02 + 1.5409e+03 3.1129e+03 1.3659e+03 1.0407e+03 6.0900e+02 3.9670e+02 5.5340e+02 + 3.2190e+02 5.8250e+02 7.0120e+02 4.4130e+02 9.2770e+02 8.8790e+02 3.2160e+02 + 1.6550e+02 6.4020e+02 4.2880e+02 1.9835e+03 1.4714e+03 5.7270e+02 3.3230e+02 + 4.5610e+02 8.0100e+01 2.5450e+02 9.7350e+02 1.0133e+03 8.5720e+02 1.5324e+03 + 2.5515e+03 1.5471e+03 2.8216e+03 8.0220e+02 2.8918e+03 2.6206e+03 2.3199e+03 + 1.6817e+03 3.6310e+02 3.4890e+02 5.2390e+02 8.5260e+02 6.8660e+02 3.9110e+02 + 3.5470e+02 5.0040e+02 4.8770e+02 4.0570e+02 7.3040e+02 6.6350e+02 5.1430e+02 + 4.8270e+02 4.6010e+02 3.3230e+02 7.2620e+02 1.2371e+03 2.3059e+03 2.4903e+03 + 1.4615e+03 5.8600e+02 4.5520e+02 4.0900e+02 9.0980e+02 2.8683e+03 2.5757e+03 + 6.9280e+02 7.0770e+02 4.7920e+02 5.6760e+02 3.7930e+02 7.9130e+02 9.2580e+02 + 6.4900e+02 5.1730e+02 4.0130e+02 5.6630e+02 3.1310e+02 4.8250e+02 3.6460e+02 + 9.0660e+02 9.0080e+02 2.9320e+02 1.9000e+00 5.4600e+01 2.9740e+02 4.7830e+02 + 5.9780e+02 1.1063e+03 2.7161e+03 5.5124e+03 3.4557e+03 7.3490e+02 3.2740e+02 + 4.0240e+02 6.5820e+02 7.1860e+02 4.9450e+02 7.9350e+02 3.5212e+03 3.4801e+03 + 2.2662e+03 1.2272e+03 7.5940e+02 4.1380e+02 6.1410e+02 7.2240e+02 8.5020e+02 + 7.5250e+02 5.7930e+02 8.2850e+02 7.1520e+02 4.2640e+02 4.8920e+02 5.3620e+02 + 2.9270e+02 6.5450e+02 6.6600e+02 8.6690e+02 5.4560e+02 7.6490e+02 4.5250e+02 + 5.7230e+02 7.2170e+02 2.0540e+03 2.6886e+03 4.0369e+03 4.9357e+03 5.3117e+03 + 5.2431e+03 1.6640e+03 8.7500e+02 5.1270e+02 4.1020e+02 5.1920e+02 6.4530e+02 + 7.7680e+02 1.4380e+03 5.7620e+02 6.6640e+02 9.1320e+02 3.5870e+02 2.4570e+02 + 2.4780e+02 3.0370e+02 4.0120e+02 5.0560e+02 5.3080e+02 7.0850e+02 4.6291e+03 + 5.6000e+03 3.1938e+03 7.6060e+02 3.5320e+02 3.3830e+02 5.8900e+02 3.0590e+02 + 4.0020e+02 5.3740e+02 3.3385e+03 5.6000e+03 3.6763e+03 1.2712e+03 1.0226e+03 + 8.9740e+02 6.5000e+02 9.5320e+02 7.2070e+02 7.9090e+02 5.2590e+02 9.8480e+02 + 8.9150e+02 4.4120e+02 5.2850e+02 3.4930e+02 2.3530e+02 2.2750e+02 6.3440e+02 + 6.7120e+02 5.4690e+02 8.4780e+02 9.4220e+02 3.9660e+02 2.8530e+02 2.0497e+03 + 1.8211e+03 2.9874e+03 4.7794e+03 2*5.6000e+03 4.8099e+03 8.0110e+02 + 2.5320e+02 6.7280e+02 3.9560e+02 4.3080e+02 5.8720e+02 6.9290e+02 4.8120e+02 + 1.3488e+03 1.0084e+03 4.2440e+02 2.7210e+02 1.7820e+02 5.5500e+02 9.0620e+02 + 4.6460e+02 2.5010e+02 6.8640e+02 2.5221e+03 5.6000e+03 5.0254e+03 7.6870e+02 + 3.9420e+02 4.9420e+02 4.3130e+02 7.0480e+02 3.2680e+02 7.1060e+02 1.9104e+03 + 3.8788e+03 3.3833e+03 2.0658e+03 1.0844e+03 1.0659e+03 5.5220e+02 6.1700e+02 + 7.3300e+02 5.4840e+02 6.2500e+02 1.1448e+03 5.1350e+02 7.1200e+02 4.6090e+02 + 6.2700e+02 3.7270e+02 3.3740e+02 7.1650e+02 4.9090e+02 5.3650e+02 1.3445e+03 + 1.1093e+03 3.2320e+02 3.2360e+02 3.7820e+02 1.1634e+03 2.0712e+03 4.0319e+03 + 2*5.6000e+03 4.6307e+03 1.6183e+03 4.4320e+02 6.5100e+02 8.5540e+02 + 4.8150e+02 5.8460e+02 5.6060e+02 6.3830e+02 4.2950e+02 1.0046e+03 3.6260e+02 + 4.4710e+02 2.9860e+02 7.0360e+02 5.6510e+02 4.8800e+02 2.7510e+02 8.3460e+02 + 2.0954e+03 3.9621e+03 3.1312e+03 1.8129e+03 5.8390e+02 5.0640e+02 6.8520e+02 + 3.5790e+02 5.3250e+02 7.0880e+02 1.0751e+03 1.9728e+03 3.4710e+03 2.7415e+03 + 1.8928e+03 8.4290e+02 6.0540e+02 7.6480e+02 7.0580e+02 5.0300e+02 4.6750e+02 + 6.4030e+02 4.0160e+02 6.1980e+02 5.4240e+02 5.4030e+02 1.0380e+03 2.0360e+02 + 3.4480e+02 2.8270e+02 6.1730e+02 6.5080e+02 9.2400e+02 3.9020e+02 4.5410e+02 + 6.0300e+02 7.7960e+02 7.1340e+02 2.7012e+03 5.6000e+03 4.6720e+03 2.9578e+03 + 2.9646e+03 6.2590e+02 1.0180e+03 9.9770e+02 4.5410e+02 3.6700e+02 8.8460e+02 + 7.9850e+02 4.5760e+02 7.1760e+02 4.8940e+02 7.6790e+02 3.7140e+02 7.9820e+02 + 1.0870e+03 2.2380e+02 6.8500e+01 5.1230e+02 3.0325e+03 5.2763e+03 3.7258e+03 + 1.1366e+03 3.5310e+02 3.3800e+02 4.6840e+02 3.4340e+02 4.9830e+02 5.4490e+02 + 3.1400e+02 8.1640e+02 1.8179e+03 3.0245e+03 2.3237e+03 2.0633e+03 9.8300e+02 + 1.4000e+03 1.1337e+03 3.6860e+02 2.1910e+02 6.9370e+02 5.3300e+02 6.6850e+02 + 7.9120e+02 1.2084e+03 6.2540e+02 4.1140e+02 3.1320e+02 6.3920e+02 1.9290e+02 + 4.3100e+02 1.0216e+03 3.3660e+02 4.0050e+02 4.7170e+02 3.2710e+02 5.9470e+02 + 4.2156e+03 5.5192e+03 5.6000e+03 2.1913e+03 2.4210e+03 2.1795e+03 1.2065e+03 + 1.0819e+03 5.1340e+02 3.2960e+02 6.3880e+02 4.9740e+02 4.0700e+02 7.7920e+02 + 6.6200e+02 6.9690e+02 5.8870e+02 8.9980e+02 8.7330e+02 3.3110e+02 1.2540e+02 + 1.8880e+02 4.6324e+03 5.6000e+03 4.2417e+03 6.0090e+02 3.9110e+02 2.3370e+02 + 2.9720e+02 4.3120e+02 3.4180e+02 1.6090e+02 8.5640e+02 3.3970e+02 9.0690e+02 + 2.3105e+03 2.9771e+03 3.4450e+03 2.1011e+03 2.2380e+03 7.1290e+02 2.6080e+02 + 4.4840e+02 4.6540e+02 5.0170e+02 4.3020e+02 6.9300e+02 7.1010e+02 6.3720e+02 + 6.2690e+02 5.2730e+02 2.2610e+02 9.5100e+01 2.6380e+02 6.0680e+02 4.5480e+02 + 5.0650e+02 7.1550e+02 3.0940e+02 1.6322e+03 3.6286e+03 4.7421e+03 3.3185e+03 + 3.7969e+03 4.5487e+03 1.5015e+03 8.8290e+02 6.7490e+02 6.4360e+02 7.3830e+02 + 7.1820e+02 2.4020e+02 6.7860e+02 5.4470e+02 7.2840e+02 8.3680e+02 3.9910e+02 + 6.5210e+02 8.9730e+02 2.2090e+02 8.0800e+01 9.0010e+02 2.8796e+03 + 2*5.6000e+03 9.8990e+02 5.9740e+02 5.8820e+02 3.5420e+02 3.1790e+02 + 3.1230e+02 1.7240e+02 5.3150e+02 5.0460e+02 4.5060e+02 1.0385e+03 2.3583e+03 + 1.9761e+03 2.6653e+03 2.8464e+03 1.0855e+03 5.7080e+02 6.4750e+02 4.0000e+02 + 5.9950e+02 6.1220e+02 2*4.4510e+02 6.3570e+02 6.7600e+02 6.8800e+02 + 2.2040e+02 3.5410e+02 2.5770e+02 3.2670e+02 4.9540e+02 6.4300e+02 4.1060e+02 + 1.5580e+02 3.7980e+02 2.9344e+03 4.2567e+03 2.8608e+03 3.1412e+03 5.4359e+03 + 3.7689e+03 6.2790e+02 3.7510e+02 3.4040e+02 5.9940e+02 6.1170e+02 2.5430e+02 + 6.2910e+02 3.6590e+02 6.1740e+02 7.0700e+02 2.9290e+02 8.8630e+02 9.4740e+02 + 2.6960e+02 3.0020e+02 6.9530e+02 2.3576e+03 5.6000e+03 5.0237e+03 8.8720e+02 + 1.0530e+03 8.2300e+02 6.8480e+02 7.6050e+02 3.6770e+02 4.0220e+02 4.1680e+02 + 5.5760e+02 5.9240e+02 4.0320e+02 1.9155e+03 1.3735e+03 2.5524e+03 2.2474e+03 + 1.9670e+03 8.5220e+02 6.6770e+02 4.6890e+02 5.0050e+02 4.9950e+02 4.9080e+02 + 4.7000e+02 3.4650e+02 5.3700e+02 9.2420e+02 2.5630e+02 3.7840e+02 4.5170e+02 + 3.1130e+02 4.0230e+02 9.1420e+02 3.4860e+02 6.6900e+01 1.1377e+03 2.9851e+03 + 3.4383e+03 2.9896e+03 2.9649e+03 5.6000e+03 4.5558e+03 1.2660e+03 3.6010e+02 + 2.9670e+02 7.2970e+02 7.8220e+02 4.4500e+02 4.7530e+02 2.5850e+02 6.4740e+02 + 6.2830e+02 3.1430e+02 4.8810e+02 6.1330e+02 3.4690e+02 4.2740e+02 1.8496e+03 + 4.2532e+03 5.6000e+03 3.6227e+03 4.6330e+02 7.2400e+02 5.3160e+02 5.9850e+02 + 7.2720e+02 7.4290e+02 5.2930e+02 2.6250e+02 3.9550e+02 7.3430e+02 7.2170e+02 + 5.9050e+02 6.4980e+02 1.7549e+03 2.7082e+03 3.0181e+03 2.7146e+03 1.0173e+03 + 3.3300e+02 3.8390e+02 3.2430e+02 2.6180e+02 3.8870e+02 2.2970e+02 2.1450e+02 + 7.0610e+02 6.8690e+02 5.6450e+02 4.9430e+02 4.1980e+02 6.4200e+02 9.1490e+02 + 4.1860e+02 3.2200e+01 2.4900e+02 3.7338e+03 4.2144e+03 1.8983e+03 2.3295e+03 + 4.8780e+03 4.7711e+03 1.8025e+03 4.5100e+02 3.2960e+02 2.8110e+02 4.1150e+02 + 5.5140e+02 7.2980e+02 2.3300e+02 7.0140e+02 5.5370e+02 4.9260e+02 3.1810e+02 + 3.9970e+02 3.5310e+02 8.5620e+02 2.3463e+03 2*5.6000e+03 3.3974e+03 + 8.0180e+02 8.5270e+02 4.8930e+02 6.3640e+02 9.2260e+02 4.3620e+02 5.5740e+02 + 3.8550e+02 5.4520e+02 4.2560e+02 4.8900e+02 5.8320e+02 5.2500e+02 5.6900e+02 + 1.2904e+03 3.0738e+03 2.1614e+03 1.5413e+03 3.7770e+02 3.2810e+02 5.1670e+02 + 4.5210e+02 2.7390e+02 3.1260e+02 5.9400e+02 3.6880e+02 4.7610e+02 6.7170e+02 + 5.0600e+02 5.0830e+02 8.9120e+02 6.3000e+02 8.2520e+02 1.3700e+02 3.3070e+02 + 4.2822e+03 3.1526e+03 2.1380e+03 2.9177e+03 2*5.6000e+03 2.3337e+03 + 5.9000e+02 3.1790e+02 6.9550e+02 3.7590e+02 4.4520e+02 9.4980e+02 2.6730e+02 + 4.8370e+02 4.5370e+02 3.0600e+02 7.0670e+02 4.9040e+02 3.4690e+02 1.2719e+03 + 2.1233e+03 5.6000e+03 3.9367e+03 3.8702e+03 6.9760e+02 6.3660e+02 4.4900e+02 + 3.3880e+02 6.2540e+02 7.4520e+02 9.8980e+02 8.2450e+02 7.8800e+02 5.5520e+02 + 3.9990e+02 6.2590e+02 4.5930e+02 5.6950e+02 1.0279e+03 2.6023e+03 3.0852e+03 + 2.9050e+03 8.8290e+02 2.2720e+02 3.2670e+02 2.4690e+02 3.5500e+02 2.7030e+02 + 4.3110e+02 3.9930e+02 3.2550e+02 6.9540e+02 9.0580e+02 6.2990e+02 6.3400e+02 + 4.8230e+02 5.3160e+02 1.6280e+02 1.9128e+03 4.3547e+03 4.7031e+03 1.1500e+03 + 2.2036e+03 3.7786e+03 4.7844e+03 2.9681e+03 8.6960e+02 9.6910e+02 4.5260e+02 + 5.0540e+02 5.8550e+02 1.0438e+03 3.4410e+02 5.6330e+02 4.5460e+02 3.1100e+02 + 1.0667e+03 4.2330e+02 1.9240e+02 4.8020e+02 3.7042e+03 4.5649e+03 5.0862e+03 + 2.3183e+03 5.9350e+02 4.4950e+02 5.9430e+02 4.0370e+02 5.0900e+02 3.0720e+02 + 7.8450e+02 1.1228e+03 5.2220e+02 3.7800e+02 4.2930e+02 7.9690e+02 3.5020e+02 + 4.3430e+02 3.0090e+02 1.9309e+03 3.2345e+03 4.3785e+03 7.4180e+02 4.8480e+02 + 3.5700e+02 3.8170e+02 4.6730e+02 5.1510e+02 4.4610e+02 3.9270e+02 5.2940e+02 + 2.9650e+02 5.1500e+02 7.4620e+02 4.0670e+02 5.1320e+02 8.2940e+02 8.2760e+02 + 1.2061e+03 3.2603e+03 2.2306e+03 9.1360e+02 1.9410e+03 4.3036e+03 5.6000e+03 + 3.7063e+03 7.0330e+02 9.2500e+02 6.3130e+02 4.1830e+02 4.2600e+02 5.2030e+02 + 9.1570e+02 4.5170e+02 2.6380e+02 4.8500e+02 7.6200e+02 4.0830e+02 2.3460e+02 + 4.4330e+02 2.9024e+03 4.0579e+03 4.4362e+03 1.8108e+03 6.8540e+02 7.4880e+02 + 2.6580e+02 7.0200e+02 4.7450e+02 4.0380e+02 1.0663e+03 9.1660e+02 7.5440e+02 + 4.5680e+02 4.4350e+02 6.4920e+02 6.7800e+02 2.4290e+02 4.8950e+02 1.1117e+03 + 2.4713e+03 3.6059e+03 1.4362e+03 7.8840e+02 5.2200e+02 6.3020e+02 8.4570e+02 + 6.1960e+02 4.7330e+02 3.6960e+02 4.0960e+02 2.9800e+02 4.6760e+02 6.3200e+02 + 3.0540e+02 5.3460e+02 1.0935e+03 2.0858e+03 3.4043e+03 3.5432e+03 1.3776e+03 + 5.0450e+02 1.1936e+03 3.7576e+03 4.0245e+03 4.3658e+03 7.9930e+02 5.7800e+02 + 9.2400e+02 4.3540e+02 4.1400e+02 5.4690e+02 7.0300e+02 5.0480e+02 3.1050e+02 + 6.9870e+02 6.9360e+02 2.5310e+02 4.7880e+02 2.3464e+03 2.5238e+03 4.1808e+03 + 4.0017e+03 1.1686e+03 5.0420e+02 7.2160e+02 6.7760e+02 4.5310e+02 5.8660e+02 + 1.5810e+02 3.9580e+02 1.0708e+03 7.2750e+02 2.7070e+02 3.7270e+02 6.7020e+02 + 5.1920e+02 5.5420e+02 4.6310e+02 6.6020e+02 2.1782e+03 4.6824e+03 2.2842e+03 + 5.8250e+02 5.0890e+02 8.1390e+02 4.9700e+02 3.8530e+02 3.0870e+02 3.3610e+02 + 6.8840e+02 5.2780e+02 6.2480e+02 7.7850e+02 3.0220e+02 3.6170e+02 1.3573e+03 + 3.4368e+03 2.2261e+03 2.9607e+03 1.3120e+03 6.0550e+02 7.4020e+02 9.8520e+02 + 4.4020e+03 4.4568e+03 3.5585e+03 5.8160e+02 9.5380e+02 5.1450e+02 7.6200e+02 + 3.5640e+02 8.4530e+02 7.2430e+02 5.4550e+02 4.5930e+02 7.1330e+02 2.8780e+02 + 9.9670e+02 1.9285e+03 2.7394e+03 5.6000e+03 3.6492e+03 1.2761e+03 3.7830e+02 + 3.7680e+02 6.7080e+02 4.3570e+02 4.7210e+02 5.0220e+02 3.3590e+02 5.1990e+02 + 5.1750e+02 2.5490e+02 2.2180e+02 4.5850e+02 6.3760e+02 5.8070e+02 5.1170e+02 + 4.0890e+02 1.9920e+03 4.4782e+03 1.8458e+03 6.1070e+02 4.6850e+02 5.0810e+02 + 5.9090e+02 4.1380e+02 2.6340e+02 2.4270e+02 5.5350e+02 5.1210e+02 8.6370e+02 + 1.0307e+03 3.4200e+02 7.6260e+02 1.9956e+03 2.0833e+03 3.5004e+03 2.7674e+03 + 8.7320e+02 4.3570e+02 5.4450e+02 1.7083e+03 4.2202e+03 4.9258e+03 2.8551e+03 + 2.0503e+03 1.3427e+03 5.5080e+02 6.7560e+02 8.3420e+02 4.4170e+02 7.3050e+02 + 5.9970e+02 4.1190e+02 4.1680e+02 4.6370e+02 4.2810e+02 2.1146e+03 4.7501e+03 + 5.2966e+03 3.0328e+03 1.0793e+03 6.7430e+02 7.8340e+02 3.1830e+02 1.0150e+02 + 5.3750e+02 3.7640e+02 6.3980e+02 4.5020e+02 2.5010e+02 3.8560e+02 6.5240e+02 + 3.5670e+02 5.2720e+02 5.8070e+02 4.3290e+02 3.3660e+02 1.9657e+03 3.6159e+03 + 1.8222e+03 6.1010e+02 6.7440e+02 8.6010e+02 3.7800e+02 2.5770e+02 2.2110e+02 + 4.6240e+02 4.8090e+02 9.8370e+02 7.2100e+02 9.8530e+02 1.8375e+03 2.1244e+03 + 2.4712e+03 3.6171e+03 3.1357e+03 2.2561e+03 7.7970e+02 3.6810e+02 7.9810e+02 + 4.0950e+02 3.0220e+03 2.5440e+03 2.8979e+03 3.7541e+03 1.0831e+03 8.2500e+02 + 4.7770e+02 8.7200e+02 4.7770e+02 6.5100e+02 9.2970e+02 5.1750e+02 4.0720e+02 + 7.2110e+02 1.2575e+03 2.3017e+03 4.5914e+03 2.9814e+03 5.2628e+03 1.9360e+03 + 4.6580e+02 5.2060e+02 3.2570e+02 1.9840e+02 2.3990e+02 2.7670e+02 7.6570e+02 + 4.8050e+02 4.9640e+02 3.2850e+02 3.8950e+02 3.5280e+02 4.2430e+02 6.5470e+02 + 5.8480e+02 3.3000e+02 1.0039e+03 4.8201e+03 2.3254e+03 5.1870e+02 5.0650e+02 + 5.0990e+02 4.4540e+02 1.8030e+02 1.6430e+02 5.0450e+02 3.6650e+02 6.8800e+02 + 2.2751e+03 2.0541e+03 2.2240e+03 2.9101e+03 3.1419e+03 1.8815e+03 7.0300e+02 + 1.6515e+03 4.8590e+02 2.6610e+02 4.1490e+02 1.4678e+03 2.4991e+03 2.8114e+03 + 1.1321e+03 3.5081e+03 2.9209e+03 1.9095e+03 1.4092e+03 7.2720e+02 2.5240e+02 + 4.8780e+02 6.2220e+02 3.4060e+02 3.3100e+02 3.5840e+02 1.6518e+03 2.3823e+03 + 4.1032e+03 4.3731e+03 4.2577e+03 2.0444e+03 4.0060e+02 7.0520e+02 5.1620e+02 + 2.1650e+02 3.3180e+02 2.6930e+02 9.3460e+02 8.5510e+02 6.3370e+02 3.6380e+02 + 7.3530e+02 4.5670e+02 6.2860e+02 4.3320e+02 5.7000e+02 4.7600e+02 9.3310e+02 + 3.0835e+03 2.9179e+03 7.9090e+02 4.3550e+02 4.2600e+02 6.0880e+02 6.5520e+02 + 3.4240e+02 6.5140e+02 1.6202e+03 1.9214e+03 2.6191e+03 3.1219e+03 1.4017e+03 + 3.1925e+03 2.0225e+03 6.7000e+02 5.1970e+02 6.7710e+02 4.5590e+02 2.7830e+02 + 3.6280e+02 1.6702e+03 4.0408e+03 2.1190e+03 6.4430e+02 2.2964e+03 2.2385e+03 + 2.3020e+03 2.0885e+03 9.3350e+02 4.9390e+02 4.7600e+02 4.9830e+02 7.0350e+02 + 4.6330e+02 4.5770e+02 2.3199e+03 2.8446e+03 2.3018e+03 5.4927e+03 5.4433e+03 + 1.2280e+03 5.9390e+02 4.4920e+02 5.1830e+02 4.4370e+02 3.4690e+02 2.0170e+02 + 3.2800e+02 4.7810e+02 6.4400e+02 5.2150e+02 6.4680e+02 5.1660e+02 3.6090e+02 + 2.4430e+02 4.1510e+02 8.0270e+02 2.7515e+03 4.2362e+03 2.7159e+03 1.2792e+03 + 5.1930e+02 1.6220e+02 7.5860e+02 6.9010e+02 6.0880e+02 1.3395e+03 1.9226e+03 + 2.3293e+03 2.0638e+03 2.9523e+03 1.9777e+03 1.2206e+03 1.2074e+03 9.2620e+02 + 2.4900e+02 4.1020e+02 6.6790e+02 2.3340e+02 4.4570e+02 1.1753e+03 3.5157e+03 + 2.7355e+03 5.6760e+02 1.0740e+03 2.3406e+03 2.1885e+03 2.3963e+03 2.5953e+03 + 6.3810e+02 2.2010e+02 8.6750e+02 4.4580e+02 3.7750e+02 6.3730e+02 3.6551e+03 + 4.0237e+03 2.0390e+03 3.5507e+03 2.7984e+03 1.2273e+03 7.0320e+02 5.0450e+02 + 5.7920e+02 5.6520e+02 4.4060e+02 2.3430e+02 2.3880e+02 5.4650e+02 7.2130e+02 + 3.8940e+02 8.4040e+02 5.5180e+02 6.2490e+02 2.1570e+02 2.7430e+02 1.9439e+03 + 1.9246e+03 4.2991e+03 2.1629e+03 1.5326e+03 4.4260e+02 2.3840e+02 6.4970e+02 + 9.0230e+02 9.4810e+02 2.2806e+03 2.0106e+03 3.1926e+03 1.8822e+03 8.3920e+02 + 4.8830e+02 1.4779e+03 1.2283e+03 8.4680e+02 3.4010e+02 2.3960e+02 3.3460e+02 + 2.3880e+02 4.5090e+02 1.5081e+03 4.4376e+03 2.0047e+03 3.1830e+02 1.9090e+02 + 1.5232e+03 2.1385e+03 2.4812e+03 2.2575e+03 5.3160e+02 4.4170e+02 3.7690e+02 + 6.9130e+02 8.7150e+02 2.4089e+03 3.4521e+03 2.9456e+03 1.2046e+03 3.3272e+03 + 4.8847e+03 2.3430e+03 3.0410e+02 3.6840e+02 5.0010e+02 6.6210e+02 6.1850e+02 + 4.7950e+02 3.0120e+02 3.7180e+02 5.0790e+02 4.9990e+02 5.1890e+02 4.6140e+02 + 5.7440e+02 8.4580e+02 9.6440e+02 1.3684e+03 4.5549e+03 2.8086e+03 1.4978e+03 + 9.0590e+02 5.5050e+02 4.1600e+02 6.3450e+02 1.6388e+03 2.2760e+03 2.5570e+03 + 2.0764e+03 1.0396e+03 7.0300e+02 7.0510e+02 5.0630e+02 4.3750e+02 7.4550e+02 + 4.0560e+02 5.9900e+02 3.5420e+02 5.2760e+02 3.7250e+02 4.0410e+02 1.7800e+03 + 2.8503e+03 2.1452e+03 4.4150e+02 4.0530e+02 3.6220e+02 8.8050e+02 1.3727e+03 + 1.9827e+03 6.3910e+02 3.1170e+02 5.0890e+02 4.1430e+02 1.4360e+03 2.6340e+03 + 3.5280e+03 1.6544e+03 5.2760e+02 1.1950e+03 4.2336e+03 1.8477e+03 6.2810e+02 + 1.4140e+02 1.9540e+02 3.7280e+02 1.0388e+03 9.5550e+02 4.7160e+02 3.7270e+02 + 1.3430e+02 7.2950e+02 8.2950e+02 6.5610e+02 1.1179e+03 9.8490e+02 1.4919e+03 + 2.9750e+03 4.0865e+03 1.6741e+03 4.1720e+02 9.4830e+02 7.3090e+02 1.0340e+03 + 9.7610e+02 3.6072e+03 4.3707e+03 2.3069e+03 1.0416e+03 8.6540e+02 2.9400e+02 + 6.2650e+02 9.1230e+02 2.8910e+02 3.9380e+02 4.8020e+02 2.5660e+02 4.3530e+02 + 5.2540e+02 3.2630e+02 3.6600e+02 1.8289e+03 4.3510e+03 2.2999e+03 5.1040e+02 + 4.8780e+02 4.8240e+02 8.4040e+02 1.0687e+03 4.5180e+02 7.3840e+02 3.7100e+02 + 2.8230e+02 5.1340e+02 2.8707e+03 3.2115e+03 1.8065e+03 7.2130e+02 4.1270e+02 + 2.1484e+03 3.2775e+03 3.8254e+03 6.4190e+02 5.6650e+02 8.8700e+01 2.3140e+02 + 1.0006e+03 1.0171e+03 6.0150e+02 4.3340e+02 2.7440e+02 6.7750e+02 8.0410e+02 + 9.0010e+02 9.3970e+02 1.5024e+03 2.9773e+03 2.0972e+03 1.6761e+03 4.4580e+02 + 3.8860e+02 5.8430e+02 6.5270e+02 2.0516e+03 2.1480e+03 4.2718e+03 2.5299e+03 + 8.8680e+02 1.1813e+03 5.3750e+02 5.5150e+02 7.5080e+02 3.2270e+02 7.2410e+02 + 3.3330e+02 1.5470e+02 3.3660e+02 3.9310e+02 9.1530e+02 6.1160e+02 4.8600e+02 + 1.1384e+03 3.3098e+03 1.5759e+03 7.7460e+02 4.4180e+02 2.2300e+02 5.6850e+02 + 9.2560e+02 6.4310e+02 2.3920e+02 7.7670e+02 4.0490e+02 1.5511e+03 2.2954e+03 + 2.3972e+03 2.1965e+03 6.2890e+02 5.0400e+02 1.1086e+03 2.4193e+03 4.1739e+03 + 9.2900e+02 4.2970e+02 1.5810e+02 7.6510e+02 6.1360e+02 8.4260e+02 5.1470e+02 + 3.5140e+02 3.5980e+02 3.0770e+02 9.0330e+02 1.1795e+03 1.6787e+03 2.7410e+03 + 2.3640e+03 1.8823e+03 5.8580e+02 4.9140e+02 2.0140e+02 4.8040e+02 9.9080e+02 + 2.7148e+03 4.2830e+03 2.1596e+03 1.7511e+03 5.1730e+02 2.1490e+02 3.7820e+02 + 6.2080e+02 5.3220e+02 3.6770e+02 3.3280e+02 7.4200e+02 5.0860e+02 4.1500e+02 + 1.1279e+03 1.0832e+03 8.2360e+02 5.7330e+02 2.2881e+03 2.6519e+03 1.8353e+03 + 6.6750e+02 4.8440e+02 7.9880e+02 6.5590e+02 5.2050e+02 5.4120e+02 4.5170e+02 + 6.6020e+02 8.8170e+02 2.5295e+03 4.4539e+03 2.8025e+03 8.0830e+02 5.0690e+02 + 5.4360e+02 8.1510e+02 2.5736e+03 3.4620e+03 2.5093e+03 2.8510e+02 2.2270e+02 + 6.5060e+02 4.6470e+02 3.6430e+02 2.6690e+02 3.1610e+02 4.5610e+02 2.8040e+02 + 1.3352e+03 2.1752e+03 2.7437e+03 3.7200e+03 2.1039e+03 1.1598e+03 4.0030e+02 + 3.8100e+02 6.6380e+02 9.8100e+02 1.9010e+03 2.8275e+03 3.0400e+03 1.0718e+03 + 1.8580e+02 3.2530e+02 6.5140e+02 2.4700e+02 5.5590e+02 3.4710e+02 4.6920e+02 + 4.1800e+02 5.0730e+02 3.7080e+02 7.2150e+02 6.7800e+02 4.9950e+02 3.7890e+02 + 1.1267e+03 2.3666e+03 3.0116e+03 1.8398e+03 4.5840e+02 4.5900e+02 5.1370e+02 + 5.1250e+02 3.0900e+02 3.7800e+02 4.6340e+02 3.0720e+02 1.3755e+03 2.1603e+03 + 2.3613e+03 1.2364e+03 1.6070e+02 4.8210e+02 7.4150e+02 9.3420e+02 2.0429e+03 + 3.5895e+03 3.2899e+03 6.8590e+02 5.4680e+02 5.6800e+02 9.2150e+02 6.8490e+02 + 3.4590e+02 5.0130e+02 3.9710e+02 9.6330e+02 1.9142e+03 3.1848e+03 3.9624e+03 + 3.0015e+03 1.9743e+03 2.8010e+02 3.1840e+02 4.6680e+02 8.1300e+02 1.9545e+03 + 3.0005e+03 2.0584e+03 2.0693e+03 5.0380e+02 1.7250e+02 7.1470e+02 5.4110e+02 + 3.7820e+02 3.9010e+02 4.2450e+02 5.7330e+02 6.3840e+02 3.5110e+02 5.4060e+02 + 4.6290e+02 9.2540e+02 5.0690e+02 5.9150e+02 2.8740e+02 2.7361e+03 4.0109e+03 + 8.2760e+02 4.4810e+02 3.0120e+02 4.0010e+02 4.6980e+02 4.5490e+02 4.9780e+02 + 6.6860e+02 9.2340e+02 2.1463e+03 3.9193e+03 2.8298e+03 8.6500e+02 4.7880e+02 + 2.5740e+02 6.1650e+02 5.7780e+02 1.2125e+03 3.7684e+03 2.5678e+03 2.1024e+03 + 4.7420e+02 6.4120e+02 5.8200e+02 3.1650e+02 4.5920e+02 6.0500e+02 9.3070e+02 + 1.6199e+03 2.6157e+03 3.1391e+03 2.1190e+03 1.0272e+03 2.7500e+02 5.1680e+02 + 3.5820e+02 1.1846e+03 2.2534e+03 2.7751e+03 3.0211e+03 3.4723e+03 1.0274e+03 + 2.9790e+02 1.4200e+02 3.6520e+02 6.7610e+02 3.0500e+02 2.3120e+02 2.3760e+02 + 4.2490e+02 5.3550e+02 4.0670e+02 3.2430e+02 4.3430e+02 8.0770e+02 7.4490e+02 + 5.5530e+02 1.0693e+03 2.3047e+03 3.6258e+03 1.0860e+03 6.4300e+02 5.1640e+02 + 7.8740e+02 8.4520e+02 4.7720e+02 3.2530e+02 8.2030e+02 7.5600e+02 3.1337e+03 + 2.5947e+03 2.1129e+03 4.9930e+02 4.1760e+02 3.5630e+02 6.5000e+02 3.5790e+02 + 5.6550e+02 2.2853e+03 4.3112e+03 2.8559e+03 5.8900e+02 7.7420e+02 5.9970e+02 + 4.1970e+02 2.6890e+02 1.0380e+03 1.7292e+03 3.0802e+03 4.0164e+03 2.3983e+03 + 1.6117e+03 1.6860e+02 4.4220e+02 2.8050e+02 5.5500e+02 1.9412e+03 3.1296e+03 + 3.0909e+03 1.8999e+03 1.9896e+03 8.8920e+02 2.8170e+02 1.5980e+02 4.8780e+02 + 4.5030e+02 7.2440e+02 4.9180e+02 3.2770e+02 5.2930e+02 6.1770e+02 8.8600e+01 + 3.3090e+02 3.4880e+02 4.9750e+02 1.0041e+03 4.1730e+02 1.9691e+03 2.2977e+03 + 3.5881e+03 6.4400e+02 3.7940e+02 7.3590e+02 8.3120e+02 6.9950e+02 3.2280e+02 + 5.2450e+02 2.0091e+03 1.4022e+03 2.6308e+03 3.7721e+03 8.0000e+02 6.7000e+02 + 5.9170e+02 4.5760e+02 5.6000e+02 7.6240e+02 4.4680e+02 1.1352e+03 2.6209e+03 + 4.6757e+03 2.7868e+03 7.2180e+02 5.9880e+02 3.7060e+02 3.5430e+02 1.1465e+03 + 2.2544e+03 2.8457e+03 2.3184e+03 8.3340e+02 6.2750e+02 1.8340e+02 6.8590e+02 + 8.0660e+02 1.5422e+03 2.2362e+03 2.7618e+03 2.0210e+03 7.8640e+02 5.6650e+02 + 6.3560e+02 5.3400e+02 2.7670e+02 4.1650e+02 5.2830e+02 6.5330e+02 5.4030e+02 + 5.8050e+02 5.2380e+02 2.3610e+02 1.6300e+02 3.1290e+02 3.8380e+02 6.0870e+02 + 5.9540e+02 4.7620e+02 2.1429e+03 3.4166e+03 1.9447e+03 1.1475e+03 3.9950e+02 + 5.6560e+02 4.1080e+02 4.7480e+02 5.4070e+02 9.0050e+02 2.2544e+03 1.8418e+03 + 3.6778e+03 2.7751e+03 3.1020e+02 6.8210e+02 4.9420e+02 4.8100e+02 7.1190e+02 + 5.1810e+02 4.2180e+02 7.9430e+02 1.0624e+03 2.3955e+03 3.8602e+03 2.9019e+03 + 8.4680e+02 2.3250e+02 2.6010e+02 7.9060e+02 2.0302e+03 3.5396e+03 8.2720e+02 + 7.0350e+02 4.2210e+02 4.5340e+02 9.3420e+02 1.3371e+03 2.3813e+03 2.1508e+03 + 3.4414e+03 1.0338e+03 2.6340e+02 3.2970e+02 5.8520e+02 6.8460e+02 8.1120e+02 + 3.6520e+02 5.3670e+02 7.8880e+02 1.1161e+03 5.0560e+02 5.4410e+02 5.2810e+02 + 3.0840e+02 2.0570e+02 3.0100e+02 2.1230e+02 3.3180e+02 6.0590e+02 2.7651e+03 + 2.6319e+03 1.4771e+03 7.0520e+02 5.2530e+02 6.8300e+02 4.9500e+02 3.5570e+02 + 3.4910e+02 4.0900e+02 2.0182e+03 2.3100e+03 4.0265e+03 1.2091e+03 9.3200e+02 + 6.2420e+02 4.6240e+02 5.6580e+02 9.3530e+02 8.0220e+02 4.0400e+02 5.1970e+02 + 1.2395e+03 1.8454e+03 3.3966e+03 3.4447e+03 2.1200e+03 1.1648e+03 6.5080e+02 + 1.1053e+03 3.5996e+03 2.3665e+03 2.2702e+03 5.2440e+02 7.2980e+02 4.7630e+02 + 2.2024e+03 2.5128e+03 2.2621e+03 2.3204e+03 7.5410e+02 4.7470e+02 3.6620e+02 + 3.0150e+02 2.7240e+02 3.8980e+02 5.5680e+02 6.5090e+02 5.8530e+02 4.2360e+02 + 4.3450e+02 3.8170e+02 4.2340e+02 5.9730e+02 4.8890e+02 5.2940e+02 5.1510e+02 + 3.7770e+02 4.0100e+02 8.3610e+02 2.5531e+03 2.9277e+03 1.3810e+03 7.8610e+02 + 4.8140e+02 3.8890e+02 8.2540e+02 5.5180e+02 5.0410e+02 4.5880e+02 2.8657e+03 + 3.1574e+03 4.5987e+03 1.0933e+03 4.0280e+02 8.6000e+02 5.9570e+02 6.4130e+02 + 5.3010e+02 7.3120e+02 2.0640e+02 6.0650e+02 4.3260e+02 7.7290e+02 1.9774e+03 + 2.7633e+03 2.4859e+03 2.7843e+03 1.7176e+03 3.1657e+03 2.4411e+03 2.2341e+03 + 1.9782e+03 1.0722e+03 2.4710e+02 1.1237e+03 1.9807e+03 1.9923e+03 1.9584e+03 + 9.6630e+02 6.3840e+02 6.3710e+02 4.5380e+02 3.8700e+02 1.7420e+02 5.8130e+02 + 1.0201e+03 5.8610e+02 5.6170e+02 2.9830e+02 2.2830e+02 2.6080e+02 9.6070e+02 + 6.7200e+02 2.0970e+02 7.5980e+02 4.1420e+02 3.8190e+02 6.5630e+02 3.0261e+03 + 3.0963e+03 2.1344e+03 1.4377e+03 6.9320e+02 5.4540e+02 5.3660e+02 9.4280e+02 + 7.2190e+02 4.3870e+02 4.1740e+02 2.0493e+03 5.4137e+03 3.4553e+03 2.3006e+03 + 5.9650e+02 3.6170e+02 4.3770e+02 7.2100e+02 7.1920e+02 7.1430e+02 5.5230e+02 + 2.9620e+02 4.1420e+02 3.0830e+02 8.5770e+02 1.1647e+03 2.6352e+03 3.5198e+03 + 2.3268e+03 3.0166e+03 2.6873e+03 1.2996e+03 6.7320e+02 1.5650e+03 2.1679e+03 + 1.8296e+03 3.6257e+03 2.3404e+03 8.3160e+02 8.3840e+02 6.4780e+02 4.2160e+02 + 5.9020e+02 4.0910e+02 3.7060e+02 5.6660e+02 2.1360e+02 4.6020e+02 5.0810e+02 + 8.2460e+02 1.9650e+02 4.6330e+02 3.9760e+02 6.7880e+02 4.9890e+02 3.9120e+02 + 9.1300e+02 7.3480e+02 9.7680e+02 3.1264e+03 2.2729e+03 2.2910e+03 6.3000e+02 + 7.2230e+02 3.8570e+02 3.4010e+02 7.9280e+02 4.6470e+02 5.0060e+02 8.4630e+02 + 1.6976e+03 5.6000e+03 4.3073e+03 2.1856e+03 6.8220e+02 3.7600e+02 3.0630e+02 + 3.8930e+02 5.9430e+02 6.1380e+02 2.2490e+02 5.0780e+02 4.8450e+02 4.7390e+02 + 2.7770e+02 1.3348e+03 2.0096e+03 2.3788e+03 2.2888e+03 4.1308e+03 5.6000e+03 + 2.7521e+03 3.8216e+03 3.1492e+03 3.5006e+03 2.1877e+03 1.9293e+03 6.0870e+02 + 1.5342e+03 6.2000e+02 2.8810e+02 5.4740e+02 6.8630e+02 3.7800e+02 2.8000e+02 + 6.4200e+02 3.0310e+02 3.9950e+02 8.6580e+02 7.0510e+02 4.9790e+02 4.0800e+02 + 3.9950e+02 4.2650e+02 1.9960e+02 3.3970e+02 3.8090e+02 5.8780e+02 2.5019e+03 + 2.8379e+03 2.2191e+03 1.1344e+03 4.0770e+02 8.8020e+02 7.9250e+02 2.6830e+02 + 7.1610e+02 6.2350e+02 4.7400e+02 1.1485e+03 1.3718e+03 3.6191e+03 5.6000e+03 + 2.2290e+03 6.7410e+02 3.3430e+02 3.7950e+02 5.6050e+02 7.6860e+02 3.6440e+02 + 3.5390e+02 2.8650e+02 2.8900e+02 8.0480e+02 6.7730e+02 7.9100e+02 1.3062e+03 + 5.7090e+02 2.7472e+03 3.0098e+03 3.8133e+03 5.1518e+03 4.8545e+03 3.4291e+03 + 2.3076e+03 2.1092e+03 1.3879e+03 7.7460e+02 7.1390e+02 3.4220e+02 3.8340e+02 + 4.4770e+02 9.8760e+02 4.6820e+02 4.1880e+02 3.6630e+02 2.2130e+02 4.5290e+02 + 5.9030e+02 4.9370e+02 4.5280e+02 4.2340e+02 3.2760e+02 3.7410e+02 2.3940e+02 + 2.4690e+02 4.2170e+02 5.9240e+02 3.0743e+03 3.1571e+03 2.0787e+03 7.9070e+02 + 2.4160e+02 8.0780e+02 9.3280e+02 2.0470e+02 4.9040e+02 5.2530e+02 2.5290e+02 + 3.4500e+02 4.9380e+02 3.8409e+03 4.8438e+03 2.8782e+03 8.0300e+02 4.9200e+02 + 2.9640e+02 5.8340e+02 6.0650e+02 2.4110e+02 2.7890e+02 3.9680e+02 4.4020e+02 + 5.4310e+02 5.0250e+02 5.5740e+02 2.8800e+02 7.5720e+02 7.9600e+02 4.6840e+03 + 2*5.6000e+03 4.4838e+03 5.3617e+03 3.3754e+03 2.2593e+03 7.1410e+02 + 8.0760e+02 5.2510e+02 2.4860e+02 2.7230e+02 5.1030e+02 8.5130e+02 8.1470e+02 + 6.6770e+02 4.4270e+02 2.2680e+02 4.9710e+02 3.0200e+02 5.8120e+02 3.6060e+02 + 5.0650e+02 4.6830e+02 3.7310e+02 4.3630e+02 5.3430e+02 4.2760e+02 9.9560e+02 + 3.4791e+03 1.9669e+03 1.1535e+03 3.6510e+02 2.4980e+02 8.5180e+02 7.9760e+02 + 4.3610e+02 5.7850e+02 5.1800e+02 5.2360e+02 2.4340e+02 9.8490e+02 3.3026e+03 + 5.6000e+03 5.5642e+03 6.9680e+02 5.7300e+02 4.0410e+02 4.5440e+02 3.9670e+02 + 5.5990e+02 6.7550e+02 3.2420e+02 5.2210e+02 2.7790e+02 4.9010e+02 2.0300e+02 + 3.0800e+02 8.6530e+02 1.3432e+03 3.4992e+03 4.7058e+03 2.0192e+03 3.1533e+03 + 4.2057e+03 4.8798e+03 2.9231e+03 1.1351e+03 1.2221e+03 1.9690e+02 4.2260e+02 + 2.0320e+02 4.6920e+02 6.3250e+02 4.5440e+02 9.7320e+02 5.2700e+02 3.8580e+02 + 4.5170e+02 3.9900e+02 3.8390e+02 2.9700e+02 5.1780e+02 3.5440e+02 2.6080e+02 + 6.8050e+02 5.9350e+02 6.7990e+02 2.2997e+03 2.2723e+03 2.1916e+03 8.4380e+02 + 5.5220e+02 2.9310e+02 4.6190e+02 5.8000e+02 4.3830e+02 5.8690e+02 6.3340e+02 + 6.9210e+02 6.3480e+02 4.0910e+02 2.1021e+03 5.4347e+03 5.2919e+03 1.4087e+03 + 7.2250e+02 5.8340e+02 5.3510e+02 5.4700e+02 1.0429e+03 4.6310e+02 4.7140e+02 + 2.7630e+02 2.4170e+02 2.5430e+02 1.9300e+02 2.4700e+02 6.7600e+02 4.7140e+02 + 3.0247e+03 2.8518e+03 2.9920e+03 1.9493e+03 2.6126e+03 3.0033e+03 2.2518e+03 + 2.0780e+03 2.0894e+03 1.8243e+03 6.0100e+02 4.2560e+02 5.2330e+02 4.3030e+02 + 4.7240e+02 7.4000e+02 4.5050e+02 4.5500e+02 4.1660e+02 5.1210e+02 4.1290e+02 + 3.4070e+02 6.4780e+02 3.9720e+02 2.7680e+02 9.2600e+02 8.9110e+02 1.5720e+03 + 2.9058e+03 2.0391e+03 5.0240e+02 4.8870e+02 8.1130e+02 5.2690e+02 2.5600e+02 + 5.4340e+02 6.2170e+02 5.5850e+02 5.8920e+02 9.4170e+02 3.3090e+02 8.7330e+02 + 1.8918e+03 5.0478e+03 5.1779e+03 1.2923e+03 1.0145e+03 5.5590e+02 2.8740e+02 + 4.7710e+02 7.7810e+02 9.9610e+02 5.3090e+02 5.4250e+02 4.0240e+02 3.7670e+02 + 1.0020e+02 2.0970e+02 5.0860e+02 6.9170e+02 2.5811e+03 2.8360e+03 6.3390e+02 + 9.3650e+02 7.5140e+02 2.1609e+03 2.1933e+03 1.9108e+03 2.8927e+03 2.5878e+03 + 8.0690e+02 5.7850e+02 7.4800e+02 2.0170e+02 7.2430e+02 1.0144e+03 3.0070e+02 + 4.9650e+02 7.1090e+02 6.6720e+02 4.8030e+02 4.4410e+02 8.8280e+02 6.2030e+02 + 2.5840e+02 7.2270e+02 7.1390e+02 1.3917e+03 3.6676e+03 1.9496e+03 2.7440e+02 + 5.9680e+02 9.1650e+02 4.9320e+02 1.6930e+02 2.7940e+02 3.7150e+02 4.1760e+02 + 8.8230e+02 9.0570e+02 4.6180e+02 9.7140e+02 1.6328e+03 2.0233e+03 2.6673e+03 + 2.1215e+03 6.8560e+02 5.7640e+02 3.1970e+02 1.8280e+02 5.3420e+02 6.7050e+02 + 9.7280e+02 7.6140e+02 5.6810e+02 2.7680e+02 1.3720e+02 4.0160e+02 8.7250e+02 + 2.2542e+03 2.4028e+03 3.2075e+03 7.9370e+02 4.6190e+02 1.0270e+03 7.3820e+02 + 1.5442e+03 2.3934e+03 2.6314e+03 3.6962e+03 2.6574e+03 7.3530e+02 1.3254e+03 + 5.1280e+02 1.1694e+03 1.1782e+03 7.1120e+02 6.4970e+02 5.4990e+02 3.1680e+02 + 4.6170e+02 4.2410e+02 1.1579e+03 7.6190e+02 4.3200e+02 4.4010e+02 8.4920e+02 + 2.8228e+03 4.0187e+03 1.3971e+03 4.0680e+02 3.3910e+02 5.8140e+02 3.5930e+02 + 1.9740e+02 7.4120e+02 6.6510e+02 2.4340e+02 2.5020e+02 6.5570e+02 8.3860e+02 + 1.0823e+03 4.4570e+02 2.6540e+03 3.4594e+03 1.9093e+03 7.4550e+02 4.8980e+02 + 4.5870e+02 7.1940e+02 4.7450e+02 4.1130e+02 5.2460e+02 9.7740e+02 5.9180e+02 + 2.1050e+02 3.3000e+02 7.1360e+02 9.8400e+02 2.6742e+03 3.0196e+03 2.3726e+03 + 4.9170e+02 2.4860e+02 3.3780e+02 5.3370e+02 5.6190e+02 8.1510e+02 2.3673e+03 + 2.4750e+03 3.1382e+03 2.7374e+03 2.2689e+03 1.1309e+03 1.1461e+03 6.5700e+02 + 3.8570e+02 3.2640e+02 5.6820e+02 4.2120e+02 6.6020e+02 9.5130e+02 7.2320e+02 + 5.1060e+02 8.2960e+02 9.7740e+02 2.2931e+03 2.1961e+03 2.0495e+03 9.4060e+02 + 8.0720e+02 5.2540e+02 8.5860e+02 5.6540e+02 5.8080e+02 5.7780e+02 5.1510e+02 + 1.4600e+02 5.0540e+02 7.2780e+02 9.0640e+02 1.2908e+03 1.0412e+03 1.8945e+03 + 2.8181e+03 2.1659e+03 8.6500e+02 2.5350e+02 4.4870e+02 4.3900e+02 4.0210e+02 + 4.1600e+02 8.3730e+02 1.1756e+03 4.8760e+02 5.1890e+02 4.6880e+02 8.7170e+02 + 1.2673e+03 2.1642e+03 4.0617e+03 7.2650e+02 4.7660e+02 2.9200e+02 2.3470e+02 + 2.8620e+02 7.4650e+02 7.2140e+02 9.8420e+02 1.8260e+03 2.5818e+03 2.4700e+03 + 2.1876e+03 9.0250e+02 1.7717e+03 5.9600e+02 6.4270e+02 7.4970e+02 5.2010e+02 + 7.0220e+02 1.0014e+03 9.2850e+02 4.1770e+02 4.1230e+02 7.7110e+02 1.8472e+03 + 2.0901e+03 2.5213e+03 2.7263e+03 1.5149e+03 7.8190e+02 4.0260e+02 4.9000e+02 + 4.7480e+02 7.0880e+02 4.0200e+02 5.3360e+02 1.8140e+02 2.4210e+02 5.1750e+02 + 1.2857e+03 6.3760e+02 1.2269e+03 1.1159e+03 2.2763e+03 2.7141e+03 9.3850e+02 + 5.1280e+02 5.8500e+02 6.5230e+02 5.6480e+02 3.0060e+02 7.2180e+02 8.4890e+02 + 6.3110e+02 3.7240e+02 5.3140e+02 9.8730e+02 6.8080e+02 2.3261e+03 3.0821e+03 + 9.8610e+02 4.6700e+02 4.4570e+02 3.8000e+02 2.4900e+02 1.3209e+03 1.1531e+03 + 8.5020e+02 1.3030e+03 2.0993e+03 1.7078e+03 2.3688e+03 3.2196e+03 2.0139e+03 + 1.3277e+03 6.0750e+02 2.7960e+02 6.1160e+02 5.9530e+02 6.2880e+02 6.8600e+02 + 3.5340e+02 2.9100e+02 7.7110e+02 2.4818e+03 3.7013e+03 2.2391e+03 9.8260e+02 + 1.1313e+03 6.6030e+02 5.5660e+02 6.6660e+02 3.0410e+02 3.5600e+02 1.3498e+03 + 5.3680e+02 3.1930e+02 3.9910e+02 5.5180e+02 1.0698e+03 8.0480e+02 1.0901e+03 + 1.9146e+03 2.5358e+03 3.2321e+03 1.6378e+03 4.9680e+02 4.8030e+02 6.6540e+02 + 6.1250e+02 4.7270e+02 6.1550e+02 7.8710e+02 6.2100e+02 3.7100e+02 3.4860e+02 + 9.4550e+02 1.3298e+03 2.9731e+03 3.0891e+03 2.5440e+02 4.0090e+02 1.9470e+02 + 4.9230e+02 5.3050e+02 9.3470e+02 7.8710e+02 7.7170e+02 1.0421e+03 6.4370e+02 + 7.4660e+02 2.5199e+03 2.2697e+03 2.5691e+03 1.2878e+03 1.3191e+03 6.9160e+02 + 3.5730e+02 7.7420e+02 8.3390e+02 3.0500e+02 3.6620e+02 3.2910e+02 8.3090e+02 + 2.0230e+03 3.1935e+03 1.6777e+03 7.3600e+02 5.9600e+02 5.4580e+02 3.7740e+02 + 5.7340e+02 5.4310e+02 2.8890e+02 7.0650e+02 5.3960e+02 3.1320e+02 4.1380e+02 + 3.9000e+02 1.2596e+03 3.4650e+02 5.3580e+02 1.5692e+03 2.1681e+03 2.4209e+03 + 2.1578e+03 9.3240e+02 8.2280e+02 1.3199e+03 4.7740e+02 5.8550e+02 2.7960e+02 + 6.2650e+02 8.2590e+02 6.8750e+02 4.1140e+02 8.6730e+02 2.4338e+03 2.8337e+03 + 3.6266e+03 7.1480e+02 4.4540e+02 5.7300e+02 3.9180e+02 7.1600e+02 1.0277e+03 + 6.1950e+02 3.6310e+02 4.6110e+02 5.5230e+02 5.3780e+02 1.7577e+03 2.3149e+03 + 2.6941e+03 2.3174e+03 2.6055e+03 4.7760e+02 6.1200e+02 8.1200e+02 9.3310e+02 + 2.8100e+02 3.4310e+02 6.0810e+02 9.8530e+02 2.2427e+03 2.8553e+03 1.8869e+03 + 1.3884e+03 9.7910e+02 4.2830e+02 5.8980e+02 2.9550e+02 1.3870e+02 4.2440e+02 + 1.0259e+03 6.2820e+02 6.6910e+02 5.0510e+02 6.5630e+02 6.0220e+02 1.0477e+03 + 3.5300e+02 1.1194e+03 2.0867e+03 2.8135e+03 2.9965e+03 1.2038e+03 9.2520e+02 + 9.9090e+02 7.1870e+02 4.2620e+02 5.4030e+02 8.3140e+02 7.5190e+02 8.8210e+02 + 5.5530e+02 1.5174e+03 2.6056e+03 2.8840e+03 2.2537e+03 3.6000e+02 6.2990e+02 + 5.3140e+02 4.9800e+02 8.7000e+02 4.6130e+02 7.6190e+02 6.0690e+02 2.5460e+02 + 3.1410e+02 9.0570e+02 5.2760e+02 4.1750e+02 2.2816e+03 3.5675e+03 2.8373e+03 + 1.1066e+03 8.7540e+02 7.2280e+02 8.0780e+02 3.1690e+02 3.4340e+02 1.0139e+03 + 8.0220e+02 3.7600e+03 2.7336e+03 5.5520e+02 8.3720e+02 3.7360e+02 3.9070e+02 + 5.5670e+02 4.9340e+02 3.1050e+02 5.9200e+02 6.4590e+02 5.5930e+02 4.3810e+02 + 5.4580e+02 6.3150e+02 6.4660e+02 1.5628e+03 1.1302e+03 1.6498e+03 7.0960e+02 + 2.0979e+03 2.2073e+03 3.0573e+03 1.1075e+03 9.3710e+02 5.3210e+02 3.8630e+02 + 3.8200e+02 4.2700e+02 6.1730e+02 4.6620e+02 3.5970e+02 2.3277e+03 3.2433e+03 + 3.5655e+03 7.5680e+02 6.7520e+02 3.8300e+02 7.7320e+02 3.8870e+02 6.1040e+02 + 7.1940e+02 5.3800e+02 3.2410e+02 6.2170e+02 6.9760e+02 3.4490e+02 5.1350e+02 + 7.6070e+02 7.2930e+02 2.1199e+03 3.0428e+03 3.1833e+03 1.0847e+03 1.0569e+03 + 4.0930e+02 4.6140e+02 4.5830e+02 5.5720e+02 7.2650e+02 4.0224e+03 2.0480e+03 + 5.5990e+02 6.4290e+02 4.2100e+02 3.6040e+02 3.5440e+02 6.8170e+02 2.1850e+02 + 4.7380e+02 4.3900e+02 5.8160e+02 6.1340e+02 4.6640e+02 4.6460e+02 7.5410e+02 + 2.7284e+03 2.0818e+03 1.2294e+03 1.9134e+03 2.9348e+03 2.8784e+03 3.3216e+03 + 2.9590e+03 1.8020e+03 7.1540e+02 5.6420e+02 4.7500e+02 6.4530e+02 2.9060e+02 + 4.3100e+02 3.3270e+02 2.9910e+03 2.7180e+03 2.9766e+03 4.2790e+02 4.5750e+02 + 7.8050e+02 1.1044e+03 5.2800e+02 5.8100e+02 7.0000e+02 3.8300e+02 1.9630e+02 + 4.1230e+02 6.8070e+02 5.3180e+02 4.7880e+02 7.2080e+02 5.4700e+02 2.3860e+03 + 3.4076e+03 3.5169e+03 2.9801e+03 1.6984e+03 6.8220e+02 4.0770e+02 3.6600e+02 + 5.1130e+02 1.6473e+03 4.2549e+03 2.3089e+03 6.1290e+02 7.7130e+02 4.6670e+02 + 4.2690e+02 7.3320e+02 4.4240e+02 3.4920e+02 4.7790e+02 5.6390e+02 2.5920e+02 + 5.1870e+02 7.2120e+02 3.0500e+02 6.9650e+02 2.8028e+03 1.6848e+03 2.1702e+03 + 2.5640e+03 2.3399e+03 3.5303e+03 5.4441e+03 4.4971e+03 1.0589e+03 5.8860e+02 + 4.3410e+02 7.1950e+02 6.4530e+02 4.0420e+02 4.8430e+02 8.2120e+02 3.7625e+03 + 3.2038e+03 1.3012e+03 5.9040e+02 4.4250e+02 1.0425e+03 1.0731e+03 1.9290e+02 + 5.3350e+02 6.4530e+02 1.8060e+02 1.6640e+02 6.6170e+02 8.8650e+02 7.0390e+02 + 5.4890e+02 5.2940e+02 3.4520e+02 6.5490e+02 2.2689e+03 3.5764e+03 2.0547e+03 + 7.3410e+02 4.9220e+02 5.2100e+02 4.8970e+02 4.6140e+02 1.9224e+03 4.3899e+03 + 1.2581e+03 4.1710e+02 3.9560e+02 7.7800e+02 7.2460e+02 8.9920e+02 7.0320e+02 + 3.2950e+02 3.3190e+02 5.8930e+02 2.3060e+02 4.0250e+02 6.0250e+02 1.6030e+02 + 4.5630e+02 1.3510e+03 1.6114e+03 1.0750e+03 2.8989e+03 2.9825e+03 1.9776e+03 + 5.5001e+03 4.2421e+03 4.3747e+03 1.7604e+03 5.6340e+02 5.1640e+02 7.9560e+02 + 5.9460e+02 4.1310e+02 1.8353e+03 2.3046e+03 2.5161e+03 9.5370e+02 4.0070e+02 + 1.2590e+02 1.4711e+03 1.1727e+03 3.3420e+02 7.9250e+02 8.0750e+02 3.5660e+02 + 1.3650e+02 5.2910e+02 5.2640e+02 4.3930e+02 6.7880e+02 8.4700e+02 7.7480e+02 + 4.7730e+02 6.7080e+02 3.1448e+03 3.3576e+03 1.0022e+03 7.0770e+02 2.8350e+02 + 6.2020e+02 8.2360e+02 2.6348e+03 2.7361e+03 1.0329e+03 2.5130e+02 1.7400e+02 + 2.9630e+02 5.0570e+02 8.8390e+02 7.6940e+02 1.9380e+02 4.3130e+02 3.3810e+02 + 7.0090e+02 3.6170e+02 4.7690e+02 1.9820e+02 2.4420e+02 4.6840e+02 6.7130e+02 + 4.9800e+02 1.8724e+03 1.7614e+03 2.5973e+03 2.4619e+03 3.9719e+03 4.6484e+03 + 2.5327e+03 8.2400e+02 4.8390e+02 5.4300e+02 1.0634e+03 2.2236e+03 2.2959e+03 + 1.9515e+03 6.4430e+02 8.4570e+02 4.8000e+02 2.1560e+02 6.1750e+02 1.7501e+03 + 8.2560e+02 2.5330e+02 6.9300e+02 4.7490e+02 7.0890e+02 4.7970e+02 7.0630e+02 + 3.8230e+02 6.5050e+02 7.0430e+02 8.9170e+02 5.8640e+02 7.9670e+02 2.3576e+03 + 2.8308e+03 1.2519e+03 7.7230e+02 5.9440e+02 4.0300e+02 9.4090e+02 2.4058e+03 + 2.7679e+03 9.1820e+02 3.3810e+02 1.9230e+02 4.0710e+02 3.9750e+02 6.3910e+02 + 1.0706e+03 3.8710e+02 8.5150e+02 7.4360e+02 2.9420e+02 2.7310e+02 2.4250e+02 + 3.1220e+02 1.4590e+02 6.9670e+02 2.1510e+02 4.1700e+02 1.1142e+03 9.1740e+02 + 4.9130e+02 1.8093e+03 2.3137e+03 5.4323e+03 5.6000e+03 3.9957e+03 1.1104e+03 + 6.3320e+02 1.6934e+03 2.5398e+03 1.9564e+03 2.0743e+03 8.0920e+02 7.6260e+02 + 4.6060e+02 1.9730e+02 5.6530e+02 8.8630e+02 5.1450e+02 5.4620e+02 5.8180e+02 + 4.0450e+02 7.7970e+02 7.2190e+02 4.6490e+02 3.3940e+02 5.4810e+02 9.3560e+02 + 5.2700e+02 7.3610e+02 1.2217e+03 1.7048e+03 4.0314e+03 1.3992e+03 5.8780e+02 + 6.1440e+02 8.2580e+02 7.1650e+02 1.8250e+03 4.2428e+03 8.1660e+02 3.0220e+02 + 3.0440e+02 5.6180e+02 7.1020e+02 6.9880e+02 4.8510e+02 7.3340e+02 1.1760e+03 + 1.2069e+03 5.3150e+02 3.3450e+02 1.3480e+02 3.1870e+02 5.0860e+02 5.8200e+02 + 3.6880e+02 2.6930e+02 8.6880e+02 9.3130e+02 6.5680e+02 5.1180e+02 6.6860e+02 + 3.6048e+03 5.4821e+03 5.3834e+03 2.5262e+03 2.0935e+03 2.2546e+03 4.9513e+03 + 2.6434e+03 1.3042e+03 6.6730e+02 6.7660e+02 3.6210e+02 7.8760e+02 4.3760e+02 + 6.5130e+02 6.2670e+02 3.2720e+02 6.1740e+02 3.4110e+02 9.2640e+02 1.1554e+03 + 3.1010e+02 7.2690e+02 3.3810e+02 3.1910e+02 4.3730e+02 8.9700e+02 8.2710e+02 + 2.0784e+03 5.0101e+03 1.9859e+03 7.5620e+02 7.9140e+02 5.0570e+02 2.8170e+02 + 1.9529e+03 3.3125e+03 1.0663e+03 3.6750e+02 3.9640e+02 7.7710e+02 4.6680e+02 + 6.0050e+02 5.0380e+02 5.9160e+02 9.7740e+02 5.5760e+02 5.3510e+02 5.2810e+02 + 2.4340e+02 3.0450e+02 3.3950e+02 5.2590e+02 3.4180e+02 3.5360e+02 5.6830e+02 + 6.4930e+02 8.0020e+02 3.3870e+02 4.5700e+02 1.9668e+03 2.3762e+03 3.7872e+03 + 3.1058e+03 4.6850e+03 5.2282e+03 4.7486e+03 2.2235e+03 5.1740e+02 6.6720e+02 + 4.9110e+02 9.1150e+02 7.4520e+02 7.3140e+02 6.6880e+02 3.4850e+02 5.2660e+02 + 5.8110e+02 5.5030e+02 6.1050e+02 4.9990e+02 4.0220e+02 2.5390e+02 2.7770e+02 + 3.7250e+02 2.3270e+02 6.7100e+02 7.2270e+02 2.1820e+03 4.0080e+03 2.0697e+03 + 8.9150e+02 7.6540e+02 4.0960e+02 4.1400e+02 3.2533e+03 4.0414e+03 9.2090e+02 + 2.7800e+02 4.8860e+02 8.3370e+02 6.9680e+02 4.0100e+02 4.0220e+02 3.3330e+02 + 1.2846e+03 3.9620e+02 7.7540e+02 5.7290e+02 2.3210e+02 4.7420e+02 3.9750e+02 + 5.1180e+02 5.8240e+02 4.4190e+02 3.4990e+02 9.9750e+02 7.3510e+02 4.9610e+02 + 2.3490e+02 6.0410e+02 1.9829e+03 3.2356e+03 4.0180e+03 5.6000e+03 4.9410e+03 + 1.9528e+03 2.2103e+03 9.9250e+02 5.4510e+02 3.0950e+02 3.8400e+02 5.5230e+02 + 4.6340e+02 5.2020e+02 2.9210e+02 5.8100e+02 3.9930e+02 2.2360e+02 1.7020e+02 + 5.1250e+02 5.6960e+02 3.4990e+02 4.1400e+02 4.0040e+02 3.4820e+02 6.7480e+02 + 6.7110e+02 1.9485e+03 3.7247e+03 2.3782e+03 8.7620e+02 4.2210e+02 4.2600e+02 + 6.7330e+02 2.6340e+03 2.7234e+03 9.9060e+02 3.4650e+02 7.2620e+02 6.6390e+02 + 6.9440e+02 2.5310e+02 4.0450e+02 5.8510e+02 6.0430e+02 6.8950e+02 6.2190e+02 + 4.6950e+02 3.2480e+02 8.0750e+02 5.4140e+02 3.9710e+02 8.5720e+02 4.3230e+02 + 1.6890e+02 7.4320e+02 7.9580e+02 4.0170e+02 4.9060e+02 4.1000e+02 1.2730e+03 + 2.7384e+03 3.4926e+03 5.6000e+03 4.3968e+03 1.7071e+03 1.0944e+03 8.7890e+02 + 5.7920e+02 4.7290e+02 6.9720e+02 6.4230e+02 3.5650e+02 3.9790e+02 5.3490e+02 + 5.7810e+02 8.0210e+02 1.6020e+02 3.0320e+02 3.7670e+02 4.0190e+02 2.9540e+02 + 3.9900e+02 4.7490e+02 6.6030e+02 5.1090e+02 8.5860e+02 2.0102e+03 2.3181e+03 + 1.9494e+03 6.6980e+02 3.7280e+02 3.9490e+02 8.6460e+02 2.4830e+03 3.5062e+03 + 2.3645e+03 1.0326e+03 7.5020e+02 6.2740e+02 5.3790e+02 7.6840e+02 5.4190e+02 + 4.5300e+02 4.8310e+02 5.9590e+02 5.3320e+02 9.2240e+02 8.7850e+02 4.2590e+02 + 5.3100e+02 7.5250e+02 8.8800e+02 5.0020e+02 2.8880e+02 5.3820e+02 4.9250e+02 + 4.8580e+02 4.6610e+02 8.1100e+02 6.1700e+02 9.5400e+02 5.5939e+03 + 2*5.6000e+03 4.2880e+03 5.6980e+02 8.2260e+02 7.0840e+02 8.3320e+02 + 3.0060e+02 2.5240e+02 2.9520e+02 5.6050e+02 3.7810e+02 7.2390e+02 8.3320e+02 + 5.5670e+02 2.2480e+02 6.5060e+02 4.4540e+02 2.3000e+02 2.4800e+02 4.4840e+02 + 3.6640e+02 6.4240e+02 1.4980e+03 1.9686e+03 3.7133e+03 2.0431e+03 7.1030e+02 + 2.4610e+02 3.6830e+02 1.2557e+03 2.1834e+03 3.3128e+03 2.1144e+03 5.9830e+02 + 7.8880e+02 3.7370e+02 8.3340e+02 3.3010e+02 5.7520e+02 5.7600e+02 4.4860e+02 + 5.2730e+02 3.7560e+02 4.1500e+02 5.7460e+02 8.8840e+02 3.5590e+02 3.0880e+02 + 6.6590e+02 2.4200e+02 4.2630e+02 2.8240e+02 3.2600e+02 4.9990e+02 1.1599e+03 + 9.0300e+02 6.6600e+02 4.7800e+02 2.9500e+03 2*5.6000e+03 2.8924e+03 + 1.9784e+03 9.8230e+02 6.4410e+02 4.9250e+02 4.0200e+02 2.1440e+02 1.9290e+02 + 2.3250e+02 9.0810e+02 7.1550e+02 5.5810e+02 2.5700e+02 2.6690e+02 4.5810e+02 + 6.4570e+02 3.1030e+02 2.3900e+02 7.1380e+02 4.4320e+02 4.1240e+02 1.0413e+03 + 2.5848e+03 3.3634e+03 1.8867e+03 8.5010e+02 2.9850e+02 3.4580e+02 1.0971e+03 + 2.3241e+03 3.5751e+03 2.0221e+03 1.3441e+03 6.6100e+02 5.2660e+02 5.8890e+02 + 4.1110e+02 7.1090e+02 4.5900e+02 3.4150e+02 5.1970e+02 8.7270e+02 5.8140e+02 + 3.9170e+02 3.4530e+02 5.0760e+02 1.1318e+03 7.4270e+02 1.8340e+02 3.8770e+02 + 3.7880e+02 1.2530e+02 2.5240e+02 7.6660e+02 1.2326e+03 6.9070e+02 1.8684e+03 + 2.6881e+03 2.3807e+03 2.3098e+03 2.4879e+03 2.4948e+03 2.3666e+03 1.5753e+03 + 7.9440e+02 4.3050e+02 4.2030e+02 3.0560e+02 4.5940e+02 4.3610e+02 5.6660e+02 + 5.3460e+02 6.1530e+02 3.0570e+02 6.8550e+02 7.8010e+02 4.3220e+02 4.2750e+02 + 5.3700e+02 3.8980e+02 3.5820e+02 6.8170e+02 2.0069e+03 3.7814e+03 2.3536e+03 + 1.3319e+03 4.6170e+02 3.4040e+02 2.8110e+02 1.9039e+03 3.5576e+03 2.2966e+03 + 1.1367e+03 4.7730e+02 4.3290e+02 7.5200e+02 5.2070e+02 7.0960e+02 8.0470e+02 + 4.8120e+02 6.0140e+02 1.0182e+03 3.7540e+02 3.5460e+02 5.3760e+02 4.4890e+02 + 2.3096e+03 1.8723e+03 4.8430e+02 5.5750e+02 5.3950e+02 5.8100e+01 1.7800e+02 + 5.5210e+02 9.8940e+02 8.4050e+02 1.9818e+03 2.9160e+03 2.0128e+03 3.2247e+03 + 1.2324e+03 3.3049e+03 2.9949e+03 1.9614e+03 1.6832e+03 2.7050e+02 3.1920e+02 + 6.0710e+02 1.0642e+03 4.9300e+02 3.8790e+02 3.0460e+02 4.6450e+02 5.2170e+02 + 3.1600e+02 5.3090e+02 7.8630e+02 6.1870e+02 3.0920e+02 7.8110e+02 3.2260e+02 + 6.3430e+02 1.4334e+03 2.6353e+03 2.8460e+03 1.1454e+03 7.7090e+02 4.5320e+02 + 4.2490e+02 8.3010e+02 3.2780e+03 2.2679e+03 7.8270e+02 8.5430e+02 5.2560e+02 + 6.5120e+02 5.4530e+02 6.4070e+02 8.6710e+02 6.8310e+02 4.4320e+02 3.8930e+02 + 4.7690e+02 2.2610e+02 5.2010e+02 2.9100e+02 5.3030e+02 8.0940e+02 2.9910e+02 + 2.3000e+00 4.7700e+01 2.8530e+02 6.9410e+02 6.5070e+02 1.3902e+03 3.3951e+03 + 6.8905e+03 4.3196e+03 9.3160e+02 2.1030e+02 3.4670e+02 6.0260e+02 5.9540e+02 + 4.4720e+02 6.6010e+02 4.4015e+03 4.3501e+03 2.8327e+03 1.1631e+03 9.4210e+02 + 3.5550e+02 7.1550e+02 9.9750e+02 9.7170e+02 4.8960e+02 2.6430e+02 1.0573e+03 + 8.9230e+02 6.7840e+02 4.6490e+02 4.9250e+02 2.7810e+02 4.9060e+02 7.0870e+02 + 1.0345e+03 6.2930e+02 7.9480e+02 5.3380e+02 1.1398e+03 6.8650e+02 2.0540e+03 + 3.3607e+03 5.0461e+03 6.1697e+03 6.6396e+03 6.5539e+03 1.3426e+03 8.9870e+02 + 3.9390e+02 6.2470e+02 6.5210e+02 4.0520e+02 6.8070e+02 7.4140e+02 5.5740e+02 + 9.1750e+02 9.8860e+02 2.9570e+02 2.7470e+02 1.7410e+02 3.1890e+02 6.7660e+02 + 5.3750e+02 5.4630e+02 6.7410e+02 5.7864e+03 7.0000e+03 3.9923e+03 8.2940e+02 + 4.3110e+02 3.3140e+02 4.0760e+02 4.9030e+02 3.3910e+02 8.4790e+02 4.1731e+03 + 7.0000e+03 4.5954e+03 5.8200e+02 5.5180e+02 8.9280e+02 4.6760e+02 6.9630e+02 + 8.0510e+02 5.7540e+02 3.2100e+02 5.8420e+02 6.9660e+02 4.0090e+02 5.1620e+02 + 3.7520e+02 2.8760e+02 2.9770e+02 6.0800e+02 6.5760e+02 6.9960e+02 7.9140e+02 + 1.1930e+03 5.3090e+02 4.0020e+02 2.0497e+03 1.6849e+03 3.7343e+03 5.9743e+03 + 2*7.0000e+03 6.0123e+03 7.2310e+02 2.2050e+02 7.3240e+02 4.9980e+02 + 5.6770e+02 9.1560e+02 5.5540e+02 5.6100e+02 2.2261e+03 8.1750e+02 3.3680e+02 + 2.6410e+02 2.0650e+02 6.7160e+02 6.2070e+02 5.7440e+02 5.7820e+02 5.6340e+02 + 3.1527e+03 7.0000e+03 6.2817e+03 7.2710e+02 5.5000e+02 5.1210e+02 5.3270e+02 + 5.0580e+02 3.7950e+02 1.0015e+03 2.1251e+03 4.8485e+03 4.2291e+03 2.0658e+03 + 1.0511e+03 1.1310e+03 6.0750e+02 5.5080e+02 1.0986e+03 6.2430e+02 4.1260e+02 + 1.0082e+03 6.5340e+02 5.1150e+02 4.5830e+02 8.2260e+02 4.3440e+02 5.0400e+01 + 4.8930e+02 7.4210e+02 7.5850e+02 7.6610e+02 1.1679e+03 5.9430e+02 2.1440e+02 + 4.3430e+02 9.2740e+02 2.5890e+03 5.0399e+03 2*7.0000e+03 5.7884e+03 + 1.6973e+03 5.8980e+02 6.8310e+02 8.5010e+02 5.7790e+02 8.4220e+02 6.7030e+02 + 6.1610e+02 7.0590e+02 7.0360e+02 5.2280e+02 4.8270e+02 2.4450e+02 5.7950e+02 + 7.0130e+02 5.2340e+02 2.4740e+02 1.1052e+03 2.0954e+03 4.9526e+03 3.9140e+03 + 1.2899e+03 4.7390e+02 3.9320e+02 6.1950e+02 4.8220e+02 4.5790e+02 3.9410e+02 + 9.7580e+02 2.4660e+03 4.3387e+03 3.4268e+03 1.8676e+03 9.3700e+02 5.6510e+02 + 6.8820e+02 6.7720e+02 3.6950e+02 3.5300e+02 4.7040e+02 4.7580e+02 5.5130e+02 + 6.0940e+02 7.3510e+02 1.0031e+03 1.8020e+02 4.0180e+02 4.9030e+02 5.4000e+02 + 6.9430e+02 8.9330e+02 3.7780e+02 4.0220e+02 6.8050e+02 7.5370e+02 6.6310e+02 + 3.3764e+03 7.0000e+03 5.8400e+03 3.6973e+03 3.7058e+03 6.4500e+02 1.0291e+03 + 9.5310e+02 4.5290e+02 3.8190e+02 7.1120e+02 6.7950e+02 2.7410e+02 1.0273e+03 + 5.8840e+02 7.2600e+02 3.8350e+02 7.3790e+02 1.1472e+03 2.6580e+02 1.4060e+02 + 5.0080e+02 3.7907e+03 6.5954e+03 4.6573e+03 1.4975e+03 2.8200e+02 3.4070e+02 + 3.6380e+02 2.7620e+02 3.2350e+02 5.4850e+02 3.2650e+02 9.0510e+02 1.4560e+03 + 3.7807e+03 2.9046e+03 2.5791e+03 1.3551e+03 1.3200e+03 1.1340e+03 5.2690e+02 + 1.6730e+02 6.5870e+02 3.0520e+02 7.1910e+02 1.1516e+03 8.7050e+02 9.0310e+02 + 4.5940e+02 1.9450e+02 4.4790e+02 2.9070e+02 3.7890e+02 7.7730e+02 4.4620e+02 + 5.4090e+02 5.2970e+02 1.8290e+02 7.7570e+02 5.2695e+03 6.8990e+03 7.0000e+03 + 2.7392e+03 3.0263e+03 2.1795e+03 8.5960e+02 9.1570e+02 8.1400e+02 3.8580e+02 + 5.6720e+02 4.0750e+02 3.5190e+02 9.6580e+02 1.0143e+03 9.4840e+02 5.7200e+02 + 5.7740e+02 1.0950e+03 5.8070e+02 1.0620e+02 3.6360e+02 5.7905e+03 7.0000e+03 + 5.3022e+03 1.1384e+03 4.7960e+02 2.5060e+02 3.9230e+02 4.2020e+02 4.7310e+02 + 2.8760e+02 5.7010e+02 2.2930e+02 8.9640e+02 2.3105e+03 3.7213e+03 4.3062e+03 + 2.1011e+03 2.7975e+03 1.1648e+03 2.1820e+02 4.3620e+02 4.0570e+02 7.9730e+02 + 8.1540e+02 3.6390e+02 1.0096e+03 1.0547e+03 4.4070e+02 3.6240e+02 2.9120e+02 + 1.4580e+02 4.1440e+02 4.2880e+02 4.6720e+02 4.5910e+02 7.7180e+02 4.4010e+02 + 1.4746e+03 4.5358e+03 5.9276e+03 4.1481e+03 4.7462e+03 5.6859e+03 1.3141e+03 + 8.3840e+02 5.4370e+02 5.8190e+02 3.5850e+02 5.3060e+02 2.5450e+02 5.8260e+02 + 3.8080e+02 1.0004e+03 6.1970e+02 4.8770e+02 7.3520e+02 4.1670e+02 2.5200e+02 + 9.0300e+01 5.2910e+02 3.5995e+03 2*7.0000e+03 9.9970e+02 9.3060e+02 + 6.7020e+02 3.2990e+02 2.6260e+02 4.1480e+02 3.6400e+02 5.0330e+02 4.0240e+02 + 5.2270e+02 8.3940e+02 2.3583e+03 2.4701e+03 3.3316e+03 3.5580e+03 9.1620e+02 + 7.9350e+02 4.0140e+02 3.9100e+02 5.9430e+02 5.1650e+02 4.3340e+02 7.1010e+02 + 5.5090e+02 5.5060e+02 6.5710e+02 2.6220e+02 2.6020e+02 3.2710e+02 3.3840e+02 + 3.8740e+02 6.2380e+02 3.5470e+02 1.8860e+02 2.8990e+02 3.6680e+03 5.3208e+03 + 3.5761e+03 3.9265e+03 6.7949e+03 4.7111e+03 7.6830e+02 3.7630e+02 3.2130e+02 + 5.4480e+02 3.6770e+02 3.0700e+02 3.9870e+02 3.6880e+02 1.0414e+03 7.1740e+02 + 2.8000e+02 9.6740e+02 7.8800e+02 3.1040e+02 3.5360e+02 7.4540e+02 2.9470e+03 + 7.0000e+03 6.2797e+03 1.1187e+03 7.7910e+02 8.0410e+02 5.4010e+02 5.7630e+02 + 1.5440e+02 3.6890e+02 3.9250e+02 7.1750e+02 5.7430e+02 4.8290e+02 1.7483e+03 + 1.0892e+03 3.1906e+03 2.8092e+03 2.4588e+03 1.1564e+03 7.4270e+02 5.6440e+02 + 5.7880e+02 6.7540e+02 4.4530e+02 4.0490e+02 5.2970e+02 8.0400e+02 7.4480e+02 + 3.6310e+02 4.1620e+02 3.7860e+02 2.9860e+02 3.2660e+02 4.1050e+02 3.7590e+02 + 6.4900e+01 1.1830e+03 3.7314e+03 4.2978e+03 3.7371e+03 3.7061e+03 7.0000e+03 + 5.6947e+03 1.5998e+03 2.4360e+02 4.3090e+02 6.3330e+02 3.4610e+02 3.8760e+02 + 5.2210e+02 2.7530e+02 5.7440e+02 6.7800e+02 3.3500e+02 4.6920e+02 7.0250e+02 + 4.9520e+02 7.3740e+02 1.6408e+03 5.3165e+03 7.0000e+03 4.5284e+03 4.9510e+02 + 7.4470e+02 7.2610e+02 5.0620e+02 4.6450e+02 6.4990e+02 6.9570e+02 4.9370e+02 + 4.3370e+02 7.4730e+02 6.1930e+02 9.0570e+02 9.3060e+02 1.8791e+03 3.3853e+03 + 3.7727e+03 3.3933e+03 1.1310e+03 3.4970e+02 5.8550e+02 4.3630e+02 2.5250e+02 + 4.7400e+02 2.8950e+02 3.1510e+02 4.4130e+02 1.0633e+03 5.2590e+02 5.8000e+02 + 4.8890e+02 3.2050e+02 9.1430e+02 5.1450e+02 4.9200e+01 2.2750e+02 4.6673e+03 + 5.2680e+03 2.0557e+03 2.3295e+03 6.0975e+03 5.9639e+03 1.5491e+03 4.9550e+02 + 2.3840e+02 3.8260e+02 5.9790e+02 5.7190e+02 7.9670e+02 2.2970e+02 5.6400e+02 + 5.7450e+02 4.2730e+02 2.8970e+02 3.3890e+02 3.1910e+02 1.0523e+03 2.9329e+03 + 2*7.0000e+03 4.2467e+03 8.5040e+02 6.4430e+02 5.4540e+02 6.0800e+02 + 6.9430e+02 5.7070e+02 6.5500e+02 5.0700e+02 4.1100e+02 3.7380e+02 4.2500e+02 + 7.2180e+02 1.0959e+03 8.2760e+02 9.9330e+02 3.8423e+03 2.7018e+03 1.2392e+03 + 4.4350e+02 2.2080e+02 5.3410e+02 3.5980e+02 4.4130e+02 3.1730e+02 2.8300e+02 + 4.0140e+02 3.5350e+02 5.1950e+02 4.6450e+02 4.5560e+02 6.7740e+02 5.1980e+02 + 6.3470e+02 1.1210e+02 2.3030e+02 5.3527e+03 3.9408e+03 2.1380e+03 3.6471e+03 + 2*7.0000e+03 2.3337e+03 2.7770e+02 2.8180e+02 5.7940e+02 1.6600e+02 + 5.6170e+02 8.3810e+02 2.3760e+02 4.9580e+02 4.5480e+02 2.1570e+02 5.6970e+02 + 4.3150e+02 5.7790e+02 7.4040e+02 2.1233e+03 7.0000e+03 4.9208e+03 4.8377e+03 + 4.8630e+02 5.2260e+02 3.8780e+02 3.7330e+02 4.0600e+02 6.0450e+02 1.2041e+03 + 8.4630e+02 3.3760e+02 4.6060e+02 2.4560e+02 3.7660e+02 5.6080e+02 4.2430e+02 + 1.0804e+03 3.2529e+03 3.8565e+03 3.6312e+03 9.9890e+02 2.3950e+02 2.5630e+02 + 3.1490e+02 3.0080e+02 4.5790e+02 4.2530e+02 3.6160e+02 2.6080e+02 5.2050e+02 + 1.1250e+03 5.5170e+02 4.9540e+02 6.9200e+02 6.0700e+02 2.2660e+02 1.8061e+03 + 5.4434e+03 5.8789e+03 1.0724e+03 2.7545e+03 4.7233e+03 5.9806e+03 3.7102e+03 + 8.9950e+02 5.8770e+02 4.6370e+02 3.4880e+02 4.0660e+02 1.1239e+03 2.5580e+02 + 4.3370e+02 5.8250e+02 3.0450e+02 7.7810e+02 3.7650e+02 2.1630e+02 5.1140e+02 + 4.6302e+03 5.7061e+03 6.3577e+03 2.3183e+03 6.0620e+02 5.0550e+02 4.8050e+02 + 3.5100e+02 2.7330e+02 3.4520e+02 5.3590e+02 1.0508e+03 4.5660e+02 3.7540e+02 + 6.0040e+02 6.5540e+02 3.3710e+02 3.5220e+02 2.6340e+02 1.5313e+03 4.0431e+03 + 5.4731e+03 1.2561e+03 3.6260e+02 3.6600e+02 3.9400e+02 3.4840e+02 6.5350e+02 + 4.3840e+02 2.8840e+02 3.9700e+02 2.2870e+02 5.8410e+02 5.5330e+02 3.7810e+02 + 8.2800e+02 7.8590e+02 6.1590e+02 6.5390e+02 4.0754e+03 2.7883e+03 9.7710e+02 + 1.8370e+03 5.3795e+03 7.0000e+03 4.6329e+03 7.3450e+02 1.0687e+03 8.7850e+02 + 3.6210e+02 4.7360e+02 4.7720e+02 5.6750e+02 3.1860e+02 2.5440e+02 5.3060e+02 + 4.6230e+02 3.7590e+02 1.9060e+02 5.8810e+02 3.6280e+03 5.0724e+03 5.5453e+03 + 1.4168e+03 6.1380e+02 7.9420e+02 2.2020e+02 7.9660e+02 5.2770e+02 2.3360e+02 + 7.2730e+02 6.2870e+02 7.5440e+02 5.0180e+02 4.5090e+02 5.4060e+02 7.5910e+02 + 2.7140e+02 2.6270e+02 1.0622e+03 3.0891e+03 4.5073e+03 1.3508e+03 7.9470e+02 + 4.7500e+02 4.2150e+02 5.8120e+02 7.4590e+02 4.1320e+02 3.3700e+02 6.6320e+02 + 3.7460e+02 4.6900e+02 5.6760e+02 3.1400e+02 2.9670e+02 1.1112e+03 2.0858e+03 + 4.2554e+03 4.4290e+03 7.5320e+02 4.7640e+02 1.2158e+03 4.6970e+03 5.0306e+03 + 5.4573e+03 1.0555e+03 8.5400e+02 5.2360e+02 2.0010e+02 6.3500e+02 4.5860e+02 + 5.9160e+02 4.5870e+02 2.9540e+02 5.1610e+02 6.4430e+02 3.8920e+02 4.8580e+02 + 1.9177e+03 3.1548e+03 5.2261e+03 5.0021e+03 1.2952e+03 3.6120e+02 5.1760e+02 + 6.7600e+02 4.0560e+02 4.6010e+02 3.2300e+02 3.9340e+02 9.6190e+02 4.1510e+02 + 2.7350e+02 3.7050e+02 7.1700e+02 5.9730e+02 5.1310e+02 4.8520e+02 7.0800e+02 + 2.7228e+03 5.8530e+03 2.8552e+03 5.6290e+02 5.4240e+02 8.5410e+02 6.2540e+02 + 6.6920e+02 3.8160e+02 3.5130e+02 4.7050e+02 7.5120e+02 6.1700e+02 5.8630e+02 + 2.0500e+02 2.9300e+02 9.2070e+02 4.2959e+03 2.7826e+03 3.7009e+03 1.8316e+03 + 5.2440e+02 8.0060e+02 1.6898e+03 5.5025e+03 5.5710e+03 4.4481e+03 7.8000e+02 + 9.9930e+02 6.5520e+02 8.8290e+02 4.6880e+02 3.5470e+02 7.5270e+02 5.4740e+02 + 4.1000e+02 3.7220e+02 4.0060e+02 7.7870e+02 2.4107e+03 3.4242e+03 7.0000e+03 + 4.5615e+03 1.6107e+03 2.2020e+02 6.3460e+02 7.4210e+02 2.9110e+02 6.7170e+02 + 4.6950e+02 3.7480e+02 4.8760e+02 5.1990e+02 1.9950e+02 3.2680e+02 5.1710e+02 + 6.0810e+02 9.8490e+02 4.2200e+02 4.5980e+02 2.1094e+03 5.5978e+03 2.0239e+03 + 3.6920e+02 5.2190e+02 6.6370e+02 4.6680e+02 3.6630e+02 1.7100e+02 5.1360e+02 + 6.0170e+02 8.5650e+02 7.9020e+02 1.2147e+03 1.4880e+02 6.0910e+02 2.4945e+03 + 2.6041e+03 4.3755e+03 3.4593e+03 1.0116e+03 5.1180e+02 6.8770e+02 2.1884e+03 + 5.2753e+03 6.1572e+03 3.5689e+03 2.0503e+03 8.7870e+02 5.8640e+02 7.9590e+02 + 7.3810e+02 4.9390e+02 8.1360e+02 7.0110e+02 5.6390e+02 4.6330e+02 3.3630e+02 + 5.0510e+02 2.1146e+03 5.9376e+03 6.6208e+03 3.7910e+03 9.9550e+02 7.0780e+02 + 4.9500e+02 3.2480e+02 1.4440e+02 6.0150e+02 5.1550e+02 6.4220e+02 5.3440e+02 + 3.8330e+02 3.3110e+02 7.4170e+02 3.1080e+02 4.2620e+02 7.4340e+02 6.1040e+02 + 2.6880e+02 2.4572e+03 4.5199e+03 2.6802e+03 5.2920e+02 8.9720e+02 6.2800e+02 + 5.1430e+02 3.9870e+02 2.2590e+02 4.4240e+02 4.9380e+02 6.3040e+02 7.5440e+02 + 1.0954e+03 1.3757e+03 2.6555e+03 3.0890e+03 4.5214e+03 3.9196e+03 2.2561e+03 + 3.8420e+02 6.1220e+02 6.1870e+02 1.0175e+03 3.7775e+03 3.1800e+03 3.6223e+03 + 4.6926e+03 1.0597e+03 5.1550e+02 5.4070e+02 4.9690e+02 4.2020e+02 9.6170e+02 + 7.5110e+02 3.6800e+02 3.6140e+02 3.6190e+02 8.4740e+02 2.3017e+03 5.7392e+03 + 3.7267e+03 6.5786e+03 2.1472e+03 7.1770e+02 4.2700e+02 3.2810e+02 2.0150e+02 + 3.0570e+02 3.9690e+02 7.1170e+02 5.2730e+02 4.3920e+02 3.9260e+02 4.8550e+02 + 3.9780e+02 3.7090e+02 6.1270e+02 8.3480e+02 5.0990e+02 5.7210e+02 6.0252e+03 + 2.9068e+03 4.3370e+02 4.5750e+02 4.2190e+02 4.5580e+02 2.3140e+02 2.2150e+02 + 5.6170e+02 4.7690e+02 4.9310e+02 2.2751e+03 2.5676e+03 2.2240e+03 3.6376e+03 + 3.9274e+03 1.7135e+03 6.5030e+02 1.2890e+03 7.6540e+02 4.0890e+02 6.2540e+02 + 1.2134e+03 3.1239e+03 3.5142e+03 1.8180e+03 4.3852e+03 3.6511e+03 1.2831e+03 + 7.7630e+02 6.6660e+02 3.8180e+02 6.3500e+02 6.8020e+02 2.9680e+02 2.5270e+02 + 3.9850e+02 2.1561e+03 2.3823e+03 5.1290e+03 5.4664e+03 5.3222e+03 2.0444e+03 + 5.7640e+02 4.0070e+02 4.9150e+02 1.9500e+02 3.8380e+02 2.9680e+02 6.5860e+02 + 7.9550e+02 5.4920e+02 4.0870e+02 4.6220e+02 5.4840e+02 6.5200e+02 4.3840e+02 + 6.4510e+02 5.6860e+02 1.1736e+03 3.8544e+03 3.6473e+03 6.6440e+02 3.5940e+02 + 5.8200e+02 6.2460e+02 8.0250e+02 3.4150e+02 6.7480e+02 1.2747e+03 2.2262e+03 + 3.2739e+03 3.9023e+03 6.9560e+02 3.9906e+03 2.0225e+03 9.6540e+02 4.0270e+02 + 1.0197e+03 3.1160e+02 2.7990e+02 4.6690e+02 1.1922e+03 5.0511e+03 2.1190e+03 + 9.9220e+02 1.1809e+03 2.7981e+03 2.3020e+03 2.6106e+03 1.5390e+03 2.3960e+02 + 5.4280e+02 4.0100e+02 6.7610e+02 3.4330e+02 5.5040e+02 2.8999e+03 3.5557e+03 + 2.8773e+03 6.8659e+03 6.8041e+03 1.0103e+03 4.1900e+02 5.0770e+02 5.3280e+02 + 2.9880e+02 2.5220e+02 2.1890e+02 3.1820e+02 5.4060e+02 5.7650e+02 4.3840e+02 + 4.7700e+02 8.3050e+02 4.4220e+02 3.3440e+02 3.7990e+02 6.1020e+02 3.4393e+03 + 5.2952e+03 3.3949e+03 1.0720e+03 4.2720e+02 2.6940e+02 6.3520e+02 5.9300e+02 + 5.0650e+02 1.2467e+03 2.3154e+03 2.9116e+03 2.5797e+03 3.6904e+03 1.8856e+03 + 1.2861e+03 9.3720e+02 9.9960e+02 1.5970e+02 4.1060e+02 5.7920e+02 2.6420e+02 + 1.8710e+02 1.5045e+03 4.3946e+03 3.4194e+03 3.6470e+02 6.8200e+02 2.3406e+03 + 2.1885e+03 2.3963e+03 3.2442e+03 8.2990e+02 1.8850e+02 5.7730e+02 7.6220e+02 + 4.8220e+02 7.7120e+02 4.5689e+03 5.0296e+03 2.5488e+03 4.4384e+03 3.4980e+03 + 1.4451e+03 4.8590e+02 4.7080e+02 6.0400e+02 4.6190e+02 5.0510e+02 3.0540e+02 + 5.6150e+02 6.0220e+02 5.5870e+02 3.7860e+02 7.5860e+02 7.6890e+02 2.6890e+02 + 2.4730e+02 3.7200e+02 1.4602e+03 2.4058e+03 5.3738e+03 2.7036e+03 1.3379e+03 + 4.4910e+02 3.7710e+02 6.5740e+02 5.6490e+02 1.5987e+03 2.2806e+03 2.0106e+03 + 3.9908e+03 1.3751e+03 4.7870e+02 7.5740e+02 1.2676e+03 7.6830e+02 1.1707e+03 + 3.5770e+02 1.7020e+02 3.4290e+02 2.2190e+02 6.1500e+02 1.3624e+03 5.5470e+03 + 2.5059e+03 4.1970e+02 4.5430e+02 1.1501e+03 2.1385e+03 3.1015e+03 2.8218e+03 + 4.1240e+02 3.0870e+02 3.3850e+02 6.5980e+02 7.4120e+02 3.0111e+03 4.3151e+03 + 3.6821e+03 1.1444e+03 4.1590e+03 6.1058e+03 2.3430e+03 2.6850e+02 2.4010e+02 + 5.7660e+02 5.2330e+02 9.5400e+02 4.2600e+02 6.6870e+02 2.1980e+02 8.1740e+02 + 6.8160e+02 4.6540e+02 5.1360e+02 4.9940e+02 7.4080e+02 8.7400e+02 1.5012e+03 + 5.6936e+03 3.5108e+03 1.9681e+03 8.2450e+02 7.3410e+02 3.5680e+02 9.2330e+02 + 1.0856e+03 2.2760e+03 3.1962e+03 2.5954e+03 1.1126e+03 5.4870e+02 9.2550e+02 + 3.3520e+02 5.3550e+02 6.6020e+02 6.3980e+02 5.1980e+02 3.7400e+02 4.0220e+02 + 4.7240e+02 4.4000e+02 1.6623e+03 3.5629e+03 2.6815e+03 4.6770e+02 3.6740e+02 + 3.3340e+02 8.2490e+02 1.0166e+03 2.4783e+03 3.3150e+02 4.2840e+02 4.9170e+02 + 6.9410e+02 1.1578e+03 3.2925e+03 4.4101e+03 1.8550e+03 5.4370e+02 1.1790e+03 + 5.2920e+03 1.4571e+03 4.7750e+02 1.6600e+02 9.8100e+01 4.8110e+02 7.1020e+02 + 9.9710e+02 3.5980e+02 3.1110e+02 2.1240e+02 8.9490e+02 8.2650e+02 6.2200e+02 + 7.8140e+02 7.7660e+02 1.6864e+03 3.7188e+03 5.1081e+03 1.6689e+03 4.1880e+02 + 8.1830e+02 4.3200e+02 7.3920e+02 1.6507e+03 4.5089e+03 5.4634e+03 2.3069e+03 + 1.3343e+03 6.8530e+02 3.7830e+02 5.9450e+02 8.1970e+02 2.1800e+02 8.5670e+02 + 3.7190e+02 2.3600e+02 5.1620e+02 5.0450e+02 4.0710e+02 4.4640e+02 1.6578e+03 + 5.4387e+03 2.2999e+03 4.5410e+02 6.0790e+02 4.8910e+02 6.7920e+02 1.0518e+03 + 3.0790e+02 8.0440e+02 4.6710e+02 4.6990e+02 6.2570e+02 3.5884e+03 4.0144e+03 + 1.6740e+03 7.1520e+02 4.1800e+02 2.1484e+03 4.0969e+03 4.7818e+03 7.3360e+02 + 4.3630e+02 2.3900e+02 2.5350e+02 8.3360e+02 7.9460e+02 4.5750e+02 4.4010e+02 + 4.2010e+02 6.7900e+02 5.1430e+02 1.0458e+03 8.8730e+02 1.4794e+03 3.7216e+03 + 2.0972e+03 1.3976e+03 4.1080e+02 2.2890e+02 6.2330e+02 8.3490e+02 2.0516e+03 + 2.1480e+03 5.3398e+03 3.1624e+03 5.3750e+02 9.8880e+02 4.1380e+02 5.3170e+02 + 9.6050e+02 3.6740e+02 4.8980e+02 2.7640e+02 2.6260e+02 2.1830e+02 9.6500e+02 + 6.6590e+02 3.2760e+02 3.8410e+02 1.3869e+03 4.1372e+03 7.4320e+02 8.6070e+02 + 6.0230e+02 4.1950e+02 7.4610e+02 7.4220e+02 6.1180e+02 2.9130e+02 7.7470e+02 + 4.2460e+02 1.3800e+03 2.8693e+03 2.3972e+03 2.7456e+03 3.2960e+02 4.6600e+02 + 1.2711e+03 3.0242e+03 5.2174e+03 1.0575e+03 3.6640e+02 1.3080e+02 5.2460e+02 + 8.3840e+02 7.1670e+02 4.9310e+02 2.6440e+02 1.9280e+02 3.7520e+02 7.5350e+02 + 7.1640e+02 1.1839e+03 3.4263e+03 2.3640e+03 2.2463e+03 6.0650e+02 3.1910e+02 + 3.4230e+02 5.2990e+02 1.0141e+03 3.3935e+03 5.3537e+03 2.1596e+03 2.1164e+03 + 7.5290e+02 3.3560e+02 5.0780e+02 6.2630e+02 4.7660e+02 4.2940e+02 4.0180e+02 + 5.3250e+02 2.9710e+02 4.4060e+02 6.7490e+02 9.4890e+02 8.2190e+02 5.1350e+02 + 2.8601e+03 3.3149e+03 1.2469e+03 6.6170e+02 6.5070e+02 7.7370e+02 5.6750e+02 + 3.2420e+02 5.6100e+02 2.2990e+02 6.3160e+02 7.3750e+02 3.1619e+03 5.5674e+03 + 3.5031e+03 8.7610e+02 3.3080e+02 7.8380e+02 5.5650e+02 3.2170e+03 4.3275e+03 + 3.1366e+03 3.5820e+02 2.3470e+02 3.6650e+02 8.5610e+02 4.1820e+02 2.2560e+02 + 2.3700e+02 5.0340e+02 2.7560e+02 1.0408e+03 2.7189e+03 3.4296e+03 4.6500e+03 + 2.1039e+03 1.3786e+03 4.9780e+02 3.9710e+02 8.3330e+02 5.2090e+02 1.7041e+03 + 3.5344e+03 3.7999e+03 1.2898e+03 4.5460e+02 3.9140e+02 5.8960e+02 1.9670e+02 + 7.5620e+02 3.8150e+02 3.9350e+02 4.8100e+02 7.8390e+02 2.6650e+02 4.9480e+02 + 4.4440e+02 4.2980e+02 5.6000e+02 8.3250e+02 2.3666e+03 3.7645e+03 1.6995e+03 + 4.9290e+02 4.3230e+02 4.9470e+02 7.3300e+02 5.5540e+02 2.9110e+02 3.1970e+02 + 4.8400e+02 1.7150e+03 2.1603e+03 2.9516e+03 8.1830e+02 1.1440e+02 5.2610e+02 + 7.5950e+02 9.5320e+02 2.0429e+03 4.4869e+03 4.1123e+03 7.2990e+02 5.5910e+02 + 5.3400e+02 8.7390e+02 3.7150e+02 2.8280e+02 3.4760e+02 3.5330e+02 9.1150e+02 + 1.6392e+03 3.9810e+03 4.9531e+03 3.7519e+03 1.7540e+03 2.4780e+02 3.6200e+02 + 4.0680e+02 8.6280e+02 2.4431e+03 3.7506e+03 2.5731e+03 2.5867e+03 6.8510e+02 + 2.9980e+02 5.8340e+02 4.7440e+02 3.2940e+02 3.1290e+02 5.3530e+02 3.6070e+02 + 7.3300e+02 4.2920e+02 3.3830e+02 3.9800e+02 9.7750e+02 2.4290e+02 4.9470e+02 + 2.4340e+02 3.4201e+03 5.0136e+03 5.7970e+02 8.2840e+02 6.1700e+02 3.2820e+02 + 5.4770e+02 3.6030e+02 3.1910e+02 6.8940e+02 1.0558e+03 2.1463e+03 4.8991e+03 + 3.5372e+03 7.3340e+02 3.5480e+02 4.0650e+02 3.0380e+02 6.9600e+02 9.6200e+02 + 4.7105e+03 3.2098e+03 1.4954e+03 2.7690e+02 6.4930e+02 5.1270e+02 3.7880e+02 + 4.5400e+02 5.4400e+02 1.4586e+03 2.2319e+03 3.2696e+03 3.9238e+03 2.1190e+03 + 1.3400e+03 3.1010e+02 3.9290e+02 4.0390e+02 1.0183e+03 2.2534e+03 3.4689e+03 + 3.7764e+03 4.3404e+03 9.2000e+02 2.7670e+02 1.8680e+02 2.3500e+02 4.7450e+02 + 3.7960e+02 2.4020e+02 3.2710e+02 6.3660e+02 4.5730e+02 2.9330e+02 4.0720e+02 + 5.6000e+02 5.4260e+02 8.3740e+02 4.5500e+02 1.4823e+03 2.8809e+03 4.5322e+03 + 1.6407e+03 4.7390e+02 5.0120e+02 7.4570e+02 6.2020e+02 5.5450e+02 3.1900e+02 + 1.3366e+03 6.0690e+02 3.9172e+03 3.2433e+03 1.9358e+03 4.9130e+02 3.2520e+02 + 2.5280e+02 5.0520e+02 3.6230e+02 9.2120e+02 2.2853e+03 5.3890e+03 3.5699e+03 + 9.1870e+02 7.9570e+02 8.6350e+02 5.3410e+02 4.7410e+02 9.6530e+02 1.9462e+03 + 3.8503e+03 5.0205e+03 2.3983e+03 2.1482e+03 1.6720e+02 3.6310e+02 4.8730e+02 + 5.7290e+02 1.3619e+03 3.9120e+03 3.8636e+03 2.0999e+03 1.9882e+03 7.8500e+02 + 3.8950e+02 1.3040e+02 5.5400e+02 8.6450e+02 6.3680e+02 5.3510e+02 3.7390e+02 + 4.2870e+02 7.4660e+02 3.1810e+02 3.6500e+02 2.7610e+02 6.5530e+02 8.6880e+02 + 3.4370e+02 2.4614e+03 2.8721e+03 4.4851e+03 9.7780e+02 6.0970e+02 8.0240e+02 + 7.9780e+02 8.0260e+02 6.3020e+02 5.9120e+02 2.0091e+03 1.1510e+03 3.2885e+03 + 4.7152e+03 5.2640e+02 4.5460e+02 4.5440e+02 4.5760e+02 3.9230e+02 7.8140e+02 + 3.9210e+02 1.8801e+03 3.2762e+03 5.8446e+03 3.4835e+03 7.4710e+02 7.4450e+02 + 3.1680e+02 3.2290e+02 1.0794e+03 2.8179e+03 3.5571e+03 2.8980e+03 1.1521e+03 + 5.3810e+02 2.8470e+02 5.5660e+02 8.1190e+02 1.7740e+03 2.7952e+03 3.4523e+03 + 2.5263e+03 7.9340e+02 8.5320e+02 8.2490e+02 4.0260e+02 2.3720e+02 3.0390e+02 + 4.5510e+02 8.6500e+02 5.1910e+02 7.0080e+02 5.6020e+02 2.6870e+02 4.0430e+02 + 3.8940e+02 4.1400e+02 5.2950e+02 5.1750e+02 4.2860e+02 2.6786e+03 4.2708e+03 + 2.4309e+03 1.0943e+03 3.8580e+02 5.2130e+02 2.9490e+02 3.5220e+02 4.9310e+02 + 9.6270e+02 2.8181e+03 1.7719e+03 4.5973e+03 3.4689e+03 2.9310e+02 5.0230e+02 + 4.2050e+02 5.1140e+02 6.3050e+02 5.7720e+02 4.3130e+02 4.8660e+02 8.9090e+02 + 2.3955e+03 4.8252e+03 3.6274e+03 6.8980e+02 3.1900e+02 2.5120e+02 7.1920e+02 + 2.5377e+03 4.4245e+03 1.5724e+03 6.2780e+02 3.4570e+02 5.6110e+02 7.0190e+02 + 1.0298e+03 2.9766e+03 2.6885e+03 4.3018e+03 1.0059e+03 2.9730e+02 1.8160e+02 + 8.1010e+02 6.7310e+02 8.0010e+02 5.6390e+02 8.0470e+02 5.2910e+02 8.9810e+02 + 4.9820e+02 7.1840e+02 7.3230e+02 2.4310e+02 2.8230e+02 1.0120e+02 1.4530e+02 + 2.8610e+02 3.2640e+02 3.4563e+03 3.2898e+03 1.7581e+03 7.1220e+02 4.3760e+02 + 6.0040e+02 5.4790e+02 5.9590e+02 4.3510e+02 3.5530e+02 2.5227e+03 2.8875e+03 + 5.0331e+03 1.1292e+03 1.2371e+03 7.3890e+02 5.3850e+02 4.8270e+02 9.4020e+02 + 5.2440e+02 5.5650e+02 7.7090e+02 1.4395e+03 2.3904e+03 4.2458e+03 4.3059e+03 + 2.1200e+03 1.0412e+03 3.3530e+02 8.0920e+02 4.4994e+03 2.9581e+03 2.2702e+03 + 7.1890e+02 4.9100e+02 4.7490e+02 2.2024e+03 3.1410e+03 2.2621e+03 2.9005e+03 + 1.0350e+03 5.3680e+02 3.9860e+02 3.8740e+02 2.9520e+02 7.1880e+02 6.5880e+02 + 6.4340e+02 6.4310e+02 6.2970e+02 4.2550e+02 5.9260e+02 4.4850e+02 5.2910e+02 + 5.7110e+02 5.6420e+02 4.4850e+02 4.2390e+02 4.6940e+02 6.9560e+02 3.1914e+03 + 3.6597e+03 1.5038e+03 8.1040e+02 3.7850e+02 3.1980e+02 7.6160e+02 8.3410e+02 + 7.3960e+02 3.7850e+02 3.5822e+03 3.9467e+03 5.7483e+03 1.2504e+03 7.1160e+02 + 7.2430e+02 3.6860e+02 6.4110e+02 6.9000e+02 4.5370e+02 3.5190e+02 7.8920e+02 + 3.7390e+02 8.7480e+02 1.6873e+03 3.4542e+03 3.1074e+03 3.4803e+03 1.9906e+03 + 3.9572e+03 3.0513e+03 2.7926e+03 2.1620e+03 6.1250e+02 2.8080e+02 1.1848e+03 + 2.4759e+03 2.4904e+03 2.4481e+03 8.1990e+02 9.2670e+02 8.2480e+02 5.4560e+02 + 3.1670e+02 2.5200e+02 6.4200e+02 7.5740e+02 4.0770e+02 6.4890e+02 4.1370e+02 + 3.6410e+02 5.3910e+02 8.1840e+02 4.7430e+02 3.6850e+02 7.9540e+02 4.2940e+02 + 3.6330e+02 5.8200e+02 3.7827e+03 3.8704e+03 2.1344e+03 2.1275e+03 3.2730e+02 + 5.5000e+02 4.3170e+02 7.8920e+02 1.0615e+03 2.9690e+02 3.6970e+02 2.5616e+03 + 6.7671e+03 4.3191e+03 2.3006e+03 7.4200e+02 2.8880e+02 6.1250e+02 5.2320e+02 + 6.6590e+02 5.9150e+02 5.6350e+02 2.7190e+02 3.0200e+02 3.3900e+02 5.9430e+02 + 9.1350e+02 3.2940e+03 4.3998e+03 2.9085e+03 3.7708e+03 3.3591e+03 1.2521e+03 + 7.1560e+02 1.6038e+03 2.1679e+03 2.0319e+03 4.5322e+03 2.9255e+03 5.7870e+02 + 6.6720e+02 5.3480e+02 4.8460e+02 3.8280e+02 3.9460e+02 3.8140e+02 5.0800e+02 + 4.3930e+02 2.3610e+02 5.1980e+02 6.5900e+02 3.3630e+02 4.5520e+02 4.7900e+02 + 4.7750e+02 4.3250e+02 3.8540e+02 7.6770e+02 7.3140e+02 1.4914e+03 3.9079e+03 + 2.8411e+03 2.2910e+03 7.0950e+02 9.9770e+02 3.1040e+02 3.0690e+02 5.2930e+02 + 6.0000e+02 5.4840e+02 3.8280e+02 1.6636e+03 7.0000e+03 5.3841e+03 2.7320e+03 + 8.9960e+02 4.7970e+02 3.8540e+02 6.3440e+02 7.7270e+02 3.5800e+02 1.5740e+02 + 4.4590e+02 6.2300e+02 5.6560e+02 2.1060e+02 1.8072e+03 2.0096e+03 2.9735e+03 + 2.8610e+03 5.1635e+03 7.0000e+03 3.4401e+03 4.7770e+03 3.9365e+03 4.3757e+03 + 2.1877e+03 2.4116e+03 8.4720e+02 1.1228e+03 4.5150e+02 2.9160e+02 4.4510e+02 + 8.6720e+02 3.7270e+02 3.6290e+02 4.0790e+02 3.5220e+02 4.5580e+02 4.3190e+02 + 7.4580e+02 3.3320e+02 4.4920e+02 3.0340e+02 4.2580e+02 3.6150e+02 4.1080e+02 + 5.3810e+02 7.6180e+02 3.1274e+03 3.5474e+03 2.7739e+03 1.4876e+03 3.1370e+02 + 9.3980e+02 6.7410e+02 3.2250e+02 7.8300e+02 5.2450e+02 3.0790e+02 7.6650e+02 + 1.4636e+03 4.5239e+03 7.0000e+03 2.7863e+03 4.5530e+02 5.5800e+02 3.2270e+02 + 5.5020e+02 8.8100e+02 3.0240e+02 4.8360e+02 3.3750e+02 4.0550e+02 6.0860e+02 + 3.5960e+02 7.1060e+02 1.1556e+03 8.8940e+02 3.4339e+03 3.7622e+03 4.7667e+03 + 6.4398e+03 6.0682e+03 4.2864e+03 2.8845e+03 2.1092e+03 1.3764e+03 6.9490e+02 + 9.0490e+02 4.2660e+02 1.6810e+02 1.9440e+02 8.0600e+02 4.4750e+02 3.5510e+02 + 4.9200e+02 2.7690e+02 4.3500e+02 6.6110e+02 6.4610e+02 5.7150e+02 4.2510e+02 + 4.9550e+02 2.8160e+02 4.4530e+02 3.5220e+02 5.8410e+02 7.6360e+02 3.8429e+03 + 3.9463e+03 2.0787e+03 1.0306e+03 2.0510e+02 1.0452e+03 8.7830e+02 1.4350e+02 + 4.9520e+02 3.3710e+02 4.7700e+02 3.6800e+02 4.7330e+02 4.8011e+03 6.0547e+03 + 3.5978e+03 5.0830e+02 5.5630e+02 3.9990e+02 4.2900e+02 5.9820e+02 4.5250e+02 + 5.5720e+02 4.0250e+02 5.4110e+02 5.7840e+02 4.9140e+02 6.4480e+02 4.2710e+02 + 5.7310e+02 8.9700e+02 5.8550e+03 2*7.0000e+03 5.6047e+03 6.7022e+03 + 4.2193e+03 2.8241e+03 8.3800e+02 9.1710e+02 5.9800e+02 3.2090e+02 3.7350e+02 + 4.8960e+02 8.5080e+02 5.8990e+02 4.7650e+02 5.4440e+02 1.8610e+02 2.9580e+02 + 6.1680e+02 5.8990e+02 3.5500e+02 8.4950e+02 4.2440e+02 4.0040e+02 3.6750e+02 + 4.0480e+02 6.3480e+02 1.7131e+03 4.3489e+03 2.4586e+03 9.3740e+02 3.7330e+02 + 2.0140e+02 6.8020e+02 8.7250e+02 3.4690e+02 8.0140e+02 5.4950e+02 3.8000e+02 + 1.5300e+02 5.0950e+02 4.1282e+03 7.0000e+03 6.9553e+03 6.6140e+02 6.0930e+02 + 5.8390e+02 4.5910e+02 3.4490e+02 4.1770e+02 3.9800e+02 3.5940e+02 4.9980e+02 + 4.9630e+02 4.3810e+02 2.6100e+02 4.4680e+02 9.6660e+02 9.0620e+02 4.3740e+03 + 5.8823e+03 2.0192e+03 3.9416e+03 5.2571e+03 6.0997e+03 3.6539e+03 1.3959e+03 + 8.9060e+02 3.2720e+02 2.7840e+02 3.1710e+02 5.8680e+02 5.7790e+02 6.6070e+02 + 1.0310e+03 5.4720e+02 4.0610e+02 6.0070e+02 4.5020e+02 5.8200e+02 4.5230e+02 + 4.0320e+02 3.9660e+02 2.3530e+02 5.8500e+02 6.6740e+02 6.6300e+02 2.8746e+03 + 2.2723e+03 2.7395e+03 9.0570e+02 4.6230e+02 1.3180e+02 5.8990e+02 4.5650e+02 + 5.3250e+02 6.4490e+02 5.9920e+02 9.9830e+02 5.7820e+02 8.4700e+02 2.6277e+03 + 6.7934e+03 6.6149e+03 1.3421e+03 6.6960e+02 3.7760e+02 4.7970e+02 3.5790e+02 + 6.4830e+02 3.2640e+02 2.5980e+02 3.7870e+02 3.3390e+02 3.3000e+02 1.5560e+02 + 1.3730e+02 6.2210e+02 5.4830e+02 3.7809e+03 3.5648e+03 3.7400e+03 1.3325e+03 + 3.2658e+03 3.7541e+03 2.8147e+03 2.0780e+03 2.6118e+03 2.1154e+03 2.3940e+02 + 3.8360e+02 7.0590e+02 3.8410e+02 6.7400e+02 8.4530e+02 4.0320e+02 3.7120e+02 + 4.5660e+02 4.2960e+02 2.2860e+02 3.1550e+02 8.7500e+02 6.1080e+02 2.6810e+02 + 8.4680e+02 6.3390e+02 6.6300e+02 3.6322e+03 2.0913e+03 4.4830e+02 5.4570e+02 + 3.6230e+02 5.3030e+02 4.0030e+02 4.5300e+02 6.1900e+02 4.6200e+02 4.5940e+02 + 7.2360e+02 3.0820e+02 1.1580e+03 1.1342e+03 6.3097e+03 6.4723e+03 9.0590e+02 + 5.7450e+02 5.4810e+02 2.1020e+02 3.8620e+02 7.0460e+02 8.2960e+02 3.9330e+02 + 6.2480e+02 5.9350e+02 3.4000e+02 9.8200e+01 2.4270e+02 4.2140e+02 6.6870e+02 + 3.2264e+03 3.5450e+03 8.2300e+02 5.8700e+02 5.4370e+02 2.7011e+03 2.1933e+03 + 1.9384e+03 3.6159e+03 3.2347e+03 7.9050e+02 5.5960e+02 5.2350e+02 6.0300e+02 + 8.4980e+02 7.6740e+02 3.7040e+02 3.6160e+02 6.9660e+02 6.6410e+02 3.6890e+02 + 6.1910e+02 9.0220e+02 6.2750e+02 2.7430e+02 9.2400e+02 1.1296e+03 9.9500e+02 + 4.5845e+03 2.4371e+03 3.3610e+02 4.3350e+02 7.8500e+02 5.7440e+02 1.3170e+02 + 4.1780e+02 4.7470e+02 5.4540e+02 4.2370e+02 6.2590e+02 4.3840e+02 7.5960e+02 + 9.1320e+02 2.5291e+03 3.3342e+03 2.6519e+03 8.7670e+02 6.1590e+02 2.9400e+02 + 2.3980e+02 9.0020e+02 6.2660e+02 4.9750e+02 6.5280e+02 4.6870e+02 2.6180e+02 + 1.1340e+02 6.3060e+02 7.7750e+02 2.8178e+03 3.0036e+03 4.0094e+03 5.9410e+02 + 6.6140e+02 5.6700e+02 1.0135e+03 1.6717e+03 2.3934e+03 3.2893e+03 4.6202e+03 + 3.3217e+03 1.1369e+03 1.5586e+03 4.7180e+02 1.2655e+03 5.9640e+02 3.8260e+02 + 3.4620e+02 4.6550e+02 3.2850e+02 3.2940e+02 7.1410e+02 1.7340e+03 6.1990e+02 + 3.4830e+02 7.4750e+02 1.0455e+03 3.5285e+03 5.0233e+03 1.5567e+03 3.5380e+02 + 3.5620e+02 4.5330e+02 4.4290e+02 2.2730e+02 6.7120e+02 3.2700e+02 1.5230e+02 + 3.5620e+02 7.1700e+02 8.5310e+02 1.2859e+03 3.7760e+02 3.3175e+03 4.3243e+03 + 2.0233e+03 8.9500e+02 4.9330e+02 4.7530e+02 7.2490e+02 3.3840e+02 4.6520e+02 + 3.7300e+02 7.3730e+02 4.0520e+02 1.9020e+02 2.9620e+02 5.8940e+02 7.3840e+02 + 3.3428e+03 3.7745e+03 2.3726e+03 6.1830e+02 3.1940e+02 3.0760e+02 5.2470e+02 + 9.8560e+02 7.7610e+02 2.3673e+03 3.0937e+03 3.9227e+03 3.4217e+03 2.8361e+03 + 1.5054e+03 8.9230e+02 4.5070e+02 4.8930e+02 4.3140e+02 5.4850e+02 4.0170e+02 + 6.7730e+02 8.9540e+02 6.6670e+02 8.0280e+02 5.8390e+02 7.8900e+02 2.8664e+03 + 2.7451e+03 2.5619e+03 1.0128e+03 7.4670e+02 5.7710e+02 8.2110e+02 4.3680e+02 + 4.0980e+02 7.4240e+02 5.0420e+02 2.5590e+02 5.2780e+02 4.6190e+02 1.3309e+03 + 9.3400e+02 1.1468e+03 1.5999e+03 3.5226e+03 2.1659e+03 5.9230e+02 2.3180e+02 + 3.3970e+02 6.1460e+02 2.4530e+02 4.7360e+02 8.9830e+02 5.7410e+02 8.3670e+02 + 4.8000e+02 6.1830e+02 6.5280e+02 1.2417e+03 2.7052e+03 5.0771e+03 9.1210e+02 + 4.7080e+02 2.0390e+02 3.2130e+02 7.7320e+02 5.5250e+02 7.8360e+02 8.2750e+02 + 1.7246e+03 3.2272e+03 3.0875e+03 2.1876e+03 1.4442e+03 1.7321e+03 5.9720e+02 + 8.2890e+02 5.8880e+02 7.7220e+02 8.7130e+02 1.0358e+03 8.7810e+02 3.9380e+02 + 3.3630e+02 6.7980e+02 1.8941e+03 2.6126e+03 3.1516e+03 3.4078e+03 9.9740e+02 + 5.2990e+02 4.4380e+02 4.2750e+02 7.1020e+02 7.8160e+02 4.6070e+02 5.1150e+02 + 1.7010e+02 1.9760e+02 4.9100e+02 7.4530e+02 6.9570e+02 9.3640e+02 1.3016e+03 + 2.8454e+03 3.3927e+03 9.1090e+02 5.3320e+02 5.0220e+02 5.1950e+02 3.9070e+02 + 3.9060e+02 7.3520e+02 7.3500e+02 5.5140e+02 4.1240e+02 3.0350e+02 7.6140e+02 + 8.5570e+02 2.9077e+03 3.8527e+03 1.0408e+03 5.0950e+02 2.7730e+02 4.3230e+02 + 3.5280e+02 1.0722e+03 5.1940e+02 8.6820e+02 6.8880e+02 1.1683e+03 1.8249e+03 + 2.9611e+03 4.0244e+03 2.0139e+03 1.5719e+03 5.1030e+02 5.2820e+02 5.6330e+02 + 5.0380e+02 7.4220e+02 7.7790e+02 2.2810e+02 3.8220e+02 6.1160e+02 3.1022e+03 + 4.6266e+03 2.7988e+03 7.5830e+02 1.2249e+03 5.6840e+02 5.7830e+02 3.6720e+02 + 3.7190e+02 4.1850e+02 5.2560e+02 4.3850e+02 5.9830e+02 3.2010e+02 4.5530e+02 + 1.3726e+03 6.6630e+02 1.2993e+03 2.4545e+03 3.1697e+03 4.0401e+03 8.4500e+02 + 4.3250e+02 5.4530e+02 7.0910e+02 6.6010e+02 4.0140e+02 6.0780e+02 4.8450e+02 + 5.7830e+02 4.1220e+02 5.7150e+02 9.4840e+02 1.0286e+03 3.7164e+03 3.8613e+03 + 8.7580e+02 2.9700e+02 2.0600e+02 5.3860e+02 4.6150e+02 6.5040e+02 8.3360e+02 + 5.0920e+02 8.1660e+02 4.5960e+02 7.7240e+02 3.1499e+03 2.2697e+03 3.2114e+03 + 1.2635e+03 7.8370e+02 6.7170e+02 4.7860e+02 4.8830e+02 7.3530e+02 4.1580e+02 + 3.8610e+02 3.5100e+02 8.2600e+02 2.5287e+03 3.9919e+03 1.4869e+03 5.4570e+02 + 6.4700e+02 8.6810e+02 4.5900e+02 4.7900e+02 4.8180e+02 2.3700e+02 9.5490e+02 + 7.3270e+02 2.3050e+02 4.8750e+02 4.4270e+02 1.1250e+03 5.9100e+02 5.0050e+02 + 1.2641e+03 2.7101e+03 3.0261e+03 2.6973e+03 6.0480e+02 9.4810e+02 9.1850e+02 + 4.0560e+02 5.2310e+02 4.3150e+02 5.3320e+02 7.6870e+02 6.5060e+02 3.5280e+02 + 9.5240e+02 3.0423e+03 3.5422e+03 4.5333e+03 7.1610e+02 4.0670e+02 6.3530e+02 + 2.3170e+02 5.2250e+02 7.1680e+02 6.9780e+02 3.9320e+02 5.3150e+02 3.6510e+02 + 3.3190e+02 1.2782e+03 2.3149e+03 3.3676e+03 2.8968e+03 3.2569e+03 4.7200e+02 + 4.5920e+02 5.4860e+02 1.2462e+03 2.3890e+02 3.6590e+02 5.0490e+02 1.2893e+03 + 2.8034e+03 3.5691e+03 1.8709e+03 1.4537e+03 5.1880e+02 3.4890e+02 6.5270e+02 + 2.4610e+02 2.8510e+02 3.7150e+02 8.9550e+02 7.3900e+02 8.3040e+02 6.3200e+02 + 5.2360e+02 5.5640e+02 8.3250e+02 6.6120e+02 1.1428e+03 2.6084e+03 3.5169e+03 + 3.7456e+03 1.2193e+03 1.0626e+03 1.3808e+03 4.5370e+02 2.9410e+02 3.7660e+02 + 6.2130e+02 8.9860e+02 6.9450e+02 4.7830e+02 1.2153e+03 3.2570e+03 3.6050e+03 + 2.8171e+03 4.1130e+02 4.7370e+02 3.8320e+02 4.2600e+02 7.5780e+02 4.7790e+02 + 8.7710e+02 4.9860e+02 2.5710e+02 5.7720e+02 7.3130e+02 3.9740e+02 7.9410e+02 + 2.8520e+03 4.4593e+03 3.5466e+03 7.0950e+02 7.1730e+02 8.7240e+02 7.7870e+02 + 3.7080e+02 2.9280e+02 5.5790e+02 1.2253e+03 4.7000e+03 3.4170e+03 6.2460e+02 + 7.5090e+02 4.6490e+02 3.4170e+02 4.1410e+02 4.8610e+02 2.7460e+02 7.3550e+02 + 7.3320e+02 5.0500e+02 6.0750e+02 7.3700e+02 5.6500e+02 8.0390e+02 1.8945e+03 + 8.6710e+02 1.3730e+03 1.2427e+03 2.0979e+03 2.7591e+03 3.8216e+03 1.3525e+03 + 1.0478e+03 9.1460e+02 4.9800e+02 2.3610e+02 6.0450e+02 4.5300e+02 4.0250e+02 + 3.4190e+02 2.3277e+03 4.0542e+03 4.4569e+03 7.7490e+02 6.6050e+02 4.0860e+02 + 4.1120e+02 5.8970e+02 5.2380e+02 7.8430e+02 5.2180e+02 2.7270e+02 6.6720e+02 + 6.9350e+02 4.5040e+02 4.1230e+02 9.2800e+02 7.8680e+02 2.6499e+03 3.8035e+03 + 3.9792e+03 1.1655e+03 7.3370e+02 4.0560e+02 3.9360e+02 3.6380e+02 6.8120e+02 + 7.4770e+02 5.0280e+03 2.5600e+03 5.4400e+02 5.5420e+02 4.2170e+02 5.8620e+02 + 7.0370e+02 8.9340e+02 3.0170e+02 5.4380e+02 6.1630e+02 7.7040e+02 5.2080e+02 + 5.6050e+02 2.9840e+02 6.6600e+02 3.4105e+03 2.6022e+03 1.6462e+03 1.9759e+03 + 3.6685e+03 3.5980e+03 4.1519e+03 3.6987e+03 1.6678e+03 5.9130e+02 7.0000e+02 + 4.6050e+02 6.2200e+02 2.7430e+02 3.7390e+02 5.5350e+02 3.7388e+03 3.3975e+03 + 3.7208e+03 7.4110e+02 5.3140e+02 7.6850e+02 6.4240e+02 4.6790e+02 5.0740e+02 + 7.3520e+02 2.1540e+02 3.6360e+02 6.1780e+02 6.5800e+02 6.2470e+02 6.4490e+02 + 8.6840e+02 7.5990e+02 2.3860e+03 4.2595e+03 4.3962e+03 3.7252e+03 1.2320e+03 + 4.4320e+02 4.0710e+02 2.4880e+02 5.4070e+02 1.1783e+03 5.3187e+03 2.8862e+03 + 5.0610e+02 6.9090e+02 3.5330e+02 6.4270e+02 8.9910e+02 4.1380e+02 3.9840e+02 + 4.0380e+02 4.8640e+02 2.4930e+02 3.9690e+02 5.8600e+02 3.2430e+02 5.2740e+02 + 3.5034e+03 1.6889e+03 2.7128e+03 3.2050e+03 2.3399e+03 4.4129e+03 6.8052e+03 + 5.6214e+03 1.4155e+03 6.1850e+02 5.7230e+02 6.4790e+02 5.3320e+02 6.3680e+02 + 4.6900e+02 1.1179e+03 4.7031e+03 4.0048e+03 1.1900e+03 5.5600e+02 4.6760e+02 + 1.0612e+03 7.0500e+02 2.7360e+02 5.5800e+02 6.2580e+02 2.9940e+02 1.5000e+02 + 6.0830e+02 7.9690e+02 7.5390e+02 5.8160e+02 4.7680e+02 3.6060e+02 5.5380e+02 + 2.8361e+03 4.4704e+03 2.5683e+03 8.5360e+02 4.0120e+02 4.6290e+02 5.1900e+02 + 3.4880e+02 1.9746e+03 5.4873e+03 1.4643e+03 1.9660e+02 3.8380e+02 1.0050e+03 + 5.8770e+02 9.5690e+02 5.8210e+02 2.5130e+02 3.0190e+02 6.7580e+02 3.2780e+02 + 6.4550e+02 6.4680e+02 2.4150e+02 2.7170e+02 7.8060e+02 1.3943e+03 1.7952e+03 + 3.6236e+03 3.7282e+03 2.6141e+03 6.8751e+03 5.3026e+03 5.4683e+03 1.7532e+03 + 5.4180e+02 8.0010e+02 8.2990e+02 5.9260e+02 7.4570e+02 1.8093e+03 2.8808e+03 + 3.1452e+03 9.3540e+02 2.9760e+02 1.5790e+02 1.4700e+03 1.0825e+03 3.4000e+02 + 5.1110e+02 9.0540e+02 4.0460e+02 2.4000e+02 4.3950e+02 6.1440e+02 3.7940e+02 + 6.8360e+02 1.0117e+03 6.4500e+02 3.7430e+02 8.2150e+02 3.9310e+03 4.1970e+03 + 1.9227e+03 4.6620e+02 3.5700e+02 4.2120e+02 7.8450e+02 3.2936e+03 3.4201e+03 + 9.0760e+02 2.3740e+02 1.6750e+02 3.2340e+02 8.2860e+02 1.0016e+03 5.9580e+02 + 4.0080e+02 3.9560e+02 4.3760e+02 5.6940e+02 4.7660e+02 4.3330e+02 3.2540e+02 + 1.7270e+02 5.2040e+02 6.4440e+02 4.8090e+02 1.1444e+03 1.5291e+03 3.2466e+03 + 3.0774e+03 4.9649e+03 5.8105e+03 3.1659e+03 1.2853e+03 5.9200e+02 5.7920e+02 + 1.1366e+03 2.7795e+03 2.2959e+03 2.4394e+03 1.1163e+03 1.1002e+03 8.9230e+02 + 1.6620e+02 3.2300e+02 1.2096e+03 4.4800e+02 4.9860e+02 7.2210e+02 5.2780e+02 + 5.8320e+02 3.8450e+02 5.8670e+02 5.5710e+02 8.3660e+02 8.6130e+02 5.5570e+02 + 6.3380e+02 6.3300e+02 2.9471e+03 3.5385e+03 1.5112e+03 4.9510e+02 5.6770e+02 + 4.3070e+02 6.6560e+02 3.0073e+03 3.4598e+03 5.8820e+02 3.0440e+02 2.2640e+02 + 5.0980e+02 3.4150e+02 6.2950e+02 9.6570e+02 4.5360e+02 8.3210e+02 1.0162e+03 + 3.5890e+02 3.4970e+02 2.2350e+02 2.6170e+02 1.7270e+02 4.7280e+02 2.5830e+02 + 6.1680e+02 1.3133e+03 9.8100e+02 9.3290e+02 1.9511e+03 2.8921e+03 6.7904e+03 + 7.0000e+03 4.9947e+03 1.1199e+03 7.5720e+02 1.6170e+03 3.1747e+03 2.4456e+03 + 2.5929e+03 7.5810e+02 5.9750e+02 3.4070e+02 9.6100e+01 2.7820e+02 1.0056e+03 + 5.1120e+02 3.1880e+02 6.1590e+02 6.6520e+02 8.3080e+02 5.8440e+02 3.2980e+02 + 2.3850e+02 3.8050e+02 7.2230e+02 4.1320e+02 7.5790e+02 7.9590e+02 1.7858e+03 + 5.0393e+03 1.5565e+03 7.0900e+02 9.3070e+02 5.9560e+02 4.3350e+02 1.4995e+03 + 5.3035e+03 5.0660e+02 3.3530e+02 4.4450e+02 3.4250e+02 5.1150e+02 8.6710e+02 + 4.8980e+02 5.2860e+02 1.0062e+03 9.3740e+02 4.5830e+02 2.4890e+02 1.5820e+02 + 3.9070e+02 5.1480e+02 5.5360e+02 2.6960e+02 2.8450e+02 1.0604e+03 8.3490e+02 + 1.0010e+03 4.2720e+02 4.3270e+02 4.5061e+03 6.8526e+03 6.7292e+03 3.1577e+03 + 2.0935e+03 2.8183e+03 6.1891e+03 3.3042e+03 8.0710e+02 6.2360e+02 8.5370e+02 + 4.2590e+02 6.0790e+02 4.3730e+02 5.9140e+02 8.8150e+02 3.1770e+02 7.4530e+02 + 3.9640e+02 1.1544e+03 8.1580e+02 2.3860e+02 4.5120e+02 5.2520e+02 5.6240e+02 + 5.0100e+02 6.4570e+02 7.4650e+02 2.5980e+03 6.2627e+03 2.4824e+03 1.4274e+03 + 8.1410e+02 6.2360e+02 3.2530e+02 2.2803e+03 4.1407e+03 1.1801e+03 3.8540e+02 + 2.4880e+02 5.3030e+02 4.9230e+02 6.4490e+02 5.5120e+02 6.1340e+02 1.0347e+03 + 6.2030e+02 6.0120e+02 2.7260e+02 1.7890e+02 2.3530e+02 8.0050e+02 4.8060e+02 + 5.5010e+02 4.1680e+02 5.1360e+02 8.4840e+02 1.0175e+03 3.7680e+02 5.7990e+02 + 2.4585e+03 2.9703e+03 4.7339e+03 3.8823e+03 5.8563e+03 6.5353e+03 5.9357e+03 + 2.7793e+03 5.4510e+02 4.6790e+02 5.8140e+02 7.5440e+02 3.2240e+02 5.2710e+02 + 5.6910e+02 4.9420e+02 4.2960e+02 4.0260e+02 5.4380e+02 5.2340e+02 7.3890e+02 + 3.1400e+02 3.9050e+02 3.6340e+02 4.9780e+02 3.1850e+02 6.3370e+02 1.1551e+03 + 2.1820e+03 5.0100e+03 2.0697e+03 1.0310e+03 8.8570e+02 3.0270e+02 5.6920e+02 + 4.0666e+03 5.0517e+03 1.3491e+03 2.2990e+02 5.2780e+02 6.9750e+02 4.1840e+02 + 4.9320e+02 3.0910e+02 5.6830e+02 1.3091e+03 5.5880e+02 6.0740e+02 7.5410e+02 + 4.3280e+02 5.0750e+02 4.4160e+02 4.7600e+02 5.9610e+02 4.5960e+02 3.3100e+02 + 8.8850e+02 9.9610e+02 3.9690e+02 3.9260e+02 5.4580e+02 2.4786e+03 4.0445e+03 + 5.0225e+03 7.0000e+03 6.1763e+03 2.4409e+03 2.2103e+03 8.5070e+02 5.7180e+02 + 2.7590e+02 4.5430e+02 6.1650e+02 6.8520e+02 6.1550e+02 3.1890e+02 4.5140e+02 + 5.8990e+02 3.3340e+02 1.6610e+02 5.1650e+02 4.1330e+02 3.5420e+02 4.0110e+02 + 6.2380e+02 2.6090e+02 7.8770e+02 7.8630e+02 2.4356e+03 4.6559e+03 2.3782e+03 + 9.8260e+02 3.5320e+02 2.6680e+02 6.4950e+02 3.2925e+03 3.4042e+03 8.0850e+02 + 4.4670e+02 6.8770e+02 5.4310e+02 7.3640e+02 2.5280e+02 3.7280e+02 5.9470e+02 + 2.5470e+02 7.3160e+02 5.0080e+02 8.5600e+02 3.2800e+02 8.2770e+02 4.6130e+02 + 8.1030e+02 1.1518e+03 3.9480e+02 3.4910e+02 6.4730e+02 6.0990e+02 6.9520e+02 + 3.3220e+02 3.7740e+02 1.7231e+03 3.4229e+03 4.3658e+03 7.0000e+03 5.4960e+03 + 1.3945e+03 9.0860e+02 6.3910e+02 8.0300e+02 4.1270e+02 8.4370e+02 5.1020e+02 + 5.2900e+02 4.7570e+02 6.9020e+02 6.0030e+02 7.0130e+02 1.0520e+02 2.3240e+02 + 3.9810e+02 4.0990e+02 3.1900e+02 4.7930e+02 4.1790e+02 4.2590e+02 5.1690e+02 + 1.1069e+03 2.0102e+03 2.8976e+03 2.4367e+03 4.9230e+02 3.7630e+02 2.5690e+02 + 7.4890e+02 3.1037e+03 4.3828e+03 2.3645e+03 6.2110e+02 5.0420e+02 4.7070e+02 + 5.6900e+02 4.7210e+02 5.5070e+02 5.8700e+02 6.8510e+02 4.4270e+02 4.9170e+02 + 5.6500e+02 5.8320e+02 6.7740e+02 5.9820e+02 7.1870e+02 7.2480e+02 4.9680e+02 + 3.6980e+02 4.4550e+02 3.7420e+02 7.2260e+02 3.1490e+02 6.1280e+02 4.9440e+02 + 9.9480e+02 6.9924e+03 2*7.0000e+03 5.3600e+03 3.1410e+02 6.3230e+02 + 8.0900e+02 7.9730e+02 7.8010e+02 2.5750e+02 3.0480e+02 6.3960e+02 5.8770e+02 + 6.9390e+02 5.1580e+02 3.1980e+02 1.3360e+02 8.0960e+02 3.9450e+02 2.0980e+02 + 2.8010e+02 6.4740e+02 4.7290e+02 5.6480e+02 1.2654e+03 2.4607e+03 4.6417e+03 + 2.0431e+03 9.5270e+02 3.0190e+02 3.5960e+02 8.9430e+02 2.1834e+03 4.1411e+03 + 2.1144e+03 8.2200e+02 4.4660e+02 4.2950e+02 6.0460e+02 3.4900e+02 7.0730e+02 + 6.0690e+02 3.6330e+02 5.1560e+02 6.1500e+02 3.7210e+02 6.7780e+02 8.9620e+02 + 4.7300e+02 4.8690e+02 7.2490e+02 3.6520e+02 3.1910e+02 4.6820e+02 3.8020e+02 + 3.0560e+02 8.4210e+02 7.3650e+02 5.5570e+02 4.4640e+02 3.6875e+03 + 2*7.0000e+03 3.6155e+03 2.4729e+03 9.9650e+02 8.6810e+02 6.4570e+02 + 7.2020e+02 3.3830e+02 2.2100e+02 2.3070e+02 6.6100e+02 7.4920e+02 7.2150e+02 + 2.4880e+02 3.8320e+02 6.0070e+02 4.3280e+02 3.1500e+02 2.5070e+02 6.8140e+02 + 5.1800e+02 3.2730e+02 7.3900e+02 3.2310e+03 4.2043e+03 1.7263e+03 1.1369e+03 + 2.6770e+02 4.1900e+02 1.4617e+03 2.9051e+03 4.4688e+03 2.0221e+03 8.4480e+02 + 5.4300e+02 6.2420e+02 6.3600e+02 3.9850e+02 8.5790e+02 4.5780e+02 4.5150e+02 + 3.4980e+02 5.5460e+02 4.3670e+02 4.7470e+02 5.3110e+02 3.8640e+02 8.4440e+02 + 5.9090e+02 2.8590e+02 4.9170e+02 2.9760e+02 9.9100e+01 4.2000e+02 1.0159e+03 + 8.8430e+02 8.6410e+02 1.4095e+03 3.3601e+03 2.9759e+03 2.8872e+03 3.1098e+03 + 3.1185e+03 2.3666e+03 1.9553e+03 7.1430e+02 3.9270e+02 2.3960e+02 3.0370e+02 + 4.5680e+02 6.9140e+02 5.5820e+02 2.7940e+02 5.7990e+02 1.8190e+02 4.1540e+02 + 7.1130e+02 4.5140e+02 6.1400e+02 6.6360e+02 3.1510e+02 5.1040e+02 6.1790e+02 + 2.0069e+03 4.7267e+03 2.3536e+03 1.3288e+03 3.0700e+02 3.5200e+02 5.7790e+02 + 9.7800e+02 4.4469e+03 2.8708e+03 1.0206e+03 6.6570e+02 2.8920e+02 7.7850e+02 + 4.5110e+02 6.5770e+02 7.8430e+02 4.3110e+02 7.9770e+02 8.9770e+02 3.8420e+02 + 2.2310e+02 8.2740e+02 2.0510e+02 2.8870e+03 1.5861e+03 3.1720e+02 3.4000e+02 + 5.0170e+02 5.9300e+01 2.0040e+02 7.6120e+02 8.4710e+02 6.3830e+02 2.4772e+03 + 3.6450e+03 2.5160e+03 4.0309e+03 1.2187e+03 4.1311e+03 3.7437e+03 2.3910e+03 + 2.0114e+03 2.5550e+02 2.6770e+02 3.1750e+02 9.1360e+02 3.9180e+02 3.7850e+02 + 3.1020e+02 6.6200e+02 4.5760e+02 4.4040e+02 6.4880e+02 8.7390e+02 6.1130e+02 + 5.4510e+02 4.5280e+02 4.3720e+02 7.0890e+02 1.5658e+03 3.2941e+03 3.5575e+03 + 1.0844e+03 6.1090e+02 5.1750e+02 3.5960e+02 8.9260e+02 4.0975e+03 2.2679e+03 + 7.0210e+02 1.1366e+03 3.1120e+02 6.3990e+02 3.4630e+02 9.0100e+02 8.6440e+02 + 6.7250e+02 5.3240e+02 4.5760e+02 4.1860e+02 3.1750e+02 3.7810e+02 3.2400e+02 + 9.4120e+02 8.8920e+02 3.3110e+02 2.3000e+00 5.0800e+01 2.8840e+02 7.3570e+02 + 7.3670e+02 9.9680e+02 2.7161e+03 5.5124e+03 3.4557e+03 7.0920e+02 3.2220e+02 + 4.4710e+02 4.7320e+02 3.8870e+02 6.1520e+02 7.0110e+02 3.5212e+03 3.4801e+03 + 2.2662e+03 1.2123e+03 6.9620e+02 5.2340e+02 3.2420e+02 8.3380e+02 1.0674e+03 + 5.9040e+02 6.0540e+02 9.6520e+02 8.5090e+02 6.7290e+02 5.4760e+02 4.3430e+02 + 3.0660e+02 5.4430e+02 6.7950e+02 1.1045e+03 5.1470e+02 1.1351e+03 6.4440e+02 + 1.0116e+03 8.0450e+02 2.0540e+03 2.6886e+03 4.0369e+03 4.9357e+03 5.3117e+03 + 5.2431e+03 1.6830e+03 7.8000e+02 2.4330e+02 4.8230e+02 5.6890e+02 8.3230e+02 + 4.7020e+02 1.1166e+03 6.0070e+02 8.7170e+02 1.0662e+03 2.4730e+02 2.1470e+02 + 2.2340e+02 3.2910e+02 6.0850e+02 3.8810e+02 5.7190e+02 4.8940e+02 4.6291e+03 + 5.6000e+03 3.1938e+03 1.1909e+03 2.2540e+02 4.4330e+02 4.1420e+02 6.5830e+02 + 2.5000e+02 8.8990e+02 3.3385e+03 5.6000e+03 3.6763e+03 1.2218e+03 9.0930e+02 + 9.6840e+02 3.9120e+02 7.6800e+02 8.6370e+02 4.7320e+02 5.5810e+02 7.9100e+02 + 6.5130e+02 4.0240e+02 5.5980e+02 5.6930e+02 2.5050e+02 2.8800e+02 9.3200e+02 + 9.1660e+02 5.8890e+02 6.7190e+02 1.2705e+03 3.4770e+02 4.5910e+02 2.0497e+03 + 1.6973e+03 2.9874e+03 4.7794e+03 2*5.6000e+03 4.8099e+03 7.2460e+02 + 2.4340e+02 5.9520e+02 3.9980e+02 4.5680e+02 9.8990e+02 7.5880e+02 6.5340e+02 + 1.9655e+03 9.8180e+02 4.3750e+02 2.7680e+02 2.1480e+02 5.6340e+02 5.5910e+02 + 3.1830e+02 4.8320e+02 6.4980e+02 2.5221e+03 5.6000e+03 5.0254e+03 8.8140e+02 + 5.5590e+02 5.5090e+02 6.4310e+02 3.7130e+02 4.8960e+02 1.0971e+03 1.9708e+03 + 3.8788e+03 3.3833e+03 2.0658e+03 6.3440e+02 7.6200e+02 7.6670e+02 7.2610e+02 + 7.1250e+02 7.1420e+02 4.5080e+02 1.2154e+03 2.3910e+02 7.4590e+02 6.0250e+02 + 5.4760e+02 4.2550e+02 4.5280e+02 5.6780e+02 8.8190e+02 6.3610e+02 1.0734e+03 + 1.1134e+03 4.0850e+02 2.6330e+02 4.1800e+02 1.1223e+03 2.0712e+03 4.0319e+03 + 2*5.6000e+03 4.6307e+03 1.3868e+03 4.0580e+02 5.2870e+02 7.6920e+02 + 3.8250e+02 7.4500e+02 8.8700e+02 4.8640e+02 7.5580e+02 9.5690e+02 5.8140e+02 + 3.5550e+02 3.5200e+02 5.2510e+02 7.3990e+02 4.9200e+02 2.3150e+02 1.1820e+03 + 2.0954e+03 3.9621e+03 3.1312e+03 1.4606e+03 4.8220e+02 5.7400e+02 7.1750e+02 + 4.0140e+02 4.3730e+02 6.8660e+02 1.5916e+03 1.9728e+03 3.4710e+03 2.7415e+03 + 1.4793e+03 8.0060e+02 6.6100e+02 7.6030e+02 6.4290e+02 2.9380e+02 6.0060e+02 + 6.3010e+02 2.3660e+02 5.0430e+02 8.1360e+02 5.8880e+02 1.0446e+03 2.0430e+02 + 4.6160e+02 5.3770e+02 5.5870e+02 6.9760e+02 8.6590e+02 4.2800e+02 3.7400e+02 + 3.6070e+02 6.5900e+02 5.4380e+02 2.7012e+03 5.6000e+03 4.6720e+03 2.9578e+03 + 2.9646e+03 4.5180e+02 8.5770e+02 5.6430e+02 5.0310e+02 4.4650e+02 5.7280e+02 + 5.1470e+02 4.5800e+02 7.2180e+02 7.2070e+02 4.4330e+02 2.7350e+02 7.8070e+02 + 1.0138e+03 3.6130e+02 1.2770e+02 4.9760e+02 3.0325e+03 5.2763e+03 3.7258e+03 + 1.2646e+03 4.8790e+02 4.8640e+02 4.3590e+02 3.9500e+02 4.5010e+02 4.1010e+02 + 3.1240e+02 1.0479e+03 1.8223e+03 3.0245e+03 2.3237e+03 2.0633e+03 1.0751e+03 + 8.4560e+02 8.9280e+02 5.0770e+02 1.5770e+02 5.8070e+02 4.4010e+02 6.2890e+02 + 1.0409e+03 1.3157e+03 8.0710e+02 4.3280e+02 2.5460e+02 4.9250e+02 2.6060e+02 + 4.8350e+02 8.4920e+02 4.2760e+02 4.0530e+02 4.2250e+02 1.7970e+02 6.0750e+02 + 4.2156e+03 5.5192e+03 5.6000e+03 2.1913e+03 2.4210e+03 2.1795e+03 6.1220e+02 + 6.4960e+02 6.4440e+02 2.4030e+02 6.6850e+02 4.8120e+02 4.6440e+02 1.2976e+03 + 1.3277e+03 7.3400e+02 7.9940e+02 6.1110e+02 1.0644e+03 4.1680e+02 1.0210e+02 + 4.5480e+02 4.6324e+03 5.6000e+03 4.2417e+03 4.9830e+02 5.4390e+02 3.6080e+02 + 3.5340e+02 3.5640e+02 4.8510e+02 2.9850e+02 8.2480e+02 5.2520e+02 9.1510e+02 + 2.3105e+03 2.9771e+03 3.4450e+03 2.1011e+03 2.2380e+03 7.8830e+02 3.2910e+02 + 3.6620e+02 3.0900e+02 6.8050e+02 4.5490e+02 4.8720e+02 9.5100e+02 9.5530e+02 + 4.9280e+02 2.8570e+02 2.8360e+02 1.0670e+02 3.8860e+02 2.8070e+02 2.3950e+02 + 3.5740e+02 5.1540e+02 3.0820e+02 1.9614e+03 3.6286e+03 4.7421e+03 3.3185e+03 + 3.7969e+03 4.5487e+03 1.5842e+03 1.0392e+03 7.7440e+02 3.8980e+02 7.9790e+02 + 6.7760e+02 3.2590e+02 6.5200e+02 5.6120e+02 9.9650e+02 3.5660e+02 4.9650e+02 + 7.8360e+02 7.2990e+02 2.5380e+02 1.1450e+02 6.3780e+02 2.8796e+03 + 2*5.6000e+03 1.2074e+03 7.2410e+02 3.7800e+02 2.9260e+02 2.5830e+02 + 1.6960e+02 3.4400e+02 3.3220e+02 6.2540e+02 5.5000e+02 9.4330e+02 2.3583e+03 + 1.9761e+03 2.6653e+03 2.8464e+03 7.8650e+02 7.6990e+02 3.7530e+02 4.5020e+02 + 5.5940e+02 5.2190e+02 3.6390e+02 5.8130e+02 3.0000e+02 7.2160e+02 7.1420e+02 + 3.0400e+02 2.7460e+02 3.3900e+02 3.5820e+02 3.1980e+02 5.5910e+02 4.6960e+02 + 2.0810e+02 3.1620e+02 2.9344e+03 4.2567e+03 2.8608e+03 3.1412e+03 5.4359e+03 + 3.7689e+03 7.6110e+02 3.5730e+02 2.6710e+02 5.8510e+02 4.9280e+02 3.5040e+02 + 3.5890e+02 2.9070e+02 8.0100e+02 3.7970e+02 3.9010e+02 6.4560e+02 6.7990e+02 + 3.1720e+02 5.5880e+02 5.6290e+02 2.3576e+03 5.6000e+03 5.0237e+03 1.4443e+03 + 9.9010e+02 8.4710e+02 7.0960e+02 5.4960e+02 3.2680e+02 3.1220e+02 4.4000e+02 + 4.2450e+02 6.9940e+02 5.6750e+02 1.3928e+03 8.9760e+02 2.5524e+03 2.2474e+03 + 1.9670e+03 1.0213e+03 9.7140e+02 6.8000e+02 4.8580e+02 5.5130e+02 5.5330e+02 + 5.3360e+02 3.2560e+02 5.2710e+02 6.7050e+02 2.9710e+02 3.9860e+02 4.2380e+02 + 2.3820e+02 6.3580e+02 8.8760e+02 3.8200e+02 6.5500e+01 1.2294e+03 2.9851e+03 + 3.4383e+03 2.9896e+03 2.9649e+03 5.6000e+03 4.5558e+03 1.4902e+03 3.9200e+02 + 3.0690e+02 7.3150e+02 9.2340e+02 3.4930e+02 5.1540e+02 2.5850e+02 6.7010e+02 + 8.7480e+02 3.3040e+02 4.0830e+02 5.5240e+02 4.3030e+02 7.9850e+02 1.7487e+03 + 4.2532e+03 5.6000e+03 3.6227e+03 4.0260e+02 7.1360e+02 5.8890e+02 5.7610e+02 + 7.4300e+02 4.8060e+02 5.8950e+02 6.1960e+02 5.3150e+02 5.5310e+02 6.1800e+02 + 7.7680e+02 7.7030e+02 1.7312e+03 2.7082e+03 3.0181e+03 2.7146e+03 1.3653e+03 + 4.1360e+02 5.6860e+02 2.9850e+02 2.8320e+02 5.7240e+02 3.8110e+02 2.9260e+02 + 6.1110e+02 7.4550e+02 5.0890e+02 3.2930e+02 3.7820e+02 8.0280e+02 8.2570e+02 + 5.7320e+02 2.5900e+01 2.4980e+02 3.7338e+03 4.2144e+03 1.8983e+03 2.3295e+03 + 4.8780e+03 4.7711e+03 1.8577e+03 5.3530e+02 3.5590e+02 5.3670e+02 5.2670e+02 + 4.2580e+02 7.5640e+02 2.3850e+02 5.5340e+02 4.6440e+02 2.9300e+02 2.1110e+02 + 3.7920e+02 3.2530e+02 9.9700e+02 2.3463e+03 2*5.6000e+03 3.3974e+03 + 7.4530e+02 8.4960e+02 5.3410e+02 6.4180e+02 7.1990e+02 4.7400e+02 6.5240e+02 + 6.4490e+02 5.4590e+02 4.9300e+02 4.9110e+02 6.5310e+02 7.9690e+02 6.8360e+02 + 1.0670e+03 3.0738e+03 2.1614e+03 9.4100e+02 4.1360e+02 2.5940e+02 5.0120e+02 + 4.1380e+02 2.3530e+02 3.3900e+02 4.3080e+02 5.4470e+02 4.1250e+02 4.5600e+02 + 5.3890e+02 4.5150e+02 5.3010e+02 7.1840e+02 6.9030e+02 1.4580e+02 3.2450e+02 + 4.2822e+03 3.1526e+03 2.1380e+03 2.9177e+03 2*5.6000e+03 2.3337e+03 + 4.4220e+02 2.9610e+02 5.4730e+02 4.1760e+02 5.3980e+02 1.0016e+03 3.5660e+02 + 6.5170e+02 4.2830e+02 3.4150e+02 4.3930e+02 4.3690e+02 6.1840e+02 1.0466e+03 + 2.1233e+03 5.6000e+03 3.9367e+03 3.8702e+03 5.0290e+02 6.6890e+02 3.5920e+02 + 3.9590e+02 6.2120e+02 4.9540e+02 1.2569e+03 6.7900e+02 5.9370e+02 5.9600e+02 + 2.9240e+02 6.5830e+02 5.1990e+02 3.4080e+02 1.1430e+03 2.6023e+03 3.0852e+03 + 2.9050e+03 1.0349e+03 1.6360e+02 2.8330e+02 2.5670e+02 3.9940e+02 4.1110e+02 + 6.7340e+02 3.6340e+02 3.1530e+02 5.4210e+02 6.2300e+02 3.5530e+02 3.5230e+02 + 7.3650e+02 3.6180e+02 2.2530e+02 1.8928e+03 4.3547e+03 4.7031e+03 1.0623e+03 + 2.2036e+03 3.7786e+03 4.7844e+03 2.9681e+03 9.5500e+02 4.1920e+02 4.4620e+02 + 4.0260e+02 5.4840e+02 1.0766e+03 3.4840e+02 5.0840e+02 3.5320e+02 3.3100e+02 + 7.9220e+02 3.8050e+02 1.6760e+02 6.4340e+02 3.7042e+03 4.5649e+03 5.0862e+03 + 2.3183e+03 4.8000e+02 7.8770e+02 7.5870e+02 5.1390e+02 4.0750e+02 3.6110e+02 + 6.8200e+02 1.2448e+03 4.7580e+02 3.9730e+02 8.5090e+02 4.8720e+02 3.6870e+02 + 3.6560e+02 3.1140e+02 1.9309e+03 3.2345e+03 4.3785e+03 1.2452e+03 4.9410e+02 + 3.7720e+02 2.6460e+02 4.4470e+02 6.1490e+02 4.0600e+02 4.7530e+02 5.1310e+02 + 3.7790e+02 4.3590e+02 4.9210e+02 3.3070e+02 6.7810e+02 6.5920e+02 5.4910e+02 + 1.2444e+03 3.2603e+03 2.2306e+03 8.2590e+02 1.9410e+03 4.3036e+03 5.6000e+03 + 3.7063e+03 6.8320e+02 7.3460e+02 5.8970e+02 4.4000e+02 4.2340e+02 4.7160e+02 + 7.8340e+02 5.6880e+02 2.9570e+02 5.0720e+02 6.3880e+02 3.4110e+02 1.9130e+02 + 5.6870e+02 2.9024e+03 4.0579e+03 4.4362e+03 1.8108e+03 6.1000e+02 9.7100e+02 + 3.8040e+02 6.0340e+02 3.9860e+02 2.9990e+02 5.5720e+02 8.9910e+02 4.8730e+02 + 3.1000e+02 5.0350e+02 6.4600e+02 6.0450e+02 2.8150e+02 5.0100e+02 1.0334e+03 + 2.4713e+03 3.6059e+03 1.4397e+03 6.7600e+02 4.3630e+02 3.3960e+02 7.5940e+02 + 5.1030e+02 3.7530e+02 2.4800e+02 4.8490e+02 3.6880e+02 4.7040e+02 3.7360e+02 + 3.0620e+02 3.9250e+02 8.6660e+02 2.0858e+03 3.4043e+03 3.5432e+03 1.7546e+03 + 3.3770e+02 1.3203e+03 3.7576e+03 4.0245e+03 4.3658e+03 8.4170e+02 8.6310e+02 + 8.9410e+02 3.9550e+02 4.0400e+02 4.1370e+02 3.3020e+02 2.4270e+02 2.7710e+02 + 4.7720e+02 6.5800e+02 4.7430e+02 4.1610e+02 1.9954e+03 2.5238e+03 4.1808e+03 + 4.0017e+03 8.4680e+02 4.8630e+02 4.1920e+02 7.9460e+02 5.2180e+02 5.2820e+02 + 3.5550e+02 3.5360e+02 8.2250e+02 4.5880e+02 2.1150e+02 3.6890e+02 7.4680e+02 + 5.7130e+02 7.3970e+02 4.7980e+02 6.6480e+02 2.1782e+03 4.6824e+03 2.2842e+03 + 5.8110e+02 3.5190e+02 5.6080e+02 8.7620e+02 5.0920e+02 2.9390e+02 3.3900e+02 + 8.0280e+02 9.8020e+02 4.5390e+02 7.9840e+02 2.3500e+02 4.1680e+02 1.3324e+03 + 3.4368e+03 2.2261e+03 2.9607e+03 1.8437e+03 5.0340e+02 7.7780e+02 1.9429e+03 + 4.4020e+03 4.4568e+03 3.5585e+03 1.0231e+03 8.0360e+02 9.3040e+02 7.2280e+02 + 4.2500e+02 4.7990e+02 5.9000e+02 6.1120e+02 5.5000e+02 4.5620e+02 3.3290e+02 + 8.8060e+02 1.9285e+03 2.7394e+03 5.6000e+03 3.6492e+03 1.6363e+03 3.9000e+02 + 4.4530e+02 4.2730e+02 3.7780e+02 6.0250e+02 7.0780e+02 4.4780e+02 5.2790e+02 + 4.9640e+02 1.7300e+02 3.8940e+02 6.6860e+02 7.8340e+02 7.6920e+02 5.0550e+02 + 4.0190e+02 1.9920e+03 4.4782e+03 1.8458e+03 4.9780e+02 6.2960e+02 8.4100e+02 + 6.5790e+02 5.8630e+02 3.2990e+02 4.5920e+02 3.7580e+02 6.0180e+02 9.3420e+02 + 1.4834e+03 4.1740e+02 5.6850e+02 1.9956e+03 2.0833e+03 3.5004e+03 2.7674e+03 + 7.4340e+02 3.5430e+02 4.5790e+02 1.8676e+03 4.2202e+03 4.9258e+03 2.8551e+03 + 2.0503e+03 1.3022e+03 5.6170e+02 7.3630e+02 6.1550e+02 4.5390e+02 5.9050e+02 + 5.6850e+02 6.0970e+02 4.0550e+02 5.0790e+02 4.9410e+02 2.1146e+03 4.7501e+03 + 5.2966e+03 3.0328e+03 1.1875e+03 6.4630e+02 9.1890e+02 2.1360e+02 1.9930e+02 + 5.9420e+02 9.0650e+02 5.7190e+02 4.4500e+02 3.9430e+02 3.1720e+02 6.3610e+02 + 3.1760e+02 4.8040e+02 6.1430e+02 7.2450e+02 2.7160e+02 1.9657e+03 3.6159e+03 + 1.8222e+03 6.1170e+02 9.0160e+02 8.5430e+02 3.7050e+02 3.9800e+02 1.7060e+02 + 4.3790e+02 3.5870e+02 7.5000e+02 9.3440e+02 1.0437e+03 1.8375e+03 2.1244e+03 + 2.4712e+03 3.6171e+03 3.1357e+03 2.2561e+03 6.5740e+02 4.4380e+02 3.8650e+02 + 9.3370e+02 3.0220e+03 2.5440e+03 2.8979e+03 3.7541e+03 1.2301e+03 6.5920e+02 + 7.6810e+02 8.6910e+02 2.7500e+02 8.1000e+02 6.6110e+02 2.8400e+02 4.7060e+02 + 4.5460e+02 8.5030e+02 2.3017e+03 4.5914e+03 2.9814e+03 5.2628e+03 1.9360e+03 + 4.2320e+02 5.4140e+02 2.7490e+02 2.1200e+02 3.3660e+02 4.4920e+02 6.8920e+02 + 7.9420e+02 4.1950e+02 3.3550e+02 6.2980e+02 4.7050e+02 3.9520e+02 6.5010e+02 + 6.7280e+02 4.3610e+02 5.6870e+02 4.8201e+03 2.3254e+03 5.7960e+02 5.5740e+02 + 5.9840e+02 5.7180e+02 2.5960e+02 2.9650e+02 4.7830e+02 3.5950e+02 8.0030e+02 + 2.2751e+03 2.0541e+03 2.2240e+03 2.9101e+03 3.1419e+03 1.8815e+03 6.8970e+02 + 1.0524e+03 5.8690e+02 3.7250e+02 5.4120e+02 1.4588e+03 2.4991e+03 2.8114e+03 + 1.0468e+03 3.5081e+03 2.9209e+03 1.2106e+03 1.1437e+03 4.8480e+02 1.9510e+02 + 4.0540e+02 5.8550e+02 4.2890e+02 3.1770e+02 3.8130e+02 1.3502e+03 2.3823e+03 + 4.1032e+03 4.3731e+03 4.2577e+03 2.0444e+03 5.6710e+02 5.6590e+02 5.8950e+02 + 2.0050e+02 3.8950e+02 3.9300e+02 8.1830e+02 4.9280e+02 6.0310e+02 3.5120e+02 + 6.0100e+02 5.0670e+02 6.2030e+02 3.7680e+02 4.3380e+02 5.4330e+02 8.3420e+02 + 3.0835e+03 2.9179e+03 4.6650e+02 3.2290e+02 4.6350e+02 5.8340e+02 6.3590e+02 + 3.1370e+02 3.9780e+02 1.5430e+03 1.9214e+03 2.6191e+03 3.1219e+03 1.4873e+03 + 3.1925e+03 2.0225e+03 7.7210e+02 7.2740e+02 6.9750e+02 3.9570e+02 3.0510e+02 + 3.9770e+02 1.7064e+03 4.0408e+03 2.1190e+03 5.9480e+02 1.2699e+03 2.2385e+03 + 2.3020e+03 2.0885e+03 1.2946e+03 3.5630e+02 3.7900e+02 5.1210e+02 7.2340e+02 + 3.4500e+02 4.5240e+02 2.3199e+03 2.8446e+03 2.3018e+03 5.4927e+03 5.4433e+03 + 9.6210e+02 4.9420e+02 4.5490e+02 3.9450e+02 2.9700e+02 4.9740e+02 1.8590e+02 + 4.3480e+02 5.1650e+02 5.8440e+02 6.1340e+02 7.0960e+02 6.0130e+02 3.1190e+02 + 2.6620e+02 3.5230e+02 6.7880e+02 2.7515e+03 4.2362e+03 2.7159e+03 9.5170e+02 + 2.7380e+02 1.4930e+02 4.4690e+02 6.0140e+02 4.9290e+02 8.9060e+02 1.9226e+03 + 2.3293e+03 2.0638e+03 2.9523e+03 1.5939e+03 5.9050e+02 1.0099e+03 6.1500e+02 + 2.1590e+02 3.7490e+02 5.9400e+02 2.5910e+02 2.9240e+02 1.7552e+03 3.5157e+03 + 2.7355e+03 5.6450e+02 6.2590e+02 2.3406e+03 2.1885e+03 2.3963e+03 2.5953e+03 + 9.2370e+02 3.0660e+02 6.1270e+02 5.6330e+02 6.0330e+02 8.1320e+02 3.6551e+03 + 4.0237e+03 2.0390e+03 3.5507e+03 2.7984e+03 7.8410e+02 5.6690e+02 4.3530e+02 + 4.9380e+02 5.1630e+02 5.1470e+02 2.8590e+02 6.3000e+02 4.7300e+02 5.1880e+02 + 3.1720e+02 4.8580e+02 7.9370e+02 5.2450e+02 3.3050e+02 4.0950e+02 1.7449e+03 + 1.9246e+03 4.2991e+03 2.1629e+03 8.9700e+02 4.1120e+02 1.8210e+02 5.0980e+02 + 9.4220e+02 1.0281e+03 2.2806e+03 2.0106e+03 3.1926e+03 1.8822e+03 8.3580e+02 + 4.9270e+02 1.2383e+03 1.1399e+03 1.6574e+03 3.4980e+02 2.7720e+02 2.9060e+02 + 1.3140e+02 5.4580e+02 1.3190e+03 4.4376e+03 2.0047e+03 3.8470e+02 3.2800e+02 + 7.8480e+02 2.1385e+03 2.4812e+03 2.2575e+03 7.7660e+02 4.4800e+02 5.6050e+02 + 9.1250e+02 7.7750e+02 2.4089e+03 3.4521e+03 2.9456e+03 8.1690e+02 3.3272e+03 + 4.8847e+03 2.3430e+03 2.9050e+02 3.4860e+02 2.9730e+02 4.7960e+02 5.0610e+02 + 5.1230e+02 3.3140e+02 4.8280e+02 7.8630e+02 5.7400e+01 5.6540e+02 7.5480e+02 + 5.9210e+02 5.4820e+02 8.4160e+02 1.4645e+03 4.5549e+03 2.8086e+03 2.1055e+03 + 1.2274e+03 6.2350e+02 4.8510e+02 9.3960e+02 1.4666e+03 2.2760e+03 2.5570e+03 + 2.0764e+03 1.1324e+03 6.2120e+02 8.7000e+02 6.6430e+02 4.2830e+02 7.1860e+02 + 6.8610e+02 4.3110e+02 4.5890e+02 4.2750e+02 4.9910e+02 7.0310e+02 1.3282e+03 + 2.8503e+03 2.1452e+03 4.5050e+02 2.3260e+02 2.9750e+02 8.2860e+02 1.4169e+03 + 1.9827e+03 4.9040e+02 3.9250e+02 3.7260e+02 7.9200e+02 1.1688e+03 2.6340e+03 + 3.5280e+03 1.5162e+03 6.6890e+02 1.1001e+03 4.2336e+03 1.8477e+03 5.4940e+02 + 1.3970e+02 1.0780e+02 3.4710e+02 8.9640e+02 7.7690e+02 3.9830e+02 3.3690e+02 + 1.9420e+02 7.3090e+02 5.7380e+02 5.3120e+02 9.4650e+02 1.0364e+03 1.5782e+03 + 2.9750e+03 4.0865e+03 1.7919e+03 4.8560e+02 1.1406e+03 5.3340e+02 9.5300e+02 + 1.2293e+03 3.6072e+03 4.3707e+03 2.3069e+03 1.1747e+03 7.4650e+02 4.3550e+02 + 7.6030e+02 9.0340e+02 3.3550e+02 4.9050e+02 3.5220e+02 3.5950e+02 7.6940e+02 + 6.2090e+02 3.8310e+02 2.9230e+02 1.7160e+03 4.3510e+03 2.2999e+03 6.7100e+02 + 4.7580e+02 5.2910e+02 7.2460e+02 1.4554e+03 3.1710e+02 6.0110e+02 5.4490e+02 + 5.5850e+02 6.0040e+02 2.8707e+03 3.2115e+03 1.8489e+03 1.0051e+03 4.9350e+02 + 2.1484e+03 3.2775e+03 3.8254e+03 8.0510e+02 6.4770e+02 3.1320e+02 1.3360e+02 + 1.0618e+03 1.2892e+03 7.4310e+02 4.9240e+02 2.4680e+02 6.8930e+02 9.6740e+02 + 8.7080e+02 1.2139e+03 1.3799e+03 2.9773e+03 2.0972e+03 1.7277e+03 3.8280e+02 + 6.3240e+02 6.7940e+02 6.6950e+02 2.0516e+03 2.1480e+03 4.2718e+03 2.5299e+03 + 1.0556e+03 6.5830e+02 7.6710e+02 6.9460e+02 6.8480e+02 3.5450e+02 6.3650e+02 + 2.3860e+02 2.1150e+02 3.7240e+02 7.0550e+02 5.9660e+02 4.7780e+02 7.3900e+02 + 1.1640e+03 3.3098e+03 1.1042e+03 8.7150e+02 7.8420e+02 4.6670e+02 8.7100e+02 + 6.3570e+02 6.0020e+02 2.2070e+02 7.4840e+02 3.6570e+02 1.2219e+03 2.2954e+03 + 2.3972e+03 2.1965e+03 5.2660e+02 3.8460e+02 1.1658e+03 2.4193e+03 4.1739e+03 + 1.1117e+03 4.9540e+02 1.0130e+02 8.3090e+02 5.7450e+02 8.6780e+02 4.1390e+02 + 3.7890e+02 2.8950e+02 6.3750e+02 6.2800e+02 1.1931e+03 1.2341e+03 2.7410e+03 + 2.3640e+03 1.8823e+03 4.9080e+02 4.2880e+02 2.4780e+02 3.8760e+02 8.0180e+02 + 2.7148e+03 4.2830e+03 2.1596e+03 1.1970e+03 9.8480e+02 2.5490e+02 3.1570e+02 + 5.1470e+02 4.8570e+02 2.7020e+02 4.9330e+02 5.7410e+02 3.3460e+02 4.9750e+02 + 1.0352e+03 1.1687e+03 6.2150e+02 2.9850e+02 2.2881e+03 2.6519e+03 1.4689e+03 + 4.3650e+02 6.2460e+02 6.8800e+02 7.1590e+02 5.6190e+02 5.3260e+02 4.7160e+02 + 7.5120e+02 7.4370e+02 2.5295e+03 4.4539e+03 2.8025e+03 1.2682e+03 4.9110e+02 + 5.8860e+02 6.3890e+02 2.5736e+03 3.4620e+03 2.5093e+03 2.7420e+02 4.0490e+02 + 5.5200e+02 7.4610e+02 4.6880e+02 2.2870e+02 1.5520e+02 4.6890e+02 2.5890e+02 + 1.2226e+03 2.1752e+03 2.7437e+03 3.7200e+03 2.1039e+03 1.0042e+03 3.7050e+02 + 4.3250e+02 8.5210e+02 9.7820e+02 1.9010e+03 2.8275e+03 3.0400e+03 1.8221e+03 + 2.6220e+02 3.3700e+02 4.4430e+02 3.2090e+02 6.2370e+02 6.2970e+02 2.8770e+02 + 4.2490e+02 6.5220e+02 3.8560e+02 5.7870e+02 7.9720e+02 4.7520e+02 5.3130e+02 + 9.2730e+02 2.3666e+03 3.0116e+03 1.8398e+03 4.7840e+02 4.6980e+02 4.1290e+02 + 4.2930e+02 3.6120e+02 2.8510e+02 4.3560e+02 7.9890e+02 2.2417e+03 2.1603e+03 + 2.3613e+03 1.4071e+03 1.2410e+02 4.1910e+02 1.0529e+03 8.6320e+02 2.0429e+03 + 3.5895e+03 3.2899e+03 6.7880e+02 4.1380e+02 4.1550e+02 6.8780e+02 4.1940e+02 + 2.7100e+02 5.7610e+02 3.7480e+02 9.3120e+02 1.9142e+03 3.1848e+03 3.9624e+03 + 3.0015e+03 1.5525e+03 1.9320e+02 3.6090e+02 4.1370e+02 7.3410e+02 1.9545e+03 + 3.0005e+03 2.0584e+03 2.0693e+03 6.3640e+02 2.4370e+02 5.7600e+02 4.6570e+02 + 3.0330e+02 3.4000e+02 3.3470e+02 5.5530e+02 7.8900e+02 4.1260e+02 2.9130e+02 + 4.7380e+02 1.1347e+03 4.5740e+02 5.1940e+02 3.8920e+02 2.7361e+03 4.0109e+03 + 7.6680e+02 5.1860e+02 5.6090e+02 5.0960e+02 4.4170e+02 3.8420e+02 4.4190e+02 + 8.7530e+02 1.1529e+03 2.1463e+03 3.9193e+03 2.8298e+03 7.5610e+02 4.9180e+02 + 3.4150e+02 4.8170e+02 5.2300e+02 1.2518e+03 3.7684e+03 2.5678e+03 1.9152e+03 + 4.6030e+02 7.6980e+02 6.7420e+02 4.4460e+02 4.0870e+02 7.8270e+02 1.4351e+03 + 1.7599e+03 2.6157e+03 3.1391e+03 2.1190e+03 1.0954e+03 3.6010e+02 4.9190e+02 + 6.7190e+02 1.4754e+03 2.2534e+03 2.7751e+03 3.0211e+03 3.4723e+03 7.3960e+02 + 3.3560e+02 1.3100e+02 2.2040e+02 5.0560e+02 3.7900e+02 1.9110e+02 1.8440e+02 + 4.4190e+02 4.6380e+02 2.7710e+02 3.8690e+02 4.7170e+02 6.6350e+02 4.5700e+02 + 5.7750e+02 1.5487e+03 2.3047e+03 3.6258e+03 1.5034e+03 6.6670e+02 4.5260e+02 + 6.2110e+02 5.9320e+02 3.5680e+02 2.6950e+02 1.0369e+03 9.3930e+02 3.1337e+03 + 2.5947e+03 1.7273e+03 2.8090e+02 3.2080e+02 3.2430e+02 5.6920e+02 4.9830e+02 + 5.0940e+02 2.2853e+03 4.3112e+03 2.8559e+03 4.9410e+02 7.0730e+02 1.1701e+03 + 6.6840e+02 3.6020e+02 8.8590e+02 1.4676e+03 3.0802e+03 4.0164e+03 2.3983e+03 + 1.6696e+03 2.3800e+02 4.4650e+02 3.4510e+02 3.9580e+02 1.9412e+03 3.1296e+03 + 3.0909e+03 1.8999e+03 1.9896e+03 6.6320e+02 1.9090e+02 1.3450e+02 6.1160e+02 + 5.2630e+02 6.0380e+02 4.0620e+02 4.0610e+02 5.5510e+02 6.5160e+02 3.6690e+02 + 1.6220e+02 4.1820e+02 8.2940e+02 6.2260e+02 4.7100e+02 1.9691e+03 2.2977e+03 + 3.5881e+03 5.7290e+02 5.6860e+02 4.9590e+02 7.8840e+02 6.3140e+02 5.4420e+02 + 4.1100e+02 2.0091e+03 1.0496e+03 2.6308e+03 3.7721e+03 1.0587e+03 4.9650e+02 + 4.8580e+02 4.4970e+02 6.4230e+02 5.2770e+02 3.9740e+02 1.9738e+03 2.6209e+03 + 4.6757e+03 2.7868e+03 7.3560e+02 7.5460e+02 1.8280e+02 3.2600e+02 9.8570e+02 + 2.2544e+03 2.8457e+03 2.3184e+03 1.0756e+03 7.0280e+02 3.0880e+02 6.2480e+02 + 7.1370e+02 2.1659e+03 2.2362e+03 2.7618e+03 2.0210e+03 1.1687e+03 7.6900e+02 + 8.5730e+02 4.0770e+02 4.0190e+02 7.2800e+01 5.1080e+02 7.1820e+02 5.8810e+02 + 3.8710e+02 3.7300e+02 3.9600e+02 2.8090e+02 3.4580e+02 4.0770e+02 4.4710e+02 + 7.5010e+02 6.0650e+02 2.1429e+03 3.4166e+03 1.9447e+03 1.3904e+03 3.8270e+02 + 6.0150e+02 6.0010e+02 4.0240e+02 5.1970e+02 8.1710e+02 2.2544e+03 1.4609e+03 + 3.6778e+03 2.7751e+03 5.8130e+02 8.3450e+02 2.9950e+02 4.1670e+02 7.0880e+02 + 5.1190e+02 3.5310e+02 5.7500e+02 6.6520e+02 2.3955e+03 3.8602e+03 2.9019e+03 + 9.3810e+02 2.1730e+02 1.7600e+02 4.5120e+02 2.0302e+03 3.5396e+03 1.2118e+03 + 8.4820e+02 3.5190e+02 5.5050e+02 1.0589e+03 1.3172e+03 2.3813e+03 2.1508e+03 + 3.4414e+03 8.6960e+02 3.6870e+02 3.6300e+02 5.7550e+02 5.8360e+02 6.9830e+02 + 4.9610e+02 5.4090e+02 8.1320e+02 7.5460e+02 4.9310e+02 3.9840e+02 5.8430e+02 + 3.5280e+02 3.5800e+02 1.8480e+02 1.5150e+02 3.7630e+02 6.0200e+02 2.7651e+03 + 2.6319e+03 1.4827e+03 8.2850e+02 4.1490e+02 3.6440e+02 5.9830e+02 4.6790e+02 + 4.1260e+02 4.0740e+02 2.0182e+03 2.3100e+03 4.0265e+03 1.2048e+03 1.1429e+03 + 8.4230e+02 3.7390e+02 7.6370e+02 8.6820e+02 7.1020e+02 3.7070e+02 4.9280e+02 + 1.4377e+03 1.7192e+03 3.3966e+03 3.4447e+03 2.1200e+03 8.3480e+02 8.2130e+02 + 8.8720e+02 3.5996e+03 2.3665e+03 2.2702e+03 4.5060e+02 7.7730e+02 4.8030e+02 + 2.2024e+03 2.5128e+03 2.2621e+03 2.3204e+03 1.4007e+03 4.5300e+02 3.4060e+02 + 4.2270e+02 4.8110e+02 7.1710e+02 6.9500e+02 7.6880e+02 4.5680e+02 5.6260e+02 + 6.0350e+02 3.6390e+02 3.6450e+02 5.1910e+02 6.4110e+02 4.1930e+02 7.4530e+02 + 4.8160e+02 3.7150e+02 8.7780e+02 2.5531e+03 2.9277e+03 1.0996e+03 8.3710e+02 + 6.5840e+02 4.3740e+02 8.8510e+02 5.5280e+02 6.8710e+02 4.9820e+02 2.8657e+03 + 3.1574e+03 4.5987e+03 8.5210e+02 1.1428e+03 7.3090e+02 6.7830e+02 3.5770e+02 + 5.2420e+02 3.5280e+02 3.0920e+02 8.7940e+02 3.2940e+02 5.2150e+02 1.9774e+03 + 2.7633e+03 2.4859e+03 2.7843e+03 2.0151e+03 3.1657e+03 2.4411e+03 2.2341e+03 + 1.8108e+03 5.4330e+02 2.7110e+02 1.6966e+03 1.9807e+03 1.9923e+03 1.9584e+03 + 9.3320e+02 6.7900e+02 4.7570e+02 3.7430e+02 3.0560e+02 2.1460e+02 4.8990e+02 + 1.0157e+03 6.0080e+02 6.9270e+02 3.6230e+02 2.7600e+02 3.9190e+02 8.8140e+02 + 5.6470e+02 3.4250e+02 6.3840e+02 5.0140e+02 5.2890e+02 1.0743e+03 3.0261e+03 + 3.0963e+03 2.1344e+03 1.3991e+03 6.6230e+02 4.4910e+02 6.1370e+02 8.1110e+02 + 1.1577e+03 3.9630e+02 5.6690e+02 2.0493e+03 5.4137e+03 3.4553e+03 2.3006e+03 + 6.7540e+02 4.9920e+02 4.3010e+02 7.5780e+02 6.8080e+02 5.8170e+02 5.5070e+02 + 3.6580e+02 3.6330e+02 3.1250e+02 9.5170e+02 1.2732e+03 2.6352e+03 3.5198e+03 + 2.3268e+03 3.0166e+03 2.6873e+03 1.8103e+03 7.6330e+02 1.0898e+03 2.1679e+03 + 1.8296e+03 3.6257e+03 2.3404e+03 6.5150e+02 7.9140e+02 6.9230e+02 8.5350e+02 + 4.3130e+02 4.4360e+02 3.6110e+02 5.3940e+02 2.4240e+02 3.9110e+02 6.7790e+02 + 7.6660e+02 3.0170e+02 3.5630e+02 6.1350e+02 6.8340e+02 4.6400e+02 3.4080e+02 + 6.9210e+02 4.5030e+02 8.6190e+02 3.1264e+03 2.2729e+03 2.2910e+03 6.9250e+02 + 6.5460e+02 4.3790e+02 2.5840e+02 7.5530e+02 5.8330e+02 6.1380e+02 4.8380e+02 + 1.8205e+03 5.6000e+03 4.3073e+03 2.1856e+03 5.6460e+02 4.9340e+02 4.1400e+02 + 4.5780e+02 6.3410e+02 6.6090e+02 2.6160e+02 5.1630e+02 3.7630e+02 3.7900e+02 + 4.4940e+02 1.6359e+03 2.0096e+03 2.3788e+03 2.2888e+03 4.1308e+03 5.6000e+03 + 2.7521e+03 3.8216e+03 3.1492e+03 3.5006e+03 2.1877e+03 1.9293e+03 1.0074e+03 + 7.9390e+02 5.3920e+02 3.0360e+02 2.9350e+02 7.3260e+02 3.1840e+02 3.7180e+02 + 5.0090e+02 4.5020e+02 3.3250e+02 4.0090e+02 9.7320e+02 3.8860e+02 3.5520e+02 + 4.7330e+02 4.9670e+02 4.0600e+02 4.6410e+02 4.4190e+02 5.4740e+02 2.5019e+03 + 2.8379e+03 2.2191e+03 9.6680e+02 4.2210e+02 1.1742e+03 5.8370e+02 4.4030e+02 + 5.9020e+02 6.4240e+02 2.6850e+02 7.4920e+02 1.3809e+03 3.6191e+03 5.6000e+03 + 2.2290e+03 8.3190e+02 6.2260e+02 1.7260e+02 5.6800e+02 9.4790e+02 4.4240e+02 + 5.2490e+02 3.1970e+02 2.1070e+02 3.3010e+02 4.6780e+02 7.0440e+02 1.1332e+03 + 6.6750e+02 2.7472e+03 3.0098e+03 3.8133e+03 5.1518e+03 4.8545e+03 3.4291e+03 + 2.3076e+03 2.1092e+03 1.7709e+03 5.6820e+02 7.5640e+02 5.1530e+02 2.4190e+02 + 4.2050e+02 7.3750e+02 5.2560e+02 5.2210e+02 7.2490e+02 2.4300e+02 2.6850e+02 + 5.7470e+02 5.8340e+02 4.8180e+02 4.5660e+02 3.4680e+02 3.1760e+02 3.6130e+02 + 4.0320e+02 5.5140e+02 6.9910e+02 3.0743e+03 3.1571e+03 2.0787e+03 4.1740e+02 + 2.2180e+02 7.7790e+02 9.3070e+02 2.6200e+02 4.3590e+02 5.7480e+02 5.2630e+02 + 2.9260e+02 6.7230e+02 3.8409e+03 4.8438e+03 2.8782e+03 7.2210e+02 6.3780e+02 + 4.7100e+02 6.0890e+02 7.9860e+02 4.5970e+02 4.1960e+02 4.2790e+02 4.4760e+02 + 4.7050e+02 3.1910e+02 6.7120e+02 3.4350e+02 6.7240e+02 1.0518e+03 4.6840e+03 + 2*5.6000e+03 4.4838e+03 5.3617e+03 3.3754e+03 2.2593e+03 7.2300e+02 + 4.8220e+02 5.9980e+02 2.1360e+02 3.8260e+02 6.2340e+02 7.8700e+02 6.8760e+02 + 4.6110e+02 6.1240e+02 1.4680e+02 4.2610e+02 9.3400e+02 4.5510e+02 3.3240e+02 + 5.1560e+02 3.4990e+02 2.1260e+02 2.9180e+02 5.8850e+02 6.5720e+02 1.5370e+03 + 3.4791e+03 1.9669e+03 1.4925e+03 4.1550e+02 1.6080e+02 7.5010e+02 6.5840e+02 + 3.8210e+02 8.5620e+02 3.9860e+02 3.2110e+02 2.3090e+02 7.5810e+02 3.3026e+03 + 5.6000e+03 5.5642e+03 6.6000e+02 6.7260e+02 3.6780e+02 3.6640e+02 3.4740e+02 + 6.4230e+02 4.5150e+02 1.9760e+02 3.0200e+02 6.1070e+02 5.0670e+02 2.5300e+02 + 2.9600e+02 6.0410e+02 9.6060e+02 3.4992e+03 4.7058e+03 2.0192e+03 3.1533e+03 + 4.2057e+03 4.8798e+03 2.9231e+03 1.4394e+03 1.1657e+03 3.4270e+02 4.4180e+02 + 3.3040e+02 6.5790e+02 8.3760e+02 5.8700e+02 7.0570e+02 4.6590e+02 3.5960e+02 + 2.9550e+02 4.2860e+02 5.5020e+02 4.1180e+02 4.2800e+02 4.9110e+02 2.4570e+02 + 7.4240e+02 5.2320e+02 8.0130e+02 2.2997e+03 2.2723e+03 2.1916e+03 1.2327e+03 + 5.2410e+02 2.2360e+02 7.2340e+02 6.3410e+02 4.8890e+02 3.2320e+02 2.9400e+02 + 6.7800e+02 6.8450e+02 9.7540e+02 2.1021e+03 5.4347e+03 5.2919e+03 1.4164e+03 + 7.3450e+02 3.9450e+02 3.2860e+02 3.9820e+02 7.7880e+02 6.2010e+02 2.9060e+02 + 2.9010e+02 3.3440e+02 2.5340e+02 1.2690e+02 2.0820e+02 4.8700e+02 4.5950e+02 + 3.0247e+03 2.8518e+03 2.9920e+03 1.9493e+03 2.6126e+03 3.0033e+03 2.2518e+03 + 2.0780e+03 2.0894e+03 1.4168e+03 4.9320e+02 5.5230e+02 7.5990e+02 5.5000e+02 + 5.9550e+02 7.3890e+02 3.6840e+02 5.5150e+02 5.5540e+02 5.5340e+02 3.2020e+02 + 3.8380e+02 5.3950e+02 4.9140e+02 2.3610e+02 8.9400e+02 1.2741e+03 1.5137e+03 + 2.9058e+03 2.0345e+03 5.3500e+02 3.8560e+02 4.4280e+02 3.7760e+02 5.4290e+02 + 3.2180e+02 6.0200e+02 5.0870e+02 6.9500e+02 7.9350e+02 4.9750e+02 1.1205e+03 + 1.5639e+03 5.0478e+03 5.1779e+03 1.1447e+03 9.1760e+02 7.0790e+02 2.3420e+02 + 4.2380e+02 6.4110e+02 7.0030e+02 5.1780e+02 4.4050e+02 3.3200e+02 4.5220e+02 + 1.2720e+02 1.7840e+02 6.6670e+02 7.4530e+02 2.5811e+03 2.8360e+03 5.9540e+02 + 8.2350e+02 6.3010e+02 2.1609e+03 2.1933e+03 1.9108e+03 2.8927e+03 2.5878e+03 + 1.1143e+03 3.8740e+02 7.7120e+02 5.1120e+02 8.0070e+02 9.5590e+02 4.1900e+02 + 3.9760e+02 5.8030e+02 6.1860e+02 3.7990e+02 6.0520e+02 9.0350e+02 4.4000e+02 + 2.1630e+02 8.4280e+02 6.4990e+02 1.9746e+03 3.6676e+03 1.9496e+03 2.9120e+02 + 4.8490e+02 8.0600e+02 5.2690e+02 2.7730e+02 2.8890e+02 4.6560e+02 5.5820e+02 + 4.8150e+02 6.4330e+02 7.4540e+02 1.2997e+03 1.2829e+03 2.0233e+03 2.6673e+03 + 2.1215e+03 7.9020e+02 2.9130e+02 3.4820e+02 2.4530e+02 7.1830e+02 6.2060e+02 + 6.9460e+02 8.4680e+02 7.2880e+02 1.5910e+02 1.8990e+02 5.5960e+02 7.9610e+02 + 2.2542e+03 2.4028e+03 3.2075e+03 6.6810e+02 6.5000e+02 9.6140e+02 7.8170e+02 + 1.5862e+03 2.3934e+03 2.6314e+03 3.6962e+03 2.6574e+03 9.3440e+02 1.5130e+03 + 5.0950e+02 9.3110e+02 7.2450e+02 5.9170e+02 5.9060e+02 2.9780e+02 5.6790e+02 + 4.8190e+02 4.6070e+02 1.1974e+03 7.5150e+02 4.5290e+02 5.3430e+02 1.1436e+03 + 2.8228e+03 4.0187e+03 1.5953e+03 3.7290e+02 3.0620e+02 8.3880e+02 5.2050e+02 + 2.1770e+02 5.8010e+02 6.1560e+02 2.6170e+02 5.4660e+02 6.6990e+02 7.0060e+02 + 1.1496e+03 4.3350e+02 2.6540e+03 3.4594e+03 1.9093e+03 7.3410e+02 5.0250e+02 + 5.9830e+02 7.7140e+02 3.8400e+02 6.4230e+02 5.0600e+02 6.6870e+02 5.9100e+02 + 2.9310e+02 4.4320e+02 8.2290e+02 1.0485e+03 2.6742e+03 3.0196e+03 2.3726e+03 + 5.3750e+02 2.5450e+02 3.4360e+02 5.4310e+02 5.7370e+02 7.0200e+02 2.3673e+03 + 2.4750e+03 3.1382e+03 2.7374e+03 2.2689e+03 9.3070e+02 1.1832e+03 4.4690e+02 + 4.3260e+02 2.2640e+02 8.0780e+02 4.5180e+02 5.4640e+02 6.7250e+02 4.1810e+02 + 7.2890e+02 4.4350e+02 1.0804e+03 2.2931e+03 2.1961e+03 2.0495e+03 7.7570e+02 + 6.7300e+02 6.7030e+02 8.1300e+02 4.7870e+02 3.9430e+02 8.7590e+02 4.4590e+02 + 2.3960e+02 5.3310e+02 5.9470e+02 1.1683e+03 1.0485e+03 1.0215e+03 1.8945e+03 + 2.8181e+03 2.1659e+03 7.0910e+02 2.2450e+02 3.7280e+02 4.4420e+02 2.3890e+02 + 3.1160e+02 1.1418e+03 1.0645e+03 3.3800e+02 2.9570e+02 5.6390e+02 7.7110e+02 + 8.1150e+02 2.1642e+03 4.0617e+03 8.1400e+02 4.2950e+02 2.5040e+02 2.6800e+02 + 4.9300e+02 6.9430e+02 5.4350e+02 1.0925e+03 1.8260e+03 2.5818e+03 2.4700e+03 + 2.1876e+03 1.6388e+03 1.6390e+03 6.9490e+02 7.6870e+02 6.2360e+02 5.4700e+02 + 6.9490e+02 9.8090e+02 7.8620e+02 4.9230e+02 3.0510e+02 7.2030e+02 1.6377e+03 + 2.0901e+03 2.5213e+03 2.7263e+03 7.7550e+02 7.5230e+02 4.7310e+02 3.9800e+02 + 4.2890e+02 7.4940e+02 4.7710e+02 4.1580e+02 1.6090e+02 1.8620e+02 4.1650e+02 + 1.0766e+03 8.0390e+02 1.1040e+03 8.8320e+02 2.2763e+03 2.7141e+03 8.8310e+02 + 6.2680e+02 4.9290e+02 3.8040e+02 3.9760e+02 3.1410e+02 1.1518e+03 1.0285e+03 + 5.5910e+02 2.6820e+02 5.7670e+02 9.0080e+02 5.2960e+02 2.3261e+03 3.0821e+03 + 1.2138e+03 3.4740e+02 2.6260e+02 4.3270e+02 2.7040e+02 1.2281e+03 1.0397e+03 + 6.8960e+02 1.2811e+03 1.2078e+03 1.8752e+03 2.3688e+03 3.2196e+03 2.0139e+03 + 1.3677e+03 8.2230e+02 3.9980e+02 5.3450e+02 4.6720e+02 8.9060e+02 7.3790e+02 + 1.9240e+02 4.6700e+02 5.5720e+02 2.4818e+03 3.7013e+03 2.2391e+03 1.3132e+03 + 8.0020e+02 8.7910e+02 6.2220e+02 4.9270e+02 4.3920e+02 4.4030e+02 1.0009e+03 + 4.4120e+02 5.0370e+02 3.7960e+02 4.6520e+02 1.5251e+03 7.8410e+02 8.9300e+02 + 1.9146e+03 2.5358e+03 3.2321e+03 1.8263e+03 4.8830e+02 4.4330e+02 6.6950e+02 + 3.3590e+02 5.0050e+02 4.7520e+02 8.1930e+02 4.1800e+02 3.6720e+02 3.8030e+02 + 8.2660e+02 1.7176e+03 2.9731e+03 3.0891e+03 7.4040e+02 5.9740e+02 1.5850e+02 + 2.6230e+02 4.3190e+02 7.9920e+02 9.1680e+02 5.7080e+02 9.0270e+02 4.8480e+02 + 6.5290e+02 2.5199e+03 2.2697e+03 2.5691e+03 1.9932e+03 1.0178e+03 5.2210e+02 + 4.5570e+02 5.6470e+02 8.3970e+02 4.9890e+02 2.4040e+02 1.9670e+02 9.0590e+02 + 2.0230e+03 3.1935e+03 1.8047e+03 6.4910e+02 5.1860e+02 7.4320e+02 5.6720e+02 + 3.6130e+02 3.4680e+02 3.2350e+02 1.0831e+03 6.8940e+02 4.6740e+02 4.1490e+02 + 6.0200e+02 1.0114e+03 6.1340e+02 6.3850e+02 1.8558e+03 2.1681e+03 2.4209e+03 + 2.1578e+03 7.4880e+02 7.1380e+02 1.0050e+03 5.5600e+02 3.8520e+02 5.2440e+02 + 4.8370e+02 9.4610e+02 6.6140e+02 3.9600e+02 5.7770e+02 2.4338e+03 2.8337e+03 + 3.6266e+03 7.9970e+02 3.8850e+02 5.3590e+02 3.9790e+02 6.7110e+02 1.0032e+03 + 5.3970e+02 2.2090e+02 5.9140e+02 4.6420e+02 5.4790e+02 1.3856e+03 2.3149e+03 + 2.6941e+03 2.3174e+03 2.6055e+03 4.6450e+02 3.6940e+02 8.3640e+02 1.0459e+03 + 2.4570e+02 4.6500e+02 7.1910e+02 1.0597e+03 2.2427e+03 2.8553e+03 1.8869e+03 + 9.4850e+02 7.9700e+02 5.1490e+02 5.2360e+02 2.3210e+02 2.5150e+02 4.2190e+02 + 7.9630e+02 4.9320e+02 6.5000e+02 5.6620e+02 5.8440e+02 6.6580e+02 1.0132e+03 + 5.8170e+02 1.1307e+03 2.0867e+03 2.8135e+03 2.9965e+03 9.5520e+02 1.1533e+03 + 1.4342e+03 6.6870e+02 3.4460e+02 4.8460e+02 6.7480e+02 6.8840e+02 6.8370e+02 + 4.7590e+02 1.2259e+03 2.6056e+03 2.8840e+03 2.2537e+03 2.6390e+02 3.7020e+02 + 4.2630e+02 4.0280e+02 9.0760e+02 5.8840e+02 7.4250e+02 3.7250e+02 3.0320e+02 + 6.5070e+02 9.5430e+02 5.6850e+02 6.5160e+02 2.2816e+03 3.5675e+03 2.8373e+03 + 1.0373e+03 7.6950e+02 7.7710e+02 8.8170e+02 3.0170e+02 3.1920e+02 6.4420e+02 + 9.6700e+02 3.7600e+03 2.7336e+03 6.0410e+02 9.2380e+02 4.7410e+02 5.1460e+02 + 5.8670e+02 4.0150e+02 3.3320e+02 5.0840e+02 7.4990e+02 6.0310e+02 5.6750e+02 + 1.0799e+03 6.1990e+02 5.5570e+02 1.6515e+03 1.3606e+03 1.7361e+03 1.5144e+03 + 2.0979e+03 2.2073e+03 3.0573e+03 1.1279e+03 6.6880e+02 5.0500e+02 3.2090e+02 + 4.3480e+02 5.3620e+02 4.5240e+02 4.4890e+02 2.5230e+02 2.3277e+03 3.2433e+03 + 3.5655e+03 9.9210e+02 6.4450e+02 3.4760e+02 8.3650e+02 4.4530e+02 7.0680e+02 + 7.5510e+02 4.7040e+02 4.4300e+02 5.2590e+02 6.3220e+02 3.8870e+02 5.6440e+02 + 1.2451e+03 6.0090e+02 2.1199e+03 3.0428e+03 3.1833e+03 8.2740e+02 9.3750e+02 + 4.2950e+02 3.2970e+02 2.5040e+02 7.1360e+02 1.2779e+03 4.0224e+03 2.0480e+03 + 5.1430e+02 6.9720e+02 4.5640e+02 4.9950e+02 3.3700e+02 4.6380e+02 2.7590e+02 + 5.0650e+02 5.9670e+02 5.2920e+02 6.0900e+02 7.4030e+02 2.5740e+02 7.3270e+02 + 2.7284e+03 2.0818e+03 1.5255e+03 1.9134e+03 2.9348e+03 2.8784e+03 3.3216e+03 + 2.9590e+03 1.2656e+03 6.5830e+02 3.8690e+02 6.6590e+02 6.9440e+02 2.0170e+02 + 3.7100e+02 3.7850e+02 2.9910e+03 2.7180e+03 2.9766e+03 7.1420e+02 5.2270e+02 + 9.0350e+02 3.5140e+02 6.8240e+02 4.5960e+02 5.9580e+02 2.7020e+02 3.4660e+02 + 9.4290e+02 7.0590e+02 4.3890e+02 5.1670e+02 6.1740e+02 5.9520e+02 2.3860e+03 + 3.4076e+03 3.5169e+03 2.9801e+03 1.4806e+03 6.2980e+02 3.9370e+02 5.6590e+02 + 5.9440e+02 1.5422e+03 4.2549e+03 2.3089e+03 3.2580e+02 5.8120e+02 5.2760e+02 + 4.3190e+02 8.2800e+02 4.7710e+02 3.0110e+02 3.2770e+02 7.5420e+02 2.8890e+02 + 4.6550e+02 6.7110e+02 3.1290e+02 6.2810e+02 2.8028e+03 1.5962e+03 2.1702e+03 + 2.5640e+03 2.3399e+03 3.5303e+03 5.4441e+03 4.4971e+03 8.5920e+02 5.5580e+02 + 4.3590e+02 5.1220e+02 5.8590e+02 4.9550e+02 6.4780e+02 1.2190e+03 3.7625e+03 + 3.2038e+03 1.3689e+03 4.0370e+02 3.6770e+02 1.3512e+03 7.4750e+02 2.2610e+02 + 4.8090e+02 7.6330e+02 2.0970e+02 1.1720e+02 5.8590e+02 7.4270e+02 6.3910e+02 + 5.0120e+02 6.2800e+02 5.3750e+02 6.1000e+02 2.2689e+03 3.5764e+03 2.0547e+03 + 1.2624e+03 4.0680e+02 5.1970e+02 4.6610e+02 6.9980e+02 1.9224e+03 4.3899e+03 + 1.3728e+03 3.5850e+02 4.9630e+02 8.1470e+02 7.1390e+02 7.9620e+02 8.3680e+02 + 2.8800e+02 2.3990e+02 5.8500e+02 2.5880e+02 5.3220e+02 5.7440e+02 1.9290e+02 + 2.6320e+02 1.3925e+03 1.3095e+03 1.7556e+03 2.8989e+03 2.9825e+03 1.9776e+03 + 5.5001e+03 4.2421e+03 4.3747e+03 2.0653e+03 5.1180e+02 7.2060e+02 9.4540e+02 + 5.3070e+02 8.7880e+02 1.3734e+03 2.3046e+03 2.5161e+03 7.0170e+02 3.6730e+02 + 7.5700e+01 1.2691e+03 1.5224e+03 5.8140e+02 7.8210e+02 4.1880e+02 4.5230e+02 + 2.3820e+02 5.3100e+02 4.0320e+02 8.2880e+02 6.9230e+02 9.3900e+02 5.7140e+02 + 5.3220e+02 8.9630e+02 3.1448e+03 3.3576e+03 1.3024e+03 6.8530e+02 3.9590e+02 + 5.1790e+02 8.3440e+02 2.6348e+03 2.7361e+03 7.2780e+02 2.5060e+02 1.9550e+02 + 3.3750e+02 5.0110e+02 1.2490e+03 5.1330e+02 1.7410e+02 5.0480e+02 3.8940e+02 + 7.6880e+02 5.2150e+02 4.0170e+02 2.3790e+02 2.0680e+02 2.9970e+02 5.4370e+02 + 4.4200e+02 1.8842e+03 2.0584e+03 2.5973e+03 2.4619e+03 3.9719e+03 4.6484e+03 + 2.5327e+03 7.8120e+02 5.5750e+02 4.3550e+02 1.0126e+03 2.2236e+03 2.2959e+03 + 1.9515e+03 8.1220e+02 6.7570e+02 4.5850e+02 1.7710e+02 4.2620e+02 7.4910e+02 + 5.2720e+02 4.1450e+02 7.4690e+02 6.8140e+02 5.0060e+02 3.6340e+02 7.0940e+02 + 6.7010e+02 9.6500e+02 7.6080e+02 6.1930e+02 7.3460e+02 7.7920e+02 2.3576e+03 + 2.8308e+03 1.3406e+03 7.1310e+02 4.0930e+02 4.1370e+02 5.3640e+02 2.4058e+03 + 2.7679e+03 9.2460e+02 2.7210e+02 2.0650e+02 5.8140e+02 3.1660e+02 9.3240e+02 + 6.9720e+02 3.8330e+02 7.9950e+02 7.0510e+02 3.0360e+02 2.1180e+02 2.6220e+02 + 2.7130e+02 2.2840e+02 2.8840e+02 3.5030e+02 3.4630e+02 1.1109e+03 1.0682e+03 + 4.6940e+02 1.8093e+03 2.3137e+03 5.4323e+03 5.6000e+03 3.9957e+03 1.1524e+03 + 9.3590e+02 1.3602e+03 2.5398e+03 1.9564e+03 2.0743e+03 4.9950e+02 8.4350e+02 + 3.6340e+02 9.7500e+01 4.3500e+02 1.0180e+03 5.2390e+02 5.7000e+02 7.5400e+02 + 5.5200e+02 9.9750e+02 5.0220e+02 4.0000e+02 2.8570e+02 6.3650e+02 9.2200e+02 + 4.2210e+02 9.7170e+02 7.5730e+02 1.6397e+03 4.0314e+03 1.8024e+03 4.9410e+02 + 7.1310e+02 5.2470e+02 6.8960e+02 1.5601e+03 4.2428e+03 7.2420e+02 3.6100e+02 + 2.9320e+02 3.6780e+02 5.7790e+02 8.8840e+02 5.0740e+02 5.3180e+02 8.4290e+02 + 1.1813e+03 5.6130e+02 2.1400e+02 1.9980e+02 3.4920e+02 5.6780e+02 6.7040e+02 + 5.5250e+02 2.5790e+02 9.1610e+02 9.0080e+02 6.6820e+02 4.0400e+02 5.4680e+02 + 3.6048e+03 5.4821e+03 5.3834e+03 2.5262e+03 2.0935e+03 2.2546e+03 4.9513e+03 + 2.6434e+03 9.3240e+02 6.4840e+02 7.9650e+02 4.2020e+02 7.2020e+02 4.1360e+02 + 7.1280e+02 4.5800e+02 3.0660e+02 3.0870e+02 3.7090e+02 1.1661e+03 7.8990e+02 + 3.2020e+02 7.9250e+02 4.6160e+02 4.8010e+02 4.5830e+02 6.1380e+02 1.0058e+03 + 2.0784e+03 5.0101e+03 1.9859e+03 7.2620e+02 7.8710e+02 5.7340e+02 3.0540e+02 + 1.9529e+03 3.3125e+03 8.2010e+02 2.7250e+02 5.4600e+02 7.2710e+02 5.6610e+02 + 5.1470e+02 9.1060e+02 5.8780e+02 1.3200e+03 7.6060e+02 5.7690e+02 3.3550e+02 + 1.5210e+02 3.4850e+02 5.6440e+02 5.0570e+02 7.0910e+02 4.6670e+02 5.2980e+02 + 3.7730e+02 1.5096e+03 4.7550e+02 3.7150e+02 1.9668e+03 2.3762e+03 3.7872e+03 + 3.1058e+03 4.6850e+03 5.2282e+03 4.7486e+03 2.2235e+03 7.5510e+02 6.2120e+02 + 7.7730e+02 4.2540e+02 5.9780e+02 5.7670e+02 5.6180e+02 4.5250e+02 3.3660e+02 + 4.1290e+02 4.2810e+02 5.4830e+02 6.7440e+02 4.1180e+02 3.3020e+02 4.4870e+02 + 4.4330e+02 3.0000e+02 6.7270e+02 1.3989e+03 2.1820e+03 4.0080e+03 2.0697e+03 + 7.3510e+02 6.3260e+02 3.2190e+02 4.2450e+02 3.2533e+03 4.0414e+03 1.0341e+03 + 1.7360e+02 6.6460e+02 7.1240e+02 4.4110e+02 2.2430e+02 2.5270e+02 5.9900e+02 + 1.2562e+03 4.6980e+02 8.9130e+02 4.6590e+02 3.3250e+02 7.2110e+02 5.1810e+02 + 4.2330e+02 8.7880e+02 4.1580e+02 4.2920e+02 9.1980e+02 8.4900e+02 5.6350e+02 + 2.3710e+02 5.6770e+02 1.9829e+03 3.2356e+03 4.0180e+03 5.6000e+03 4.9410e+03 + 1.9528e+03 2.2103e+03 7.9370e+02 4.7080e+02 3.2690e+02 4.2340e+02 6.2820e+02 + 4.3850e+02 5.2850e+02 2.1260e+02 5.0050e+02 4.0590e+02 2.8600e+02 1.6210e+02 + 5.9920e+02 3.8610e+02 3.1120e+02 3.2010e+02 4.3920e+02 4.2330e+02 4.8820e+02 + 1.0198e+03 1.9485e+03 3.7247e+03 2.3782e+03 8.6730e+02 2.9180e+02 4.0260e+02 + 6.5940e+02 2.6340e+03 2.7234e+03 1.0460e+03 3.8020e+02 4.1550e+02 7.5230e+02 + 7.5490e+02 2.9240e+02 3.6150e+02 8.2070e+02 4.6500e+02 8.3330e+02 4.6420e+02 + 6.1010e+02 3.1720e+02 9.1200e+02 6.4850e+02 6.3680e+02 1.3515e+03 5.8640e+02 + 2.9470e+02 5.1790e+02 6.0320e+02 6.3690e+02 2.8610e+02 3.2380e+02 1.3209e+03 + 2.7384e+03 3.4926e+03 5.6000e+03 4.3968e+03 1.6006e+03 8.2620e+02 6.9450e+02 + 6.1640e+02 4.9050e+02 9.4990e+02 4.6320e+02 3.0660e+02 6.9230e+02 6.7380e+02 + 7.0230e+02 6.6560e+02 1.4010e+02 3.2390e+02 3.6060e+02 5.6970e+02 3.3280e+02 + 4.5570e+02 3.9610e+02 5.2040e+02 5.4250e+02 8.2700e+02 2.0102e+03 2.3181e+03 + 1.9494e+03 6.0830e+02 4.7750e+02 4.2120e+02 8.8930e+02 2.4830e+03 3.5062e+03 + 2.3645e+03 1.1485e+03 5.3690e+02 5.5760e+02 7.0430e+02 5.3750e+02 5.5740e+02 + 3.7790e+02 6.0510e+02 5.0280e+02 2.8470e+02 7.3210e+02 5.6340e+02 6.9210e+02 + 4.2440e+02 8.4060e+02 7.9540e+02 4.2360e+02 2.9490e+02 4.6640e+02 4.5760e+02 + 5.7440e+02 5.2550e+02 4.7670e+02 2.9730e+02 7.6640e+02 5.5939e+03 + 2*5.6000e+03 4.2880e+03 4.9370e+02 7.3180e+02 5.8090e+02 9.6150e+02 + 7.3670e+02 2.2450e+02 2.7440e+02 4.9210e+02 4.7990e+02 6.9320e+02 7.3670e+02 + 4.5160e+02 2.3420e+02 3.2950e+02 3.2150e+02 1.8400e+02 4.1470e+02 5.0970e+02 + 3.0570e+02 5.7910e+02 1.4135e+03 1.9686e+03 3.7133e+03 2.0431e+03 6.5970e+02 + 3.1920e+02 2.6490e+02 1.3772e+03 2.1834e+03 3.3128e+03 2.1144e+03 5.6960e+02 + 7.8090e+02 6.1150e+02 6.8040e+02 4.4290e+02 6.2010e+02 7.1140e+02 5.9550e+02 + 4.9480e+02 5.4090e+02 4.9780e+02 5.6880e+02 8.3880e+02 5.0420e+02 2.9960e+02 + 1.2632e+03 2.6290e+02 3.1020e+02 5.0380e+02 3.6200e+02 3.9100e+02 8.0200e+02 + 5.2750e+02 6.7710e+02 4.8060e+02 2.9500e+03 2*5.6000e+03 2.8924e+03 + 1.9784e+03 8.5750e+02 6.9280e+02 5.0910e+02 5.8690e+02 3.2820e+02 2.3230e+02 + 2.6280e+02 8.8900e+02 7.5880e+02 4.8780e+02 3.3580e+02 4.2680e+02 5.8850e+02 + 5.9000e+02 3.1760e+02 2.0810e+02 5.6920e+02 5.9320e+02 4.0600e+02 7.0260e+02 + 2.5848e+03 3.3634e+03 1.8867e+03 1.5904e+03 3.5980e+02 3.4040e+02 1.1666e+03 + 2.3241e+03 3.5751e+03 2.0221e+03 1.0142e+03 4.5980e+02 4.4680e+02 6.0110e+02 + 4.5250e+02 4.4610e+02 4.9420e+02 5.3520e+02 4.4550e+02 4.1930e+02 5.6980e+02 + 3.0720e+02 5.6430e+02 5.2760e+02 6.1920e+02 7.9590e+02 4.1010e+02 4.1510e+02 + 3.6860e+02 1.8050e+02 3.9010e+02 9.5690e+02 1.0478e+03 7.7500e+02 1.8684e+03 + 2.6881e+03 2.3807e+03 2.3098e+03 2.4879e+03 2.4948e+03 2.3666e+03 1.5480e+03 + 7.2240e+02 2.5620e+02 3.5950e+02 2.6870e+02 5.2800e+02 7.7620e+02 5.3560e+02 + 6.3000e+02 3.2990e+02 2.4460e+02 3.4020e+02 7.1980e+02 4.3700e+02 3.7340e+02 + 3.2790e+02 4.4400e+02 3.0210e+02 6.3170e+02 2.0069e+03 3.7814e+03 2.3536e+03 + 1.0762e+03 3.3550e+02 2.6750e+02 5.7730e+02 8.8900e+02 3.5576e+03 2.2966e+03 + 1.0025e+03 6.8410e+02 3.8040e+02 5.4490e+02 5.6540e+02 5.4200e+02 9.5780e+02 + 5.1050e+02 7.9600e+02 1.0357e+03 2.4560e+02 3.7230e+02 7.6560e+02 3.3520e+02 + 2.3096e+03 1.8723e+03 5.6810e+02 6.4570e+02 3.6110e+02 7.1200e+01 2.0930e+02 + 8.9450e+02 8.5500e+02 1.4598e+03 1.9818e+03 2.9160e+03 2.0128e+03 3.2247e+03 + 1.4242e+03 3.3049e+03 2.9949e+03 1.9614e+03 1.5307e+03 4.3720e+02 3.4940e+02 + 3.0850e+02 8.3340e+02 6.0660e+02 4.7240e+02 3.9370e+02 3.4330e+02 4.4780e+02 + 4.7830e+02 6.7430e+02 1.1888e+03 6.4320e+02 3.5450e+02 5.9030e+02 3.8270e+02 + 5.5210e+02 2.3783e+03 2.6353e+03 2.8460e+03 8.8820e+02 5.7060e+02 9.2820e+02 + 3.1330e+02 7.8430e+02 3.2780e+03 2.2679e+03 9.0760e+02 7.1350e+02 5.3720e+02 + 6.9730e+02 4.1660e+02 1.2330e+03 6.5120e+02 9.3470e+02 4.9710e+02 7.0340e+02 + 5.4400e+02 3.0850e+02 3.8260e+02 3.2310e+02 8.5460e+02 7.6900e+02 3.9140e+02 + 1.7000e+00 5.8500e+01 3.1860e+02 6.6240e+02 4.4470e+02 9.6210e+02 2.3766e+03 + 4.8234e+03 3.0237e+03 8.5690e+02 2.5910e+02 2.3450e+02 6.0660e+02 4.5480e+02 + 5.4150e+02 6.5220e+02 3.0810e+03 3.0451e+03 2.0304e+03 1.1551e+03 8.1410e+02 + 5.2460e+02 7.6460e+02 1.2046e+03 1.0148e+03 4.5440e+02 5.1960e+02 1.0436e+03 + 9.2140e+02 5.9290e+02 5.4450e+02 3.4990e+02 3.2550e+02 4.9270e+02 8.1580e+02 + 7.8950e+02 3.7220e+02 6.5640e+02 7.1760e+02 1.0297e+03 7.8310e+02 2.3438e+03 + 2.3525e+03 3.5322e+03 4.3188e+03 4.6477e+03 4.5877e+03 1.5742e+03 7.5620e+02 + 3.0010e+02 5.1020e+02 6.4890e+02 7.6680e+02 7.1210e+02 1.0680e+03 4.5170e+02 + 8.5060e+02 6.8640e+02 2.7710e+02 2.4950e+02 1.6810e+02 2.6640e+02 4.9890e+02 + 6.0630e+02 4.5110e+02 4.7080e+02 4.0505e+03 4.9000e+03 2.7946e+03 9.8620e+02 + 4.3510e+02 4.2190e+02 4.7090e+02 3.6170e+02 2.3920e+02 8.0430e+02 2.9212e+03 + 4.9000e+03 3.2168e+03 1.1798e+03 6.7730e+02 7.6990e+02 6.1190e+02 6.6570e+02 + 4.6710e+02 7.0430e+02 4.2710e+02 6.3450e+02 8.0980e+02 5.4000e+02 4.6680e+02 + 3.4180e+02 2.2010e+02 2.9570e+02 6.8720e+02 6.6120e+02 4.8270e+02 9.6650e+02 + 9.2700e+02 5.3860e+02 3.9180e+02 2.2109e+03 1.3209e+03 2.6140e+03 4.1820e+03 + 2*4.9000e+03 4.2086e+03 6.6510e+02 3.1020e+02 6.2620e+02 4.4410e+02 + 6.7360e+02 5.8170e+02 6.2560e+02 5.4580e+02 2.3870e+03 9.1610e+02 3.9760e+02 + 3.0140e+02 1.8110e+02 6.9860e+02 8.2690e+02 4.9960e+02 3.3310e+02 5.9590e+02 + 1.8634e+03 4.9000e+03 4.3972e+03 8.9590e+02 4.6990e+02 4.2770e+02 6.3720e+02 + 5.2020e+02 4.9310e+02 1.2370e+03 1.9707e+03 3.3939e+03 2.9604e+03 1.3739e+03 + 1.0916e+03 1.1506e+03 7.7510e+02 5.8790e+02 6.6150e+02 6.4790e+02 6.1330e+02 + 9.0550e+02 3.0040e+02 5.4940e+02 5.4260e+02 6.5950e+02 3.4810e+02 3.0380e+02 + 7.0650e+02 5.4490e+02 4.2280e+02 1.3856e+03 8.8020e+02 5.6180e+02 2.5220e+02 + 3.7790e+02 1.0376e+03 1.7467e+03 3.5279e+03 2*4.9000e+03 4.0519e+03 + 1.4766e+03 5.8830e+02 9.0730e+02 4.9470e+02 2*6.2970e+02 6.0230e+02 + 8.2650e+02 6.5680e+02 9.8490e+02 2.6090e+02 4.7630e+02 3.0200e+02 5.9460e+02 + 9.1610e+02 4.5890e+02 3.5040e+02 1.0898e+03 1.0457e+03 3.4668e+03 2.7398e+03 + 1.5098e+03 4.1530e+02 6.4180e+02 7.1480e+02 3.3700e+02 5.1490e+02 5.4600e+02 + 1.1480e+03 2.0468e+03 3.0371e+03 2.3988e+03 1.3191e+03 9.2680e+02 4.4940e+02 + 1.1570e+03 7.7460e+02 4.8190e+02 7.0330e+02 5.5060e+02 4.6940e+02 9.0110e+02 + 6.8860e+02 5.9310e+02 5.2300e+02 2.8690e+02 5.6960e+02 5.8390e+02 6.9990e+02 + 7.5360e+02 7.0070e+02 2.4370e+02 2.9900e+02 5.6330e+02 1.0831e+03 7.4450e+02 + 2.3635e+03 4.9000e+03 4.0880e+03 2.5881e+03 2.5941e+03 7.6280e+02 8.6390e+02 + 6.0000e+02 4.9240e+02 4.5160e+02 8.2700e+02 8.9170e+02 3.5570e+02 8.6620e+02 + 8.3420e+02 7.6590e+02 3.9200e+02 7.1180e+02 1.5866e+03 3.1330e+02 9.7100e+01 + 6.8540e+02 2.6535e+03 4.6168e+03 3.2601e+03 1.1438e+03 2.6730e+02 6.2210e+02 + 4.1000e+02 3.9730e+02 4.2810e+02 4.1880e+02 3.2520e+02 8.3750e+02 2.0751e+03 + 2.6465e+03 2.0143e+03 2.3783e+03 1.1170e+03 9.2900e+02 1.0244e+03 3.2450e+02 + 1.8860e+02 4.4280e+02 4.0320e+02 6.0160e+02 5.6080e+02 1.0774e+03 8.4560e+02 + 4.4400e+02 2.2490e+02 4.1080e+02 3.1430e+02 3.6290e+02 7.6960e+02 3.7120e+02 + 6.1980e+02 3.9020e+02 2.3590e+02 4.9040e+02 3.6886e+03 4.8293e+03 4.9000e+03 + 1.6395e+03 1.8382e+03 2.3142e+03 9.4850e+02 1.0013e+03 7.0580e+02 2.4990e+02 + 6.9850e+02 3.3000e+02 4.7170e+02 1.0241e+03 1.1444e+03 1.0398e+03 5.3210e+02 + 5.6930e+02 9.8270e+02 4.7800e+02 9.5800e+01 4.0270e+02 4.0533e+03 4.9000e+03 + 3.7115e+03 8.6920e+02 5.5740e+02 2.7440e+02 3.2940e+02 3.8820e+02 5.6390e+02 + 2.3740e+02 5.8620e+02 4.1860e+02 9.0350e+02 2.2515e+03 2.6049e+03 3.0144e+03 + 2.7469e+03 1.7499e+03 1.3192e+03 4.0520e+02 3.6160e+02 6.1920e+02 8.1710e+02 + 4.6370e+02 6.3040e+02 6.9830e+02 5.7930e+02 5.2280e+02 2.9580e+02 3.3540e+02 + 1.7570e+02 3.9880e+02 5.0840e+02 4.0980e+02 4.3510e+02 8.5350e+02 3.1800e+02 + 1.7779e+03 3.1750e+03 4.1493e+03 2.9037e+03 3.3223e+03 3.9801e+03 1.0377e+03 + 8.3680e+02 4.2940e+02 3.8190e+02 8.8370e+02 5.8940e+02 2.3100e+02 6.4920e+02 + 2.7490e+02 1.1619e+03 6.7360e+02 5.2470e+02 7.3370e+02 6.7760e+02 3.2630e+02 + 1.2650e+02 6.0590e+02 2.5197e+03 2*4.9000e+03 7.0550e+02 8.1120e+02 + 4.4330e+02 4.3970e+02 2.9130e+02 3.8310e+02 2.5380e+02 3.2410e+02 5.9810e+02 + 4.9000e+02 8.4280e+02 1.7841e+03 1.3647e+03 2.3321e+03 2.4906e+03 9.3570e+02 + 7.7320e+02 5.5970e+02 5.0930e+02 7.0710e+02 5.2100e+02 4.2250e+02 8.1590e+02 + 6.2750e+02 6.5980e+02 8.5510e+02 3.3260e+02 2.3320e+02 4.2820e+02 2.4570e+02 + 4.3130e+02 4.3250e+02 2.3640e+02 1.3060e+02 2.8450e+02 2.5676e+03 3.7246e+03 + 2.5032e+03 2.7486e+03 4.7564e+03 3.2978e+03 9.1610e+02 2.8860e+02 4.1370e+02 + 6.4930e+02 5.3240e+02 3.7090e+02 4.5210e+02 3.7140e+02 6.0760e+02 6.1210e+02 + 3.4180e+02 6.7840e+02 6.9650e+02 3.8950e+02 4.6040e+02 5.4270e+02 2.5970e+03 + 4.9000e+03 4.3958e+03 9.2710e+02 8.7100e+02 7.1070e+02 6.9780e+02 7.9830e+02 + 3.2330e+02 3.3900e+02 6.0250e+02 6.8860e+02 5.3380e+02 4.0700e+02 1.4667e+03 + 1.2215e+03 2.8507e+03 2.0040e+03 2.0997e+03 1.1161e+03 9.8000e+02 5.7300e+02 + 3.9980e+02 5.4820e+02 5.7620e+02 4.9670e+02 5.0920e+02 8.0810e+02 5.4540e+02 + 3.9170e+02 5.1530e+02 3.8000e+02 3.1750e+02 5.6970e+02 1.1850e+03 4.4380e+02 + 7.4500e+01 1.2268e+03 2.6120e+03 3.0085e+03 2.6159e+03 2.5942e+03 4.9000e+03 + 3.9863e+03 9.4580e+02 2.9280e+02 1.4430e+02 6.5560e+02 7.9060e+02 3.4790e+02 + 5.7060e+02 2.3900e+02 7.4520e+02 5.9780e+02 3.0280e+02 4.0880e+02 8.1670e+02 + 4.2150e+02 9.1680e+02 1.3279e+03 3.7216e+03 4.9000e+03 3.1699e+03 3.8360e+02 + 7.7550e+02 6.8600e+02 5.5090e+02 3.7860e+02 6.7250e+02 6.8790e+02 5.0120e+02 + 5.8760e+02 7.6000e+02 4.4640e+02 1.1489e+03 8.7320e+02 1.2332e+03 2.3697e+03 + 2.6409e+03 2.3753e+03 1.1274e+03 3.2630e+02 5.4780e+02 2.7470e+02 3.2560e+02 + 4.7350e+02 2.3400e+02 4.2390e+02 7.7050e+02 5.6670e+02 6.1460e+02 3.9110e+02 + 4.8030e+02 6.4220e+02 1.0625e+03 4.6250e+02 3.3800e+01 1.3840e+02 3.2671e+03 + 3.6876e+03 1.9176e+03 2.4242e+03 4.2683e+03 4.1747e+03 1.3542e+03 6.1100e+02 + 2.6170e+02 3.3110e+02 4.9600e+02 4.5760e+02 6.9790e+02 2.3600e+02 8.7740e+02 + 5.7340e+02 3.4380e+02 2.5130e+02 5.0770e+02 4.8350e+02 8.6690e+02 1.4984e+03 + 2*4.9000e+03 2.9727e+03 6.0620e+02 6.9880e+02 7.5960e+02 9.2190e+02 + 5.9360e+02 4.0580e+02 6.2640e+02 5.2500e+02 4.3990e+02 5.8000e+02 5.2950e+02 + 6.7140e+02 6.9180e+02 6.5890e+02 1.3313e+03 2.6896e+03 1.6004e+03 1.4674e+03 + 4.9510e+02 3.2780e+02 4.7140e+02 4.3080e+02 4.4370e+02 4.1130e+02 4.0550e+02 + 3.5190e+02 6.7540e+02 6.5420e+02 5.2720e+02 5.7950e+02 8.0980e+02 5.8940e+02 + 5.6820e+02 1.8510e+02 3.3010e+02 3.7469e+03 2.7585e+03 1.7893e+03 2.5530e+03 + 2*4.9000e+03 2.3227e+03 3.6610e+02 3.4370e+02 5.3090e+02 3.6930e+02 + 4.3070e+02 1.1271e+03 2.6400e+02 5.1240e+02 4.6860e+02 2.3270e+02 4.2960e+02 + 3.4440e+02 3.6900e+02 7.2790e+02 2.0649e+03 4.9000e+03 3.4446e+03 3.3864e+03 + 4.3380e+02 7.1580e+02 3.3140e+02 3.0910e+02 6.2060e+02 6.5490e+02 9.5530e+02 + 8.0240e+02 6.1480e+02 2.2400e+02 2.8250e+02 3.9480e+02 6.1900e+02 5.5940e+02 + 1.1196e+03 2.2770e+03 2.6996e+03 2.5419e+03 4.9410e+02 3.1580e+02 3.5520e+02 + 2.6670e+02 3.5730e+02 3.4990e+02 5.5840e+02 5.3240e+02 2.4480e+02 3.3760e+02 + 7.7510e+02 6.1260e+02 4.0110e+02 9.4910e+02 5.7500e+02 1.5130e+02 2.0107e+03 + 3.8104e+03 4.1152e+03 8.8710e+02 1.4068e+03 3.3063e+03 4.1864e+03 2.5971e+03 + 6.3950e+02 5.0920e+02 3.9460e+02 2.9540e+02 5.2070e+02 8.5730e+02 2.2260e+02 + 4.6430e+02 3.1650e+02 3.7710e+02 4.0340e+02 3.1970e+02 1.7890e+02 5.8570e+02 + 3.2412e+03 3.9943e+03 4.4504e+03 2.5558e+03 6.5810e+02 6.1570e+02 5.5910e+02 + 3.6920e+02 4.2470e+02 2.8140e+02 6.0420e+02 8.7580e+02 4.1780e+02 3.1370e+02 + 4.1120e+02 6.0410e+02 3.6040e+02 3.6360e+02 3.9450e+02 1.7562e+03 2.8302e+03 + 3.8312e+03 1.1326e+03 3.1180e+02 4.9130e+02 4.2040e+02 3.0060e+02 6.0570e+02 + 3.9470e+02 5.1860e+02 3.1670e+02 3.0750e+02 4.1880e+02 7.2500e+02 2.7290e+02 + 6.6630e+02 8.8230e+02 7.8270e+02 9.0460e+02 2.8528e+03 2.0694e+03 1.1124e+03 + 2.5704e+03 3.7656e+03 4.9000e+03 3.2430e+03 5.7630e+02 1.0262e+03 7.0310e+02 + 2.5920e+02 3.5090e+02 2.1630e+02 9.2350e+02 5.4350e+02 2.4130e+02 5.5000e+02 + 6.6650e+02 4.1240e+02 1.4450e+02 5.7390e+02 2.5396e+03 3.5507e+03 3.8817e+03 + 1.8486e+03 7.3410e+02 1.1458e+03 3.0820e+02 3.6220e+02 5.4470e+02 4.0080e+02 + 5.3350e+02 8.4810e+02 5.6400e+02 5.5110e+02 4.4670e+02 8.1670e+02 7.2200e+02 + 2.4830e+02 4.0990e+02 8.7120e+02 2.9330e+03 3.1551e+03 1.4986e+03 6.8930e+02 + 4.8670e+02 5.3730e+02 7.3300e+02 7.7670e+02 4.1740e+02 3.8500e+02 4.5280e+02 + 4.1240e+02 6.8130e+02 4.0870e+02 2.2060e+02 4.0000e+02 9.3480e+02 1.9320e+03 + 2.9788e+03 3.1003e+03 1.6156e+03 6.8340e+02 1.1202e+03 3.2879e+03 3.5214e+03 + 3.8201e+03 1.4108e+03 6.7040e+02 5.1820e+02 5.6640e+02 3.4960e+02 4.2380e+02 + 6.5070e+02 3.2070e+02 3.1840e+02 7.1520e+02 7.8690e+02 4.5010e+02 5.5710e+02 + 1.5552e+03 1.4777e+03 3.6582e+03 3.5015e+03 1.0880e+03 4.6830e+02 6.8700e+02 + 7.3390e+02 6.3820e+02 5.9420e+02 3.2610e+02 4.3290e+02 7.2550e+02 3.7100e+02 + 1.7970e+02 3.5090e+02 7.2000e+02 5.7320e+02 6.2650e+02 5.4870e+02 6.9500e+02 + 2.1805e+03 4.0971e+03 1.6978e+03 5.2050e+02 6.6750e+02 7.8480e+02 9.7600e+02 + 6.1820e+02 2.0320e+02 2.2530e+02 4.5250e+02 7.9340e+02 6.6780e+02 6.9830e+02 + 3.7060e+02 3.0690e+02 1.1987e+03 3.0072e+03 2.0664e+03 2.5907e+03 9.6570e+02 + 6.1200e+02 9.7850e+02 1.4153e+03 3.8518e+03 3.8997e+03 3.1137e+03 6.9700e+02 + 7.5440e+02 5.8590e+02 7.1850e+02 5.1080e+02 7.9480e+02 7.5330e+02 6.8480e+02 + 3.7100e+02 6.6160e+02 3.5060e+02 1.0092e+03 1.5327e+03 2.3969e+03 4.9000e+03 + 3.1931e+03 1.0575e+03 3.8810e+02 5.4470e+02 8.2610e+02 3.9060e+02 5.1450e+02 + 5.5920e+02 3.2360e+02 4.1080e+02 6.3590e+02 2.2090e+02 3.7140e+02 4.9270e+02 + 7.9780e+02 5.9960e+02 3.7540e+02 4.0750e+02 1.8211e+03 3.9184e+03 1.9794e+03 + 4.7400e+02 5.9880e+02 5.9890e+02 6.4770e+02 4.0540e+02 2.2810e+02 5.4270e+02 + 5.1350e+02 6.2290e+02 3.6310e+02 1.4169e+03 4.0230e+02 7.5470e+02 1.7417e+03 + 1.7249e+03 3.0629e+03 2.4215e+03 7.7260e+02 4.3260e+02 5.1610e+02 1.4721e+03 + 3.6927e+03 4.3100e+03 2.4982e+03 1.5615e+03 1.3801e+03 6.5430e+02 6.8270e+02 + 6.1730e+02 5.8210e+02 5.6760e+02 6.7000e+02 3.5940e+02 3.1370e+02 5.0000e+02 + 6.4500e+02 1.3522e+03 4.1563e+03 4.6346e+03 2.6537e+03 1.2751e+03 7.0170e+02 + 9.4080e+02 2.0520e+02 2.2950e+02 8.3030e+02 4.0440e+02 4.7250e+02 5.3580e+02 + 2.1980e+02 3.2230e+02 5.5730e+02 3.3690e+02 5.5030e+02 4.6010e+02 7.8160e+02 + 3.3800e+02 1.7136e+03 3.1639e+03 1.8984e+03 5.7480e+02 5.5130e+02 6.5560e+02 + 3.1290e+02 3.7450e+02 2.2020e+02 4.4590e+02 6.6730e+02 7.4650e+02 6.6360e+02 + 7.8870e+02 1.3083e+03 1.5218e+03 2.2825e+03 3.1650e+03 2.7437e+03 2.1902e+03 + 7.5960e+02 4.6160e+02 6.1230e+02 8.6260e+02 2.6442e+03 2.0264e+03 2.5356e+03 + 3.2848e+03 1.4322e+03 7.1810e+02 4.3590e+02 7.8920e+02 4.6530e+02 9.3830e+02 + 6.9180e+02 5.5360e+02 1.3830e+02 6.3550e+02 8.9820e+02 2.6261e+03 4.0175e+03 + 2.6087e+03 4.6050e+03 2.0786e+03 4.6900e+02 4.8500e+02 3.4410e+02 1.8700e+02 + 4.0090e+02 3.6000e+02 6.2530e+02 5.0090e+02 4.4720e+02 2.0120e+02 3.4490e+02 + 4.6920e+02 4.8430e+02 6.5970e+02 3.9310e+02 2.5520e+02 5.2860e+02 4.2176e+03 + 2.3382e+03 5.6580e+02 5.2590e+02 6.6610e+02 4.7300e+02 2.5810e+02 1.3720e+02 + 5.6020e+02 4.0000e+02 6.9890e+02 1.7807e+03 2.2450e+03 2.4122e+03 2.5463e+03 + 2.7491e+03 1.2669e+03 7.2590e+02 1.0497e+03 6.5520e+02 4.1490e+02 4.5530e+02 + 1.4910e+03 2.4744e+03 2.4600e+03 1.6349e+03 3.0696e+03 2.5558e+03 1.6906e+03 + 1.0922e+03 3.7970e+02 3.0000e+02 5.2520e+02 7.1940e+02 3.7900e+02 2.1840e+02 + 3.4470e+02 1.0611e+03 2.9251e+03 3.5903e+03 3.8265e+03 3.7255e+03 2.2247e+03 + 3.3940e+02 6.0500e+02 4.7030e+02 1.7580e+02 3.5370e+02 3.4930e+02 7.3520e+02 + 7.3990e+02 6.6980e+02 3.9670e+02 5.7910e+02 3.8760e+02 6.0510e+02 5.9200e+02 + 5.1710e+02 3.8210e+02 7.1590e+02 2.6981e+03 2.5531e+03 4.4380e+02 2.8290e+02 + 4.2290e+02 7.5250e+02 6.2910e+02 2.4310e+02 3.5320e+02 1.6762e+03 1.8374e+03 + 2.2917e+03 2.7316e+03 1.9472e+03 2.7934e+03 2.3946e+03 5.8550e+02 5.4530e+02 + 6.8240e+02 3.1220e+02 2.1750e+02 3.4110e+02 1.5631e+03 3.5357e+03 2.6994e+03 + 1.2852e+03 1.1359e+03 2.6465e+03 3.0991e+03 1.5949e+03 1.2907e+03 2.3780e+02 + 4.7800e+02 7.4680e+02 7.3970e+02 3.1480e+02 4.5770e+02 1.9856e+03 2.4890e+03 + 1.9896e+03 4.8061e+03 4.7629e+03 1.2995e+03 8.6390e+02 5.4700e+02 3.9230e+02 + 3.0930e+02 3.4860e+02 2.3370e+02 4.4100e+02 3.8060e+02 4.8770e+02 5.6350e+02 + 7.9250e+02 7.0010e+02 4.0580e+02 2.9250e+02 3.7090e+02 6.9010e+02 2.4075e+03 + 3.7066e+03 2.3764e+03 1.1356e+03 4.4170e+02 2.2210e+02 5.9440e+02 5.6080e+02 + 7.0040e+02 1.0059e+03 1.9432e+03 2.1558e+03 1.4455e+03 2.5833e+03 1.3955e+03 + 1.0705e+03 1.3868e+03 8.1760e+02 2.9530e+02 3.7590e+02 6.1430e+02 2.7500e+02 + 4.1140e+02 1.5904e+03 3.0762e+03 2.3936e+03 4.8650e+02 9.2570e+02 3.1315e+03 + 2.0928e+03 2.1945e+03 2.2709e+03 6.7710e+02 2.1750e+02 6.1100e+02 4.7310e+02 + 4.7170e+02 9.6250e+02 3.1982e+03 3.5207e+03 1.6721e+03 3.1069e+03 2.4486e+03 + 1.2593e+03 7.0110e+02 4.0930e+02 6.1310e+02 4.3730e+02 4.7780e+02 3.6790e+02 + 4.9470e+02 4.8590e+02 6.0390e+02 3.4080e+02 6.8700e+02 6.8110e+02 4.3650e+02 + 2.7050e+02 4.2130e+02 1.4993e+03 2.0894e+03 3.7617e+03 1.9929e+03 9.4780e+02 + 3.4620e+02 2.5500e+02 4.2920e+02 9.4750e+02 1.2749e+03 3.3196e+03 2.1537e+03 + 2.7936e+03 2.3389e+03 7.5540e+02 6.1070e+02 1.1786e+03 1.4160e+03 1.3153e+03 + 4.1290e+02 3.7360e+02 3.0380e+02 2.6830e+02 4.0160e+02 1.2998e+03 3.8829e+03 + 1.7887e+03 5.7600e+02 2.6870e+02 1.1777e+03 2.2238e+03 1.9638e+03 2.2374e+03 + 7.8000e+02 3.8840e+02 3.1360e+02 4.9620e+02 5.7450e+02 2.2524e+03 3.0206e+03 + 2.5774e+03 9.3850e+02 2.9113e+03 4.2741e+03 1.4161e+03 3.5840e+02 4.4070e+02 + 3.0610e+02 8.0280e+02 1.1691e+03 6.3540e+02 5.9300e+02 4.2250e+02 5.2270e+02 + 9.0770e+02 5.1630e+02 4.2870e+02 4.6130e+02 6.3670e+02 9.1950e+02 1.4502e+03 + 3.9855e+03 2.4576e+03 1.6164e+03 9.4020e+02 4.9890e+02 3.4350e+02 9.1810e+02 + 1.2964e+03 2.4010e+03 1.9651e+03 2.1395e+03 1.5530e+03 5.4360e+02 9.3870e+02 + 5.5780e+02 4.7350e+02 5.6940e+02 5.7140e+02 6.0160e+02 4.1750e+02 4.0260e+02 + 4.1160e+02 3.5590e+02 1.9691e+03 2.4940e+03 2.0818e+03 4.3580e+02 2.7020e+02 + 2.7930e+02 9.5580e+02 5.8410e+02 2.1746e+03 5.8290e+02 5.5010e+02 4.1250e+02 + 6.4980e+02 1.0804e+03 2.3048e+03 3.0870e+03 1.3036e+03 6.0130e+02 1.2134e+03 + 3.7044e+03 2.1953e+03 4.8070e+02 1.4500e+02 6.4800e+01 4.2890e+02 8.7270e+02 + 9.7940e+02 4.1340e+02 3.0460e+02 2.7300e+02 5.1260e+02 9.3980e+02 6.2100e+02 + 7.8230e+02 1.0151e+03 1.8910e+03 2.6031e+03 3.5757e+03 1.0218e+03 3.8380e+02 + 7.3110e+02 4.1830e+02 7.0160e+02 2.0068e+03 3.1563e+03 3.8243e+03 2.2182e+03 + 8.7900e+02 7.1100e+02 3.7750e+02 7.5910e+02 5.1710e+02 2.1540e+02 8.3300e+02 + 4.5430e+02 3.2660e+02 6.9000e+02 7.3400e+02 5.4820e+02 4.1390e+02 9.2330e+02 + 3.8071e+03 2.7039e+03 4.0900e+02 4.4530e+02 2.8790e+02 8.2800e+02 1.1537e+03 + 4.1780e+02 5.1490e+02 5.6130e+02 4.2880e+02 5.2030e+02 2.5119e+03 2.8101e+03 + 1.7621e+03 6.9950e+02 6.2610e+02 2.7583e+03 2.8678e+03 3.3473e+03 7.4170e+02 + 4.8580e+02 3.0290e+02 1.9930e+02 1.0792e+03 9.3540e+02 5.4010e+02 6.4800e+02 + 2.9710e+02 7.5820e+02 5.1350e+02 7.1900e+02 1.1521e+03 1.5915e+03 2.6051e+03 + 2.4992e+03 1.9114e+03 3.9580e+02 4.0670e+02 3.5790e+02 7.3200e+02 2.3729e+03 + 1.8571e+03 3.7378e+03 1.9084e+03 8.5110e+02 5.7470e+02 6.9850e+02 4.9800e+02 + 9.0730e+02 3.7820e+02 9.5310e+02 3.5740e+02 3.5870e+02 2.0360e+02 7.8600e+02 + 9.5390e+02 4.3620e+02 5.4440e+02 1.7979e+03 2.8960e+03 8.7680e+02 7.8100e+02 + 7.2540e+02 4.7830e+02 7.1750e+02 1.0963e+03 8.9460e+02 4.0210e+02 9.9010e+02 + 4.4010e+02 1.2691e+03 2.1196e+03 2.6762e+03 1.6572e+03 5.3400e+02 4.1050e+02 + 1.7633e+03 2.1376e+03 3.6522e+03 1.0606e+03 3.2970e+02 1.6900e+02 8.2120e+02 + 8.8290e+02 5.3840e+02 3.9680e+02 4.1560e+02 1.8500e+02 5.0670e+02 8.2990e+02 + 1.0153e+03 1.3997e+03 2.3984e+03 1.8280e+03 1.9130e+03 4.6950e+02 5.6270e+02 + 1.9670e+02 3.6420e+02 9.5390e+02 2.3755e+03 3.7476e+03 2.0001e+03 8.5080e+02 + 4.8970e+02 2.5560e+02 5.1500e+02 6.6410e+02 3.5860e+02 3.2460e+02 6.4040e+02 + 4.7660e+02 5.2610e+02 3.7580e+02 5.2970e+02 1.0646e+03 6.7780e+02 4.8880e+02 + 2.2137e+03 2.3204e+03 1.9355e+03 6.3430e+02 5.9870e+02 7.7810e+02 5.7190e+02 + 5.6020e+02 4.6980e+02 3.8050e+02 6.0080e+02 7.0830e+02 1.9523e+03 3.8972e+03 + 2.4522e+03 1.2013e+03 4.6320e+02 6.9910e+02 6.3940e+02 2.2519e+03 3.0293e+03 + 1.9316e+03 3.3690e+02 2.3860e+02 6.1090e+02 6.4680e+02 4.4470e+02 3.4630e+02 + 1.8420e+02 3.2750e+02 3.1760e+02 1.2086e+03 1.9921e+03 2.4008e+03 3.2550e+03 + 2.3575e+03 1.3857e+03 3.9690e+02 3.4070e+02 8.1060e+02 9.0650e+02 2.2356e+03 + 2.4741e+03 2.6600e+03 1.4549e+03 4.3380e+02 4.3170e+02 5.8650e+02 2.9410e+02 + 6.6080e+02 3.3710e+02 3.0560e+02 5.1250e+02 9.5740e+02 3.5310e+02 7.3280e+02 + 9.0650e+02 6.2720e+02 4.4460e+02 9.2950e+02 2.0701e+03 2.6352e+03 2.0188e+03 + 6.4470e+02 5.0710e+02 4.6190e+02 5.3620e+02 4.9820e+02 3.4210e+02 4.8890e+02 + 6.1850e+02 1.9077e+03 2.0709e+03 1.8563e+03 1.3881e+03 1.3430e+02 5.1570e+02 + 8.8680e+02 6.8580e+02 1.8732e+03 3.1408e+03 2.8786e+03 6.6510e+02 5.0060e+02 + 6.3110e+02 5.3470e+02 7.0540e+02 2.7390e+02 5.0690e+02 3.9680e+02 9.5320e+02 + 1.7567e+03 2.7867e+03 3.4671e+03 2.6263e+03 2.2728e+03 2.5690e+02 2.9370e+02 + 4.9890e+02 5.4610e+02 1.6789e+03 2.6254e+03 1.7506e+03 2.0486e+03 3.7940e+02 + 3.1590e+02 4.3990e+02 3.6230e+02 4.3540e+02 2.7050e+02 3.8710e+02 4.4060e+02 + 7.4770e+02 5.4480e+02 4.7510e+02 6.4060e+02 1.1190e+03 4.9540e+02 3.6280e+02 + 3.9960e+02 2.3941e+03 3.5095e+03 6.7490e+02 4.6530e+02 4.3520e+02 4.6350e+02 + 4.8610e+02 4.8380e+02 5.2660e+02 8.1120e+02 8.5940e+02 2.6350e+03 3.4294e+03 + 2.4760e+03 1.3387e+03 4.6170e+02 2.8240e+02 4.9890e+02 6.5660e+02 1.5009e+03 + 3.2974e+03 2.2468e+03 2.2535e+03 4.5700e+02 5.4800e+02 8.0680e+02 4.6720e+02 + 4.4830e+02 5.5450e+02 1.2503e+03 1.4120e+03 2.2887e+03 2.7467e+03 2.2085e+03 + 1.1620e+03 2.9450e+02 5.1660e+02 2.7020e+02 8.0600e+02 3.6491e+03 2.4282e+03 + 2.6434e+03 3.0383e+03 8.3270e+02 2.3100e+02 1.9230e+02 3.1720e+02 5.2620e+02 + 2.7440e+02 2.7320e+02 1.6470e+02 4.4910e+02 5.7360e+02 3.8110e+02 3.9330e+02 + 8.2670e+02 1.0381e+03 5.6040e+02 9.1040e+02 1.3173e+03 1.7709e+03 3.1726e+03 + 1.7122e+03 5.9560e+02 7.2310e+02 9.1760e+02 5.5260e+02 4.3330e+02 2.8400e+02 + 1.6230e+03 8.2150e+02 2.7420e+03 2.2703e+03 1.4182e+03 3.6460e+02 3.6560e+02 + 3.3310e+02 5.1210e+02 5.5360e+02 4.5580e+02 2.6936e+03 3.7723e+03 2.4989e+03 + 9.6380e+02 8.2920e+02 9.5470e+02 4.4240e+02 4.1890e+02 1.1234e+03 2.0718e+03 + 2.6952e+03 3.5144e+03 2.5248e+03 1.4736e+03 2.0870e+02 2.3200e+02 5.4140e+02 + 4.3240e+02 1.7583e+03 2.7384e+03 2.7045e+03 2.0004e+03 2.1716e+03 8.2880e+02 + 4.3440e+02 1.3120e+02 5.8710e+02 6.7950e+02 5.8340e+02 5.8270e+02 3.6740e+02 + 4.6610e+02 5.7890e+02 1.9120e+02 2.4120e+02 5.2480e+02 7.8250e+02 7.1910e+02 + 3.6140e+02 1.7041e+03 1.7056e+03 3.1396e+03 4.5890e+02 3.8860e+02 3.1550e+02 + 7.4520e+02 6.0660e+02 3.8440e+02 4.4040e+02 1.7924e+03 1.2367e+03 2.3019e+03 + 3.3006e+03 6.5640e+02 4.4600e+02 5.4850e+02 4.1000e+02 4.3360e+02 8.5430e+02 + 4.8660e+02 1.7069e+03 2.2933e+03 4.0912e+03 2.4384e+03 8.6260e+02 6.8870e+02 + 2.5000e+02 4.2640e+02 1.1880e+03 1.8967e+03 2.4900e+03 2.0253e+03 1.1463e+03 + 4.6230e+02 2.3970e+02 3.0280e+02 5.8850e+02 1.6023e+03 1.4533e+03 2.4166e+03 + 1.5588e+03 7.8290e+02 6.3960e+02 6.0580e+02 5.2830e+02 2.8210e+02 3.2680e+02 + 6.0620e+02 5.7740e+02 7.1260e+02 7.8070e+02 3.9000e+02 1.3990e+02 2.7490e+02 + 4.4860e+02 5.0680e+02 5.1700e+02 4.6490e+02 4.1910e+02 2.2416e+03 2.9895e+03 + 2.1601e+03 1.1208e+03 5.4220e+02 4.5700e+02 6.8300e+02 4.5690e+02 6.3780e+02 + 6.3670e+02 2.4709e+03 1.2763e+03 3.2181e+03 2.4282e+03 3.2500e+02 5.6850e+02 + 4.3860e+02 6.0880e+02 5.8630e+02 7.9580e+02 3.1510e+02 5.5460e+02 9.6310e+02 + 2.9113e+03 3.3777e+03 2.5392e+03 5.6160e+02 2.3640e+02 2.5680e+02 9.1660e+02 + 1.4455e+03 3.0972e+03 8.0320e+02 4.9170e+02 3.8220e+02 4.9430e+02 6.6430e+02 + 1.1972e+03 2.5475e+03 2.0993e+03 3.0112e+03 6.6850e+02 2.1610e+02 2.5830e+02 + 6.0530e+02 4.7450e+02 8.4650e+02 4.5710e+02 6.9040e+02 7.8480e+02 1.0041e+03 + 3.1200e+02 6.2660e+02 6.2820e+02 3.3680e+02 3.2920e+02 1.4170e+02 2.1350e+02 + 2.7090e+02 5.8470e+02 2.4194e+03 2.3029e+03 1.3995e+03 8.2860e+02 3.0100e+02 + 6.4950e+02 3.6540e+02 5.7940e+02 3.2350e+02 4.9300e+02 2.1246e+03 2.4995e+03 + 3.5232e+03 1.6376e+03 9.3310e+02 7.5920e+02 6.3460e+02 4.2390e+02 1.0402e+03 + 5.2430e+02 3.9950e+02 5.6170e+02 1.0544e+03 2.6107e+03 2.9720e+03 3.0141e+03 + 1.8851e+03 8.5360e+02 7.6740e+02 1.1069e+03 3.1496e+03 2.9421e+03 1.9949e+03 + 7.4660e+02 7.7670e+02 3.7980e+02 2.5161e+03 1.4501e+03 2.2904e+03 1.5911e+03 + 9.1270e+02 8.6690e+02 2.9420e+02 1.9620e+02 3.7190e+02 4.8710e+02 8.2410e+02 + 5.4810e+02 7.7130e+02 5.6680e+02 5.2080e+02 4.2570e+02 6.7150e+02 4.6850e+02 + 7.4200e+02 5.1610e+02 4.1080e+02 4.7500e+02 5.8880e+02 6.3580e+02 2.2850e+03 + 2.5618e+03 2.0351e+03 7.9360e+02 4.1720e+02 2.8950e+02 1.0114e+03 4.7770e+02 + 6.0820e+02 3.7240e+02 2.5075e+03 2.7627e+03 4.0238e+03 1.4886e+03 9.3270e+02 + 9.3870e+02 3.6420e+02 5.0780e+02 7.7090e+02 4.3320e+02 2.0830e+02 7.2490e+02 + 4.2160e+02 4.3240e+02 1.7847e+03 2.4179e+03 2.2136e+03 2.4362e+03 1.4735e+03 + 2.7700e+03 1.6213e+03 2.3110e+03 1.4937e+03 8.8910e+02 2.9410e+02 1.6896e+03 + 1.5488e+03 2.4994e+03 2.0243e+03 7.9130e+02 9.4220e+02 6.0080e+02 4.8170e+02 + 4.6120e+02 2.6230e+02 5.9610e+02 8.5470e+02 6.6750e+02 5.5960e+02 3.6760e+02 + 1.4350e+02 5.1650e+02 9.1770e+02 7.8480e+02 3.3700e+02 6.6480e+02 2.3530e+02 + 5.8030e+02 6.5550e+02 2.6479e+03 2.7093e+03 2.0449e+03 1.6784e+03 6.4390e+02 + 4.6910e+02 6.5430e+02 7.9070e+02 8.3120e+02 5.7290e+02 5.7930e+02 1.4258e+03 + 4.7370e+03 3.0234e+03 2.4775e+03 7.8780e+02 6.1100e+02 3.2750e+02 4.6240e+02 + 5.8070e+02 5.5310e+02 4.6120e+02 6.2010e+02 5.2720e+02 3.6250e+02 8.7190e+02 + 1.1925e+03 2.3058e+03 3.0799e+03 2.4265e+03 2.6395e+03 2.3514e+03 1.4243e+03 + 6.5700e+02 1.1606e+03 2.3611e+03 2.1841e+03 3.1725e+03 2.2212e+03 9.2980e+02 + 6.7030e+02 6.6430e+02 3.8840e+02 5.9010e+02 5.5360e+02 3.2180e+02 5.0660e+02 + 3.8550e+02 3.3380e+02 6.8150e+02 8.6800e+02 3.0200e+02 3.1390e+02 4.1520e+02 + 6.7430e+02 3.5470e+02 5.3500e+02 7.6170e+02 6.0010e+02 1.0810e+03 2.7356e+03 + 2.5337e+03 2.2737e+03 7.9120e+02 1.0081e+03 2.9970e+02 3.5460e+02 3.2980e+02 + 3.2460e+02 5.2880e+02 6.3640e+02 1.6940e+03 4.9000e+03 3.7689e+03 1.6851e+03 + 1.0009e+03 6.3260e+02 3.1640e+02 6.0420e+02 6.6980e+02 4.8840e+02 1.9250e+02 + 3.1330e+02 5.1320e+02 4.1880e+02 3.0590e+02 1.6551e+03 1.8277e+03 2.5366e+03 + 1.8800e+03 3.6145e+03 4.9000e+03 2.4081e+03 3.3439e+03 2.7555e+03 3.0630e+03 + 1.5086e+03 1.6676e+03 9.2660e+02 1.0367e+03 4.8490e+02 3.3810e+02 7.0340e+02 + 6.6700e+02 6.0290e+02 4.0860e+02 4.1220e+02 2.2210e+02 2.3460e+02 8.0900e+02 + 6.1410e+02 3.7680e+02 3.7500e+02 4.1350e+02 4.9980e+02 3.1540e+02 5.1910e+02 + 4.9590e+02 5.6610e+02 1.8423e+03 2.4832e+03 2.0110e+03 1.8315e+03 5.2580e+02 + 7.2660e+02 7.3310e+02 3.8180e+02 7.6760e+02 5.4990e+02 4.3390e+02 9.0210e+02 + 1.1738e+03 3.1667e+03 4.9000e+03 1.6891e+03 9.4230e+02 5.6350e+02 3.5240e+02 + 4.8870e+02 7.4230e+02 3.5900e+02 4.5320e+02 3.3400e+02 4.1180e+02 8.6080e+02 + 4.3030e+02 4.9500e+02 1.2416e+03 6.3450e+02 2.4038e+03 2.6335e+03 3.3367e+03 + 4.5079e+03 4.2477e+03 3.0005e+03 1.6876e+03 2.3379e+03 1.1538e+03 5.6250e+02 + 9.8320e+02 3.3140e+02 2.6490e+02 4.0830e+02 8.4040e+02 3.8910e+02 4.0630e+02 + 5.7110e+02 3.1240e+02 3.3620e+02 8.3510e+02 7.3800e+02 6.3350e+02 4.5580e+02 + 4.0350e+02 2.1570e+02 5.1790e+02 3.4120e+02 3.9690e+02 7.3610e+02 2.6900e+03 + 2.7624e+03 2.1890e+03 6.7170e+02 2.2820e+02 8.2130e+02 8.0840e+02 1.8670e+02 + 5.1800e+02 5.2770e+02 4.6360e+02 5.2910e+02 6.3270e+02 3.3608e+03 4.2383e+03 + 2.5185e+03 6.4520e+02 4.1260e+02 4.0930e+02 8.6950e+02 7.2150e+02 4.4220e+02 + 5.7700e+02 3.2920e+02 5.2070e+02 6.3090e+02 5.7730e+02 6.5550e+02 4.3670e+02 + 7.3100e+02 9.0020e+02 4.0985e+03 2*4.9000e+03 3.9233e+03 4.6915e+03 + 2.9535e+03 1.8935e+03 4.4000e+02 9.2940e+02 7.7690e+02 3.7770e+02 2.1240e+02 + 4.0200e+02 9.7100e+02 6.0930e+02 4.8030e+02 4.8160e+02 2.3100e+02 4.2520e+02 + 9.3480e+02 4.4380e+02 4.2190e+02 5.5350e+02 4.4140e+02 3.2550e+02 4.5130e+02 + 6.0040e+02 5.6120e+02 1.3063e+03 3.0442e+03 1.5505e+03 9.3260e+02 3.2840e+02 + 1.8710e+02 1.1849e+03 9.6000e+02 3.3330e+02 8.5410e+02 3.9670e+02 3.8720e+02 + 1.9100e+02 7.2970e+02 2.8898e+03 4.9000e+03 4.8687e+03 5.3030e+02 6.8750e+02 + 3.3160e+02 4.6400e+02 3.3580e+02 6.6170e+02 5.8130e+02 3.2060e+02 5.0400e+02 + 4.3340e+02 4.4270e+02 2.8520e+02 3.2890e+02 8.4920e+02 9.1790e+02 3.0618e+03 + 4.1176e+03 1.7729e+03 2.7591e+03 3.6800e+03 4.2698e+03 2.5577e+03 2.0852e+03 + 1.1576e+03 4.0300e+02 4.0790e+02 4.1200e+02 3.8770e+02 6.8290e+02 4.7030e+02 + 5.0600e+02 5.3030e+02 5.6750e+02 3.7070e+02 3.6340e+02 6.6750e+02 4.9360e+02 + 4.6450e+02 5.0660e+02 2.1940e+02 7.2400e+02 7.9220e+02 6.5860e+02 1.1647e+03 + 1.5484e+03 2.0963e+03 1.2105e+03 2.1010e+02 3.3190e+02 6.0560e+02 4.9800e+02 + 5.6430e+02 6.3010e+02 2.9820e+02 8.2400e+02 5.7850e+02 8.1920e+02 1.6762e+03 + 4.7554e+03 4.6304e+03 1.4174e+03 6.7540e+02 6.8360e+02 3.4320e+02 4.7950e+02 + 1.2223e+03 7.2890e+02 3.0530e+02 1.7160e+02 1.9060e+02 3.2050e+02 1.7750e+02 + 2.3550e+02 5.9650e+02 5.1610e+02 2.6466e+03 2.4954e+03 2.6180e+03 1.2160e+03 + 2.2860e+03 2.6278e+03 1.2471e+03 2.1290e+03 1.3559e+03 1.7579e+03 5.8940e+02 + 4.8200e+02 5.3290e+02 5.2250e+02 8.9070e+02 7.1860e+02 4.0620e+02 5.1540e+02 + 2.8330e+02 4.9470e+02 2.4750e+02 4.4720e+02 5.3430e+02 5.5010e+02 1.7370e+02 + 5.0600e+02 6.6560e+02 1.6002e+03 2.5426e+03 1.3015e+03 5.1900e+02 5.0590e+02 + 6.1310e+02 4.5360e+02 3.6730e+02 6.5900e+02 7.8680e+02 4.7550e+02 5.5720e+02 + 6.6500e+02 2.2970e+02 9.8280e+02 1.4266e+03 4.4168e+03 4.5306e+03 1.1323e+03 + 9.8220e+02 5.8160e+02 1.7310e+02 3.1190e+02 7.9410e+02 8.8160e+02 7.1380e+02 + 5.0400e+02 4.6110e+02 3.0930e+02 9.4300e+01 2.6590e+02 5.7610e+02 6.3510e+02 + 2.2585e+03 2.4815e+03 9.7430e+02 6.0520e+02 5.9490e+02 1.5518e+03 1.8285e+03 + 1.9790e+03 2.5311e+03 2.2643e+03 7.8190e+02 5.4650e+02 6.8950e+02 4.9460e+02 + 7.7740e+02 5.3090e+02 3.4950e+02 3.5900e+02 6.4650e+02 7.5950e+02 3.6600e+02 + 4.5990e+02 1.4457e+03 7.8560e+02 3.0200e+02 8.5720e+02 7.3810e+02 9.1620e+02 + 3.2091e+03 1.6380e+03 2.0070e+02 5.5900e+02 1.2381e+03 3.8910e+02 1.8070e+02 + 3.6830e+02 4.8990e+02 4.2680e+02 6.2840e+02 9.1460e+02 4.9560e+02 1.1544e+03 + 1.4806e+03 1.9399e+03 2.3339e+03 1.3913e+03 7.9500e+02 6.6070e+02 3.2160e+02 + 2.0460e+02 6.6040e+02 4.9320e+02 6.4800e+02 5.4960e+02 3.4450e+02 2.6220e+02 + 1.2570e+02 5.7280e+02 8.9520e+02 2.2247e+03 1.7332e+03 2.8066e+03 3.8620e+02 + 6.7730e+02 1.0094e+03 5.6160e+02 1.3755e+03 2.7901e+03 2.3025e+03 3.2341e+03 + 2.3252e+03 7.7340e+02 1.0461e+03 5.8340e+02 8.5930e+02 1.0737e+03 4.7670e+02 + 3.0280e+02 4.7070e+02 5.5960e+02 4.8800e+02 4.1150e+02 1.1615e+03 7.1560e+02 + 3.0250e+02 6.3390e+02 9.8160e+02 2.4699e+03 3.5163e+03 1.5876e+03 2.2290e+02 + 4.3350e+02 6.6260e+02 3.4770e+02 1.8640e+02 7.6520e+02 5.6070e+02 3.1300e+02 + 5.2660e+02 6.7260e+02 1.1076e+03 9.4340e+02 1.8630e+02 2.3222e+03 3.0270e+03 + 2.2518e+03 8.2480e+02 5.2010e+02 5.7170e+02 7.2390e+02 4.2190e+02 6.9640e+02 + 2.2550e+02 9.0200e+02 5.6790e+02 3.1830e+02 3.0200e+02 8.4360e+02 8.4080e+02 + 2.3399e+03 2.6422e+03 2.7042e+03 6.4910e+02 2.6850e+02 3.3910e+02 4.8110e+02 + 7.8420e+02 8.8950e+02 1.8522e+03 1.8735e+03 2.7459e+03 2.3952e+03 2.4944e+03 + 9.6640e+02 1.0468e+03 3.7640e+02 6.0220e+02 3.2410e+02 5.1770e+02 4.8210e+02 + 5.8380e+02 5.9550e+02 8.9610e+02 5.5240e+02 5.9360e+02 8.3600e+02 1.9424e+03 + 1.8820e+03 2.0209e+03 8.3240e+02 7.5530e+02 5.2360e+02 6.5430e+02 4.5040e+02 + 3.4980e+02 5.1750e+02 4.7680e+02 2.5650e+02 4.9000e+02 6.6320e+02 1.0708e+03 + 7.0230e+02 7.7760e+02 1.2749e+03 2.4658e+03 2.1193e+03 7.7490e+02 2.3760e+02 + 2.0400e+02 3.8400e+02 4.0730e+02 2.9710e+02 9.6000e+02 9.2970e+02 7.7770e+02 + 4.6770e+02 5.4240e+02 7.0600e+02 1.4227e+03 1.9694e+03 3.5540e+03 1.2951e+03 + 3.1700e+02 2.6840e+02 3.9780e+02 6.9140e+02 7.1520e+02 8.7780e+02 1.0238e+03 + 2.0963e+03 2.2590e+03 2.1947e+03 2.3293e+03 1.1990e+03 1.5035e+03 7.4590e+02 + 7.6920e+02 6.8840e+02 8.5530e+02 7.8030e+02 1.5188e+03 5.9850e+02 3.9050e+02 + 4.8260e+02 6.0030e+02 1.1086e+03 1.5024e+03 2.5322e+03 2.3855e+03 9.4470e+02 + 9.0340e+02 3.8590e+02 5.3370e+02 3.3940e+02 7.0920e+02 4.2150e+02 6.6580e+02 + 1.6060e+02 4.0060e+02 5.4230e+02 1.0849e+03 1.0880e+03 1.5319e+03 1.0830e+03 + 1.3269e+03 2.3749e+03 9.1990e+02 4.2990e+02 5.9190e+02 4.8470e+02 6.0200e+02 + 3.3530e+02 8.3440e+02 6.6580e+02 5.0680e+02 4.5400e+02 6.5690e+02 7.6030e+02 + 1.0592e+03 1.8798e+03 2.6969e+03 1.3882e+03 4.4790e+02 3.1850e+02 3.4220e+02 + 4.7030e+02 9.3670e+02 9.5010e+02 5.0530e+02 1.0857e+03 1.7424e+03 1.9586e+03 + 2.0914e+03 2.8171e+03 1.5286e+03 1.8657e+03 9.3940e+02 4.8460e+02 3.6270e+02 + 4.6610e+02 7.8690e+02 5.8790e+02 2.7540e+02 3.2300e+02 6.5610e+02 2.1961e+03 + 3.2386e+03 2.3145e+03 1.4279e+03 8.2920e+02 6.9360e+02 6.5820e+02 7.5110e+02 + 3.9700e+02 2.8640e+02 1.1210e+03 3.8900e+02 5.0230e+02 2.5660e+02 5.7660e+02 + 8.3180e+02 7.8890e+02 1.1586e+03 1.7721e+03 2.3519e+03 2.8281e+03 1.2269e+03 + 3.0910e+02 3.4730e+02 6.5310e+02 5.4780e+02 3.9190e+02 6.8380e+02 8.2590e+02 + 5.2070e+02 3.4900e+02 4.7830e+02 8.7820e+02 1.0182e+03 2.6015e+03 2.7029e+03 + 5.7450e+02 4.6620e+02 2.9540e+02 4.1200e+02 3.8890e+02 6.3690e+02 7.6450e+02 + 5.2480e+02 8.3200e+02 8.1160e+02 8.2480e+02 2.0356e+03 2.1546e+03 2.2480e+03 + 1.1584e+03 1.1968e+03 6.3350e+02 6.8760e+02 6.7720e+02 5.8380e+02 6.7660e+02 + 3.6360e+02 3.6030e+02 5.0750e+02 1.2382e+03 2.7943e+03 2.0179e+03 4.4050e+02 + 8.4330e+02 7.3500e+02 4.6570e+02 6.1300e+02 3.5490e+02 2.7240e+02 6.9750e+02 + 7.9920e+02 3.8610e+02 4.8130e+02 3.1300e+02 1.4049e+03 4.5470e+02 6.8620e+02 + 1.4110e+03 1.8690e+03 1.9940e+03 1.4949e+03 5.9260e+02 8.8940e+02 8.8460e+02 + 5.8430e+02 6.9250e+02 6.0160e+02 6.3820e+02 8.7940e+02 5.8060e+02 4.1870e+02 + 9.3540e+02 2.4581e+03 2.4795e+03 3.1733e+03 5.6240e+02 2.9330e+02 4.1110e+02 + 4.3740e+02 5.8190e+02 1.1718e+03 7.2440e+02 3.0480e+02 5.9890e+02 6.1750e+02 + 5.3470e+02 2.0115e+03 2.1708e+03 2.3573e+03 2.5342e+03 2.2798e+03 3.9870e+02 + 5.6520e+02 7.8450e+02 8.9240e+02 2.6020e+02 4.0580e+02 4.7600e+02 6.2620e+02 + 2.2184e+03 2.4984e+03 1.7609e+03 9.2830e+02 7.4540e+02 3.9790e+02 6.3410e+02 + 1.9830e+02 1.9280e+02 3.2880e+02 8.8150e+02 5.2400e+02 6.6800e+02 6.3250e+02 + 7.3730e+02 6.0420e+02 5.9530e+02 5.7440e+02 1.3419e+03 2.0325e+03 2.4618e+03 + 2.6219e+03 1.1952e+03 9.3000e+02 1.1225e+03 4.6980e+02 3.2970e+02 4.0590e+02 + 5.8000e+02 5.4710e+02 7.7840e+02 3.8980e+02 1.4139e+03 2.2799e+03 2.5235e+03 + 1.4711e+03 4.9910e+02 6.1110e+02 4.1010e+02 4.9100e+02 7.0130e+02 6.1290e+02 + 6.7880e+02 3.1420e+02 2.6710e+02 4.1410e+02 7.0310e+02 4.9850e+02 8.3670e+02 + 2.2081e+03 3.1215e+03 2.4827e+03 9.8170e+02 7.3090e+02 6.6750e+02 7.7680e+02 + 3.1580e+02 3.8410e+02 5.7750e+02 1.0691e+03 3.2900e+03 2.3919e+03 1.0797e+03 + 8.2160e+02 4.3900e+02 3.5720e+02 3.2790e+02 3.6920e+02 3.2010e+02 5.2670e+02 + 4.8680e+02 5.3220e+02 5.1140e+02 7.7330e+02 5.1740e+02 6.6690e+02 1.2547e+03 + 8.0250e+02 1.0302e+03 1.0944e+03 2.8356e+03 3.2352e+03 2.6751e+03 9.5950e+02 + 6.1810e+02 6.6520e+02 3.6220e+02 3.7310e+02 4.9180e+02 5.2120e+02 4.6470e+02 + 3.9150e+02 3.5343e+03 2.8379e+03 3.1198e+03 8.6420e+02 6.2100e+02 4.2800e+02 + 8.7300e+02 4.2170e+02 7.9170e+02 9.3830e+02 4.4030e+02 3.9930e+02 5.8040e+02 + 7.6490e+02 5.1080e+02 5.1890e+02 8.8470e+02 6.7860e+02 1.1250e+03 2.6624e+03 + 2.7854e+03 1.5211e+03 9.2050e+02 3.5670e+02 4.2580e+02 3.7370e+02 9.0200e+02 + 7.5480e+02 3.5196e+03 1.9601e+03 5.1070e+02 7.0370e+02 4.5240e+02 5.7120e+02 + 5.4340e+02 7.9470e+02 2.6830e+02 5.2700e+02 5.5940e+02 4.7850e+02 4.8680e+02 + 6.0390e+02 3.4630e+02 5.2290e+02 2.3874e+03 2.1429e+03 1.3240e+03 2.3760e+03 + 2.5679e+03 2.5186e+03 2.9064e+03 2.5891e+03 1.4529e+03 6.0610e+02 5.0890e+02 + 4.9470e+02 6.8920e+02 2.1950e+02 5.4980e+02 4.1920e+02 2.6171e+03 2.3783e+03 + 2.6045e+03 6.6110e+02 4.2740e+02 7.1510e+02 8.9110e+02 4.5870e+02 5.4760e+02 + 6.5510e+02 2.6230e+02 3.0820e+02 8.2300e+02 8.3460e+02 4.3610e+02 5.4330e+02 + 9.5970e+02 8.0030e+02 2.6325e+03 2.9816e+03 3.0773e+03 2.6076e+03 1.4598e+03 + 5.2760e+02 4.2520e+02 4.2300e+02 5.2720e+02 1.7127e+03 3.7231e+03 2.7543e+03 + 3.8790e+02 5.3460e+02 5.6010e+02 4.9960e+02 8.5820e+02 3.8690e+02 2.4300e+02 + 3.3220e+02 7.4870e+02 3.9610e+02 3.6060e+02 7.5900e+02 2.3840e+02 6.6240e+02 + 2.4524e+03 2.2534e+03 2.0300e+03 2.2435e+03 1.9752e+03 3.0890e+03 4.7636e+03 + 3.9350e+03 1.6028e+03 6.3490e+02 5.4340e+02 4.9870e+02 4.5930e+02 6.0690e+02 + 4.8600e+02 7.6030e+02 3.2922e+03 2.8033e+03 9.6300e+02 5.6570e+02 3.5130e+02 + 1.0559e+03 8.6170e+02 1.9540e+02 6.1950e+02 7.1480e+02 2.8950e+02 1.9870e+02 + 7.2480e+02 5.0340e+02 6.5880e+02 6.7810e+02 6.2640e+02 3.1860e+02 7.2440e+02 + 1.2392e+03 3.1293e+03 1.8133e+03 1.1659e+03 4.7020e+02 5.2350e+02 4.9660e+02 + 6.0800e+02 2.3371e+03 3.8411e+03 1.3393e+03 5.4170e+02 3.9720e+02 8.3550e+02 + 6.2330e+02 9.2180e+02 3.8040e+02 3.0810e+02 3.2040e+02 8.9570e+02 2.5380e+02 + 4.9880e+02 5.2260e+02 2.5990e+02 2.4230e+02 1.0529e+03 1.2419e+03 1.6904e+03 + 2.5365e+03 2.6097e+03 1.3120e+03 4.8126e+03 3.7118e+03 3.8278e+03 2.5846e+03 + 3.5090e+02 7.2420e+02 8.0680e+02 6.0700e+02 7.2050e+02 1.0846e+03 2.5610e+03 + 2.4928e+03 8.4040e+02 4.0830e+02 1.1630e+02 1.1956e+03 1.0626e+03 2.3540e+02 + 6.4390e+02 7.1940e+02 5.1460e+02 2.1830e+02 4.6160e+02 4.9540e+02 7.0710e+02 + 5.6180e+02 7.8160e+02 6.0720e+02 4.4250e+02 6.9940e+02 2.7517e+03 2.9379e+03 + 1.5594e+03 3.1690e+02 3.2880e+02 4.1950e+02 7.3250e+02 2.3055e+03 2.3941e+03 + 5.4720e+02 2.2100e+02 2.4950e+02 3.4970e+02 5.9400e+02 6.1380e+02 6.0610e+02 + 2.4170e+02 3.7820e+02 5.7650e+02 6.3940e+02 5.7170e+02 3.1990e+02 3.3660e+02 + 2.1250e+02 4.3300e+02 5.2770e+02 4.8220e+02 1.3989e+03 2.5112e+03 2.2726e+03 + 2.4272e+03 3.4754e+03 4.0674e+03 2.3613e+03 1.0419e+03 6.2920e+02 5.1260e+02 + 1.6956e+03 1.1041e+03 2.7346e+03 2.0613e+03 1.0224e+03 8.6110e+02 6.9560e+02 + 2.2350e+02 5.5400e+02 1.3926e+03 6.4220e+02 3.7670e+02 7.0960e+02 4.3060e+02 + 5.6500e+02 5.4030e+02 4.8630e+02 4.6450e+02 6.1230e+02 1.2205e+03 7.2990e+02 + 4.7750e+02 8.2360e+02 2.0587e+03 2.4770e+03 1.5682e+03 9.0510e+02 4.9840e+02 + 4.8100e+02 1.0320e+03 1.7423e+03 2.4219e+03 5.4320e+02 1.9430e+02 1.4300e+02 + 4.5990e+02 3.5170e+02 6.2660e+02 4.1500e+02 3.7020e+02 1.0322e+03 7.0300e+02 + 3.3870e+02 3.3090e+02 3.3980e+02 3.7420e+02 2.0640e+02 3.1340e+02 3.0720e+02 + 5.6620e+02 9.7960e+02 7.7670e+02 5.6280e+02 2.0956e+03 2.1076e+03 4.7533e+03 + 4.9000e+03 3.4963e+03 9.6820e+02 7.8730e+02 6.0270e+02 1.6505e+03 1.7717e+03 + 2.1519e+03 1.0143e+03 7.5030e+02 2.1050e+02 1.3880e+02 4.2520e+02 9.1140e+02 + 7.3860e+02 5.4820e+02 6.9170e+02 4.2960e+02 8.1160e+02 3.3940e+02 3.5470e+02 + 2.7200e+02 6.0250e+02 7.1340e+02 5.1930e+02 6.3440e+02 1.2424e+03 1.7810e+03 + 3.5275e+03 1.9123e+03 6.3290e+02 5.9370e+02 7.8100e+02 1.1450e+03 1.7549e+03 + 3.7125e+03 6.6600e+02 4.1750e+02 3.5480e+02 6.2550e+02 7.1590e+02 8.3200e+02 + 5.0200e+02 6.3910e+02 1.0980e+03 1.3481e+03 5.0870e+02 3.1990e+02 1.5320e+02 + 3.4400e+02 4.4680e+02 8.3820e+02 3.1200e+02 2.9000e+02 1.0120e+03 5.1250e+02 + 5.1640e+02 4.6020e+02 6.1870e+02 3.1542e+03 4.7968e+03 4.7104e+03 2.4514e+03 + 2.4351e+03 2.3463e+03 4.3323e+03 2.3130e+03 1.4289e+03 4.8640e+02 9.7660e+02 + 4.4830e+02 5.0180e+02 3.7020e+02 5.8820e+02 4.7730e+02 2.2990e+02 5.8950e+02 + 4.7580e+02 9.0040e+02 8.8860e+02 3.7520e+02 4.4340e+02 4.1420e+02 5.3130e+02 + 5.0160e+02 7.3960e+02 9.4690e+02 2.1435e+03 4.3839e+03 1.7289e+03 1.2768e+03 + 1.2747e+03 3.4190e+02 3.6060e+02 2.3739e+03 2.8985e+03 8.4290e+02 3.2980e+02 + 3.6860e+02 6.2060e+02 6.7720e+02 7.4670e+02 4.8460e+02 6.7390e+02 8.1160e+02 + 4.5090e+02 4.6170e+02 5.5500e+02 1.8040e+02 2.5690e+02 4.3000e+02 3.7220e+02 + 8.3990e+02 3.4020e+02 3.5520e+02 8.4800e+02 1.4294e+03 3.5220e+02 4.8450e+02 + 1.8256e+03 2.0354e+03 3.3138e+03 2.7176e+03 4.0994e+03 4.5747e+03 4.1550e+03 + 1.5252e+03 5.9240e+02 4.5480e+02 6.6020e+02 9.4630e+02 6.1000e+02 7.5330e+02 + 4.8020e+02 4.4390e+02 3.7980e+02 3.4210e+02 4.4400e+02 6.3700e+02 4.9260e+02 + 3.5460e+02 3.2940e+02 2.7840e+02 2.6510e+02 2.3810e+02 8.3290e+02 1.3142e+03 + 2.1499e+03 3.5070e+03 1.6632e+03 1.0463e+03 1.1666e+03 4.3320e+02 5.1880e+02 + 2.8466e+03 3.5362e+03 1.3384e+03 1.5030e+02 3.7810e+02 8.4280e+02 8.1120e+02 + 5.3560e+02 3.9680e+02 8.0020e+02 1.0703e+03 4.7140e+02 9.3020e+02 6.5600e+02 + 4.6980e+02 4.6950e+02 4.0330e+02 6.0680e+02 9.1820e+02 5.0810e+02 3.5280e+02 + 1.2178e+03 9.7780e+02 5.1410e+02 2.8440e+02 6.4650e+02 1.6617e+03 2.8312e+03 + 3.5157e+03 4.9000e+03 4.3234e+03 1.4112e+03 2.6331e+03 1.1095e+03 5.0250e+02 + 2.5650e+02 4.5150e+02 4.5990e+02 6.2050e+02 6.5430e+02 2.4690e+02 6.0920e+02 + 6.3620e+02 2.1510e+02 1.7510e+02 6.7300e+02 5.3990e+02 2.6170e+02 2.9270e+02 + 3.6360e+02 3.1870e+02 5.4500e+02 8.7030e+02 2.0112e+03 3.2591e+03 2.6189e+03 + 8.4260e+02 4.3230e+02 3.6630e+02 7.2170e+02 2.3048e+03 2.3830e+03 1.0786e+03 + 3.6660e+02 5.7810e+02 4.6750e+02 5.3670e+02 3.9310e+02 3.4540e+02 5.0760e+02 + 4.0780e+02 5.3480e+02 6.4760e+02 6.4380e+02 3.7190e+02 6.5460e+02 6.6270e+02 + 5.5100e+02 1.0398e+03 3.4490e+02 4.7730e+02 6.8590e+02 7.9840e+02 6.0320e+02 + 3.8110e+02 3.5090e+02 1.0898e+03 2.3961e+03 3.0560e+03 4.9000e+03 3.8472e+03 + 1.6557e+03 7.4670e+02 7.3730e+02 5.7540e+02 6.7010e+02 1.0664e+03 5.2700e+02 + 3.5050e+02 4.7540e+02 5.2730e+02 6.2600e+02 9.0500e+02 9.9300e+01 2.6580e+02 + 3.7630e+02 5.3610e+02 2.7380e+02 5.7110e+02 3.7900e+02 5.5840e+02 5.1240e+02 + 7.7530e+02 1.6876e+03 2.6025e+03 2.0164e+03 3.6390e+02 5.3210e+02 3.9300e+02 + 7.9080e+02 2.3190e+03 3.0680e+03 2.0466e+03 8.1670e+02 5.9850e+02 7.2640e+02 + 7.1550e+02 8.6160e+02 5.5240e+02 6.5030e+02 6.9770e+02 5.9110e+02 3.1570e+02 + 4.6590e+02 8.0430e+02 5.8310e+02 3.8400e+02 9.5200e+02 7.2580e+02 4.5930e+02 + 3.5610e+02 3.2560e+02 3.1850e+02 4.6310e+02 4.2280e+02 6.8470e+02 7.4730e+02 + 9.6870e+02 4.8947e+03 2*4.9000e+03 3.7520e+03 3.5310e+02 7.0780e+02 + 9.2200e+02 8.1670e+02 9.4460e+02 1.9370e+02 2.5290e+02 4.5250e+02 7.7930e+02 + 5.7380e+02 9.2970e+02 4.9590e+02 3.4990e+02 5.2750e+02 4.9820e+02 1.9610e+02 + 2.9720e+02 4.7790e+02 3.1310e+02 5.3860e+02 1.4473e+03 1.6124e+03 3.2492e+03 + 1.8400e+03 6.8880e+02 3.7300e+02 4.5080e+02 1.0003e+03 2.0286e+03 2.8987e+03 + 2.2947e+03 7.7360e+02 4.6310e+02 8.9030e+02 7.5290e+02 3.6460e+02 8.4650e+02 + 8.1820e+02 5.3860e+02 5.6120e+02 2.8540e+02 5.2300e+02 5.5650e+02 8.6870e+02 + 4.8920e+02 4.0900e+02 7.1650e+02 3.3470e+02 2.7480e+02 4.5790e+02 4.5550e+02 + 5.3560e+02 7.5740e+02 1.0324e+03 4.1010e+02 4.9440e+02 2.5812e+03 + 2*4.9000e+03 2.5308e+03 2.7161e+03 8.7530e+02 4.8160e+02 4.7410e+02 + 7.2480e+02 2.4990e+02 2.3240e+02 1.5860e+02 7.4740e+02 7.3620e+02 7.4230e+02 + 2.4600e+02 3.0210e+02 5.3790e+02 6.1230e+02 3.4110e+02 2.8300e+02 6.3280e+02 + 4.9700e+02 3.9720e+02 8.7760e+02 2.2617e+03 2.9430e+03 1.2842e+03 1.1704e+03 + 2.6990e+02 2.2950e+02 9.7130e+02 1.3180e+03 3.1282e+03 2.2632e+03 7.0380e+02 + 7.5780e+02 5.8210e+02 4.8960e+02 4.6710e+02 8.9680e+02 7.1740e+02 2.1800e+02 + 5.6730e+02 4.9090e+02 3.0500e+02 3.9100e+02 4.4440e+02 4.8210e+02 6.5960e+02 + 7.9330e+02 4.4690e+02 4.0280e+02 4.7680e+02 1.6980e+02 3.1060e+02 1.0008e+03 + 1.0754e+03 7.1250e+02 1.5871e+03 2.3521e+03 1.1573e+03 1.9400e+03 2.6870e+03 + 2.5160e+03 2.8903e+03 1.9154e+03 7.8190e+02 3.6720e+02 4.6710e+02 3.7870e+02 + 3.9510e+02 7.4690e+02 5.1040e+02 6.2690e+02 5.9560e+02 3.5420e+02 6.1570e+02 + 7.2770e+02 4.4580e+02 6.6760e+02 4.8180e+02 4.0390e+02 3.0530e+02 6.5460e+02 + 2.0676e+03 3.3087e+03 2.4009e+03 1.8380e+03 4.0640e+02 3.2310e+02 5.1820e+02 + 1.2070e+03 3.1129e+03 1.8576e+03 6.6570e+02 6.9190e+02 4.4230e+02 4.0660e+02 + 6.5850e+02 6.2390e+02 6.5850e+02 3.8260e+02 5.9680e+02 7.3470e+02 2.5920e+02 + 1.9030e+02 7.0400e+02 4.3380e+02 1.8724e+03 1.6991e+03 5.4280e+02 4.7060e+02 + 4.4320e+02 5.6500e+01 1.9090e+02 6.9460e+02 9.2790e+02 1.0088e+03 2.0145e+03 + 2.5515e+03 1.8187e+03 2.8216e+03 2.2503e+03 2.8918e+03 2.6206e+03 1.9483e+03 + 1.7423e+03 2.0770e+02 3.6310e+02 5.6170e+02 9.1750e+02 5.6880e+02 4.6110e+02 + 2.9860e+02 1.5930e+02 5.2000e+02 5.1840e+02 7.6540e+02 9.1630e+02 6.5270e+02 + 6.0060e+02 6.0960e+02 4.2570e+02 5.9150e+02 1.1258e+03 2.3059e+03 2.4903e+03 + 1.1073e+03 6.7480e+02 4.3540e+02 3.5290e+02 6.9040e+02 2.8683e+03 1.9639e+03 + 7.5190e+02 1.0746e+03 3.7560e+02 5.8100e+02 4.7740e+02 9.3420e+02 6.1840e+02 + 7.6280e+02 5.1930e+02 7.5550e+02 4.4300e+02 3.4870e+02 3.6970e+02 3.8080e+02 + 7.1950e+02 5.2210e+02 2.3630e+02 2.1000e+00 5.0500e+01 2.3930e+02 4.3960e+02 + 6.8130e+02 1.0951e+03 1.6976e+03 3.4453e+03 2.1598e+03 8.3230e+02 2.6810e+02 + 3.3690e+02 4.6000e+02 4.2970e+02 3.9610e+02 6.4500e+02 2.2007e+03 2.1751e+03 + 1.7700e+03 1.1336e+03 4.7140e+02 6.7130e+02 5.7450e+02 6.9130e+02 7.9780e+02 + 5.4900e+02 5.0490e+02 9.0900e+02 1.0662e+03 7.9500e+02 4.8580e+02 3.6730e+02 + 3.4650e+02 5.4030e+02 6.8080e+02 1.0182e+03 5.7310e+02 8.6900e+02 6.0680e+02 + 4.3040e+02 7.7410e+02 7.4940e+02 1.6804e+03 2.5230e+03 3.0848e+03 3.3198e+03 + 3.2769e+03 8.6740e+02 1.0135e+03 2.8100e+02 3.8770e+02 5.3890e+02 4.7110e+02 + 9.1140e+02 1.1194e+03 4.5400e+02 7.9900e+02 1.1008e+03 3.8940e+02 2.6330e+02 + 1.3680e+02 3.8030e+02 3.5640e+02 5.2140e+02 7.3340e+02 3.9220e+02 2.8932e+03 + 3.5000e+03 1.9962e+03 1.0988e+03 4.3500e+02 5.4340e+02 6.8150e+02 5.8700e+02 + 3.1170e+02 6.6190e+02 2.0865e+03 3.5000e+03 2.2977e+03 1.1807e+03 6.1180e+02 + 7.4290e+02 5.6260e+02 8.2430e+02 9.3950e+02 6.3080e+02 4.4590e+02 6.5330e+02 + 8.4000e+02 5.9000e+02 4.3850e+02 3.4250e+02 3.9390e+02 2.1270e+02 7.1380e+02 + 7.9770e+02 5.4670e+02 9.8780e+02 9.9410e+02 4.0370e+02 2.0120e+02 7.4650e+02 + 9.0430e+02 1.8671e+03 2.9871e+03 2*3.5000e+03 3.0062e+03 5.8030e+02 + 2.8610e+02 5.8100e+02 5.5730e+02 7.4280e+02 1.0662e+03 9.1280e+02 5.4160e+02 + 1.0009e+03 9.4680e+02 4.6560e+02 3.8510e+02 2.8540e+02 8.2030e+02 8.0310e+02 + 4.8070e+02 3.5880e+02 4.7770e+02 1.5763e+03 3.5000e+03 3.1409e+03 1.3075e+03 + 2.7420e+02 3.9620e+02 7.7710e+02 6.4630e+02 5.3230e+02 1.1261e+03 1.1235e+03 + 2.4242e+03 2.1146e+03 1.1986e+03 1.1237e+03 1.2484e+03 4.5840e+02 3.8910e+02 + 8.3080e+02 6.1700e+02 6.3330e+02 8.3050e+02 3.0060e+02 6.4580e+02 6.3670e+02 + 7.5710e+02 4.1650e+02 2.8360e+02 7.1610e+02 5.2970e+02 6.2940e+02 1.1466e+03 + 1.2778e+03 5.3290e+02 2.6360e+02 5.3540e+02 8.9180e+02 1.5624e+03 2.5200e+03 + 2*3.5000e+03 2.8942e+03 1.3338e+03 5.6060e+02 5.0690e+02 7.0780e+02 + 3.9300e+02 6.6590e+02 7.8570e+02 5.3240e+02 6.9750e+02 6.0940e+02 4.2200e+02 + 4.9000e+02 2.0850e+02 5.9420e+02 8.7370e+02 4.5560e+02 3.2960e+02 7.5610e+02 + 1.1851e+03 2.4763e+03 1.9570e+03 5.5410e+02 6.2960e+02 5.7350e+02 6.9810e+02 + 2.9490e+02 7.6730e+02 4.9630e+02 1.2515e+03 1.3001e+03 2.1694e+03 1.7134e+03 + 7.4630e+02 8.7770e+02 5.1870e+02 6.2840e+02 6.6050e+02 4.9740e+02 4.7810e+02 + 4.4390e+02 2.5820e+02 7.1490e+02 5.8610e+02 7.8790e+02 8.2660e+02 2.7520e+02 + 4.1590e+02 4.2040e+02 4.4060e+02 9.8490e+02 9.5670e+02 3.7940e+02 2.4140e+02 + 7.5750e+02 7.4480e+02 8.0720e+02 1.6882e+03 3.5000e+03 2.9200e+03 1.8486e+03 + 1.8529e+03 6.7040e+02 7.0910e+02 5.4550e+02 5.0920e+02 3.5720e+02 6.9290e+02 + 4.1180e+02 5.3080e+02 7.7670e+02 7.2380e+02 5.7960e+02 2.7290e+02 6.6800e+02 + 1.4365e+03 2.0490e+02 6.9300e+01 6.4960e+02 1.8953e+03 3.2977e+03 2.3286e+03 + 1.2813e+03 2.9320e+02 5.1360e+02 4.7710e+02 3.8990e+02 4.6860e+02 3.9940e+02 + 2.3680e+02 8.0390e+02 3.5390e+02 1.8903e+03 2.1116e+03 1.2929e+03 1.4198e+03 + 1.0666e+03 9.6990e+02 3.6890e+02 1.2700e+02 6.7870e+02 4.0340e+02 7.3310e+02 + 9.9630e+02 1.0599e+03 7.0350e+02 2.6990e+02 2.3280e+02 6.1390e+02 2.5430e+02 + 3.3680e+02 8.5680e+02 3.5770e+02 4.6700e+02 4.5090e+02 2.5880e+02 2.5350e+02 + 2.6347e+03 3.4495e+03 3.5000e+03 1.6504e+03 1.5131e+03 1.0736e+03 1.4150e+03 + 7.5770e+02 5.1840e+02 3.3810e+02 5.9930e+02 5.1620e+02 3.4310e+02 4.6020e+02 + 1.3138e+03 9.6600e+02 6.5550e+02 6.0930e+02 1.0273e+03 3.6160e+02 1.3050e+02 + 5.0120e+02 2.8952e+03 3.5000e+03 2.6511e+03 1.2295e+03 5.3980e+02 2.7330e+02 + 2.8160e+02 4.2570e+02 5.3540e+02 2.9450e+02 4.8290e+02 4.5660e+02 5.4100e+02 + 1.4373e+03 1.8607e+03 2.1531e+03 7.3440e+02 1.0239e+03 5.0830e+02 4.6480e+02 + 3.0340e+02 3.6390e+02 6.2320e+02 4.0300e+02 7.3380e+02 9.8620e+02 1.0108e+03 + 4.7650e+02 2.5330e+02 1.5410e+02 1.3700e+02 4.5680e+02 6.2120e+02 4.8670e+02 + 3.3240e+02 6.6190e+02 3.7750e+02 1.5113e+03 2.2679e+03 2.9638e+03 2.0740e+03 + 2.3731e+03 2.8429e+03 1.3829e+03 1.0927e+03 4.8570e+02 3.7170e+02 9.4210e+02 + 6.0860e+02 2.8850e+02 6.1170e+02 6.3270e+02 9.5410e+02 7.8200e+02 2.8060e+02 + 7.6210e+02 9.1040e+02 3.0560e+02 8.3500e+01 7.9700e+02 1.7998e+03 + 2*3.5000e+03 1.0368e+03 4.9190e+02 4.9320e+02 3.0400e+02 3.0450e+02 + 3.6290e+02 2.3160e+02 4.1610e+02 5.5630e+02 7.3490e+02 1.1174e+03 1.2555e+03 + 1.3722e+03 1.6658e+03 1.7790e+03 1.2340e+03 8.3400e+02 4.8000e+02 3.9040e+02 + 6.2620e+02 4.9440e+02 3.1410e+02 7.0190e+02 8.1840e+02 8.1230e+02 8.4040e+02 + 2.9120e+02 3.2920e+02 2.6330e+02 3.5080e+02 4.0990e+02 8.5910e+02 2.5660e+02 + 2.1900e+02 3.2100e+02 1.8340e+03 2.6604e+03 1.7880e+03 1.9633e+03 3.3975e+03 + 2.3555e+03 6.8830e+02 3.3700e+02 3.6670e+02 6.2350e+02 4.7240e+02 2.7760e+02 + 4.8990e+02 3.4100e+02 9.8350e+02 7.8530e+02 3.0280e+02 6.8520e+02 9.5360e+02 + 3.4140e+02 6.2680e+02 6.3410e+02 1.3734e+03 3.5000e+03 3.1398e+03 1.3395e+03 + 6.2700e+02 7.3420e+02 6.4790e+02 6.1470e+02 4.2310e+02 2.6400e+02 5.7110e+02 + 6.0510e+02 3.1160e+02 6.5700e+02 1.0386e+03 1.3009e+03 1.5953e+03 1.8023e+03 + 1.1716e+03 1.1029e+03 5.0080e+02 5.7070e+02 4.7910e+02 5.8830e+02 5.5890e+02 + 5.4920e+02 5.4800e+02 6.6100e+02 1.0371e+03 3.7690e+02 3.6250e+02 4.8260e+02 + 2.1760e+02 6.5300e+02 6.4330e+02 3.8850e+02 5.3800e+01 1.2344e+03 1.8657e+03 + 2.1489e+03 1.8685e+03 1.8530e+03 3.5000e+03 2.8474e+03 1.6397e+03 3.4270e+02 + 4.3550e+02 5.3850e+02 6.6770e+02 3.7580e+02 4.2220e+02 3.3570e+02 6.9230e+02 + 5.6450e+02 2.8200e+02 4.4870e+02 7.6310e+02 3.7440e+02 8.3060e+02 1.0900e+03 + 2.6583e+03 3.5000e+03 2.2642e+03 4.2930e+02 6.9060e+02 8.6760e+02 5.7250e+02 + 5.9820e+02 3.3010e+02 8.1450e+02 4.7490e+02 1.4230e+02 6.0290e+02 4.7850e+02 + 7.3190e+02 7.7230e+02 1.0412e+03 1.6926e+03 1.8863e+03 1.6966e+03 1.1283e+03 + 3.0940e+02 2.7680e+02 3.9360e+02 4.0740e+02 4.7840e+02 2.2120e+02 3.3950e+02 + 5.2890e+02 7.0960e+02 5.6170e+02 3.2900e+02 3.5560e+02 5.8910e+02 6.2500e+02 + 4.2710e+02 3.6200e+01 2.3020e+02 2.3336e+03 2.6340e+03 9.3230e+02 1.7196e+03 + 3.0488e+03 2.9819e+03 1.3651e+03 4.5110e+02 2.4430e+02 3.9870e+02 5.1200e+02 + 5.0800e+02 5.7290e+02 2.4600e+02 6.1260e+02 7.2730e+02 4.5440e+02 2.0200e+02 + 5.8220e+02 3.9750e+02 1.1707e+03 2.1645e+03 2*3.5000e+03 2.1234e+03 + 7.1990e+02 1.2987e+03 5.1660e+02 6.8230e+02 1.0389e+03 6.1790e+02 6.7060e+02 + 7.5870e+02 3.8880e+02 3.2750e+02 5.4540e+02 7.2920e+02 7.6830e+02 5.5810e+02 + 1.0923e+03 1.9211e+03 1.3730e+03 1.5803e+03 4.3760e+02 1.8020e+02 2.8050e+02 + 3.5070e+02 4.2780e+02 3.9920e+02 5.1610e+02 5.2280e+02 6.8080e+02 7.4290e+02 + 5.2220e+02 6.1630e+02 6.5410e+02 6.7550e+02 5.2360e+02 1.0450e+02 3.9250e+02 + 2.6764e+03 1.9704e+03 1.4496e+03 1.8236e+03 2*3.5000e+03 1.4063e+03 + 5.7180e+02 1.8370e+02 4.3000e+02 3.2390e+02 3.9120e+02 7.6390e+02 4.0490e+02 + 5.8180e+02 3.7710e+02 1.1360e+02 5.8160e+02 2.9010e+02 7.3470e+02 1.1469e+03 + 1.0287e+03 3.5000e+03 2.4604e+03 2.4189e+03 7.1190e+02 6.9060e+02 3.4510e+02 + 4.3410e+02 5.8530e+02 5.5880e+02 8.9250e+02 7.4480e+02 7.1610e+02 2.3840e+02 + 4.2680e+02 4.0200e+02 5.5710e+02 5.3850e+02 8.7600e+02 1.6265e+03 1.9283e+03 + 1.8156e+03 1.1636e+03 2.8570e+02 2.7980e+02 3.5050e+02 6.0480e+02 3.9350e+02 + 6.4020e+02 4.0430e+02 3.4120e+02 5.7870e+02 8.6000e+02 4.9750e+02 4.3440e+02 + 9.3920e+02 5.8270e+02 1.9390e+02 1.0272e+03 2.7217e+03 2.9395e+03 9.7950e+02 + 1.7060e+03 2.3616e+03 2.9903e+03 1.8551e+03 7.9430e+02 6.4510e+02 4.4700e+02 + 4.7840e+02 3.4880e+02 9.5470e+02 3.7180e+02 4.6650e+02 3.6550e+02 3.4050e+02 + 8.1280e+02 3.3900e+02 1.6830e+02 7.3060e+02 2.3151e+03 2.8531e+03 3.1789e+03 + 1.1829e+03 9.5090e+02 5.2890e+02 5.0560e+02 4.3380e+02 3.9510e+02 4.0130e+02 + 1.1155e+03 7.7200e+02 5.1310e+02 2.7440e+02 5.7020e+02 4.1840e+02 4.4100e+02 + 3.6910e+02 3.1960e+02 8.5350e+02 2.0215e+03 2.7366e+03 2.1769e+03 4.8390e+02 + 4.2170e+02 4.0610e+02 5.0050e+02 4.4480e+02 3.1420e+02 3.8460e+02 3.3850e+02 + 2.9350e+02 4.6300e+02 4.9660e+02 3.1250e+02 8.5600e+02 8.6220e+02 7.4430e+02 + 1.2589e+03 2.0377e+03 1.6298e+03 8.9990e+02 1.1663e+03 2.6897e+03 3.5000e+03 + 2.3165e+03 8.3710e+02 5.7700e+02 6.6690e+02 3.5110e+02 5.0950e+02 4.8280e+02 + 7.6760e+02 4.2190e+02 1.7450e+02 6.3690e+02 5.2500e+02 3.9770e+02 1.5780e+02 + 4.5270e+02 1.8140e+03 2.5362e+03 2.7726e+03 9.9450e+02 6.0470e+02 8.8870e+02 + 4.0120e+02 9.2850e+02 4.4370e+02 2.8020e+02 7.0350e+02 5.9430e+02 5.4790e+02 + 5.3010e+02 5.9670e+02 6.8750e+02 6.9760e+02 2.4120e+02 4.6400e+02 1.1132e+03 + 1.5446e+03 2.2537e+03 1.4280e+03 7.8330e+02 4.2170e+02 4.7880e+02 7.5100e+02 + 7.3040e+02 3.4910e+02 3.8590e+02 4.9130e+02 4.0260e+02 5.5500e+02 5.7370e+02 + 4.0130e+02 3.8000e+02 9.8190e+02 8.0540e+02 2.1277e+03 2.2145e+03 1.0046e+03 + 7.2530e+02 1.2660e+03 2.3485e+03 2.5153e+03 2.7286e+03 1.0218e+03 1.0949e+03 + 7.8710e+02 3.0180e+02 3.9250e+02 4.6090e+02 6.2610e+02 4.0260e+02 2.5410e+02 + 5.0950e+02 5.1990e+02 4.0360e+02 5.4050e+02 1.5975e+03 1.5774e+03 2.6130e+03 + 2.5011e+03 9.9210e+02 4.1950e+02 5.8960e+02 6.3280e+02 3.2800e+02 5.4200e+02 + 3.6140e+02 3.7800e+02 6.4510e+02 3.9420e+02 2.1530e+02 4.5130e+02 6.2610e+02 + 4.9620e+02 4.8120e+02 3.5070e+02 9.0250e+02 1.3103e+03 2.9265e+03 1.6668e+03 + 5.7120e+02 5.7440e+02 5.3260e+02 5.8210e+02 6.8680e+02 2.8340e+02 3.6320e+02 + 6.3210e+02 7.9850e+02 3.6350e+02 7.4120e+02 2.7960e+02 4.4060e+02 1.2598e+03 + 2.1480e+03 1.1540e+03 1.8505e+03 9.7450e+02 7.6150e+02 8.3490e+02 1.1901e+03 + 2.7513e+03 2.7855e+03 2.2241e+03 8.6080e+02 1.1448e+03 7.9170e+02 7.7820e+02 + 4.1790e+02 7.7760e+02 6.6000e+02 4.2260e+02 3.0210e+02 5.6350e+02 2.6930e+02 + 1.0207e+03 1.0514e+03 1.7121e+03 3.5000e+03 2.2808e+03 1.4799e+03 3.3850e+02 + 4.0090e+02 6.7680e+02 4.2300e+02 4.8200e+02 7.0500e+02 3.9650e+02 3.8800e+02 + 5.0460e+02 2.4520e+02 3.4680e+02 4.5730e+02 5.6630e+02 6.1640e+02 3.5860e+02 + 3.5040e+02 8.1320e+02 2.7989e+03 9.5620e+02 5.1710e+02 5.3780e+02 9.7000e+02 + 6.3440e+02 4.3290e+02 1.5040e+02 4.1760e+02 4.1870e+02 4.8530e+02 9.1880e+02 + 9.0650e+02 2.9060e+02 6.9960e+02 1.1349e+03 1.8107e+03 2.1878e+03 1.7297e+03 + 1.1932e+03 4.1020e+02 5.7010e+02 1.2025e+03 2.6377e+03 3.0786e+03 1.7844e+03 + 1.0207e+03 9.2750e+02 7.9060e+02 7.7370e+02 6.3400e+02 7.1410e+02 6.2320e+02 + 7.9460e+02 6.1870e+02 4.6290e+02 4.0910e+02 7.7320e+02 9.8600e+02 2.9688e+03 + 3.3104e+03 1.8955e+03 1.6313e+03 6.7020e+02 5.7520e+02 3.4540e+02 1.8130e+02 + 6.2610e+02 1.0652e+03 4.5040e+02 5.7410e+02 3.5370e+02 3.1030e+02 1.0572e+03 + 2.9870e+02 4.5930e+02 5.7090e+02 6.6580e+02 1.6870e+02 1.3950e+03 2.2600e+03 + 7.8220e+02 8.0830e+02 9.2020e+02 5.7370e+02 4.0850e+02 4.1100e+02 2.0490e+02 + 3.8260e+02 4.9640e+02 7.1850e+02 8.5220e+02 8.3580e+02 1.0341e+03 1.2653e+03 + 1.5445e+03 2.2607e+03 1.9598e+03 1.0149e+03 6.4340e+02 5.4560e+02 6.4710e+02 + 1.1226e+03 1.8887e+03 1.5900e+03 1.8112e+03 2.3463e+03 1.0578e+03 6.5320e+02 + 8.1950e+02 9.7470e+02 3.3870e+02 1.1042e+03 5.9060e+02 4.6010e+02 4.7310e+02 + 5.4670e+02 8.6160e+02 1.0874e+03 2.8696e+03 1.8634e+03 3.2893e+03 7.3600e+02 + 4.6550e+02 6.7450e+02 4.5260e+02 1.5770e+02 3.5730e+02 1.6380e+02 5.5200e+02 + 6.5830e+02 4.5990e+02 1.3350e+02 5.1110e+02 3.6330e+02 5.0610e+02 6.1200e+02 + 4.9060e+02 4.4250e+02 7.9930e+02 3.0126e+03 9.2190e+02 3.9220e+02 6.3710e+02 + 5.8470e+02 4.0050e+02 2.8750e+02 1.9290e+02 3.8830e+02 3.4630e+02 4.7710e+02 + 1.3616e+03 1.0537e+03 8.5800e+02 1.8188e+03 1.9637e+03 8.7150e+02 9.0540e+02 + 1.4291e+03 5.9180e+02 3.2650e+02 5.3390e+02 1.5161e+03 1.5619e+03 1.7571e+03 + 1.2512e+03 2.1926e+03 1.8256e+03 1.5666e+03 1.1737e+03 5.4290e+02 3.3870e+02 + 5.2790e+02 5.0870e+02 2.1580e+02 3.5590e+02 4.5840e+02 1.5574e+03 1.2866e+03 + 2.5645e+03 2.7332e+03 2.6611e+03 1.3804e+03 5.8350e+02 3.8200e+02 3.4640e+02 + 2.8080e+02 3.4920e+02 4.5800e+02 4.9230e+02 7.9460e+02 7.2280e+02 3.5340e+02 + 4.2560e+02 5.5820e+02 7.0710e+02 4.1610e+02 6.2890e+02 6.4520e+02 9.6280e+02 + 1.9272e+03 1.8237e+03 5.7750e+02 3.2000e+02 4.3420e+02 6.5920e+02 5.8210e+02 + 3.3860e+02 6.4210e+02 1.2160e+03 7.7000e+02 1.6369e+03 1.9512e+03 1.5800e+03 + 1.9953e+03 6.3210e+02 8.1440e+02 5.0330e+02 5.5430e+02 3.5810e+02 3.1880e+02 + 3.5380e+02 1.5593e+03 2.5255e+03 8.9810e+02 7.4030e+02 1.5984e+03 1.6133e+03 + 1.2531e+03 1.4270e+03 1.1298e+03 3.4170e+02 4.3080e+02 4.2700e+02 3.9940e+02 + 3.5570e+02 4.3070e+02 1.2690e+03 1.7779e+03 1.1979e+03 3.4329e+03 3.4020e+03 + 1.0797e+03 5.6950e+02 5.7110e+02 2.9580e+02 2.8040e+02 5.5850e+02 1.1840e+02 + 3.3580e+02 5.4740e+02 7.3090e+02 5.0940e+02 4.9500e+02 7.2210e+02 4.7240e+02 + 3.0270e+02 2.9510e+02 8.6890e+02 1.7197e+03 2.6476e+03 1.6974e+03 1.0647e+03 + 2.8230e+02 2.2940e+02 3.2790e+02 8.0680e+02 6.4220e+02 1.2704e+03 1.0593e+03 + 1.9130e+03 1.1686e+03 1.8452e+03 6.2160e+02 1.2637e+03 1.4302e+03 9.6950e+02 + 2.4380e+02 1.7670e+02 5.1940e+02 3.6100e+02 2.9550e+02 1.5569e+03 2.1973e+03 + 1.7097e+03 6.9230e+02 6.6240e+02 1.0269e+03 1.5567e+03 1.2598e+03 1.6221e+03 + 8.1160e+02 1.9670e+02 9.4140e+02 8.5730e+02 8.0300e+02 8.9760e+02 2.2845e+03 + 2.5148e+03 1.4963e+03 2.2192e+03 1.7490e+03 1.4055e+03 5.8980e+02 4.8280e+02 + 7.2330e+02 5.7490e+02 4.5740e+02 3.6720e+02 4.5780e+02 5.2980e+02 5.8970e+02 + 3.6150e+02 6.6640e+02 9.9450e+02 4.1410e+02 1.7360e+02 4.9530e+02 1.3630e+03 + 7.6040e+02 2.6869e+03 1.1998e+03 1.1048e+03 3.0110e+02 3.2810e+02 3.8860e+02 + 1.1738e+03 1.1783e+03 1.4454e+03 1.1586e+03 1.9954e+03 1.0060e+03 1.1533e+03 + 5.1040e+02 1.2560e+03 1.3045e+03 1.1737e+03 3.7150e+02 2.6830e+02 3.8410e+02 + 1.5360e+02 5.6200e+02 1.0279e+03 2.7735e+03 8.4100e+02 4.0230e+02 2.9900e+02 + 1.2325e+03 1.2903e+03 1.5507e+03 1.3950e+03 7.1150e+02 3.5540e+02 4.3010e+02 + 5.9560e+02 5.0240e+02 1.5055e+03 2.1575e+03 1.8410e+03 9.6180e+02 2.0795e+03 + 3.0529e+03 5.9430e+02 3.0720e+02 3.3920e+02 4.5020e+02 8.7650e+02 1.2362e+03 + 3.5110e+02 5.4520e+02 2.8580e+02 6.2110e+02 5.7940e+02 4.2220e+02 4.8980e+02 + 6.5540e+02 6.3030e+02 6.3920e+02 1.5936e+03 2.8468e+03 1.7554e+03 4.7460e+02 + 7.5990e+02 2.7180e+02 5.2780e+02 9.2780e+02 7.5870e+02 1.4786e+03 1.5981e+03 + 9.6970e+02 1.2105e+03 8.1130e+02 7.0030e+02 3.5710e+02 5.6600e+02 7.2940e+02 + 9.4830e+02 4.6990e+02 3.5220e+02 6.3470e+02 1.3740e+02 4.6430e+02 1.0105e+03 + 1.7815e+03 1.7378e+03 4.5860e+02 3.3950e+02 2.5800e+02 1.0777e+03 1.0675e+03 + 1.1840e+03 4.9560e+02 4.8170e+02 6.1700e+02 5.0670e+02 1.0786e+03 1.6463e+03 + 2.2050e+03 7.7390e+02 5.5330e+02 1.1551e+03 2.6460e+03 1.0697e+03 2.0450e+02 + 2.0280e+02 1.7390e+02 4.1340e+02 8.7940e+02 6.3810e+02 4.0280e+02 3.0850e+02 + 1.5330e+02 7.7930e+02 4.9910e+02 7.8390e+02 8.0040e+02 7.4050e+02 1.5497e+03 + 1.8594e+03 2.5541e+03 1.2141e+03 3.4410e+02 8.7580e+02 6.9290e+02 8.7340e+02 + 1.5854e+03 2.2545e+03 2.7317e+03 1.0256e+03 1.0550e+03 1.0256e+03 3.5630e+02 + 4.8310e+02 9.1700e+02 3.6830e+02 7.0630e+02 5.4260e+02 3.6180e+02 5.7700e+02 + 5.8530e+02 2.9820e+02 2.8020e+02 1.5186e+03 2.7194e+03 9.7260e+02 6.5660e+02 + 4.9330e+02 3.5010e+02 1.1496e+03 1.1499e+03 4.4430e+02 6.5820e+02 5.0240e+02 + 6.9810e+02 3.8160e+02 1.7942e+03 2.0072e+03 7.3410e+02 5.2770e+02 3.5790e+02 + 8.2120e+02 2.0484e+03 2.3909e+03 7.9870e+02 5.9400e+02 2.8870e+02 2.7470e+02 + 9.0190e+02 1.0003e+03 4.5870e+02 5.0580e+02 2.6550e+02 9.0010e+02 6.2300e+02 + 6.3660e+02 1.3083e+03 1.2469e+03 1.8608e+03 9.8410e+02 7.5110e+02 4.0360e+02 + 4.2400e+02 6.7970e+02 8.9180e+02 1.1109e+03 9.7680e+02 2.6699e+03 1.5812e+03 + 7.7010e+02 8.6050e+02 5.0790e+02 5.2530e+02 9.2820e+02 3.6600e+02 8.4840e+02 + 3.3410e+02 2.5120e+02 2.4990e+02 1.0084e+03 4.6480e+02 4.0660e+02 4.2260e+02 + 2.2041e+03 2.0686e+03 8.7800e+02 8.0320e+02 7.7320e+02 2.8490e+02 8.9030e+02 + 7.3110e+02 1.0596e+03 3.7750e+02 1.1912e+03 3.7770e+02 1.3672e+03 1.5637e+03 + 1.6157e+03 1.2102e+03 3.8270e+02 5.4210e+02 1.5119e+03 1.5121e+03 2.6087e+03 + 7.5520e+02 5.6590e+02 1.3900e+02 7.7390e+02 6.4360e+02 6.2080e+02 3.2770e+02 + 3.8190e+02 2.7420e+02 6.3870e+02 9.9370e+02 1.3820e+03 1.4941e+03 1.7131e+03 + 1.1977e+03 1.1109e+03 4.8210e+02 5.2040e+02 2.1080e+02 4.1070e+02 9.1690e+02 + 1.6968e+03 2.6769e+03 1.0700e+03 1.3986e+03 6.0880e+02 2.7130e+02 7.1730e+02 + 4.4900e+02 3.1050e+02 2.8450e+02 2.5830e+02 4.3300e+02 4.1990e+02 3.0740e+02 + 5.7340e+02 1.3761e+03 5.4250e+02 8.3000e+02 1.5051e+03 1.6574e+03 8.6810e+02 + 7.3220e+02 5.6970e+02 1.2255e+03 6.2470e+02 6.5590e+02 4.5790e+02 4.7670e+02 + 7.5590e+02 7.6240e+02 1.5810e+03 2.7837e+03 1.7515e+03 9.3930e+02 6.0960e+02 + 4.5280e+02 6.7320e+02 1.6085e+03 2.1638e+03 1.5683e+03 4.0750e+02 2.6210e+02 + 6.9570e+02 5.4400e+02 2.8490e+02 2.6720e+02 2.6120e+02 3.6110e+02 2.9040e+02 + 9.1220e+02 1.5190e+03 1.7148e+03 2.3250e+03 9.6610e+02 1.4967e+03 3.7070e+02 + 4.0180e+02 5.2020e+02 5.2270e+02 9.0830e+02 1.7672e+03 1.9000e+03 1.0783e+03 + 2.8560e+02 3.8970e+02 4.8060e+02 2.3620e+02 6.5330e+02 5.6870e+02 4.7780e+02 + 2.9760e+02 5.6640e+02 5.1640e+02 6.0130e+02 7.0320e+02 5.8640e+02 5.2280e+02 + 9.3830e+02 1.6238e+03 1.8823e+03 9.2610e+02 3.6740e+02 5.7300e+02 5.7920e+02 + 4.8980e+02 3.5160e+02 2.9580e+02 3.4680e+02 6.0920e+02 1.5455e+03 1.0903e+03 + 1.4708e+03 1.5996e+03 1.1990e+02 4.9560e+02 8.9270e+02 8.2500e+02 1.2789e+03 + 2.2435e+03 2.0562e+03 6.2820e+02 4.5860e+02 5.7300e+02 9.1060e+02 4.6080e+02 + 2.5080e+02 4.7990e+02 5.3730e+02 8.7130e+02 8.7240e+02 1.9905e+03 2.4765e+03 + 1.8759e+03 6.4150e+02 2.1920e+02 3.4160e+02 4.2620e+02 8.9080e+02 1.1266e+03 + 1.8753e+03 1.6637e+03 1.1353e+03 6.3440e+02 2.9030e+02 3.1510e+02 3.7620e+02 + 3.5770e+02 4.1290e+02 3.8680e+02 2.9280e+02 4.0280e+02 4.8220e+02 2.6910e+02 + 4.0520e+02 6.6920e+02 6.2660e+02 3.7590e+02 2.9100e+02 1.7101e+03 2.5068e+03 + 8.8610e+02 4.3690e+02 3.5940e+02 3.8400e+02 4.0620e+02 3.7580e+02 4.3670e+02 + 9.9400e+02 7.4700e+02 1.0345e+03 2.4496e+03 1.7686e+03 6.3740e+02 3.7320e+02 + 4.2890e+02 5.9510e+02 6.8480e+02 1.3401e+03 2.3553e+03 1.6049e+03 6.4750e+02 + 4.3110e+02 6.9470e+02 6.2940e+02 5.3360e+02 3.1690e+02 9.0670e+02 1.6775e+03 + 8.9920e+02 1.6348e+03 1.9619e+03 1.1836e+03 1.2775e+03 3.1930e+02 4.6560e+02 + 3.2400e+02 1.1250e+03 1.3824e+03 1.7345e+03 1.8882e+03 2.1702e+03 6.6660e+02 + 3.5880e+02 1.6510e+02 2.4600e+02 5.5110e+02 2.7870e+02 2.5450e+02 2.7080e+02 + 3.6480e+02 5.9670e+02 3.0570e+02 2.4900e+02 6.1110e+02 8.0070e+02 5.8950e+02 + 5.9230e+02 1.1912e+03 1.4156e+03 2.2661e+03 1.0234e+03 7.0290e+02 4.9610e+02 + 9.2440e+02 5.2880e+02 3.2580e+02 2.1490e+02 7.2050e+02 9.9070e+02 1.9586e+03 + 1.6217e+03 1.5346e+03 5.3280e+02 3.3680e+02 3.1350e+02 5.2990e+02 5.0660e+02 + 5.6250e+02 1.3549e+03 2.6945e+03 1.7849e+03 8.4660e+02 6.4890e+02 1.0299e+03 + 4.6530e+02 4.1010e+02 1.1560e+03 6.3510e+02 1.9251e+03 2.5103e+03 1.1726e+03 + 8.3500e+02 1.8210e+02 3.5900e+02 3.4960e+02 3.9180e+02 9.6270e+02 1.9560e+03 + 1.9318e+03 7.0860e+02 1.6090e+03 8.1900e+02 4.5670e+02 1.0430e+02 3.7870e+02 + 4.1650e+02 8.2190e+02 4.9370e+02 4.1040e+02 6.4270e+02 7.3200e+02 2.1110e+02 + 2.9390e+02 3.2820e+02 5.9200e+02 7.0890e+02 3.0950e+02 1.2207e+03 1.7840e+03 + 2.2425e+03 1.0641e+03 3.8870e+02 6.6460e+02 5.5790e+02 5.9500e+02 2.7770e+02 + 4.6760e+02 6.5850e+02 1.2365e+03 1.6442e+03 2.3576e+03 9.1740e+02 3.6040e+02 + 5.2240e+02 3.7830e+02 4.2480e+02 7.3620e+02 6.9800e+02 1.3677e+03 1.6381e+03 + 2.9223e+03 1.7417e+03 9.3500e+02 5.4920e+02 3.9340e+02 4.9540e+02 1.3689e+03 + 1.0915e+03 1.7786e+03 1.8106e+03 1.5265e+03 6.8180e+02 2.6250e+02 5.3810e+02 + 6.0620e+02 1.5001e+03 1.4288e+03 1.7261e+03 1.0522e+03 7.8870e+02 5.3530e+02 + 8.0140e+02 3.6570e+02 2.3110e+02 2.9880e+02 4.8160e+02 9.6230e+02 7.1690e+02 + 6.3140e+02 4.1500e+02 3.1570e+02 4.4170e+02 3.3790e+02 3.4600e+02 3.6220e+02 + 6.9950e+02 2.8080e+02 1.3796e+03 2.1354e+03 1.1950e+03 8.3980e+02 4.7990e+02 + 4.2440e+02 7.4940e+02 4.6740e+02 6.7380e+02 7.1400e+02 1.6620e+03 1.5516e+03 + 2.2986e+03 1.7345e+03 5.3150e+02 4.4070e+02 4.5060e+02 6.6110e+02 3.8570e+02 + 4.4660e+02 4.3990e+02 6.1120e+02 7.1600e+02 1.1423e+03 2.4126e+03 1.8137e+03 + 6.9330e+02 1.5460e+02 3.2320e+02 9.3030e+02 1.3330e+03 2.2123e+03 1.2374e+03 + 8.0720e+02 2.8320e+02 4.7740e+02 6.9180e+02 1.1425e+03 1.6916e+03 1.2313e+03 + 2.1509e+03 1.0772e+03 2.3060e+02 3.6470e+02 7.1810e+02 8.1130e+02 6.1780e+02 + 4.3380e+02 4.8430e+02 5.7640e+02 6.6090e+02 3.6490e+02 5.6200e+02 5.7450e+02 + 2.7690e+02 4.4520e+02 2.5700e+02 2.0540e+02 2.9830e+02 4.9580e+02 1.7282e+03 + 1.6449e+03 1.0175e+03 9.7660e+02 5.3730e+02 7.5240e+02 6.2670e+02 6.6370e+02 + 2.6400e+02 3.5410e+02 7.6300e+02 1.0852e+03 2.5166e+03 1.2668e+03 1.2631e+03 + 7.8090e+02 3.3260e+02 9.5510e+02 9.3810e+02 5.9750e+02 3.9440e+02 5.9920e+02 + 1.7116e+03 7.0750e+02 2.1229e+03 2.1530e+03 1.1450e+03 8.6380e+02 9.6090e+02 + 1.1427e+03 2.2497e+03 1.2034e+03 1.0560e+03 6.3900e+02 7.4000e+02 5.1820e+02 + 1.2956e+03 1.5705e+03 1.6338e+03 1.5892e+03 1.1655e+03 4.6240e+02 4.0930e+02 + 4.2800e+02 4.6960e+02 6.6860e+02 1.1117e+03 6.3960e+02 7.3830e+02 6.5770e+02 + 4.4270e+02 4.8750e+02 5.7520e+02 5.2020e+02 7.0000e+02 4.9900e+02 4.4330e+02 + 4.3600e+02 2.8650e+02 6.8220e+02 1.5957e+03 1.8298e+03 1.5977e+03 4.9130e+02 + 6.7030e+02 4.7680e+02 8.9570e+02 4.8690e+02 5.7290e+02 4.9400e+02 1.7911e+03 + 1.9733e+03 2.8742e+03 1.3486e+03 5.5980e+02 7.8250e+02 3.2150e+02 5.7730e+02 + 6.5000e+02 4.9960e+02 2.4770e+02 7.1010e+02 4.0530e+02 5.3580e+02 8.5570e+02 + 1.7271e+03 1.5537e+03 1.7402e+03 7.0090e+02 1.9786e+03 1.5257e+03 1.3614e+03 + 1.0591e+03 7.5260e+02 2.8970e+02 1.7331e+03 1.1406e+03 1.1740e+03 1.4800e+03 + 9.6470e+02 6.4030e+02 5.5310e+02 6.3680e+02 3.9000e+02 1.5440e+02 4.4550e+02 + 1.0728e+03 6.9610e+02 8.8010e+02 3.5090e+02 2.4540e+02 3.6980e+02 5.9850e+02 + 5.5820e+02 4.2620e+02 6.0820e+02 4.1520e+02 6.4490e+02 7.9700e+02 1.8913e+03 + 1.9352e+03 7.1490e+02 8.9380e+02 4.7630e+02 5.9360e+02 4.7640e+02 7.8130e+02 + 8.1090e+02 4.7760e+02 6.0140e+02 1.5178e+03 3.3836e+03 2.1596e+03 1.2383e+03 + 6.2930e+02 4.4130e+02 5.7710e+02 6.5430e+02 5.4660e+02 8.9580e+02 3.7010e+02 + 3.5820e+02 4.8730e+02 3.8370e+02 7.0480e+02 1.2482e+03 1.6470e+03 2.1999e+03 + 1.4881e+03 1.8854e+03 1.6795e+03 1.1208e+03 7.6050e+02 1.1867e+03 8.3180e+02 + 9.4180e+02 2.2661e+03 6.6430e+02 8.4780e+02 5.0520e+02 6.6100e+02 6.2800e+02 + 4.4050e+02 4.6690e+02 3.6990e+02 5.6940e+02 3.3820e+02 2.8540e+02 9.1370e+02 + 8.3410e+02 3.1600e+02 3.7160e+02 4.9840e+02 5.5690e+02 5.1790e+02 3.3710e+02 + 1.1514e+03 6.9290e+02 9.7820e+02 1.9540e+03 1.5093e+03 1.2100e+03 6.7810e+02 + 5.5890e+02 4.0350e+02 2.9720e+02 6.7680e+02 6.9140e+02 4.2340e+02 7.6050e+02 + 8.2000e+02 3.5000e+03 2.6920e+03 1.4030e+03 9.0820e+02 4.4900e+02 4.3870e+02 + 5.1810e+02 7.7540e+02 5.0870e+02 2.2070e+02 5.5030e+02 4.4810e+02 3.4920e+02 + 2.4860e+02 1.5008e+03 9.7260e+02 1.1852e+03 1.8057e+03 2.5818e+03 3.5000e+03 + 1.7200e+03 2.3885e+03 1.9682e+03 2.1879e+03 9.3730e+02 1.5821e+03 8.0260e+02 + 7.8540e+02 7.0630e+02 3.3610e+02 4.5080e+02 4.6250e+02 2.9970e+02 3.0430e+02 + 3.6910e+02 3.5910e+02 2.5810e+02 7.3550e+02 7.3990e+02 3.7930e+02 4.1420e+02 + 5.1730e+02 5.2110e+02 3.2340e+02 4.7200e+02 5.5580e+02 7.7140e+02 1.5637e+03 + 1.7737e+03 1.1223e+03 1.4274e+03 5.1530e+02 1.0575e+03 7.3810e+02 3.0830e+02 + 6.7930e+02 4.2870e+02 4.9600e+02 9.0490e+02 1.6842e+03 2.2620e+03 3.5000e+03 + 1.4702e+03 5.9430e+02 6.6500e+02 3.8660e+02 7.5460e+02 8.3020e+02 3.4260e+02 + 3.7490e+02 3.4500e+02 3.1530e+02 6.6280e+02 7.0270e+02 8.4700e+02 9.6480e+02 + 6.8460e+02 1.7170e+03 1.8811e+03 2.3833e+03 3.2199e+03 3.0341e+03 2.1432e+03 + 1.1561e+03 1.3322e+03 1.3149e+03 5.5860e+02 9.9370e+02 4.4070e+02 2.8420e+02 + 3.7460e+02 8.3820e+02 3.7530e+02 4.4890e+02 6.8550e+02 2.8560e+02 4.5470e+02 + 8.0030e+02 6.6280e+02 6.5470e+02 4.7630e+02 3.9410e+02 2.0760e+02 4.3010e+02 + 2.7410e+02 4.9200e+02 5.6160e+02 1.9214e+03 1.9732e+03 8.5070e+02 6.5680e+02 + 2.4800e+02 7.7220e+02 9.4570e+02 1.9250e+02 4.8910e+02 4.6370e+02 3.5290e+02 + 4.3650e+02 5.9770e+02 2.4006e+03 3.0274e+03 1.7989e+03 8.0180e+02 5.6680e+02 + 3.0160e+02 5.8770e+02 8.2080e+02 4.4000e+02 5.9280e+02 4.3600e+02 3.0760e+02 + 6.3920e+02 3.9840e+02 6.1380e+02 5.2460e+02 8.1300e+02 5.8790e+02 2.9275e+03 + 2*3.5000e+03 2.8024e+03 3.3511e+03 2.1097e+03 1.0759e+03 7.0400e+02 + 7.1550e+02 6.1490e+02 3.2470e+02 4.9330e+02 4.0510e+02 8.1420e+02 5.8420e+02 + 4.9890e+02 4.0990e+02 3.0220e+02 3.0470e+02 4.7620e+02 6.3730e+02 4.1360e+02 + 5.0370e+02 5.5340e+02 3.2120e+02 3.5320e+02 6.3970e+02 5.8880e+02 1.1851e+03 + 2.1744e+03 8.0170e+02 9.3110e+02 3.0770e+02 2.9990e+02 9.2260e+02 7.3600e+02 + 3.3770e+02 4.9830e+02 5.2100e+02 2.6440e+02 1.1740e+02 8.4720e+02 2.0641e+03 + 3.5000e+03 3.4776e+03 7.3420e+02 5.0940e+02 4.8120e+02 3.4510e+02 4.5440e+02 + 3.7590e+02 4.7640e+02 4.8120e+02 6.6070e+02 4.9440e+02 4.5320e+02 2.7310e+02 + 3.3940e+02 1.1327e+03 8.6240e+02 2.1870e+03 2.9411e+03 1.0282e+03 1.9708e+03 + 2.6285e+03 3.0499e+03 1.8269e+03 1.1896e+03 1.2733e+03 3.4710e+02 3.4080e+02 + 3.1080e+02 5.7710e+02 3.4310e+02 5.8510e+02 7.8740e+02 5.8290e+02 4.9980e+02 + 3.4350e+02 3.9980e+02 5.3670e+02 4.5520e+02 3.7930e+02 3.9490e+02 1.4940e+02 + 5.1030e+02 8.3050e+02 6.1460e+02 1.5672e+03 9.4450e+02 1.1295e+03 1.6061e+03 + 2.2920e+02 2.5270e+02 4.0190e+02 4.7610e+02 5.3980e+02 5.9540e+02 5.6790e+02 + 9.1780e+02 3.7790e+02 1.0887e+03 1.2271e+03 3.3967e+03 3.3074e+03 1.5790e+03 + 6.4560e+02 6.0090e+02 4.6610e+02 5.7070e+02 9.3570e+02 6.5260e+02 2.7750e+02 + 3.1950e+02 3.3410e+02 3.1490e+02 2.0610e+02 2.1430e+02 7.4950e+02 3.0370e+02 + 1.8905e+03 1.7824e+03 1.8700e+03 1.1017e+03 1.6329e+03 1.8770e+03 7.1560e+02 + 1.0758e+03 1.3865e+03 1.1896e+03 6.4690e+02 5.6230e+02 6.3070e+02 4.7880e+02 + 3.9950e+02 8.6470e+02 7.3430e+02 4.1510e+02 3.7390e+02 6.3180e+02 3.2060e+02 + 3.3970e+02 6.6420e+02 5.4880e+02 2.0790e+02 6.6450e+02 8.9180e+02 9.1360e+02 + 1.8161e+03 9.7170e+02 4.0130e+02 4.9020e+02 5.3750e+02 3.5060e+02 3.8150e+02 + 5.3460e+02 5.6620e+02 5.7220e+02 5.0090e+02 7.2710e+02 3.4140e+02 6.7040e+02 + 5.4530e+02 3.1549e+03 3.2362e+03 1.1545e+03 1.0528e+03 6.3120e+02 1.5680e+02 + 4.7190e+02 7.4790e+02 5.3650e+02 3.2680e+02 5.5910e+02 3.5480e+02 3.9130e+02 + 9.4400e+01 2.0960e+02 4.8620e+02 7.9130e+02 1.6132e+03 1.7725e+03 7.1890e+02 + 8.7610e+02 1.0594e+03 1.6669e+03 9.1770e+02 8.2450e+02 1.8079e+03 1.6174e+03 + 9.1330e+02 4.7600e+02 6.9830e+02 6.0220e+02 4.1820e+02 2.8370e+02 3.8290e+02 + 4.7580e+02 6.5310e+02 4.5990e+02 4.7860e+02 4.5290e+02 8.8580e+02 6.0380e+02 + 2.8500e+02 8.4010e+02 1.0958e+03 1.3345e+03 2.2922e+03 1.4166e+03 2.7130e+02 + 7.0680e+02 7.6820e+02 4.6260e+02 2.0570e+02 2.9690e+02 5.4330e+02 4.4880e+02 + 5.1610e+02 7.6320e+02 6.4920e+02 1.3638e+03 1.4527e+03 9.1780e+02 1.6671e+03 + 1.2902e+03 7.7380e+02 5.7150e+02 2.9960e+02 2.6780e+02 7.3440e+02 6.0810e+02 + 6.4010e+02 5.5920e+02 7.2420e+02 2.9400e+02 2.2580e+02 4.3630e+02 8.0160e+02 + 1.0216e+03 1.5018e+03 2.0047e+03 5.5890e+02 5.1240e+02 9.3170e+02 6.6280e+02 + 9.9730e+02 1.0107e+03 1.6446e+03 2.3101e+03 1.6609e+03 6.7190e+02 1.0336e+03 + 5.7860e+02 1.0860e+03 8.5690e+02 4.3840e+02 2.9380e+02 5.5490e+02 5.4610e+02 + 3.9950e+02 4.7660e+02 1.1552e+03 6.2420e+02 3.2870e+02 4.6220e+02 1.0914e+03 + 1.7642e+03 2.5117e+03 1.6869e+03 3.2030e+02 4.0220e+02 6.9000e+02 4.6920e+02 + 1.9930e+02 7.9970e+02 7.0720e+02 2.4190e+02 3.9180e+02 7.1630e+02 7.5730e+02 + 9.0120e+02 4.0930e+02 1.6587e+03 2.1621e+03 5.7750e+02 7.7520e+02 4.7200e+02 + 4.1080e+02 5.7340e+02 4.0080e+02 6.0820e+02 4.8550e+02 8.8010e+02 5.7100e+02 + 3.2480e+02 3.7810e+02 6.5740e+02 1.1307e+03 1.6714e+03 1.8873e+03 1.4215e+03 + 5.5880e+02 1.6870e+02 1.4810e+02 6.3890e+02 7.6380e+02 3.9080e+02 1.1142e+03 + 1.5469e+03 1.9614e+03 1.7109e+03 1.2946e+03 1.1669e+03 7.7130e+02 5.3320e+02 + 6.0660e+02 2.5950e+02 7.5100e+02 5.1230e+02 4.1740e+02 9.3190e+02 8.8040e+02 + 6.6490e+02 6.6310e+02 6.4590e+02 1.4737e+03 1.8359e+03 1.4740e+03 1.0989e+03 + 9.3830e+02 3.8520e+02 7.8920e+02 5.1110e+02 3.2400e+02 6.0630e+02 4.2060e+02 + 2.0490e+02 3.4950e+02 6.5030e+02 7.7740e+02 1.4675e+03 6.4220e+02 8.9030e+02 + 1.7613e+03 9.0420e+02 6.5070e+02 2.4930e+02 3.7760e+02 3.3150e+02 2.9570e+02 + 3.7060e+02 8.9320e+02 1.2130e+03 6.6450e+02 2.4050e+02 6.0830e+02 8.6090e+02 + 8.6510e+02 1.5414e+03 2.5386e+03 9.6430e+02 3.6140e+02 2.1620e+02 3.8900e+02 + 9.2980e+02 9.8240e+02 4.6600e+02 1.1790e+03 1.2120e+03 1.6136e+03 1.5438e+03 + 1.1393e+03 1.1719e+03 1.3258e+03 6.6700e+02 4.6200e+02 5.2220e+02 4.4360e+02 + 5.9900e+02 1.1740e+03 1.2258e+03 5.0500e+02 5.0870e+02 4.9730e+02 9.6500e+02 + 1.5563e+03 1.5758e+03 1.7039e+03 9.0610e+02 9.5530e+02 4.2710e+02 4.3950e+02 + 6.0140e+02 7.1690e+02 5.3310e+02 8.2480e+02 1.6910e+02 3.4290e+02 8.2160e+02 + 1.2861e+03 7.4350e+02 1.1552e+03 9.2750e+02 1.5696e+03 1.6963e+03 8.1470e+02 + 4.3480e+02 5.4250e+02 4.5420e+02 3.8340e+02 3.1550e+02 1.0245e+03 9.3600e+02 + 5.6790e+02 3.6790e+02 4.5420e+02 1.1557e+03 1.1255e+03 1.0949e+03 1.9263e+03 + 8.9770e+02 4.5100e+02 3.4570e+02 4.3140e+02 3.1350e+02 8.1870e+02 6.4990e+02 + 8.8760e+02 7.6420e+02 1.5029e+03 9.3970e+02 1.5743e+03 2.0122e+03 9.6580e+02 + 1.5007e+03 8.3900e+02 3.8810e+02 7.2260e+02 5.9970e+02 5.0860e+02 7.0810e+02 + 2.9970e+02 4.3970e+02 7.3560e+02 1.5511e+03 2.3133e+03 1.5212e+03 1.5244e+03 + 4.2540e+02 5.7470e+02 6.7910e+02 7.5600e+02 2.6100e+02 3.9450e+02 9.5970e+02 + 5.5010e+02 4.4990e+02 3.2320e+02 5.1240e+02 1.2455e+03 4.3460e+02 8.7340e+02 + 9.5670e+02 1.5849e+03 2.0200e+03 1.4612e+03 5.3570e+02 5.5320e+02 7.5570e+02 + 4.3360e+02 3.2540e+02 7.4480e+02 6.6590e+02 5.7890e+02 2.8900e+02 4.2010e+02 + 9.5150e+02 1.2341e+03 1.8582e+03 1.9307e+03 7.9680e+02 8.1210e+02 2.7360e+02 + 5.5480e+02 5.7520e+02 6.1270e+02 7.9010e+02 8.5550e+02 7.3880e+02 5.7100e+02 + 7.9300e+02 1.5749e+03 1.1112e+03 1.6057e+03 1.5887e+03 1.4224e+03 7.1040e+02 + 2.9370e+02 8.0600e+02 8.3640e+02 5.8900e+02 5.5750e+02 3.4900e+02 6.2610e+02 + 1.1076e+03 1.9959e+03 8.1930e+02 7.3310e+02 7.0570e+02 7.5360e+02 4.3800e+02 + 5.8280e+02 4.2350e+02 3.0910e+02 7.0900e+02 5.7420e+02 3.1900e+02 2.6050e+02 + 5.5130e+02 1.3088e+03 5.1770e+02 1.0164e+03 1.5148e+03 1.4024e+03 1.5130e+03 + 1.9217e+03 7.0700e+02 4.7960e+02 7.5160e+02 4.9730e+02 4.5800e+02 3.8920e+02 + 2.9760e+02 9.8230e+02 6.2510e+02 4.5310e+02 7.0400e+02 1.5211e+03 1.7711e+03 + 2.2666e+03 6.9030e+02 4.1680e+02 6.1210e+02 3.0820e+02 5.3040e+02 7.2300e+02 + 6.9410e+02 4.2690e+02 3.2180e+02 4.3990e+02 6.9880e+02 8.7570e+02 1.2133e+03 + 1.6838e+03 1.4886e+03 1.6284e+03 4.1980e+02 3.0690e+02 5.9930e+02 8.8780e+02 + 3.5330e+02 5.7020e+02 5.3790e+02 9.5160e+02 1.4529e+03 1.7846e+03 1.0622e+03 + 1.0112e+03 7.9010e+02 4.9150e+02 4.8960e+02 3.6480e+02 2.2510e+02 3.7770e+02 + 1.0135e+03 4.8410e+02 6.5990e+02 6.6560e+02 6.7460e+02 6.0830e+02 7.1380e+02 + 5.1080e+02 1.9701e+03 1.4438e+03 1.7584e+03 1.8728e+03 8.5290e+02 1.1988e+03 + 1.1317e+03 5.0850e+02 4.0010e+02 3.7420e+02 8.8580e+02 6.7150e+02 6.1690e+02 + 4.0260e+02 1.5425e+03 1.6285e+03 1.8025e+03 1.5890e+03 3.9880e+02 5.3710e+02 + 6.2950e+02 4.4630e+02 7.2500e+02 7.4860e+02 5.0880e+02 4.7210e+02 3.2410e+02 + 5.5990e+02 5.8190e+02 5.6300e+02 6.1320e+02 9.5920e+02 2.2297e+03 1.7733e+03 + 1.1255e+03 4.7470e+02 8.6340e+02 7.4360e+02 2.7680e+02 3.3840e+02 5.5770e+02 + 9.7220e+02 2.3500e+03 1.7085e+03 8.7710e+02 4.8830e+02 4.3930e+02 4.9730e+02 + 7.1270e+02 3.7740e+02 2.8940e+02 4.0920e+02 9.0980e+02 6.8250e+02 3.8020e+02 + 1.0839e+03 5.3020e+02 4.6640e+02 1.0684e+03 1.1818e+03 1.4310e+03 1.3937e+03 + 9.2220e+02 1.1222e+03 1.9108e+03 1.1064e+03 6.9120e+02 7.9500e+02 3.6530e+02 + 4.3320e+02 5.6060e+02 4.5090e+02 3.3970e+02 4.5400e+02 1.6804e+03 2.0271e+03 + 2.2284e+03 7.8600e+02 7.4210e+02 5.2680e+02 7.8940e+02 3.5640e+02 5.3390e+02 + 7.1150e+02 5.2460e+02 4.2420e+02 5.3790e+02 5.2340e+02 3.3150e+02 4.4220e+02 + 9.4750e+02 5.6820e+02 1.1608e+03 1.9017e+03 1.9896e+03 1.5337e+03 9.3860e+02 + 3.0910e+02 3.6050e+02 2.4870e+02 6.5440e+02 8.2250e+02 2.5140e+03 1.4445e+03 + 3.4150e+02 3.2690e+02 3.8070e+02 5.3320e+02 6.0460e+02 7.9270e+02 3.5000e+02 + 5.7720e+02 8.5540e+02 6.9210e+02 5.0730e+02 5.7320e+02 3.5320e+02 4.8150e+02 + 1.7053e+03 1.2037e+03 1.4928e+03 8.5510e+02 1.8342e+03 1.7990e+03 2.0760e+03 + 1.8493e+03 1.6094e+03 6.5290e+02 4.0730e+02 4.0400e+02 7.5880e+02 1.8840e+02 + 3.8020e+02 3.9670e+02 1.8694e+03 1.6988e+03 1.8604e+03 5.1900e+02 5.1340e+02 + 1.0736e+03 7.9560e+02 5.5370e+02 6.0570e+02 5.5810e+02 3.8370e+02 2.7360e+02 + 7.3980e+02 8.0650e+02 3.9660e+02 5.9920e+02 7.2590e+02 6.9750e+02 1.3047e+03 + 2.1297e+03 2.1981e+03 1.8626e+03 1.4693e+03 5.5930e+02 3.6190e+02 2.6640e+02 + 4.3260e+02 4.7090e+02 2.6593e+03 1.1367e+03 3.4780e+02 7.5900e+02 5.9200e+02 + 5.5340e+02 4.4910e+02 3.0350e+02 3.3200e+02 3.3580e+02 1.0160e+03 2.6070e+02 + 3.6420e+02 9.0010e+02 2.3930e+02 5.4180e+02 1.7517e+03 6.3460e+02 8.8770e+02 + 1.6025e+03 7.3160e+02 2.2065e+03 3.4026e+03 2.8107e+03 1.3244e+03 5.4170e+02 + 4.6330e+02 5.6580e+02 7.7840e+02 4.7020e+02 4.7990e+02 1.2260e+03 2.3516e+03 + 2.0024e+03 1.2255e+03 5.2230e+02 4.4030e+02 1.4450e+03 9.9180e+02 3.5310e+02 + 3.8260e+02 5.9780e+02 1.4700e+02 1.2650e+02 5.0150e+02 8.1870e+02 7.0180e+02 + 3.1330e+02 8.3310e+02 4.1800e+02 6.2870e+02 1.8757e+03 2.2352e+03 1.2546e+03 + 1.3624e+03 5.3320e+02 5.6130e+02 4.2260e+02 5.2760e+02 8.3450e+02 2.7437e+03 + 1.0339e+03 2.6310e+02 4.8710e+02 6.1980e+02 4.9620e+02 5.0200e+02 7.6630e+02 + 2.9520e+02 3.5070e+02 7.1730e+02 3.0770e+02 4.0590e+02 4.8520e+02 1.5140e+02 + 2.3430e+02 8.6020e+02 1.5215e+03 1.4390e+03 1.8118e+03 1.8641e+03 6.6850e+02 + 3.4376e+03 2.6513e+03 2.7342e+03 8.5880e+02 4.6180e+02 8.5840e+02 4.7820e+02 + 7.4850e+02 8.8130e+02 5.7330e+02 1.3505e+03 1.5726e+03 8.8320e+02 4.2040e+02 + 1.5110e+02 9.7560e+02 1.1372e+03 3.6420e+02 7.2830e+02 5.8490e+02 3.4430e+02 + 2.3640e+02 5.9890e+02 4.7300e+02 5.3570e+02 9.4070e+02 1.0045e+03 5.9070e+02 + 3.4080e+02 6.9700e+02 1.9655e+03 2.0985e+03 1.5869e+03 5.5150e+02 4.1730e+02 + 4.5980e+02 1.2073e+03 1.6468e+03 1.7101e+03 8.8050e+02 2.0560e+02 3.5490e+02 + 2.6920e+02 5.9060e+02 9.5770e+02 8.5980e+02 3.7310e+02 3.9970e+02 5.5170e+02 + 3.6460e+02 3.7350e+02 4.0160e+02 3.2280e+02 2.5880e+02 3.6570e+02 6.9830e+02 + 2.8450e+02 8.5290e+02 1.1713e+03 1.6233e+03 1.5387e+03 2.4824e+03 2.9053e+03 + 1.5830e+03 1.4210e+03 6.6030e+02 5.5960e+02 9.1690e+02 1.2494e+03 1.2326e+03 + 1.2405e+03 1.0653e+03 7.5060e+02 6.6200e+02 1.7040e+02 3.2960e+02 8.7590e+02 + 6.6920e+02 3.9030e+02 7.5730e+02 4.7530e+02 7.7060e+02 3.4310e+02 9.6270e+02 + 4.3140e+02 9.1260e+02 1.2771e+03 7.8930e+02 6.4760e+02 7.6040e+02 1.3144e+03 + 1.7693e+03 1.5247e+03 7.4280e+02 6.2910e+02 5.1860e+02 5.4840e+02 1.5036e+03 + 1.7299e+03 7.6720e+02 2.6270e+02 1.7840e+02 3.6940e+02 2.7660e+02 6.7590e+02 + 6.9390e+02 5.1770e+02 8.6990e+02 8.9080e+02 3.9420e+02 3.2200e+02 3.3890e+02 + 4.1540e+02 1.8050e+02 5.6160e+02 3.1390e+02 5.1140e+02 1.0212e+03 9.4290e+02 + 4.7810e+02 8.2160e+02 1.2653e+03 3.3952e+03 3.5000e+03 2.4973e+03 7.1760e+02 + 1.0840e+03 1.5544e+03 1.5873e+03 1.3856e+03 1.1168e+03 9.0090e+02 5.1570e+02 + 3.6470e+02 1.5170e+02 6.2310e+02 9.9520e+02 8.7910e+02 4.9570e+02 5.6940e+02 + 4.7850e+02 6.8110e+02 5.9900e+02 3.9870e+02 2.5600e+02 5.6610e+02 8.1550e+02 + 4.0390e+02 9.0500e+02 1.3372e+03 1.0815e+03 2.5196e+03 1.4681e+03 6.0360e+02 + 5.7080e+02 7.3400e+02 5.9230e+02 8.4250e+02 2.6518e+03 7.9220e+02 2.9290e+02 + 3.7980e+02 5.0120e+02 7.2100e+02 9.2440e+02 4.1310e+02 5.4460e+02 1.1334e+03 + 9.2590e+02 4.8450e+02 3.5100e+02 1.9390e+02 2.8910e+02 4.7060e+02 8.0860e+02 + 3.9080e+02 2.9800e+02 1.0524e+03 1.0342e+03 6.5590e+02 6.5280e+02 8.2440e+02 + 2.2530e+03 3.4263e+03 3.3646e+03 1.5789e+03 9.5430e+02 1.9875e+03 3.0945e+03 + 1.6521e+03 1.1580e+03 8.6690e+02 6.9830e+02 3.2590e+02 6.3100e+02 3.6140e+02 + 8.9570e+02 6.6080e+02 3.2060e+02 5.8780e+02 3.7070e+02 8.2330e+02 8.1990e+02 + 3.7190e+02 7.1260e+02 4.0000e+02 3.6770e+02 3.1590e+02 8.9450e+02 8.3020e+02 + 1.7316e+03 3.1313e+03 1.0796e+03 1.2129e+03 1.0288e+03 6.2710e+02 3.4590e+02 + 8.3890e+02 2.0703e+03 6.5900e+02 4.0450e+02 3.6450e+02 6.2220e+02 3.8370e+02 + 6.2370e+02 4.9810e+02 6.7300e+02 1.6513e+03 4.0320e+02 8.2720e+02 1.5020e+02 + 2.0200e+02 2.7130e+02 5.3370e+02 4.6040e+02 5.9540e+02 3.7490e+02 3.7850e+02 + 5.6490e+02 1.0293e+03 6.7980e+02 3.9510e+02 1.3228e+03 1.6857e+03 2.3670e+03 + 1.9411e+03 2.9281e+03 3.2676e+03 2.9679e+03 1.0138e+03 7.2510e+02 6.6880e+02 + 5.0020e+02 4.0060e+02 4.9060e+02 5.7120e+02 5.1510e+02 1.9790e+02 5.0900e+02 + 3.0610e+02 5.1690e+02 5.9420e+02 5.8120e+02 2.8280e+02 4.1340e+02 4.4250e+02 + 4.4820e+02 2.7310e+02 7.9700e+02 9.0580e+02 1.4679e+03 2.5050e+03 7.4610e+02 + 1.0190e+03 7.6410e+02 3.1950e+02 3.8020e+02 2.0333e+03 2.5259e+03 9.7430e+02 + 2.1230e+02 4.6090e+02 6.4080e+02 5.2390e+02 4.1640e+02 3.6590e+02 7.8490e+02 + 1.0654e+03 5.2050e+02 9.8520e+02 4.3950e+02 3.5630e+02 3.8320e+02 5.1640e+02 + 7.3680e+02 9.0220e+02 2.9250e+02 3.1620e+02 7.8290e+02 8.6940e+02 4.0890e+02 + 2.3130e+02 6.7810e+02 1.2832e+03 2.0223e+03 2.5112e+03 3.5000e+03 3.0882e+03 + 1.4214e+03 1.1523e+03 8.0940e+02 5.3440e+02 2.0480e+02 3.9560e+02 3.2360e+02 + 5.6170e+02 6.1470e+02 2.3610e+02 6.4490e+02 4.9580e+02 2.2310e+02 2.3150e+02 + 4.4910e+02 4.6400e+02 4.1830e+02 3.4850e+02 5.8650e+02 2.8120e+02 3.9280e+02 + 6.7260e+02 1.1692e+03 2.3279e+03 9.8000e+02 5.2420e+02 4.9720e+02 3.6330e+02 + 6.1210e+02 1.6463e+03 1.7021e+03 6.5000e+02 3.6960e+02 6.6910e+02 7.0380e+02 + 8.9100e+02 2.9640e+02 4.6610e+02 6.5660e+02 4.4600e+02 5.0060e+02 6.8210e+02 + 4.2690e+02 3.3170e+02 7.0510e+02 6.0530e+02 6.6940e+02 6.5760e+02 2.4220e+02 + 3.4620e+02 7.6940e+02 5.0670e+02 4.4370e+02 3.7270e+02 3.2090e+02 9.6010e+02 + 1.7115e+03 2.1829e+03 3.5000e+03 2.7480e+03 7.1130e+02 5.8490e+02 6.7040e+02 + 6.5320e+02 5.4290e+02 6.7980e+02 5.7840e+02 2.0580e+02 4.5960e+02 7.3680e+02 + 5.0250e+02 5.5390e+02 2.1310e+02 2.8580e+02 3.2580e+02 5.6020e+02 3.4680e+02 + 3.6500e+02 4.9210e+02 5.4990e+02 5.2540e+02 6.0160e+02 9.9130e+02 1.2778e+03 + 1.4075e+03 7.7820e+02 4.2140e+02 3.6960e+02 1.1386e+03 1.5519e+03 2.1914e+03 + 1.1512e+03 8.8840e+02 3.6640e+02 6.1720e+02 7.4830e+02 6.0180e+02 4.7000e+02 + 4.7170e+02 5.8890e+02 4.2080e+02 4.4820e+02 5.2440e+02 6.1680e+02 6.6050e+02 + 5.1940e+02 7.8900e+02 9.4040e+02 5.1460e+02 2.6590e+02 4.7760e+02 4.6550e+02 + 7.9980e+02 4.8730e+02 7.6300e+02 5.9840e+02 1.0587e+03 3.4962e+03 + 2*3.5000e+03 2.6800e+03 6.6470e+02 8.3350e+02 7.7240e+02 9.8170e+02 + 9.7940e+02 2.1230e+02 2.4490e+02 3.7680e+02 3.5440e+02 8.6940e+02 8.7680e+02 + 5.0750e+02 3.1020e+02 6.1000e+02 5.7710e+02 2.4950e+02 4.0290e+02 4.1930e+02 + 3.3550e+02 4.3170e+02 1.0507e+03 1.1695e+03 2.3208e+03 1.0373e+03 9.7780e+02 + 3.9100e+02 3.6740e+02 1.0965e+03 9.1070e+02 2.0705e+03 1.1836e+03 6.2370e+02 + 4.5370e+02 4.7750e+02 1.1087e+03 5.2530e+02 6.4780e+02 4.8470e+02 4.5780e+02 + 5.0520e+02 3.9730e+02 6.1240e+02 7.4590e+02 7.0630e+02 6.4620e+02 4.6330e+02 + 9.2790e+02 3.8590e+02 3.3110e+02 4.4540e+02 4.4640e+02 4.8460e+02 1.0582e+03 + 7.5970e+02 5.8640e+02 6.7280e+02 1.8437e+03 2*3.5000e+03 1.8077e+03 + 1.1754e+03 9.2080e+02 6.0750e+02 4.4380e+02 7.0030e+02 2.6350e+02 2.9330e+02 + 2.2780e+02 1.0484e+03 8.0640e+02 6.9550e+02 3.9910e+02 2.8290e+02 6.7380e+02 + 5.6400e+02 2.7360e+02 2.9540e+02 3.6270e+02 3.4040e+02 1.6260e+02 5.5420e+02 + 1.6155e+03 2.1021e+03 8.3690e+02 1.3720e+03 3.9310e+02 1.8630e+02 8.3030e+02 + 1.5232e+03 2.2344e+03 9.0290e+02 9.8190e+02 6.1800e+02 4.5020e+02 4.9340e+02 + 3.1110e+02 9.7090e+02 4.7370e+02 3.6110e+02 5.5690e+02 6.4850e+02 4.9650e+02 + 5.1810e+02 5.3370e+02 3.0230e+02 1.0418e+03 5.3940e+02 4.3460e+02 4.1510e+02 + 3.3360e+02 2.3950e+02 3.7190e+02 8.2040e+02 1.0102e+03 7.3470e+02 1.2161e+03 + 1.6800e+03 1.7908e+03 1.0630e+03 1.5549e+03 1.5593e+03 1.4314e+03 1.5908e+03 + 7.5030e+02 4.1580e+02 2.5570e+02 2.7220e+02 3.3820e+02 4.8590e+02 6.1530e+02 + 4.5560e+02 6.3830e+02 3.2490e+02 5.5600e+02 7.5780e+02 5.5050e+02 5.9820e+02 + 4.6330e+02 4.7670e+02 5.9210e+02 7.0450e+02 1.0180e+03 2.3634e+03 1.3024e+03 + 1.0162e+03 4.4560e+02 2.8020e+02 6.6270e+02 1.4999e+03 2.2235e+03 1.2435e+03 + 5.6700e+02 7.0670e+02 3.4720e+02 6.6500e+02 4.2300e+02 8.2350e+02 4.7950e+02 + 5.2740e+02 5.9290e+02 1.1023e+03 5.1110e+02 2.4400e+02 4.6250e+02 6.1790e+02 + 8.2360e+02 9.0410e+02 4.3900e+02 5.3180e+02 5.7690e+02 5.6100e+01 3.1890e+02 + 6.5070e+02 8.3600e+02 1.0339e+03 1.1778e+03 1.8225e+03 1.5369e+03 2.0155e+03 + 1.5783e+03 2.0656e+03 1.8718e+03 1.1476e+03 1.5730e+03 2.6080e+02 3.7360e+02 + 4.4220e+02 5.5720e+02 5.1250e+02 4.0260e+02 4.4390e+02 4.5040e+02 4.2160e+02 + 2.7050e+02 7.3670e+02 8.1180e+02 6.9380e+02 6.1300e+02 4.5240e+02 2.6020e+02 + 5.3250e+02 1.5460e+03 1.6471e+03 1.7788e+03 1.2449e+03 4.9900e+02 6.1010e+02 + 4.5420e+02 7.4530e+02 2.0488e+03 1.0837e+03 7.8750e+02 1.0503e+03 3.7250e+02 + 4.1380e+02 3.2150e+02 7.1290e+02 1.0963e+03 6.7800e+02 4.7010e+02 6.3300e+02 + 5.3810e+02 3.4360e+02 4.3880e+02 2.8060e+02 +/ diff --git a/examples/egg/eclipse/include/realizations/realization-0/eclipse/include/grid/active.inc b/examples/egg/eclipse/include/realizations/realization-0/eclipse/include/grid/active.inc new file mode 120000 index 00000000000..2ab54c5daeb --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-0/eclipse/include/grid/active.inc @@ -0,0 +1 @@ +../../../../../grid/active.inc \ No newline at end of file diff --git a/examples/egg/eclipse/include/realizations/realization-0/eclipse/include/schedule b/examples/egg/eclipse/include/realizations/realization-0/eclipse/include/schedule new file mode 120000 index 00000000000..ed5b970d39c --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-0/eclipse/include/schedule @@ -0,0 +1 @@ +../../../../schedule \ No newline at end of file diff --git a/examples/egg/eclipse/include/realizations/realization-0/eclipse/include/summary b/examples/egg/eclipse/include/realizations/realization-0/eclipse/include/summary new file mode 120000 index 00000000000..e5a0eb405d3 --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-0/eclipse/include/summary @@ -0,0 +1 @@ +../../../../summary \ No newline at end of file diff --git a/examples/egg/eclipse/include/realizations/realization-0/eclipse/model/EGG.DATA b/examples/egg/eclipse/include/realizations/realization-0/eclipse/model/EGG.DATA new file mode 120000 index 00000000000..e4b3ffa3150 --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-0/eclipse/model/EGG.DATA @@ -0,0 +1 @@ +../../../../EGG.DATA \ No newline at end of file diff --git a/examples/egg/eclipse/include/realizations/realization-0/eclipse/model/EGG_FLOW.DATA b/examples/egg/eclipse/include/realizations/realization-0/eclipse/model/EGG_FLOW.DATA new file mode 120000 index 00000000000..931f4143326 --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-0/eclipse/model/EGG_FLOW.DATA @@ -0,0 +1 @@ +../../../../EGG_FLOW.DATA \ No newline at end of file diff --git a/examples/egg/eclipse/include/realizations/realization-1/eclipse/include/grid/PERM.INC b/examples/egg/eclipse/include/realizations/realization-1/eclipse/include/grid/PERM.INC new file mode 100755 index 00000000000..52dc7c36a5a --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-1/eclipse/include/grid/PERM.INC @@ -0,0 +1,3606 @@ +-- File compressed with eclcompress at 2024-09-19 10:23:21.175529 +-- Compression ratio 1.0 (higher is better, 1 is no compression) + +PERMX + 3.6620e+02 5.3140e+02 1.1437e+03 1.7951e+03 1.5245e+03 8.1670e+02 2.5970e+02 + 2.9860e+02 7.9780e+02 2.2834e+03 2.0910e+03 8.4870e+02 9.2020e+02 9.0860e+02 + 1.1648e+03 6.0810e+02 5.0170e+02 2.5300e+02 7.0640e+02 9.4220e+02 2.6474e+03 + 1.7103e+03 1.0985e+03 9.1740e+02 8.8270e+02 6.5260e+02 1.9025e+03 1.6445e+03 + 1.5170e+03 4.9260e+02 1.3461e+03 8.4710e+02 3.7510e+02 5.5620e+02 8.3690e+02 + 5.2740e+02 8.2220e+02 1.3889e+03 2.0340e+03 2.1878e+03 2.9273e+03 1.5637e+03 + 4.2680e+02 2.5750e+02 5.0600e+02 1.5530e+02 2.3540e+02 2.9890e+02 3.8760e+02 + 3.6140e+02 4.6870e+02 5.8210e+02 9.5540e+02 3.8860e+02 3.4400e+02 7.8040e+02 + 1.0596e+03 1.5559e+03 7.6340e+02 7.2110e+02 6.8710e+02 5.4930e+02 2.1699e+03 + 1.6536e+03 9.2580e+02 3.8260e+02 3.0980e+02 2.5690e+02 1.0563e+03 8.6860e+02 + 2.2711e+03 1.3934e+03 5.2850e+02 6.0050e+02 5.6380e+02 4.9550e+02 6.5700e+02 + 3.4190e+02 5.4230e+02 3.5580e+02 1.6736e+03 2.0471e+03 7.7810e+02 1.1123e+03 + 4.1060e+02 3.4030e+02 5.0960e+02 2.3792e+03 2.0770e+03 1.4109e+03 7.6760e+02 + 7.2580e+02 3.2600e+02 6.4810e+02 7.9300e+02 7.3810e+02 7.2870e+02 8.3950e+02 + 7.9060e+02 2*3.5000e+03 1.8240e+03 9.5060e+02 3.5050e+02 4.8290e+02 + 3.0170e+02 1.8720e+02 4.4170e+02 3.4300e+02 1.6590e+02 2.3610e+02 7.2910e+02 + 1.1118e+03 5.6040e+02 6.2940e+02 9.4240e+02 8.3970e+02 9.0780e+02 6.5970e+02 + 3.6960e+02 6.6350e+02 9.4660e+02 2.2505e+03 8.4180e+02 1.0213e+03 4.7550e+02 + 3.0320e+02 3.1460e+02 1.1718e+03 2.6677e+03 1.9880e+03 1.5268e+03 3.0480e+02 + 4.8050e+02 4.2220e+02 3.2310e+02 3.9760e+02 5.6520e+02 3.1710e+02 5.1800e+02 + 7.3180e+02 2.7547e+03 1.7298e+03 1.0286e+03 5.6060e+02 5.1880e+02 9.6370e+02 + 6.6420e+02 1.6024e+03 8.6690e+02 1.3608e+03 4.8740e+02 5.5030e+02 5.6170e+02 + 4.6930e+02 3.6200e+02 4.2170e+02 6.9960e+02 1.4178e+03 3.2765e+03 2.2965e+03 + 3.0535e+03 1.3697e+03 1.5601e+03 8.6040e+02 4.8040e+02 3.7450e+02 7.4420e+02 + 5.1130e+02 5.3880e+02 4.5600e+02 6.6740e+02 8.1050e+02 7.3320e+02 3.4990e+02 + 7.2010e+02 8.4740e+02 5.7490e+02 7.9120e+02 1.0667e+03 1.3692e+03 1.6649e+03 + 1.8214e+03 8.6890e+02 6.5200e+02 6.7520e+02 3.4520e+02 8.8560e+02 8.5080e+02 + 2.5100e+03 1.2070e+03 7.3370e+02 3.0720e+02 3.8570e+02 3.5440e+02 4.0080e+02 + 4.2760e+02 7.6220e+02 5.0310e+02 2.8450e+02 1.6715e+03 2.0101e+03 9.6180e+02 + 8.4070e+02 3.2660e+02 5.6430e+02 9.5080e+02 1.5524e+03 1.3425e+03 1.5973e+03 + 1.8932e+03 3.3620e+02 6.5350e+02 1.0473e+03 8.1610e+02 3.9420e+02 2.8380e+02 + 5.8510e+02 1.0060e+03 2.1106e+03 2.2302e+03 1.9214e+03 2.4730e+03 1.5109e+03 + 8.3080e+02 5.7750e+02 2.8980e+02 5.6390e+02 6.8040e+02 5.1030e+02 5.2910e+02 + 4.0130e+02 4.9950e+02 4.8160e+02 6.3070e+02 3.5790e+02 3.7510e+02 5.1450e+02 + 1.0737e+03 1.0678e+03 9.9900e+02 9.8610e+02 1.8111e+03 1.3886e+03 6.5990e+02 + 5.0500e+02 7.7420e+02 7.5720e+02 1.2640e+03 1.6376e+03 1.7215e+03 6.6120e+02 + 4.6550e+02 4.2890e+02 5.5530e+02 3.9670e+02 2.8960e+02 4.5560e+02 6.6430e+02 + 3.8190e+02 1.5547e+03 2.0981e+03 1.8550e+03 1.1185e+03 6.5380e+02 4.5780e+02 + 9.9420e+02 1.2041e+03 1.3779e+03 1.9218e+03 2.0746e+03 9.9500e+02 8.9400e+02 + 4.5150e+02 4.3990e+02 2.7050e+02 3.3290e+02 6.4610e+02 1.1813e+03 1.5896e+03 + 2.7295e+03 1.2109e+03 2.7612e+03 1.1731e+03 1.0727e+03 3.1630e+02 6.2490e+02 + 4.0110e+02 6.1610e+02 6.6380e+02 8.5000e+02 1.0820e+02 2.7470e+02 5.1420e+02 + 1.1270e+03 3.6760e+02 2.4370e+02 6.6200e+02 1.3842e+03 1.0914e+03 9.0690e+02 + 2.1908e+03 2.2699e+03 4.7490e+02 5.0530e+02 4.6170e+02 1.1276e+03 5.0510e+02 + 1.6074e+03 2.5332e+03 1.7314e+03 4.4820e+02 3.9140e+02 4.4390e+02 1.0339e+03 + 2.2030e+02 2.2510e+02 3.6070e+02 4.7660e+02 5.1380e+02 8.9470e+02 1.7401e+03 + 1.7140e+03 1.2101e+03 5.8730e+02 5.9170e+02 6.3920e+02 4.1240e+02 1.2628e+03 + 1.0766e+03 1.6355e+03 1.5779e+03 1.0215e+03 3.6940e+02 5.4670e+02 2.6640e+02 + 4.0270e+02 3.2790e+02 1.0841e+03 1.8287e+03 2.0129e+03 2.4593e+03 2.6705e+03 + 1.8275e+03 7.9150e+02 4.0410e+02 3.1780e+02 6.6040e+02 6.8980e+02 7.7420e+02 + 3.6330e+02 1.2080e+02 5.3480e+02 4.5500e+02 1.0225e+03 2.2790e+02 3.8070e+02 + 7.9800e+02 1.4663e+03 2.1248e+03 1.9925e+03 1.8188e+03 1.3006e+03 4.8610e+02 + 3.3970e+02 4.6130e+02 3.4930e+02 3.8420e+02 1.2756e+03 1.6373e+03 1.1765e+03 + 8.6290e+02 5.2530e+02 4.1600e+02 9.6790e+02 4.7400e+02 2.5360e+02 4.1140e+02 + 4.8220e+02 9.5660e+02 1.1327e+03 9.7080e+02 1.8812e+03 9.2740e+02 5.9690e+02 + 6.2630e+02 5.7640e+02 6.9420e+02 7.6420e+02 1.4738e+03 1.9411e+03 1.7880e+03 + 9.5160e+02 7.9650e+02 5.4060e+02 6.1690e+02 1.3050e+02 3.9770e+02 1.5765e+03 + 1.5046e+03 1.9130e+03 2.0085e+03 1.8262e+03 1.6717e+03 5.4980e+02 2.2980e+02 + 4.7130e+02 4.9130e+02 8.6350e+02 1.1506e+03 3.8720e+02 3.9900e+02 5.0060e+02 + 3.7230e+02 7.1370e+02 3.4270e+02 3.4460e+02 7.1000e+02 1.4356e+03 1.6930e+03 + 2.6501e+03 1.8994e+03 1.5406e+03 1.7180e+02 4.1210e+02 8.4560e+02 6.2450e+02 + 6.0610e+02 1.3808e+03 2.4656e+03 1.5318e+03 8.4710e+02 7.9650e+02 7.9660e+02 + 5.6430e+02 1.4830e+02 3.3780e+02 4.9160e+02 2.7490e+02 2.4370e+02 9.2600e+02 + 1.8909e+03 2.2836e+03 9.4160e+02 7.8950e+02 5.4080e+02 3.6690e+02 3.8210e+02 + 5.8310e+02 1.1066e+03 1.7207e+03 1.6423e+03 8.4670e+02 1.0417e+03 7.9070e+02 + 3.0050e+02 3.3070e+02 4.6370e+02 1.6845e+03 1.8811e+03 1.5316e+03 1.7620e+03 + 1.5233e+03 1.3308e+03 5.8710e+02 4.0830e+02 4.5830e+02 8.9910e+02 1.0326e+03 + 3.8650e+02 3.6570e+02 2.0890e+02 3.0180e+02 5.5130e+02 1.2750e+02 2.6560e+02 + 6.4940e+02 5.0890e+02 1.7016e+03 2.4461e+03 2.1424e+03 2.4385e+03 9.0860e+02 + 2.1420e+02 2.7570e+02 6.6910e+02 4.3090e+02 3.3650e+02 8.9510e+02 2.4526e+03 + 1.5096e+03 6.7860e+02 6.6590e+02 6.0750e+02 6.4710e+02 2.7710e+02 4.7540e+02 + 3.4100e+02 2.7090e+02 2.7550e+02 7.6580e+02 1.3723e+03 2.0940e+03 1.1671e+03 + 7.4610e+02 4.7540e+02 5.3800e+02 3.4820e+02 5.2650e+02 6.4890e+02 8.2230e+02 + 1.4934e+03 1.8228e+03 1.2756e+03 1.1135e+03 3.2380e+02 2.0320e+02 6.7040e+02 + 1.5171e+03 1.8864e+03 1.5094e+03 1.5077e+03 1.1608e+03 7.7030e+02 9.0940e+02 + 3.1020e+02 4.8850e+02 8.1230e+02 5.4930e+02 3.1630e+02 3.6420e+02 4.8590e+02 + 6.6760e+02 3.1750e+02 1.9580e+02 1.9960e+02 3.0510e+02 1.0854e+03 1.3889e+03 + 2.2718e+03 2.1062e+03 1.8900e+03 8.2600e+02 5.2700e+02 5.0850e+02 6.8910e+02 + 6.5690e+02 4.3930e+02 1.2933e+03 1.8753e+03 7.1460e+02 6.9070e+02 6.5930e+02 + 5.8640e+02 4.5800e+02 5.9140e+02 4.4890e+02 4.6280e+02 2.5230e+02 2.5890e+02 + 4.8380e+02 1.5654e+03 1.8485e+03 1.4999e+03 3.9150e+02 5.9500e+02 5.5190e+02 + 5.6110e+02 3.4590e+02 5.1850e+02 6.1410e+02 1.0238e+03 1.8124e+03 1.7628e+03 + 1.6298e+03 1.0186e+03 5.4690e+02 6.2980e+02 1.8382e+03 1.5917e+03 1.5066e+03 + 1.7530e+03 1.9830e+03 1.4298e+03 5.6240e+02 2.9820e+02 2.6360e+02 6.2090e+02 + 4.2160e+02 1.7350e+02 2.5100e+02 3.3830e+02 5.1010e+02 1.3547e+03 6.2450e+02 + 4.4220e+02 3.7050e+02 6.9870e+02 1.4302e+03 2.4603e+03 1.1473e+03 2.2715e+03 + 9.8700e+02 6.5570e+02 6.6810e+02 1.0383e+03 5.5310e+02 2.8090e+02 8.8600e+02 + 1.5212e+03 1.2141e+03 3.7120e+02 5.6140e+02 5.1140e+02 6.4300e+02 7.7810e+02 + 2.5480e+02 5.3240e+02 3.6810e+02 4.6820e+02 6.2340e+02 9.8880e+02 2.8595e+03 + 1.1694e+03 4.8070e+02 2.1790e+02 7.2210e+02 8.7030e+02 8.9020e+02 3.3330e+02 + 4.1220e+02 5.3810e+02 1.3123e+03 2.8459e+03 1.5398e+03 5.8390e+02 8.6700e+02 + 8.3280e+02 2.6927e+03 1.5163e+03 6.3960e+02 1.4527e+03 1.8848e+03 1.4013e+03 + 8.7690e+02 3.3090e+02 3.3450e+02 4.3480e+02 5.0490e+02 3.3360e+02 2.0190e+02 + 5.9200e+02 6.1760e+02 5.6810e+02 2.5940e+02 5.8230e+02 8.6900e+02 1.0958e+03 + 1.1092e+03 1.8425e+03 1.5320e+03 2.0588e+03 1.5398e+03 4.5910e+02 7.2300e+02 + 1.4205e+03 5.1270e+02 2.8600e+02 6.0380e+02 7.3270e+02 1.9211e+03 9.0570e+02 + 4.5300e+02 5.5460e+02 4.5780e+02 4.9940e+02 3.3210e+02 6.7750e+02 4.6820e+02 + 6.5720e+02 6.9740e+02 9.8180e+02 2.6631e+03 1.8623e+03 7.4140e+02 2.1340e+02 + 3.1150e+02 7.9590e+02 7.4090e+02 2.0100e+02 3.3320e+02 4.5420e+02 9.0380e+02 + 2.7337e+03 1.9003e+03 5.6750e+02 1.0338e+03 1.6462e+03 2.0256e+03 5.9000e+02 + 1.3790e+03 2.3686e+03 1.7874e+03 7.7060e+02 7.6700e+02 4.4190e+02 1.6120e+02 + 2.6360e+02 8.6960e+02 4.4070e+02 4.7430e+02 2.1400e+02 6.4740e+02 6.4330e+02 + 3.0790e+02 5.6330e+02 6.0500e+02 1.0884e+03 1.9462e+03 1.5988e+03 1.1834e+03 + 2.8455e+03 6.0480e+02 1.1393e+03 5.8270e+02 6.9550e+02 4.4020e+02 4.2770e+02 + 4.7120e+02 1.0845e+03 2.0344e+03 1.0444e+03 7.8370e+02 4.8240e+02 3.3630e+02 + 4.3090e+02 4.0370e+02 3.7730e+02 6.0220e+02 8.5680e+02 7.9920e+02 8.7190e+02 + 1.8543e+03 4.4650e+02 3.6900e+02 1.5210e+02 8.8640e+02 6.5980e+02 8.9620e+02 + 5.4780e+02 5.4560e+02 2.0020e+02 4.7550e+02 1.5343e+03 1.3272e+03 1.9178e+03 + 6.4630e+02 1.6024e+03 1.5498e+03 8.1640e+02 1.3044e+03 2.3768e+03 2.0707e+03 + 1.4783e+03 5.0350e+02 5.7340e+02 2.9800e+02 3.2580e+02 4.8440e+02 7.1660e+02 + 8.3750e+02 3.1330e+02 5.9390e+02 4.3420e+02 2.7660e+02 2.4030e+02 5.4480e+02 + 7.9660e+02 2.1210e+03 1.1984e+03 1.7163e+03 2.9941e+03 1.3686e+03 1.1111e+03 + 1.0454e+03 3.9780e+02 2.3390e+02 4.0240e+02 6.4270e+02 1.1138e+03 2.4318e+03 + 1.5910e+03 3.7910e+02 3.8960e+02 4.0280e+02 4.8180e+02 5.4480e+02 6.7400e+02 + 2.6090e+02 8.4620e+02 7.1880e+02 1.3026e+03 2.7504e+03 1.5300e+03 3.6860e+02 + 2.0120e+02 6.3500e+02 7.3600e+02 8.1890e+02 5.1990e+02 3.7530e+02 2.4840e+02 + 3.1860e+02 1.3146e+03 2.1921e+03 1.7108e+03 1.2199e+03 1.7491e+03 8.6130e+02 + 1.1924e+03 1.3596e+03 1.2613e+03 1.6720e+03 9.7290e+02 6.2440e+02 3.5980e+02 + 3.0250e+02 2.7310e+02 4.9260e+02 5.2770e+02 5.8450e+02 4.4170e+02 4.9280e+02 + 7.1340e+02 2.2500e+02 1.5890e+02 9.5050e+02 1.4497e+03 1.8720e+03 1.6068e+03 + 1.4449e+03 2.1056e+03 9.4890e+02 8.9830e+02 8.5110e+02 5.0920e+02 5.3430e+02 + 9.5570e+02 5.9420e+02 1.0416e+03 2.7169e+03 2.5006e+03 8.1110e+02 4.7130e+02 + 6.6420e+02 4.5130e+02 7.0200e+02 5.1020e+02 7.4280e+02 8.4270e+02 5.3680e+02 + 1.8666e+03 2.7093e+03 1.0673e+03 6.8630e+02 2.2510e+02 5.2030e+02 5.3330e+02 + 9.0860e+02 5.7540e+02 2.6870e+02 4.4490e+02 3.6130e+02 8.2850e+02 1.1546e+03 + 3.0258e+03 1.6927e+03 1.4084e+03 1.5249e+03 7.7430e+02 1.6156e+03 2.2090e+03 + 2.1138e+03 3.1780e+02 6.0790e+02 4.9850e+02 4.3110e+02 3.8760e+02 4.4600e+02 + 3.4020e+02 4.0110e+02 6.0920e+02 9.7790e+02 6.5070e+02 5.0930e+02 4.4170e+02 + 6.1920e+02 1.1381e+03 1.6551e+03 1.6988e+03 1.1063e+03 2.5403e+03 1.1618e+03 + 7.0470e+02 5.2420e+02 4.4520e+02 8.0410e+02 1.3317e+03 7.5670e+02 4.9470e+02 + 1.2279e+03 2.0494e+03 1.0100e+03 5.0090e+02 3.5750e+02 4.7010e+02 4.0760e+02 + 4.9670e+02 5.0730e+02 7.0390e+02 1.1877e+03 2.2205e+03 1.9572e+03 1.3667e+03 + 4.9530e+02 2.7360e+02 7.4970e+02 3.4500e+02 4.4340e+02 3.7410e+02 6.6960e+02 + 4.3920e+02 3.3710e+02 1.5785e+03 1.9154e+03 3.3418e+03 2.0439e+03 1.7751e+03 + 1.2521e+03 6.0580e+02 1.3508e+03 2.5817e+03 1.1131e+03 4.6750e+02 4.3280e+02 + 3.7370e+02 2.9080e+02 4.3220e+02 5.3200e+02 3.3150e+02 1.9700e+02 4.0930e+02 + 1.0057e+03 1.1149e+03 3.7300e+02 2.6970e+02 7.2160e+02 1.7884e+03 2.4571e+03 + 1.9154e+03 2.1214e+03 2.9023e+03 1.7210e+03 5.1150e+02 2.6650e+02 4.5440e+02 + 5.7100e+02 6.8900e+02 5.3480e+02 1.2915e+03 9.3420e+02 2.1995e+03 2.5257e+03 + 1.1485e+03 5.2980e+02 5.4310e+02 4.7270e+02 3.8360e+02 5.2690e+02 7.3070e+02 + 1.1708e+03 1.8400e+03 1.8103e+03 9.5840e+02 5.5620e+02 4.4650e+02 3.2130e+02 + 5.6930e+02 3.3180e+02 5.6670e+02 5.1550e+02 2.4930e+02 7.5490e+02 6.5300e+02 + 2.2282e+03 2.6755e+03 3.5000e+03 1.1280e+03 7.1670e+02 4.5010e+02 1.2894e+03 + 2.4310e+03 1.2523e+03 6.3500e+02 5.4450e+02 5.5450e+02 1.0360e+02 6.6830e+02 + 3.5980e+02 6.4420e+02 2.0960e+02 2.3170e+02 7.5000e+02 6.7960e+02 6.5470e+02 + 2.9970e+02 4.2430e+02 5.3560e+02 1.6768e+03 2.3061e+03 9.6190e+02 3.3730e+03 + 9.6710e+02 3.4020e+02 2.5080e+02 4.7890e+02 4.9350e+02 7.6720e+02 3.3800e+02 + 4.9740e+02 1.0311e+03 6.6230e+02 2.6078e+03 1.0210e+03 7.1060e+02 7.1350e+02 + 2.3300e+02 5.0770e+02 2.4500e+02 7.5820e+02 7.6850e+02 2.9879e+03 1.9110e+03 + 1.5322e+03 4.6920e+02 4.0900e+02 5.2230e+02 1.3723e+03 4.8060e+02 2.9900e+02 + 4.3250e+02 3.8980e+02 2.8610e+02 9.0060e+02 1.4613e+03 3.5000e+03 2.3961e+03 + 8.5680e+02 5.2180e+02 7.8620e+02 7.3200e+02 2.0435e+03 1.7449e+03 1.1049e+03 + 4.9600e+02 2.3930e+02 2.8670e+02 5.4420e+02 4.1530e+02 9.9970e+02 1.6560e+02 + 2.3200e+02 4.8790e+02 9.4660e+02 4.1380e+02 5.0540e+02 6.3740e+02 5.4450e+02 + 1.7527e+03 1.6629e+03 1.8066e+03 2.7705e+03 1.0701e+03 2.1920e+02 4.5580e+02 + 9.4310e+02 9.7910e+02 5.3140e+02 3.6610e+02 5.6190e+02 9.1320e+02 1.5461e+03 + 1.9760e+03 2.0065e+03 1.0934e+03 9.6780e+02 2.1030e+02 1.9330e+02 2.0120e+02 + 4.9780e+02 2.1807e+03 2.0312e+03 1.4701e+03 8.8990e+02 4.1480e+02 3.0170e+02 + 5.4480e+02 7.6340e+02 6.0500e+02 6.3560e+02 2.4940e+02 3.3800e+02 4.9340e+02 + 5.8610e+02 2.2422e+03 3.3198e+03 3.3252e+03 6.3980e+02 5.0770e+02 3.7210e+02 + 1.7298e+03 1.9327e+03 3.2705e+03 9.4060e+02 6.6110e+02 3.6540e+02 1.9240e+02 + 6.8000e+02 8.6020e+02 1.0145e+03 8.2520e+02 6.2700e+02 5.1160e+02 6.0690e+02 + 6.7390e+02 7.3830e+02 4.8610e+02 2.8850e+02 9.7180e+02 8.3300e+02 6.0240e+02 + 2.9623e+03 9.9680e+02 1.5250e+02 6.8150e+02 9.7670e+02 7.1820e+02 1.6100e+02 + 1.2080e+02 3.1410e+02 7.2420e+02 1.5769e+03 1.5255e+03 1.8799e+03 8.9870e+02 + 9.4660e+02 2.8470e+02 2.0020e+02 4.3170e+02 8.1250e+02 2.5654e+03 2.0206e+03 + 1.1152e+03 8.5630e+02 7.1850e+02 5.1690e+02 3.9520e+02 6.8250e+02 4.4700e+02 + 1.0115e+03 5.0420e+02 7.0880e+02 4.4870e+02 6.9840e+02 2.2198e+03 2.8898e+03 + 3.0380e+03 6.4600e+02 2.1600e+02 4.4120e+02 1.1487e+03 1.5080e+03 2.5755e+03 + 1.4132e+03 1.3523e+03 7.1570e+02 3.9460e+02 7.3600e+02 4.2740e+02 6.3160e+02 + 2.4290e+02 7.6060e+02 5.6400e+02 3.6890e+02 6.5160e+02 9.2000e+02 3.6550e+02 + 1.0130e+02 9.6650e+02 1.9472e+03 1.0279e+03 2.0073e+03 1.8539e+03 7.1470e+02 + 6.4960e+02 1.2914e+03 7.1220e+02 2.5150e+02 2.2150e+02 4.7080e+02 3.0830e+02 + 7.5500e+02 1.5402e+03 2.0565e+03 1.4775e+03 9.2870e+02 4.5530e+02 2.0590e+02 + 4.3240e+02 1.0363e+03 2.7406e+03 1.2181e+03 9.2500e+02 3.8920e+02 7.6290e+02 + 5.5610e+02 2.7920e+02 3.9730e+02 5.8330e+02 7.1630e+02 3.7850e+02 2.7290e+02 + 5.8930e+02 7.1620e+02 2.6317e+03 3.2142e+03 1.2197e+03 1.0199e+03 2.2730e+02 + 2.8780e+02 1.0240e+03 1.0801e+03 2.5500e+03 1.0882e+03 7.8540e+02 8.7400e+02 + 4.0070e+02 6.1170e+02 1.1364e+03 5.4340e+02 5.2730e+02 5.4180e+02 5.1220e+02 + 3.6740e+02 6.4940e+02 5.4400e+02 5.2210e+02 1.0230e+02 1.0477e+03 1.9274e+03 + 1.0603e+03 1.9498e+03 2.2072e+03 8.2120e+02 3.6370e+02 1.1636e+03 7.7340e+02 + 1.7790e+02 6.3270e+02 3.8280e+02 3.7920e+02 7.0270e+02 1.1333e+03 1.5843e+03 + 2.1615e+03 1.0095e+03 8.5930e+02 4.1600e+02 1.0963e+03 1.6563e+03 1.7378e+03 + 8.9050e+02 4.4440e+02 3.6340e+02 7.1070e+02 7.2120e+02 5.2870e+02 2.2360e+02 + 3.1020e+02 8.0130e+02 3.6500e+02 2.8380e+02 4.0810e+02 1.8011e+03 3.1334e+03 + 2.7011e+03 1.5237e+03 8.1080e+02 3.0820e+02 1.6760e+02 5.1510e+02 1.1928e+03 + 1.5826e+03 1.1150e+03 1.2979e+03 1.1845e+03 7.0000e+02 1.1955e+03 6.9670e+02 + 4.1460e+02 4.7560e+02 7.6980e+02 2.7550e+02 6.9340e+02 7.9630e+02 5.3390e+02 + 5.3280e+02 6.9430e+02 9.3320e+02 1.9927e+03 4.7780e+02 2.4414e+03 2.1849e+03 + 8.4720e+02 5.5790e+02 5.5750e+02 5.4630e+02 2.6810e+02 5.4160e+02 3.9640e+02 + 3.3460e+02 4.0430e+02 9.0940e+02 1.3978e+03 1.7710e+03 1.7229e+03 9.5860e+02 + 9.5680e+02 7.3500e+02 1.5032e+03 1.5291e+03 6.9700e+02 4.9440e+02 5.2050e+02 + 4.1030e+02 7.0450e+02 4.4870e+02 6.8020e+02 5.4400e+02 9.7670e+02 1.9000e+02 + 7.1850e+02 1.2151e+03 1.5256e+03 3.5000e+03 2.9896e+03 1.1301e+03 7.0700e+02 + 4.8110e+02 3.6180e+02 4.6880e+02 1.7580e+03 1.9738e+03 1.6057e+03 1.9237e+03 + 6.7020e+02 8.2830e+02 6.5540e+02 9.1000e+02 6.5550e+02 6.7880e+02 5.8520e+02 + 7.1670e+02 3.1860e+02 4.5780e+02 4.9530e+02 5.3010e+02 6.9450e+02 7.3600e+02 + 2.1420e+03 3.7340e+02 1.8990e+03 3.5000e+03 1.1637e+03 5.4430e+02 3.6030e+02 + 3.8100e+02 4.4580e+02 5.1390e+02 3.3650e+02 3.6320e+02 4.6280e+02 1.0359e+03 + 8.2040e+02 2.7938e+03 8.1200e+02 8.3680e+02 4.6660e+02 1.7369e+03 1.8820e+03 + 7.9050e+02 8.1910e+02 5.6760e+02 6.1080e+02 8.2630e+02 5.9120e+02 3.5440e+02 + 6.0850e+02 6.8900e+02 4.1630e+02 4.3430e+02 7.4570e+02 8.2600e+02 1.7715e+03 + 2.2601e+03 2.8574e+03 1.6537e+03 5.8140e+02 4.5560e+02 6.1110e+02 3.0110e+02 + 1.2824e+03 1.2710e+03 1.3573e+03 1.6421e+03 8.9930e+02 1.1523e+03 1.5431e+03 + 6.7740e+02 9.9230e+02 8.0220e+02 7.5270e+02 6.5090e+02 4.4070e+02 4.6770e+02 + 2.7280e+02 8.7050e+02 1.1748e+03 1.4445e+03 1.5961e+03 5.1260e+02 9.8660e+02 + 3.5000e+03 1.7643e+03 5.9640e+02 5.5310e+02 2.7670e+02 2.0250e+02 3.3650e+02 + 3.4300e+02 2.6380e+02 2.4130e+02 7.7250e+02 6.9210e+02 1.5056e+03 1.8470e+03 + 1.5070e+03 2.7698e+03 1.6453e+03 2.2830e+03 9.0490e+02 4.1170e+02 4.7960e+02 + 2.5920e+02 5.5090e+02 2.0360e+02 4.0030e+02 4.2190e+02 5.2310e+02 1.7690e+02 + 2.4960e+02 6.4570e+02 1.6326e+03 2.3900e+03 2.4044e+03 3.0836e+03 8.0490e+02 + 6.6180e+02 4.7350e+02 7.9260e+02 3.4880e+02 6.7320e+02 1.2909e+03 8.0530e+02 + 1.2747e+03 1.3276e+03 2.1032e+03 2.0295e+03 1.1691e+03 1.0097e+03 9.0680e+02 + 9.8250e+02 1.1777e+03 7.4590e+02 3.0960e+02 2.7340e+02 6.4140e+02 7.1010e+02 + 1.3660e+03 2.3813e+03 3.6650e+02 8.6790e+02 2.5212e+03 2.2974e+03 1.0795e+03 + 6.6060e+02 4.7990e+02 2.5050e+02 3.3010e+02 7.5110e+02 7.4760e+02 3.1230e+02 + 3.6100e+02 4.3080e+02 7.1340e+02 1.6527e+03 3.1243e+03 2.2570e+03 1.6028e+03 + 7.1660e+02 8.2400e+02 3.2920e+02 5.6030e+02 3.2460e+02 6.7810e+02 2.6730e+02 + 4.9060e+02 7.0180e+02 3.4830e+02 2.7750e+02 3.2640e+02 5.4230e+02 1.5010e+03 + 3.1148e+03 3.5000e+03 2.0391e+03 9.2350e+02 3.4580e+02 7.6940e+02 6.3110e+02 + 3.4580e+02 4.3210e+02 7.4100e+02 5.1550e+02 1.0194e+03 6.9940e+02 1.7617e+03 + 1.6383e+03 1.0797e+03 1.4286e+03 1.2776e+03 1.1933e+03 1.5305e+03 9.2610e+02 + 7.7320e+02 3.0530e+02 6.8780e+02 6.0000e+02 9.7010e+02 2.2201e+03 2.1470e+02 + 5.0230e+02 1.4904e+03 2.0522e+03 7.8100e+02 1.0898e+03 7.9070e+02 2.1620e+02 + 3.0120e+02 7.0510e+02 9.5300e+02 4.6660e+02 4.3960e+02 7.2170e+02 9.5240e+02 + 2.3636e+03 3.5000e+03 2.1036e+03 1.5170e+03 8.1260e+02 9.3540e+02 5.4120e+02 + 4.9200e+02 5.0710e+02 4.3440e+02 5.2870e+02 5.8560e+02 5.8280e+02 3.5100e+02 + 3.6860e+02 3.7390e+02 6.4310e+02 1.3358e+03 2.0396e+03 2.9971e+03 1.6831e+03 + 4.4530e+02 4.7670e+02 1.1616e+03 3.0710e+02 2.0820e+02 3.5720e+02 7.3610e+02 + 4.7220e+02 7.7660e+02 7.5300e+02 1.6285e+03 1.5268e+03 2.0574e+03 1.0950e+03 + 1.1845e+03 8.7720e+02 1.0980e+03 9.6040e+02 6.1180e+02 6.6000e+02 4.7230e+02 + 4.9810e+02 1.8735e+03 1.9687e+03 3.0820e+02 9.5620e+02 1.5147e+03 1.3097e+03 + 2.2788e+03 9.8560e+02 1.0746e+03 2.5270e+02 3.7630e+02 7.9250e+02 5.7400e+02 + 7.6020e+02 1.0342e+03 6.1020e+02 9.7030e+02 2.1356e+03 3.5000e+03 9.6240e+02 + 1.0740e+03 5.7010e+02 8.4780e+02 4.9630e+02 3.0560e+02 6.6450e+02 1.1679e+03 + 4.6340e+02 4.8920e+02 5.7440e+02 3.0060e+02 6.9350e+02 9.6110e+02 1.5552e+03 + 2.3913e+03 2.5820e+03 3.3292e+03 1.5751e+03 4.9480e+02 8.3360e+02 9.5630e+02 + 4.8040e+02 2.4300e+02 2.1740e+02 5.5760e+02 4.9730e+02 2.4210e+02 3.7750e+02 + 1.2040e+03 9.2500e+02 7.3360e+02 7.0540e+02 1.5745e+03 1.5486e+03 6.2420e+02 + 1.5617e+03 1.5823e+03 1.8837e+03 6.8430e+02 9.7020e+02 2.1293e+03 1.9587e+03 + 3.0620e+02 6.7120e+02 1.4375e+03 1.6334e+03 1.5689e+03 1.7059e+03 9.8960e+02 + 3.7300e+02 5.0590e+02 6.5750e+02 4.5790e+02 4.6280e+02 8.2290e+02 9.0920e+02 + 1.5065e+03 2.6417e+03 3.5000e+03 1.5003e+03 4.9070e+02 6.4540e+02 6.1500e+02 + 4.2090e+02 4.9450e+02 7.9180e+02 6.6450e+02 3.8830e+02 3.6150e+02 3.2320e+02 + 2.8210e+02 5.9430e+02 8.5010e+02 9.4770e+02 2.3605e+03 1.7966e+03 2.0389e+03 + 1.1835e+03 7.4030e+02 7.2170e+02 1.0111e+03 3.6760e+02 5.1740e+02 3.2430e+02 + 5.0280e+02 7.1550e+02 1.9930e+02 1.3320e+02 5.2510e+02 9.4250e+02 1.4068e+03 + 7.9170e+02 1.1468e+03 1.8318e+03 9.7260e+02 1.3956e+03 6.2110e+02 1.5426e+03 + 8.1000e+02 8.2080e+02 9.8150e+02 1.4449e+03 4.7020e+02 9.5520e+02 6.7900e+02 + 1.3711e+03 2.0752e+03 1.1705e+03 1.5271e+03 2.3890e+02 4.3480e+02 4.8090e+02 + 1.6620e+02 3.8960e+02 1.1350e+03 1.7697e+03 1.6554e+03 1.6769e+03 2.1109e+03 + 1.6486e+03 5.0090e+02 5.6180e+02 4.5490e+02 3.0740e+02 6.4100e+02 8.7590e+02 + 7.0460e+02 3.9260e+02 5.4200e+02 3.8660e+02 2.0530e+02 6.3220e+02 1.5175e+03 + 1.5044e+03 2.2253e+03 7.7290e+02 1.9026e+03 1.3921e+03 3.9860e+02 4.7330e+02 + 3.8870e+02 5.5900e+02 4.5210e+02 7.4930e+02 8.7580e+02 8.1440e+02 5.2170e+02 + 4.6250e+02 3.0900e+02 3.6930e+02 8.2370e+02 3.9610e+02 2.5300e+02 7.9790e+02 + 8.4560e+02 9.3260e+02 1.6636e+03 1.1356e+03 2.6926e+03 1.5965e+03 2.3681e+03 + 1.4078e+03 4.9590e+02 7.4700e+02 5.8150e+02 8.9520e+02 1.5404e+03 3.0986e+03 + 7.0510e+02 4.3800e+02 4.6350e+02 8.1680e+02 5.6720e+02 3.3330e+02 7.1220e+02 + 2.3473e+03 2.5224e+03 8.6130e+02 1.8593e+03 1.5972e+03 8.5690e+02 7.9750e+02 + 2.2970e+02 5.2880e+02 4.1330e+02 4.8110e+02 6.0020e+02 4.1370e+02 5.6420e+02 + 2.7790e+02 3.3920e+02 6.7850e+02 9.1280e+02 1.3985e+03 1.9409e+03 2.2623e+03 + 2.4499e+03 4.3820e+02 5.1030e+02 5.5390e+02 5.3970e+02 2.8490e+02 4.1180e+02 + 9.5260e+02 7.4050e+02 8.9620e+02 2.9550e+02 2.1300e+02 3.2200e+02 7.0860e+02 + 4.0850e+02 5.2840e+02 2.1890e+02 8.9800e+02 4.8910e+02 1.3172e+03 1.1817e+03 + 1.9901e+03 2.8559e+03 2.8837e+03 1.6421e+03 1.5241e+03 7.0910e+02 9.2330e+02 + 6.0580e+02 3.9210e+02 1.3375e+03 1.9588e+03 1.5818e+03 5.9730e+02 3.7170e+02 + 8.2110e+02 7.3510e+02 6.9160e+02 1.1641e+03 1.9877e+03 8.9050e+02 9.9480e+02 + 2.6524e+03 9.2820e+02 1.4807e+03 6.4690e+02 4.1890e+02 5.3980e+02 4.3360e+02 + 1.1107e+03 5.1520e+02 5.2240e+02 3.2640e+02 5.1770e+02 1.9850e+02 6.6690e+02 + 1.0096e+03 2.7020e+03 1.1184e+03 1.9502e+03 2.7032e+03 7.1820e+02 4.5630e+02 + 6.2420e+02 4.3720e+02 3.0400e+02 5.1810e+02 6.5410e+02 3.9870e+02 4.2950e+02 + 4.3130e+02 5.6730e+02 4.3760e+02 9.5660e+02 6.9570e+02 4.4790e+02 5.5960e+02 + 1.0555e+03 8.5930e+02 5.3420e+02 9.8270e+02 7.4920e+02 2*3.5000e+03 + 2.0221e+03 1.8472e+03 9.6020e+02 5.1010e+02 8.6970e+02 4.9870e+02 1.3926e+03 + 2.3870e+03 2.0329e+03 8.1010e+02 3.6450e+02 8.3110e+02 9.6140e+02 1.1973e+03 + 1.5942e+03 1.5643e+03 1.6284e+03 9.5010e+02 1.7789e+03 1.6770e+03 1.0870e+03 + 5.8150e+02 7.5650e+02 4.5360e+02 6.0080e+02 7.0740e+02 3.5080e+02 1.9980e+02 + 3.1350e+02 9.0780e+02 3.0230e+02 6.2450e+02 2.3335e+03 2.2056e+03 1.5981e+03 + 1.0957e+03 2.2981e+03 6.5830e+02 3.7810e+02 6.6590e+02 7.3120e+02 5.3060e+02 + 5.6650e+02 5.9220e+02 4.0090e+02 2.6520e+02 3.7260e+02 1.2343e+03 6.0540e+02 + 9.8960e+02 3.7850e+02 1.4750e+02 4.7110e+02 3.0040e+02 6.6060e+02 1.1252e+03 + 1.0045e+03 7.5250e+02 3.1809e+03 3.2024e+03 2.4157e+03 5.4320e+02 5.2710e+02 + 7.0120e+02 5.9770e+02 7.7930e+02 8.5130e+02 2.7337e+03 2.3289e+03 9.7530e+02 + 4.5170e+02 7.1370e+02 1.5012e+03 1.1768e+03 1.9806e+03 1.0539e+03 1.0739e+03 + 6.1010e+02 1.7034e+03 8.9900e+02 8.8160e+02 5.3260e+02 2.6950e+02 2.5710e+02 + 3.2110e+02 7.4160e+02 4.3770e+02 3.7120e+02 3.4970e+02 9.3090e+02 8.8550e+02 + 1.2465e+03 1.5481e+03 2.0073e+03 1.5464e+03 1.3129e+03 2.1852e+03 7.8130e+02 + 3.4010e+02 4.1010e+02 4.8230e+02 5.6170e+02 4.5860e+02 7.1590e+02 1.4350e+02 + 6.6570e+02 5.2850e+02 8.7370e+02 4.3540e+02 8.6210e+02 4.6460e+02 3.8350e+02 + 4.9210e+02 5.9470e+02 7.1590e+02 1.2635e+03 1.3632e+03 2.2872e+03 2.3963e+03 + 2.7881e+03 3.2682e+03 9.8320e+02 3.2250e+02 6.3980e+02 5.4340e+02 9.1440e+02 + 1.4906e+03 2.7625e+03 1.7121e+03 1.1016e+03 4.5260e+02 1.3611e+03 1.5778e+03 + 1.4721e+03 1.7346e+03 4.3200e+02 6.7540e+02 1.5252e+03 1.2400e+03 1.5544e+03 + 3.0890e+02 2.0550e+02 2.6000e+02 4.0900e+02 6.0210e+02 6.0560e+02 8.9600e+02 + 5.1560e+02 4.6700e+02 2.9890e+02 1.0786e+03 4.4090e+02 2.1598e+03 1.9523e+03 + 1.5676e+03 1.8170e+03 1.7893e+03 9.7410e+02 3.9820e+02 2.6410e+02 5.1230e+02 + 5.9270e+02 2.3800e+02 6.0420e+02 2.5840e+02 4.6580e+02 1.0033e+03 9.1090e+02 + 5.4810e+02 3.1010e+02 4.7660e+02 5.2220e+02 5.4780e+02 1.1314e+03 1.6794e+03 + 1.1218e+03 9.2350e+02 2.3802e+03 1.0049e+03 8.0220e+02 1.5017e+03 1.7057e+03 + 2.4750e+02 6.4110e+02 3.6460e+02 7.4700e+02 1.2911e+03 1.7253e+03 2.4979e+03 + 8.1800e+02 8.5010e+02 2.3435e+03 2.4464e+03 8.7040e+02 3.4720e+02 2.1710e+02 + 4.9410e+02 1.2253e+03 1.3133e+03 1.9035e+03 5.7930e+02 1.9450e+02 3.0490e+02 + 6.4710e+02 4.8910e+02 7.3190e+02 6.3000e+02 8.4380e+02 6.3100e+02 4.6250e+02 + 6.7030e+02 7.6200e+02 1.0084e+03 2.2872e+03 6.2260e+02 1.0530e+03 1.7647e+03 + 6.8360e+02 5.7300e+02 2.3310e+02 4.2560e+02 8.9690e+02 5.7060e+02 2.9000e+02 + 3.5680e+02 1.1678e+03 1.0959e+03 6.6470e+02 4.8640e+02 4.8720e+02 2.9730e+02 + 7.5110e+02 7.4190e+02 1.3479e+03 1.2156e+03 1.6071e+03 1.5558e+03 1.6780e+03 + 1.5929e+03 6.8120e+02 8.4800e+02 1.9449e+03 8.7870e+02 3.9640e+02 4.2600e+02 + 4.5340e+02 8.1830e+02 7.7540e+02 2.0123e+03 1.0155e+03 2.0957e+03 1.9389e+03 + 4.8900e+02 1.5231e+03 4.4270e+02 1.5880e+02 7.6870e+02 1.0029e+03 2.1306e+03 + 2.0912e+03 3.2300e+02 3.3720e+02 5.1250e+02 6.7200e+02 5.9420e+02 5.7510e+02 + 8.1100e+02 1.0343e+03 1.0823e+03 6.4570e+02 4.1900e+02 1.3462e+03 1.3955e+03 + 2.3138e+03 1.0219e+03 2.6895e+03 1.5905e+03 4.9750e+02 7.1400e+02 6.1390e+02 + 3.1470e+02 5.2690e+02 3.1440e+02 2.7260e+02 3.2430e+02 4.4150e+02 5.5400e+02 + 3.1970e+02 5.5890e+02 6.1130e+02 3.7210e+02 4.4320e+02 1.3686e+03 8.4400e+02 + 1.6952e+03 1.3911e+03 1.7353e+03 9.2080e+02 1.5212e+03 7.1180e+02 1.7191e+03 + 1.5300e+03 7.6920e+02 5.5980e+02 4.0600e+02 3.8070e+02 7.5850e+02 1.5484e+03 + 1.5831e+03 1.9012e+03 1.7928e+03 1.5413e+03 9.5290e+02 6.7000e+02 4.0150e+02 + 2.3730e+02 2.9880e+02 1.5661e+03 2.3169e+03 9.5200e+02 4.5680e+02 2.4870e+02 + 2.4970e+02 4.0830e+02 1.6820e+02 8.5480e+02 1.0549e+03 7.2820e+02 6.4910e+02 + 5.1030e+02 2.5330e+02 9.0870e+02 1.7274e+03 1.1657e+03 1.5896e+03 1.8532e+03 + 2.1529e+03 1.1255e+03 7.4460e+02 8.2020e+02 6.8910e+02 7.0900e+02 4.6320e+02 + 5.2450e+02 4.4950e+02 1.2152e+03 3.8860e+02 2.8580e+02 2.9450e+02 3.2970e+02 + 7.7890e+02 8.7160e+02 1.5646e+03 1.6202e+03 1.5621e+03 1.8593e+03 4.4040e+02 + 6.9930e+02 7.1790e+02 6.5770e+02 5.4100e+02 3.3840e+02 8.5530e+02 4.8440e+02 + 3.4450e+02 2.7550e+02 5.4380e+02 1.6305e+03 1.7495e+03 2.6684e+03 2.9424e+03 + 1.3652e+03 1.1869e+03 4.1340e+02 3.2170e+02 3.6110e+02 4.4380e+02 1.2833e+03 + 2.0063e+03 1.0608e+03 5.4220e+02 4.3090e+02 2.1250e+02 4.6580e+02 4.3660e+02 + 3.9470e+02 8.6930e+02 9.1680e+02 5.8890e+02 3.3220e+02 5.7650e+02 8.1660e+02 + 9.6580e+02 1.2003e+03 1.0588e+03 1.8715e+03 2.6043e+03 1.4681e+03 6.9040e+02 + 1.0424e+03 6.2550e+02 3.0560e+02 5.1570e+02 6.1010e+02 5.9780e+02 1.3740e+02 + 5.3360e+02 3.0800e+02 2.6300e+02 2.2600e+02 6.1250e+02 6.8470e+02 9.6560e+02 + 1.7019e+03 1.6120e+03 1.2134e+03 8.8060e+02 7.0590e+02 4.2140e+02 5.8980e+02 + 1.1872e+03 4.6950e+02 2.1390e+02 3.1510e+02 8.6330e+02 5.4880e+02 5.1580e+02 + 7.6270e+02 3.1860e+03 1.8753e+03 2.0375e+03 1.2105e+03 3.9080e+02 5.8740e+02 + 4.7630e+02 1.0622e+03 8.8420e+02 1.7577e+03 2.1658e+03 1.2787e+03 7.1030e+02 + 7.5940e+02 3.7310e+02 5.1810e+02 3.8310e+02 4.0050e+02 8.4860e+02 4.7110e+02 + 5.7460e+02 3.9010e+02 4.8690e+02 5.4460e+02 1.5223e+03 1.0242e+03 9.3710e+02 + 6.1150e+02 1.6105e+03 1.3595e+03 7.8860e+02 1.0030e+03 5.6330e+02 1.7940e+02 + 3.9150e+02 6.8050e+02 7.1420e+02 8.0160e+02 9.0860e+02 6.5870e+02 3.3790e+02 + 3.9520e+02 1.3081e+03 1.8685e+03 1.3360e+03 1.5225e+03 1.1704e+03 1.1533e+03 + 4.6000e+02 3.9000e+02 3.8550e+02 5.6780e+02 7.6070e+02 5.7720e+02 5.7810e+02 + 2.8930e+02 4.1170e+02 5.6470e+02 5.3700e+02 1.6924e+03 3.5000e+03 1.5884e+03 + 1.2589e+03 8.7150e+02 5.0400e+02 8.3060e+02 6.7350e+02 1.0723e+03 9.8110e+02 + 2.0969e+03 1.5359e+03 7.6830e+02 1.0590e+03 8.4720e+02 7.9560e+02 3.7480e+02 + 4.0540e+02 5.6360e+02 7.4050e+02 4.1040e+02 5.6990e+02 6.3580e+02 4.0610e+02 + 1.2159e+03 2.0427e+03 1.7425e+03 6.8890e+02 1.2010e+03 2.2120e+03 2.4149e+03 + 5.5770e+02 6.6450e+02 5.5370e+02 3.8970e+02 6.7200e+02 5.8950e+02 1.0594e+03 + 5.2170e+02 5.9520e+02 6.6630e+02 3.9580e+02 6.4780e+02 1.9268e+03 1.5963e+03 + 1.0184e+03 5.1860e+02 8.1640e+02 8.2830e+02 5.3270e+02 4.9930e+02 5.7440e+02 + 4.3720e+02 3.8490e+02 7.5500e+02 4.2420e+02 5.0730e+02 3.8710e+02 6.0290e+02 + 4.5050e+02 1.8010e+03 2.5501e+03 1.6887e+03 1.0313e+03 4.6160e+02 5.5410e+02 + 5.5530e+02 5.0450e+02 1.0603e+03 5.2980e+02 2.7450e+03 1.2114e+03 1.0395e+03 + 9.4750e+02 2.7280e+02 5.7580e+02 3.3250e+02 4.2890e+02 6.1900e+02 5.0810e+02 + 7.6070e+02 3.6600e+02 4.2430e+02 3.5540e+02 1.2983e+03 2.6011e+03 9.9940e+02 + 1.2083e+03 8.8930e+02 9.1610e+02 2.7903e+03 7.0980e+02 7.5430e+02 4.7890e+02 + 2.9790e+02 6.1060e+02 1.0976e+03 4.0850e+02 7.0820e+02 5.3930e+02 4.8370e+02 + 4.5960e+02 4.6300e+02 9.7330e+02 1.7770e+03 1.2952e+03 5.7920e+02 5.3540e+02 + 5.1430e+02 7.1390e+02 5.4610e+02 1.3580e+02 3.7500e+02 5.7540e+02 4.4420e+02 + 5.0740e+02 4.1330e+02 8.9300e+02 7.1740e+02 9.5670e+02 2.3482e+03 2.2518e+03 + 9.3440e+02 1.0731e+03 5.9060e+02 9.7790e+02 5.7380e+02 6.6500e+02 7.3320e+02 + 6.8040e+02 3.1012e+03 1.7843e+03 1.0235e+03 9.6370e+02 7.0100e+02 8.4960e+02 + 9.0310e+02 5.3490e+02 4.4700e+02 7.2070e+02 6.1620e+02 6.6320e+02 5.4860e+02 + 5.3270e+02 1.4002e+03 1.9148e+03 2.0486e+03 9.4520e+02 5.7860e+02 1.0150e+03 + 2.7878e+03 8.5640e+02 4.4170e+02 4.3930e+02 4.9070e+02 7.2950e+02 5.9590e+02 + 6.4480e+02 7.2340e+02 4.8680e+02 6.0420e+02 4.6530e+02 1.2120e+03 1.6896e+03 + 1.5521e+03 6.4950e+02 7.0680e+02 4.7030e+02 4.2410e+02 4.4660e+02 4.5360e+02 + 6.6070e+02 2.3460e+02 4.2960e+02 1.7940e+02 3.4160e+02 3.2180e+02 7.2140e+02 + 8.3590e+02 2.0203e+03 2.1273e+03 2.5090e+03 1.5742e+03 8.3150e+02 4.6780e+02 + 3.9900e+02 9.6810e+02 3.5640e+02 4.7740e+02 9.5060e+02 2.1115e+03 1.2818e+03 + 9.6800e+02 3.6290e+02 4.6520e+02 6.9000e+02 9.1640e+02 5.4550e+02 2.6770e+02 + 8.3740e+02 8.3410e+02 6.3860e+02 3.9920e+02 5.5850e+02 1.1647e+03 2.8084e+03 + 2.5623e+03 8.4370e+02 4.9230e+02 6.1590e+02 2.1663e+03 9.3110e+02 6.1550e+02 + 7.0130e+02 7.3850e+02 7.0810e+02 3.9080e+02 5.1960e+02 4.3490e+02 4.4740e+02 + 6.1430e+02 5.4650e+02 9.9620e+02 2.4012e+03 1.6042e+03 2.0390e+03 7.7880e+02 + 3.0020e+02 2.0150e+02 3.6180e+02 7.7230e+02 5.1740e+02 5.5910e+02 3.2300e+02 + 3.4010e+02 3.5600e+02 4.3570e+02 5.8340e+02 6.6610e+02 1.8106e+03 1.7912e+03 + 1.6471e+03 1.0658e+03 7.6020e+02 8.3250e+02 7.7780e+02 7.1010e+02 4.9760e+02 + 5.8210e+02 2.2398e+03 2.1842e+03 8.4440e+02 7.1310e+02 5.0610e+02 4.7100e+02 + 5.1430e+02 6.9300e+02 3.5140e+02 3.8560e+02 6.3680e+02 1.1121e+03 7.5810e+02 + 3.7530e+02 3.8790e+02 1.7139e+03 1.7414e+03 1.9302e+03 1.1159e+03 2.7230e+02 + 1.0817e+03 2.8436e+03 1.0550e+03 1.0488e+03 7.1760e+02 6.7850e+02 4.2900e+02 + 7.1430e+02 5.6160e+02 4.7740e+02 8.1360e+02 4.3830e+02 1.0294e+03 1.5441e+03 + 3.2137e+03 8.4100e+02 1.1442e+03 4.6890e+02 2.2190e+02 2.8900e+02 5.0360e+02 + 4.9990e+02 3.8960e+02 3.3830e+02 4.0980e+02 6.2050e+02 5.9880e+02 3.3760e+02 + 3.9730e+02 9.0070e+02 2.1852e+03 2.3648e+03 5.1430e+02 1.1610e+03 7.2270e+02 + 9.4940e+02 8.2840e+02 9.2740e+02 5.8150e+02 3.6200e+02 1.0991e+03 1.6462e+03 + 1.5413e+03 6.8110e+02 4.7300e+02 3.5240e+02 4.9960e+02 8.6130e+02 6.8030e+02 + 2.3590e+02 4.8020e+02 9.7470e+02 7.7470e+02 4.5210e+02 4.0670e+02 1.0257e+03 + 1.8894e+03 1.8170e+03 1.2768e+03 4.2370e+02 7.9930e+02 2.1933e+03 2.6618e+03 + 1.4404e+03 3.9210e+02 3.9880e+02 4.5780e+02 4.0970e+02 7.0950e+02 7.1690e+02 + 5.0230e+02 4.7990e+02 1.0738e+03 2.0843e+03 3.0588e+03 1.2250e+03 8.4490e+02 + 5.1940e+02 1.8890e+02 3.5280e+02 5.0590e+02 6.6880e+02 4.3590e+02 6.1230e+02 + 4.7610e+02 2.6530e+02 5.9550e+02 4.8590e+02 6.0120e+02 1.2262e+03 1.6265e+03 + 1.9509e+03 8.3350e+02 6.9850e+02 3.7460e+02 6.4280e+02 8.4670e+02 1.0488e+03 + 3.0690e+02 3.4870e+02 2.1283e+03 2.0715e+03 6.2050e+02 5.0720e+02 7.8580e+02 + 2.7180e+02 3.1850e+02 8.5810e+02 7.7540e+02 3.5720e+02 4.1220e+02 7.8570e+02 + 6.8440e+02 5.6550e+02 2.4470e+02 1.0054e+03 1.9970e+03 1.2472e+03 3.9310e+02 + 3.1050e+02 8.1160e+02 9.9890e+02 1.8336e+03 1.0234e+03 6.5530e+02 7.6570e+02 + 2.3000e+02 4.7850e+02 3.7950e+02 3.1290e+02 3.0890e+02 6.0430e+02 1.2232e+03 + 2.5111e+03 9.8340e+02 1.1435e+03 8.5960e+02 3.5950e+02 4.9330e+02 4.5920e+02 + 8.4810e+02 2.9540e+02 2.4000e+02 6.0730e+02 4.1820e+02 4.1570e+02 7.1830e+02 + 2.2630e+02 3.7300e+02 9.9200e+02 2.0360e+03 1.0145e+03 4.6200e+02 9.8350e+02 + 6.8850e+02 4.7620e+02 4.3930e+02 7.8300e+02 3.1990e+02 4.4040e+02 2.0583e+03 + 2.9530e+03 2.1079e+03 4.6800e+02 4.4550e+02 3.4110e+02 4.8160e+02 7.5230e+02 + 7.5450e+02 4.6370e+02 5.1740e+02 4.1570e+02 4.9640e+02 9.5350e+02 5.6660e+02 + 8.7090e+02 2.3472e+03 9.9580e+02 4.9890e+02 5.6920e+02 8.7900e+02 1.2734e+03 + 1.2429e+03 2.1990e+03 7.3160e+02 4.2210e+02 2.9750e+02 4.0950e+02 4.6980e+02 + 4.8490e+02 8.8040e+02 1.0345e+03 1.2221e+03 2.0971e+03 9.1800e+02 4.2860e+02 + 6.3070e+02 2.5590e+02 6.1820e+02 5.4840e+02 6.4550e+02 3.7640e+02 2.8980e+02 + 5.5160e+02 5.2870e+02 4.4020e+02 5.8720e+02 1.9460e+02 6.5370e+02 1.9051e+03 + 2.1894e+03 8.2380e+02 8.0810e+02 3.8730e+02 3.1570e+02 4.5150e+02 4.3740e+02 + 6.1940e+02 2.8870e+02 1.0826e+03 8.7220e+02 2.2737e+03 1.5301e+03 4.0170e+02 + 7.3130e+02 4.7290e+02 3.0740e+02 8.3090e+02 8.6640e+02 3.8620e+02 5.0100e+02 + 5.4290e+02 3.8780e+02 2.7970e+02 1.0577e+03 1.5943e+03 2.0879e+03 1.7112e+03 + 1.5846e+03 5.1980e+02 3.5630e+02 7.5420e+02 1.6849e+03 2.5322e+03 1.5579e+03 + 5.3370e+02 4.4420e+02 4.5380e+02 3.5100e+02 4.7650e+02 8.9790e+02 1.1654e+03 + 1.0849e+03 1.4516e+03 8.7980e+02 5.1220e+02 4.4910e+02 3.3190e+02 4.5800e+02 + 7.1190e+02 7.4690e+02 2.8370e+02 2.2390e+02 2.5340e+02 7.4550e+02 1.2884e+03 + 4.6090e+02 7.5800e+01 5.0930e+02 1.6383e+03 2.7128e+03 8.9430e+02 8.0060e+02 + 7.9990e+02 4.2440e+02 5.0050e+02 3.5700e+02 3.2230e+02 4.9790e+02 7.0280e+02 + 1.4653e+03 2.7323e+03 1.4108e+03 4.6050e+02 4.3180e+02 1.2290e+02 5.4170e+02 + 4.1120e+02 8.1740e+02 3.9430e+02 7.8040e+02 4.9280e+02 2.9840e+02 4.1640e+02 + 3.6950e+02 8.2310e+02 2.1740e+03 1.7924e+03 1.9613e+03 4.0310e+02 4.3640e+02 + 8.8930e+02 7.7810e+02 1.9485e+03 9.6160e+02 1.7562e+03 3.3250e+02 5.4350e+02 + 3.6600e+02 1.6511e+03 1.3461e+03 2.3107e+03 1.5978e+03 9.3950e+02 1.8239e+03 + 8.5190e+02 2.2270e+02 3.6020e+02 8.1510e+02 1.0513e+03 8.8200e+02 2.4580e+02 + 3.3520e+02 4.0030e+02 4.1070e+02 7.2990e+02 5.1910e+02 2.8540e+02 2.4820e+02 + 1.6432e+03 2.4213e+03 9.5260e+02 1.1537e+03 1.1711e+03 6.5420e+02 2.5400e+02 + 1.9660e+02 3.9990e+02 4.0780e+02 8.3330e+02 9.4100e+02 2.4084e+03 7.7880e+02 + 4.7930e+02 6.0420e+02 3.1500e+02 3.3550e+02 6.6700e+02 5.7680e+02 6.6890e+02 + 4.0790e+02 3.5720e+02 4.1020e+02 2.8240e+02 8.6970e+02 9.5400e+02 2.4108e+03 + 1.0348e+03 9.1400e+02 4.3280e+02 5.3900e+02 1.0223e+03 8.2100e+02 1.7341e+03 + 1.8689e+03 1.0041e+03 5.0470e+02 8.3030e+02 1.3879e+03 1.4450e+03 1.3720e+03 + 1.6767e+03 8.4780e+02 1.1970e+03 1.2261e+03 9.9540e+02 6.5970e+02 8.3200e+01 + 6.6660e+02 1.1267e+03 7.1890e+02 6.2260e+02 7.0940e+02 6.1820e+02 4.5740e+02 + 5.7390e+02 1.4950e+02 2.9860e+02 6.8030e+02 1.8540e+03 2.5373e+03 1.4019e+03 + 8.0620e+02 6.7130e+02 3.5220e+02 3.2580e+02 3.5080e+02 5.7290e+02 5.9570e+02 + 7.0050e+02 8.4230e+02 2.2241e+03 2.0379e+03 1.4631e+03 5.5850e+02 3.8740e+02 + 2.7550e+02 5.7200e+02 2.1580e+02 7.2350e+02 6.8680e+02 5.0230e+02 4.2410e+02 + 4.2390e+02 4.7750e+02 1.5214e+03 1.6344e+03 2.0314e+03 8.2800e+02 3.4930e+02 + 5.1700e+02 1.1238e+03 7.7570e+02 9.2690e+02 1.7932e+03 1.9712e+03 1.1038e+03 + 1.0440e+03 8.7230e+02 1.1511e+03 1.1478e+03 1.2565e+03 6.3980e+02 5.1780e+02 + 5.1430e+02 4.9470e+02 3.2000e+02 4.1680e+02 1.0055e+03 7.8100e+02 3.9270e+02 + 4.6190e+02 7.8070e+02 4.7860e+02 7.4300e+02 3.0700e+02 6.4630e+02 2.1490e+02 + 7.1680e+02 9.2900e+02 2.8671e+03 8.0000e+02 7.4910e+02 4.5210e+02 4.2370e+02 + 2.9570e+02 3.6930e+02 7.2410e+02 6.6580e+02 7.0350e+02 1.5194e+03 1.6433e+03 + 2.4210e+03 1.4464e+03 6.9530e+02 4.6190e+02 1.1473e+03 2.4190e+02 3.5890e+02 + 7.3880e+02 9.0550e+02 2.5120e+02 3.5920e+02 3.0860e+02 1.6040e+02 1.7021e+03 + 2.5962e+03 9.9020e+02 9.4900e+02 3.6570e+02 3.6170e+02 7.4540e+02 4.5500e+02 + 5.8820e+02 2.5816e+03 2.7623e+03 1.1010e+03 2.2862e+03 2.1249e+03 2.3297e+03 + 1.5725e+03 1.5509e+03 9.7950e+02 6.9330e+02 4.6350e+02 3.9300e+02 8.2760e+02 + 3.4140e+02 6.7800e+02 8.6220e+02 8.0120e+02 4.8280e+02 5.6150e+02 8.4530e+02 + 7.2070e+02 9.2200e+02 7.5310e+02 8.8370e+02 7.1900e+02 2.4368e+03 2.2040e+03 + 8.6940e+02 5.0680e+02 2.6080e+02 4.6860e+02 3.2140e+02 3.5550e+02 6.6310e+02 + 6.2300e+02 4.4820e+02 1.1527e+03 1.3342e+03 1.8007e+03 1.1633e+03 4.3020e+02 + 7.0590e+02 8.3850e+02 7.0770e+02 3.0210e+02 7.3940e+02 8.7360e+02 4.7100e+02 + 1.1040e+02 4.9250e+02 5.0000e+02 1.4600e+03 2.0086e+03 1.2567e+03 1.1389e+03 + 8.7360e+02 3.6440e+02 6.2750e+02 5.7350e+02 6.7810e+02 1.1895e+03 2.5807e+03 + 1.4687e+03 2.0618e+03 3.2175e+03 1.3666e+03 8.1700e+02 5.9720e+02 5.3610e+02 + 4.1470e+02 5.6060e+02 7.3310e+02 2.8260e+02 3.2510e+02 6.9590e+02 7.1920e+02 + 6.5930e+02 5.2010e+02 7.8320e+02 1.0062e+03 8.9070e+02 1.2394e+03 1.1018e+03 + 6.6860e+02 1.0207e+03 2.4846e+03 2.8717e+03 1.0772e+03 4.9550e+02 2.3430e+02 + 3.5140e+02 2.3150e+02 7.5960e+02 5.1240e+02 6.0450e+02 3.2980e+02 3.7750e+02 + 1.6519e+03 2.8720e+03 1.1274e+03 4.8310e+02 3.5470e+02 5.0100e+02 9.0740e+02 + 2.5760e+02 3.7010e+02 6.2070e+02 5.7100e+02 1.1100e+02 3.9110e+02 6.2720e+02 + 1.5098e+03 2.4280e+03 1.0247e+03 6.2480e+02 5.3270e+02 4.4800e+02 5.2890e+02 + 6.5060e+02 5.5940e+02 1.0817e+03 1.9029e+03 2.2914e+03 1.6628e+03 2.9892e+03 + 6.8160e+02 4.2730e+02 2.7040e+02 6.2330e+02 3.8320e+02 5.6800e+02 5.2830e+02 + 4.8830e+02 2.9220e+02 6.6640e+02 4.7660e+02 7.3320e+02 5.8390e+02 7.3760e+02 + 8.2200e+02 1.0498e+03 9.0780e+02 7.6550e+02 7.1360e+02 1.2502e+03 1.3372e+03 + 9.9050e+02 3.4820e+02 4.2800e+02 2.8200e+02 2.1960e+02 4.5090e+02 3.1700e+02 + 1.0392e+03 8.4950e+02 5.7760e+02 5.6160e+02 8.7700e+02 2.0731e+03 1.6580e+03 + 9.1770e+02 7.6010e+02 3.2000e+02 7.4010e+02 5.0060e+02 7.1150e+02 3.8380e+02 + 4.8680e+02 2.2240e+02 3.8800e+02 8.9270e+02 1.6080e+03 2.2371e+03 1.1941e+03 + 8.0170e+02 4.0070e+02 6.6310e+02 2*4.9920e+02 4.0800e+02 1.2144e+03 + 1.9985e+03 2.4894e+03 3.3280e+03 2.8131e+03 1.0748e+03 1.5020e+02 3.0450e+02 + 6.1950e+02 4.9290e+02 5.2080e+02 6.0210e+02 3.7080e+02 2.4670e+02 6.8250e+02 + 7.5320e+02 7.0870e+02 4.4670e+02 5.3810e+02 7.3770e+02 1.7515e+03 9.7700e+02 + 3.9590e+02 5.1080e+02 1.2987e+03 1.9116e+03 2.2715e+03 5.6750e+02 3.3520e+02 + 6.4310e+02 1.8840e+02 2.1580e+02 3.2960e+02 7.8320e+02 7.2720e+02 4.5060e+02 + 5.0360e+02 7.7420e+02 1.6631e+03 2.1328e+03 1.5265e+03 4.8250e+02 2.5370e+02 + 4.5590e+02 7.2720e+02 2.3520e+02 4.6410e+02 2.3110e+02 3.0790e+02 6.4320e+02 + 1.1333e+03 2.4877e+03 2.7628e+03 9.1630e+02 2.9950e+02 4.0300e+02 3.7580e+02 + 5.5330e+02 3.9050e+02 3.8110e+02 3.3700e+02 1.0020e+03 2.3107e+03 3.4234e+03 + 2.1188e+03 1.5981e+03 2.0370e+02 3.5330e+02 4.5050e+02 5.4160e+02 4.3510e+02 + 3.7010e+02 2.2800e+02 2.5500e+02 5.9100e+02 5.7900e+02 8.3350e+02 3.5700e+02 + 3.8950e+02 4.6560e+02 5.5630e+02 1.1591e+03 5.3200e+02 3.3060e+02 8.5940e+02 + 1.4824e+03 1.6372e+03 6.5770e+02 5.1960e+02 6.7470e+02 3.9550e+02 3.1180e+02 + 3.5400e+02 6.7440e+02 5.7910e+02 7.8850e+02 2.6350e+02 4.2640e+02 1.7630e+03 + 2.1138e+03 1.1485e+03 1.0695e+03 2.0250e+02 5.8300e+02 5.4840e+02 4.1040e+02 + 5.2630e+02 3.6000e+02 4.4280e+02 7.4530e+02 1.3186e+03 2.4956e+03 2.1051e+03 + 6.3110e+02 2.0470e+02 4.2610e+02 5.7680e+02 4.9810e+02 9.9960e+02 4.7660e+02 + 5.4250e+02 9.4760e+02 2.4266e+03 3.1768e+03 1.9216e+03 1.5110e+03 5.0260e+02 + 3.8580e+02 6.7110e+02 1.0582e+03 5.2000e+02 3.4310e+02 3.4980e+02 5.1180e+02 + 4.8630e+02 9.2740e+02 6.7740e+02 4.4740e+02 5.4480e+02 3.2780e+02 2.8000e+02 + 1.3316e+03 6.9020e+02 6.8550e+02 3.7740e+02 1.3953e+03 1.3651e+03 7.5610e+02 + 4.7360e+02 7.5850e+02 7.3580e+02 6.2280e+02 5.6520e+02 8.4460e+02 3.7810e+02 + 2.8740e+02 4.8670e+02 6.3760e+02 1.0580e+03 2.0859e+03 1.2893e+03 9.2260e+02 + 2.0310e+02 8.0550e+02 2.8970e+02 3.2630e+02 6.0660e+02 5.8830e+02 4.9320e+02 + 7.2990e+02 1.1960e+03 2.3362e+03 1.0629e+03 2.8440e+02 3.4690e+02 3.7510e+02 + 4.4020e+02 5.3920e+02 3.7520e+02 3.5870e+02 5.1950e+02 1.0679e+03 1.5898e+03 + 2.9490e+03 1.5922e+03 7.0770e+02 7.8020e+02 4.3400e+02 4.4720e+02 4.4990e+02 + 4.3560e+02 3.6660e+02 4.5410e+02 9.4410e+02 6.6280e+02 5.1010e+02 5.8810e+02 + 5.7490e+02 6.6580e+02 4.3440e+02 1.2180e+02 1.0819e+03 1.2887e+03 6.3280e+02 + 3.0950e+02 1.0833e+03 6.8600e+02 1.2021e+03 5.6120e+02 1.0141e+03 6.1090e+02 + 7.6500e+02 3.9670e+02 6.0670e+02 8.1760e+02 2.8010e+02 3.6820e+02 5.9020e+02 + 9.1600e+02 1.5047e+03 1.9522e+03 1.5424e+03 4.1170e+02 6.7330e+02 2.9950e+02 + 3.6410e+02 7.0150e+02 7.9690e+02 9.0630e+02 6.5660e+02 1.1244e+03 1.5135e+03 + 1.4911e+03 6.5370e+02 4.9420e+02 4.1550e+02 5.3120e+02 9.9820e+02 3.9340e+02 + 2.2570e+02 4.6690e+02 9.5030e+02 1.4822e+03 2.3102e+03 2.1219e+03 1.1773e+03 + 6.2720e+02 7.3960e+02 2.4090e+02 2.8380e+02 4.3950e+02 4.2550e+02 2.8580e+02 + 9.8170e+02 6.1550e+02 6.7860e+02 8.1180e+02 9.3340e+02 5.1490e+02 2.5610e+02 + 8.9400e+01 1.4334e+03 4.4250e+02 7.9210e+02 1.8361e+03 2.5132e+03 1.2980e+03 + 9.3530e+02 4.2550e+02 1.9670e+02 5.3600e+02 3.1967e+03 2.9274e+03 1.9592e+03 + 6.6450e+02 8.4810e+02 1.0513e+03 7.8510e+02 3.3870e+02 2.2830e+02 6.6970e+02 + 4.0790e+02 3.7063e+03 2.3945e+03 9.9330e+02 1.0272e+03 8.3610e+02 9.1050e+02 + 2.6635e+03 2.3023e+03 2.2436e+03 7.8800e+02 1.4686e+03 5.5250e+02 3.9690e+02 + 5.9780e+02 5.2740e+02 7.4480e+02 7.2490e+02 2.0638e+03 2.8476e+03 3.0629e+03 + 4.0983e+03 2.0032e+03 5.5060e+02 2.4640e+02 3.9090e+02 1.9000e+02 1.6280e+02 + 4.1710e+02 6.6350e+02 3.6270e+02 4.3380e+02 4.1490e+02 1.0265e+03 4.3900e+02 + 4.9090e+02 9.1690e+02 6.9650e+02 7.5220e+02 7.2140e+02 4.9580e+02 6.9750e+02 + 8.6940e+02 3.0378e+03 2.3150e+03 1.1521e+03 4.8370e+02 3.8270e+02 3.0680e+02 + 1.5123e+03 1.7875e+03 3.1796e+03 1.0415e+03 7.2750e+02 6.1010e+02 4.2220e+02 + 6.8770e+02 7.9280e+02 2.3020e+02 3.9950e+02 5.3740e+02 2.3430e+03 2.8660e+03 + 1.7105e+03 1.0660e+03 3.7000e+02 3.7370e+02 1.6972e+03 3.3309e+03 2.9078e+03 + 1.0865e+03 8.8870e+02 7.5620e+02 4.1950e+02 7.5070e+02 7.4500e+02 1.0395e+03 + 7.7720e+02 9.2950e+02 1.5482e+03 2*4.9000e+03 2.5536e+03 1.0246e+03 + 5.3520e+02 7.1270e+02 2.0140e+02 1.6420e+02 3.9540e+02 2.8880e+02 1.8290e+02 + 2.2170e+02 4.5200e+02 7.3800e+02 6.7090e+02 6.9400e+02 8.6150e+02 8.6810e+02 + 5.5460e+02 7.1740e+02 3.3590e+02 1.2852e+03 1.0558e+03 3.1506e+03 1.2363e+03 + 1.0343e+03 4.1530e+02 2.8470e+02 3.1720e+02 8.1720e+02 3.7348e+03 2.7831e+03 + 1.5889e+03 4.5580e+02 4.2160e+02 2.4810e+02 4.2210e+02 3.1110e+02 3.3420e+02 + 4.3820e+02 6.1990e+02 2.0267e+03 3.8566e+03 1.1989e+03 7.3490e+02 4.3470e+02 + 3.5670e+02 2.0010e+03 2.0332e+03 2.2434e+03 2.5097e+03 1.2270e+03 5.8560e+02 + 4.5680e+02 9.9840e+02 5.8840e+02 7.3750e+02 3.4840e+02 4.7640e+02 2.3408e+03 + 4.5871e+03 3.2152e+03 4.2749e+03 1.5989e+03 1.4119e+03 1.0412e+03 4.5180e+02 + 2.2180e+02 8.3620e+02 4.6100e+02 3.4670e+02 4.8020e+02 7.5510e+02 6.3450e+02 + 7.2310e+02 4.4010e+02 6.0380e+02 6.7480e+02 5.2160e+02 6.4530e+02 1.4868e+03 + 1.6855e+03 2.3309e+03 2.5499e+03 2.0933e+03 4.1020e+02 4.5400e+02 3.6490e+02 + 6.8500e+02 2.2212e+03 3.5140e+03 1.8031e+03 8.9480e+02 3.8810e+02 3.9700e+02 + 7.0280e+02 4.1620e+02 3.5590e+02 4.9170e+02 4.9860e+02 2.6930e+02 1.9907e+03 + 2.8141e+03 2.1197e+03 7.0720e+02 3.2910e+02 4.1900e+02 7.8600e+02 2.1589e+03 + 3.1861e+03 2.6788e+03 1.4245e+03 3.8100e+02 8.1780e+02 9.9000e+02 8.8980e+02 + 4.2150e+02 3.4820e+02 4.5740e+02 1.0475e+03 2.9548e+03 3.1223e+03 2.6900e+03 + 3.4622e+03 1.2827e+03 8.6840e+02 5.4970e+02 2.4410e+02 5.5580e+02 4.7270e+02 + 5.3320e+02 4.9620e+02 5.5200e+02 5.0450e+02 5.2640e+02 5.3760e+02 3.2610e+02 + 3.4630e+02 5.6750e+02 1.1238e+03 1.4813e+03 2.3655e+03 2.4979e+03 2.5356e+03 + 1.0284e+03 3.3080e+02 5.8070e+02 6.3410e+02 6.5240e+02 1.9950e+03 2.2926e+03 + 2.4101e+03 7.2800e+02 5.5260e+02 2.9370e+02 6.8850e+02 3.8580e+02 3.4580e+02 + 5.0740e+02 6.8190e+02 3.4670e+02 1.9806e+03 2.9374e+03 2.5971e+03 1.2121e+03 + 6.3710e+02 5.5760e+02 1.3465e+03 8.8280e+02 1.5442e+03 1.0918e+03 2.9044e+03 + 1.2612e+03 1.2658e+03 6.3040e+02 3.3600e+02 4.5970e+02 3.0010e+02 6.0270e+02 + 1.8379e+03 2.8448e+03 3.8213e+03 1.8308e+03 3.8657e+03 1.6776e+03 7.6160e+02 + 3.8990e+02 3.9340e+02 3.3140e+02 5.8480e+02 4.9440e+02 1.0255e+03 1.6720e+02 + 2.4500e+02 2.4950e+02 7.7150e+02 3.9160e+02 2.7800e+02 7.5830e+02 1.1432e+03 + 1.7211e+03 1.5316e+03 3.0671e+03 3.1778e+03 5.3710e+02 3.0920e+02 5.0060e+02 + 1.0997e+03 7.4530e+02 2.2503e+03 3.5465e+03 2.4240e+03 4.9060e+02 4.9190e+02 + 4.1450e+02 5.7410e+02 2.4910e+02 1.9150e+02 5.5310e+02 4.4740e+02 4.1790e+02 + 1.3203e+03 2.4362e+03 2.3996e+03 1.4920e+03 7.8850e+02 5.3530e+02 6.8850e+02 + 6.8030e+02 1.1484e+03 2.0132e+03 2.2897e+03 2.8809e+03 1.0259e+03 3.0970e+02 + 6.7350e+02 2.5170e+02 2.8880e+02 3.2330e+02 2.9644e+03 2.5602e+03 2.8181e+03 + 3.4430e+03 3.7388e+03 2.5585e+03 5.9480e+02 3.9440e+02 3.7440e+02 4.1560e+02 + 8.5740e+02 7.5890e+02 3.4950e+02 1.5510e+02 1.5160e+02 5.7680e+02 9.5560e+02 + 2.3840e+02 5.9840e+02 8.1310e+02 1.7330e+03 2.9747e+03 2.7895e+03 2.5463e+03 + 1.8952e+03 7.0320e+02 2.6830e+02 4.8820e+02 4.9030e+02 5.7660e+02 1.8374e+03 + 2.5314e+03 1.7820e+03 1.1213e+03 4.6720e+02 3.4450e+02 7.6130e+02 2.5690e+02 + 2.9090e+02 3.6110e+02 3.8390e+02 6.6100e+02 1.3080e+03 2.1621e+03 2.6337e+03 + 1.7287e+03 6.9490e+02 6.8300e+02 8.6780e+02 4.9520e+02 1.0744e+03 2.4426e+03 + 2.7175e+03 2.5032e+03 2.7645e+03 9.4750e+02 7.2410e+02 7.3800e+02 1.4200e+02 + 3.1660e+02 1.2029e+03 1.5815e+03 1.3678e+03 2.8119e+03 2.5567e+03 2.3404e+03 + 5.3630e+02 2.5200e+02 5.6810e+02 4.6320e+02 7.4310e+02 8.4180e+02 2.6330e+02 + 4.9130e+02 5.2620e+02 4.0400e+02 5.8880e+02 3.6100e+02 3.4230e+02 5.8510e+02 + 2.1218e+03 2.3701e+03 3.7102e+03 2.6592e+03 1.1789e+03 2.6690e+02 3.7470e+02 + 8.6580e+02 6.1320e+02 4.4430e+02 1.4909e+03 3.4518e+03 2.1597e+03 5.4340e+02 + 4.6570e+02 7.6870e+02 2.5040e+02 2.3750e+02 3.2790e+02 5.3020e+02 3.2490e+02 + 2.8530e+02 6.5580e+02 2.6472e+03 3.1970e+03 1.6140e+03 5.3170e+02 4.9110e+02 + 5.3450e+02 3.6770e+02 6.0310e+02 1.2976e+03 2.0338e+03 2.2992e+03 2.7947e+03 + 1.9837e+03 6.2420e+02 3.9350e+02 4.0520e+02 4.1750e+02 2.3584e+03 2.6336e+03 + 2.4201e+03 2.4862e+03 2.1051e+03 2.2745e+03 6.1500e+02 3.7720e+02 3.7170e+02 + 6.4490e+02 5.4640e+02 6.1100e+02 4.9650e+02 2.2230e+02 4.3650e+02 7.5020e+02 + 2.4360e+02 2.1870e+02 5.0520e+02 5.9580e+02 1.8993e+03 3.4245e+03 2.9993e+03 + 3.4139e+03 7.3470e+02 1.6000e+02 5.0880e+02 6.4810e+02 4.0010e+02 3.3640e+02 + 6.2180e+02 3.4337e+03 2.3077e+03 8.8410e+02 6.9270e+02 6.7890e+02 8.5100e+02 + 2.3970e+02 4.6820e+02 4.7910e+02 3.1420e+02 2.4180e+02 5.9930e+02 1.4473e+03 + 2.9316e+03 1.1750e+03 1.1214e+03 3.9370e+02 4.8720e+02 4.2350e+02 4.9330e+02 + 8.1110e+02 8.6710e+02 2.0070e+03 2.5519e+03 2.1314e+03 9.3500e+02 2.7430e+02 + 2.2710e+02 6.6190e+02 1.6759e+03 2.6410e+03 1.7590e+03 2.3658e+03 2.0864e+03 + 1.6311e+03 9.1320e+02 3.6280e+02 3.5910e+02 1.0943e+03 5.1610e+02 3.1950e+02 + 4.4490e+02 3.8660e+02 6.3170e+02 5.5120e+02 3.6560e+02 2.4430e+02 6.9100e+02 + 7.0340e+02 2.4584e+03 3.1806e+03 2.9487e+03 2.6460e+03 7.8340e+02 5.2990e+02 + 3.1140e+02 1.2919e+03 6.2580e+02 2.9710e+02 1.1103e+03 2.6254e+03 1.2086e+03 + 8.1460e+02 7.2400e+02 6.0040e+02 5.2880e+02 5.8610e+02 4.4080e+02 4.8750e+02 + 1.7040e+02 2.2060e+02 5.3610e+02 1.9822e+03 2.5880e+03 1.3053e+03 2.9900e+02 + 4.6440e+02 6.4980e+02 4.9470e+02 4.9770e+02 5.1270e+02 5.5980e+02 1.1942e+03 + 2.5374e+03 2.4679e+03 2.0172e+03 9.4190e+02 4.9390e+02 1.2180e+03 2.5734e+03 + 2.0623e+03 9.1760e+02 1.5726e+03 2.7761e+03 1.2564e+03 7.0940e+02 3.0390e+02 + 2.4470e+02 4.5380e+02 3.9030e+02 1.5550e+02 2.4000e+02 3.3900e+02 8.2060e+02 + 7.9600e+02 3.7030e+02 3.9580e+02 6.0500e+02 5.2460e+02 2.7335e+03 3.4445e+03 + 2.0030e+03 3.1801e+03 1.1941e+03 3.0550e+02 5.8780e+02 8.2880e+02 6.3800e+02 + 2.2860e+02 9.7400e+02 1.3101e+03 2.1508e+03 5.6760e+02 5.9210e+02 3.8370e+02 + 6.6160e+02 7.6190e+02 3.6860e+02 5.2330e+02 4.6230e+02 3.8380e+02 5.1100e+02 + 2.3955e+03 4.0033e+03 1.4632e+03 3.4880e+02 2.4090e+02 4.7100e+02 9.9680e+02 + 5.9170e+02 3.8680e+02 4.2280e+02 8.5180e+02 2.3212e+03 3.9843e+03 1.5860e+03 + 9.8160e+02 7.9240e+02 7.9030e+02 3.7697e+03 2.1426e+03 9.9970e+02 1.0561e+03 + 2.6387e+03 1.7180e+03 7.8720e+02 3.8580e+02 3.6490e+02 3.7750e+02 4.1780e+02 + 3.3080e+02 1.8430e+02 4.1420e+02 6.0180e+02 5.9570e+02 2.6750e+02 7.7990e+02 + 6.9070e+02 1.4842e+03 1.7382e+03 2.5795e+03 2.0626e+03 2.8823e+03 1.8241e+03 + 5.1820e+02 5.7870e+02 1.0487e+03 3.9830e+02 2.4760e+02 6.9370e+02 1.8993e+03 + 2.6895e+03 5.3800e+02 4.2260e+02 4.8530e+02 5.3050e+02 6.6130e+02 3.4410e+02 + 6.2170e+02 5.2970e+02 6.7790e+02 4.2970e+02 2.2300e+03 3.7284e+03 1.9940e+03 + 5.2840e+02 3.5520e+02 2.6590e+02 6.5520e+02 5.6830e+02 2.7150e+02 3.2470e+02 + 7.0620e+02 9.2210e+02 3.8272e+03 2.6604e+03 1.2471e+03 8.5380e+02 1.9919e+03 + 2.8358e+03 1.6622e+03 1.0000e+03 3.3161e+03 2.5024e+03 9.4070e+02 7.5160e+02 + 4.1360e+02 2.1120e+02 4.0330e+02 4.6280e+02 6.3730e+02 4.4180e+02 4.2580e+02 + 8.5520e+02 6.9950e+02 2.9890e+02 1.9150e+02 5.9260e+02 1.1538e+03 2.7247e+03 + 1.9628e+03 2.0093e+03 3.9837e+03 7.2230e+02 6.6130e+02 6.3460e+02 9.0300e+02 + 3.5600e+02 4.0030e+02 5.5780e+02 2.3300e+03 2.8481e+03 1.9138e+03 5.1320e+02 + 6.1050e+02 8.0180e+02 3.0910e+02 3.7320e+02 5.8750e+02 4.4310e+02 7.4950e+02 + 5.3470e+02 1.2356e+03 2.5961e+03 2.5601e+03 4.1110e+02 2.0680e+02 6.9160e+02 + 1.0849e+03 6.5120e+02 6.0750e+02 6.3040e+02 1.7280e+02 5.6900e+02 2.6698e+03 + 1.9140e+03 2.6849e+03 1.3417e+03 2.2434e+03 2.0402e+03 1.8248e+03 1.4196e+03 + 3.3275e+03 2.8990e+03 1.3652e+03 4.6630e+02 3.9900e+02 3.5760e+02 2.2720e+02 + 4.2910e+02 2.9100e+02 4.8450e+02 3.1620e+02 4.1150e+02 5.9230e+02 2.5330e+02 + 4.7940e+02 8.2740e+02 1.9934e+03 2.9694e+03 1.2618e+03 1.1886e+03 4.1917e+03 + 1.3424e+03 1.1118e+03 1.4292e+03 6.0710e+02 5.9540e+02 4.2620e+02 5.6010e+02 + 1.3721e+03 3.4046e+03 2.2168e+03 5.4480e+02 3.9330e+02 3.2860e+02 5.1970e+02 + 4.5200e+02 7.7600e+02 4.3650e+02 9.7630e+02 9.2180e+02 1.9972e+03 3.8505e+03 + 1.7342e+03 5.2270e+02 1.6280e+02 3.1800e+02 7.8230e+02 5.4550e+02 6.7020e+02 + 2.8390e+02 2.8340e+02 1.8610e+02 2.2986e+03 3.0690e+03 2.3951e+03 1.6768e+03 + 2.4487e+03 2.1314e+03 1.1260e+03 1.8336e+03 1.6627e+03 2.3408e+03 9.0410e+02 + 5.6420e+02 6.5520e+02 4.3570e+02 2.3890e+02 3.8250e+02 6.8390e+02 4.8120e+02 + 4.0920e+02 7.2090e+02 6.1890e+02 1.5630e+02 1.4130e+02 6.9440e+02 1.7341e+03 + 2.6209e+03 2.2496e+03 2.3968e+03 2.9479e+03 2.3379e+03 8.4040e+02 8.3890e+02 + 4.6330e+02 7.7600e+02 8.6420e+02 4.9330e+02 7.2510e+02 3.8037e+03 3.5009e+03 + 1.0003e+03 5.2120e+02 4.5760e+02 8.0390e+02 5.7590e+02 4.2190e+02 8.3710e+02 + 1.0953e+03 8.9330e+02 2.6133e+03 3.7930e+03 9.3420e+02 4.8820e+02 2.1030e+02 + 5.9710e+02 4.8220e+02 7.0110e+02 6.5750e+02 3.5360e+02 4.7330e+02 3.1090e+02 + 1.0672e+03 2.2024e+03 4.2361e+03 2.3698e+03 1.5704e+03 1.0952e+03 9.2050e+02 + 1.6402e+03 3.0926e+03 2.9593e+03 5.0050e+02 4.4420e+02 3.6950e+02 3.1680e+02 + 2.4090e+02 3.6660e+02 3.7520e+02 3.8370e+02 7.3910e+02 7.3000e+02 6.1200e+02 + 4.9530e+02 4.5850e+02 6.3760e+02 1.3194e+03 2.3172e+03 2.3783e+03 2.3537e+03 + 3.5564e+03 9.7820e+02 7.3200e+02 5.0000e+02 3.1670e+02 8.3240e+02 1.1582e+03 + 6.2570e+02 8.2520e+02 1.8082e+03 2.8692e+03 2.6038e+03 4.5790e+02 6.0380e+02 + 6.4950e+02 4.4350e+02 7.5610e+02 5.5230e+02 8.8320e+02 1.5201e+03 3.1086e+03 + 2.7401e+03 1.2817e+03 5.9960e+02 3.7200e+02 8.7860e+02 6.4690e+02 4.1250e+02 + 3.2140e+02 4.5760e+02 4.8350e+02 3.0650e+02 1.5153e+03 2.6815e+03 4.6785e+03 + 2.8615e+03 2.4851e+03 1.3262e+03 3.1120e+02 9.2010e+02 3.6143e+03 1.9838e+03 + 3.6560e+02 4.9030e+02 1.9940e+02 3.7430e+02 2.9190e+02 3.3540e+02 4.0310e+02 + 2.4430e+02 4.2940e+02 1.1640e+03 1.0382e+03 4.0250e+02 2.6450e+02 6.2490e+02 + 1.6790e+03 3.4399e+03 2.0499e+03 2.9700e+03 4.0632e+03 2.1035e+03 5.2710e+02 + 2.2360e+02 4.8890e+02 8.0700e+02 5.0010e+02 6.2930e+02 9.0670e+02 1.4137e+03 + 3.0793e+03 3.5360e+03 1.1486e+03 6.5210e+02 5.1380e+02 4.4290e+02 4.3560e+02 + 4.8260e+02 5.9890e+02 2.0549e+03 2.2254e+03 2.5344e+03 1.2530e+03 7.8910e+02 + 6.5010e+02 4.6910e+02 3.0990e+02 3.4490e+02 4.9950e+02 6.7900e+02 3.2420e+02 + 6.8280e+02 4.6960e+02 3.1194e+03 3.7457e+03 4.9000e+03 1.9870e+03 7.2600e+02 + 3.5640e+02 9.4300e+02 3.4034e+03 2.2843e+03 5.3250e+02 4.8370e+02 3.9700e+02 + 2.6230e+02 6.6460e+02 4.6180e+02 4.4760e+02 1.6380e+02 2.8380e+02 6.1650e+02 + 7.7130e+02 4.2150e+02 4.9160e+02 6.7290e+02 5.2430e+02 2.3476e+03 3.2285e+03 + 1.1452e+03 4.7222e+03 1.8756e+03 3.7370e+02 3.1620e+02 3.1190e+02 5.2600e+02 + 5.1340e+02 6.5040e+02 3.5290e+02 2.1457e+03 2.2615e+03 3.6509e+03 1.2050e+03 + 4.6550e+02 4.3360e+02 1.8060e+02 4.7570e+02 2.1430e+02 9.2030e+02 1.6130e+03 + 4.1831e+03 2.6754e+03 7.9950e+02 4.9480e+02 2.1350e+02 6.6640e+02 1.3677e+03 + 6.7760e+02 3.5420e+02 5.7500e+02 3.6360e+02 4.1810e+02 8.9970e+02 2.3422e+03 + 4.9000e+03 3.3546e+03 6.4840e+02 5.8970e+02 7.2880e+02 1.3965e+03 2.8609e+03 + 2.4428e+03 7.1130e+02 6.7450e+02 3.8940e+02 2.2900e+02 3.8430e+02 3.8220e+02 + 5.2870e+02 1.9690e+02 2.2110e+02 7.2600e+02 8.1010e+02 3.8220e+02 4.0120e+02 + 5.1080e+02 8.1290e+02 1.8469e+03 1.8989e+03 2.5292e+03 3.8786e+03 1.5563e+03 + 3.2380e+02 3.4430e+02 7.9320e+02 6.4800e+02 5.0610e+02 4.1500e+02 5.3700e+02 + 7.0260e+02 1.2468e+03 2.7664e+03 2.8091e+03 1.1177e+03 8.6260e+02 1.5890e+02 + 1.4270e+02 3.2990e+02 3.8990e+02 3.0529e+03 2.8436e+03 2.3623e+03 7.7660e+02 + 4.4270e+02 4.1230e+02 5.2540e+02 6.5700e+02 5.3880e+02 4.2100e+02 3.5830e+02 + 6.1340e+02 6.1320e+02 4.7940e+02 3.1391e+03 4.6477e+03 4.6553e+03 4.2030e+02 + 5.5830e+02 6.0880e+02 1.3632e+03 2.7058e+03 4.5787e+03 2.0466e+03 5.3760e+02 + 3.2430e+02 1.4450e+02 5.7290e+02 1.0248e+03 9.1350e+02 6.4860e+02 3.0550e+02 + 6.5700e+02 5.2490e+02 4.9330e+02 7.7900e+02 3.1370e+02 2.2550e+02 1.4307e+03 + 1.6524e+03 2.5821e+03 4.1472e+03 1.5309e+03 2.9320e+02 5.3090e+02 9.9220e+02 + 9.1900e+02 1.4550e+02 1.7780e+02 3.0610e+02 5.6360e+02 1.9662e+03 2.0558e+03 + 2.6318e+03 1.6776e+03 8.8220e+02 2.9930e+02 1.9100e+02 3.3810e+02 9.1150e+02 + 3.5916e+03 2.8288e+03 1.7353e+03 8.7050e+02 7.8510e+02 6.2560e+02 2.3890e+02 + 6.0530e+02 4.1840e+02 5.3170e+02 5.3000e+02 7.2330e+02 4.2030e+02 5.9780e+02 + 3.1077e+03 4.0458e+03 4.2533e+03 5.8690e+02 2.5960e+02 3.8180e+02 1.1266e+03 + 2.7176e+03 3.6057e+03 1.7484e+03 8.0390e+02 7.5720e+02 2.5880e+02 1.1417e+03 + 6.8620e+02 8.8340e+02 4.1000e+02 4.5840e+02 6.0750e+02 2.5060e+02 5.9790e+02 + 8.4950e+02 2.9360e+02 9.8900e+01 8.9220e+02 2.7261e+03 1.6833e+03 2.8102e+03 + 2.5955e+03 6.9600e+02 4.0810e+02 1.1372e+03 6.8840e+02 2.9030e+02 2.3650e+02 + 4.4500e+02 2.5210e+02 8.6480e+02 1.6753e+03 2.8791e+03 2.0772e+03 7.4430e+02 + 5.0900e+02 3.9810e+02 4.4170e+02 1.2328e+03 3.8368e+03 2.1260e+03 1.1757e+03 + 7.5340e+02 7.3650e+02 5.3870e+02 1.9250e+02 4.6710e+02 2.8860e+02 7.7070e+02 + 2.4580e+02 3.8620e+02 4.7090e+02 1.5802e+03 3.6843e+03 4.4999e+03 1.6510e+03 + 7.7540e+02 1.7960e+02 2.6060e+02 5.4890e+02 2.3101e+03 3.5700e+03 2.1198e+03 + 6.4910e+02 7.5890e+02 5.0960e+02 1.0474e+03 9.7270e+02 5.3810e+02 7.4700e+02 + 4.9740e+02 8.3190e+02 2.6350e+02 7.0520e+02 5.0910e+02 4.1810e+02 9.4100e+01 + 5.3210e+02 2.6984e+03 1.0011e+03 2.7297e+03 3.0901e+03 8.2290e+02 5.2830e+02 + 7.6720e+02 1.0580e+03 3.8020e+02 6.5230e+02 4.1670e+02 4.5680e+02 5.0700e+02 + 2.7317e+03 1.9890e+03 3.0262e+03 1.2339e+03 6.0250e+02 5.8530e+02 9.6420e+02 + 2.3188e+03 2.4329e+03 2.1655e+03 4.3950e+02 4.2980e+02 8.2510e+02 5.3780e+02 + 4.1400e+02 2.1030e+02 4.3230e+02 5.9580e+02 4.8690e+02 3.8600e+02 5.0510e+02 + 2.5215e+03 4.3868e+03 3.7815e+03 2.2242e+03 7.2080e+02 3.0500e+02 1.3490e+02 + 5.7120e+02 1.3799e+03 2.0002e+03 2.2361e+03 1.1974e+03 1.0581e+03 8.3360e+02 + 1.1306e+03 8.9380e+02 2.9540e+02 6.4740e+02 6.6290e+02 5.4900e+02 5.8450e+02 + 6.7520e+02 6.9670e+02 5.8110e+02 8.9890e+02 6.6260e+02 2.7898e+03 4.4160e+02 + 3.4179e+03 3.0589e+03 7.5540e+02 6.4280e+02 2.9680e+02 3.8930e+02 2.6440e+02 + 4.7180e+02 2.7250e+02 3.8800e+02 8.5570e+02 1.0370e+03 3.1126e+03 2.4794e+03 + 2.0095e+03 7.7190e+02 6.8250e+02 1.2421e+03 2.6699e+03 1.9771e+03 5.8940e+02 + 5.2060e+02 4.7990e+02 5.1680e+02 6.6640e+02 4.5080e+02 5.8530e+02 4.4190e+02 + 8.9240e+02 2.1730e+02 5.8780e+02 1.1825e+03 1.7262e+03 4.9000e+03 4.1855e+03 + 1.7998e+03 5.9960e+02 3.4930e+02 1.9900e+02 6.5220e+02 1.0608e+03 2.7634e+03 + 2.2480e+03 2.6931e+03 2.3683e+03 5.9620e+02 9.4060e+02 8.1190e+02 7.5010e+02 + 6.6030e+02 4.6270e+02 4.2020e+02 6.2910e+02 4.4240e+02 4.2300e+02 8.1780e+02 + 8.1200e+02 6.5820e+02 2.9988e+03 3.5300e+02 2.6586e+03 4.9000e+03 1.2259e+03 + 6.2720e+02 3.4880e+02 4.5180e+02 3.8570e+02 5.2540e+02 2.4320e+02 2.6780e+02 + 5.2050e+02 9.1220e+02 9.6970e+02 3.9114e+03 2.5021e+03 1.8290e+03 2.0311e+03 + 2.4316e+03 2.6348e+03 1.3034e+03 4.9830e+02 4.6190e+02 5.6800e+02 7.7840e+02 + 3.7040e+02 3.5790e+02 4.2750e+02 7.0300e+02 4.1070e+02 2.8520e+02 5.1590e+02 + 1.4081e+03 2.4801e+03 3.1641e+03 4.0004e+03 2.3151e+03 4.7970e+02 4.3850e+02 + 3.8510e+02 2.2680e+02 1.0707e+03 1.8333e+03 2.0523e+03 2.2989e+03 1.9607e+03 + 1.9092e+03 1.4162e+03 6.8710e+02 9.0840e+02 7.6330e+02 9.7320e+02 8.8220e+02 + 6.0780e+02 4.1780e+02 2.7130e+02 1.0220e+03 1.2019e+03 8.5900e+02 2.5241e+03 + 4.2690e+02 1.3694e+03 4.9000e+03 2.4700e+03 5.0880e+02 4.3800e+02 3.5860e+02 + 2.7900e+02 3.6120e+02 2.2580e+02 4.0910e+02 2.9040e+02 7.7270e+02 7.3500e+02 + 1.7840e+03 2.5858e+03 1.8554e+03 3.8777e+03 2.3034e+03 3.1962e+03 9.8450e+02 + 6.1050e+02 4.9160e+02 3.8060e+02 5.1660e+02 3.7900e+02 3.6350e+02 3.7690e+02 + 5.2050e+02 1.7440e+02 4.4470e+02 7.8860e+02 1.8798e+03 3.3460e+03 3.3662e+03 + 4.3170e+03 1.0231e+03 6.7040e+02 5.7320e+02 7.8750e+02 4.0750e+02 5.4770e+02 + 1.4601e+03 1.6501e+03 1.4746e+03 2.9707e+03 2.9444e+03 2.8413e+03 1.3463e+03 + 1.1547e+03 8.9770e+02 8.2970e+02 1.0109e+03 1.2044e+03 5.4780e+02 3.2600e+02 + 6.1720e+02 7.4540e+02 1.2833e+03 3.3339e+03 3.3930e+02 1.0091e+03 3.5297e+03 + 3.2163e+03 5.4440e+02 5.5530e+02 6.4250e+02 2.2010e+02 3.0990e+02 1.0215e+03 + 8.4330e+02 4.8310e+02 3.4930e+02 4.1190e+02 2.0796e+03 2.1406e+03 4.3741e+03 + 3.1597e+03 2.2439e+03 2.6002e+03 3.4720e+02 3.0270e+02 5.2240e+02 4.8800e+02 + 4.2640e+02 3.1490e+02 3.1090e+02 9.6890e+02 3.0970e+02 3.0450e+02 4.6800e+02 + 6.4800e+02 1.7061e+03 4.3607e+03 4.9000e+03 2.8547e+03 6.5110e+02 4.5230e+02 + 5.2030e+02 6.6320e+02 2.9000e+02 4.5040e+02 5.7880e+02 4.8620e+02 2.4094e+03 + 2.2814e+03 2.4663e+03 2.2936e+03 1.5902e+03 1.7640e+03 3.0180e+03 1.3970e+03 + 1.5925e+03 1.0698e+03 4.8590e+02 4.1420e+02 5.8600e+02 6.1540e+02 1.5703e+03 + 3.1082e+03 2.8720e+02 5.6030e+02 1.4639e+03 2.8731e+03 1.7123e+03 1.2114e+03 + 8.4460e+02 1.9650e+02 4.2130e+02 4.8980e+02 7.7620e+02 5.5920e+02 6.1170e+02 + 7.9780e+02 1.2130e+03 3.3091e+03 4.9000e+03 2.9450e+03 1.9458e+03 8.6270e+02 + 9.1570e+02 5.3570e+02 4.4250e+02 4.7380e+02 2.8870e+02 3.3530e+02 4.8930e+02 + 7.4910e+02 3.5450e+02 5.1060e+02 5.4670e+02 8.2690e+02 2.0951e+03 2.8554e+03 + 4.1959e+03 2.3563e+03 5.7990e+02 3.6470e+02 1.5869e+03 5.8690e+02 1.7610e+02 + 2.8090e+02 5.8050e+02 4.4730e+02 4.8860e+02 9.0270e+02 1.2197e+03 1.9700e+03 + 1.3741e+03 1.2411e+03 1.6814e+03 2.3494e+03 2.3337e+03 7.5300e+02 9.8790e+02 + 5.2030e+02 6.6530e+02 5.8360e+02 2.6229e+03 2.7562e+03 3.0270e+02 9.0140e+02 + 1.3329e+03 2.6655e+03 3.1903e+03 1.6907e+03 7.3960e+02 2.6360e+02 2.2680e+02 + 6.4950e+02 6.0430e+02 4.4560e+02 9.0450e+02 5.9070e+02 1.3805e+03 2.9898e+03 + 4.9000e+03 1.9051e+03 1.2596e+03 1.2534e+03 8.1240e+02 3.0830e+02 3.0340e+02 + 4.3180e+02 7.5610e+02 5.6740e+02 4.5690e+02 3.7460e+02 5.4440e+02 4.6420e+02 + 1.2878e+03 1.3041e+03 3.3479e+03 3.6148e+03 4.6609e+03 2.0406e+03 2.7690e+02 + 8.1750e+02 1.6786e+03 4.8970e+02 2.7870e+02 2.0490e+02 5.3130e+02 3.7240e+02 + 1.6790e+02 5.6100e+02 9.3070e+02 8.8630e+02 5.7550e+02 2.2793e+03 1.6777e+03 + 1.9638e+03 1.2112e+03 1.0216e+03 2.1173e+03 1.5582e+03 4.6240e+02 1.2122e+03 + 2.9810e+03 2.7422e+03 3.0160e+02 5.8270e+02 1.8396e+03 1.9038e+03 1.7991e+03 + 2.3882e+03 1.0521e+03 2.6840e+02 6.8540e+02 7.1000e+02 5.6830e+02 4.6070e+02 + 1.0580e+03 2.5910e+03 2.4893e+03 3.6983e+03 4.9000e+03 1.9404e+03 4.5490e+02 + 6.7180e+02 7.8630e+02 5.1180e+02 5.0410e+02 4.2650e+02 5.4610e+02 4.6470e+02 + 4.2380e+02 2.2720e+02 3.3000e+02 6.9860e+02 7.0440e+02 2.4484e+03 3.3047e+03 + 2.5153e+03 2.8544e+03 1.4685e+03 8.3590e+02 7.2540e+02 1.0181e+03 4.8410e+02 + 7.9760e+02 3.9820e+02 7.3850e+02 6.4350e+02 3.1680e+02 2.2980e+02 4.7520e+02 + 6.5340e+02 1.3243e+03 5.6500e+02 1.0781e+03 1.4656e+03 2.7384e+03 2.3830e+03 + 2.2281e+03 1.8631e+03 2.4709e+03 2.3901e+03 1.6487e+03 1.6558e+03 7.1500e+02 + 8.0360e+02 7.7420e+02 1.0157e+03 2.9052e+03 2.2010e+03 2.1055e+03 2.3840e+02 + 5.1340e+02 3.2360e+02 1.4880e+02 5.5320e+02 1.7615e+03 2.4776e+03 2.3175e+03 + 2.3476e+03 2.9553e+03 2.1967e+03 5.1140e+02 4.1570e+02 3.2080e+02 5.9050e+02 + 5.9540e+02 7.0320e+02 2.3410e+02 5.6780e+02 4.5210e+02 4.1170e+02 2.4460e+02 + 4.7180e+02 1.9970e+03 1.5531e+03 3.1154e+03 1.6960e+03 2.6636e+03 1.2157e+03 + 3.4180e+02 5.9360e+02 6.4960e+02 3.9310e+02 1.1740e+02 6.6810e+02 8.0280e+02 + 6.6460e+02 5.1800e+02 2.8280e+02 3.8670e+02 2.4660e+02 5.2280e+02 6.0370e+02 + 4.4350e+02 7.3070e+02 8.4860e+02 1.1446e+03 2.0572e+03 2.2051e+03 3.7696e+03 + 1.5426e+03 3.3153e+03 1.3899e+03 6.5920e+02 9.4190e+02 4.8170e+02 6.8230e+02 + 1.8389e+03 4.3381e+03 1.3836e+03 4.4670e+02 4.2670e+02 6.0920e+02 3.0560e+02 + 4.8690e+02 1.7466e+03 3.2862e+03 3.5314e+03 1.5834e+03 2.6030e+03 1.4779e+03 + 1.0142e+03 6.6650e+02 1.9270e+02 7.3550e+02 5.7390e+02 7.1810e+02 4.6800e+02 + 2.5380e+02 4.6610e+02 4.7790e+02 3.4810e+02 7.3390e+02 2.2031e+03 2.0636e+03 + 2.7173e+03 3.1672e+03 3.4299e+03 5.8940e+02 5.1370e+02 2.6460e+02 4.4970e+02 + 2.4000e+02 3.6980e+02 9.0730e+02 7.4890e+02 7.9610e+02 3.5340e+02 2.4040e+02 + 3.1850e+02 3.9640e+02 4.9330e+02 4.9110e+02 5.5500e+02 6.2080e+02 4.7790e+02 + 1.1626e+03 1.5187e+03 2.7861e+03 3.9983e+03 4.0372e+03 2.2989e+03 1.1182e+03 + 4.3570e+02 5.4570e+02 8.2410e+02 3.8760e+02 1.2266e+03 2.7423e+03 2.5286e+03 + 7.1630e+02 3.1630e+02 4.5960e+02 5.5440e+02 6.3840e+02 1.6346e+03 2.7828e+03 + 1.8205e+03 8.9390e+02 3.7134e+03 2.2866e+03 8.0460e+02 4.7990e+02 3.9720e+02 + 4.1620e+02 6.4280e+02 4.4400e+02 5.6770e+02 6.3670e+02 4.3160e+02 6.3770e+02 + 3.0910e+02 8.3540e+02 2.1135e+03 3.7828e+03 1.8128e+03 2.7302e+03 3.7845e+03 + 1.1214e+03 5.1690e+02 8.5120e+02 4.1370e+02 2.7440e+02 4.0050e+02 4.0290e+02 + 5.8520e+02 3.5370e+02 4.7400e+02 6.5230e+02 5.2610e+02 7.3130e+02 9.4150e+02 + 4.1680e+02 5.3450e+02 8.9440e+02 8.8300e+02 7.4700e+02 5.1290e+02 1.3561e+03 + 2*4.9000e+03 2.8309e+03 1.3622e+03 5.5770e+02 6.2830e+02 8.6650e+02 + 4.3870e+02 8.9840e+02 3.3417e+03 2.8460e+03 6.0660e+02 3.0430e+02 6.7530e+02 + 1.5474e+03 2.8899e+03 2.3454e+03 3.1742e+03 2.2797e+03 2.0653e+03 2.4905e+03 + 2.3478e+03 1.1748e+03 7.3550e+02 6.0770e+02 4.1770e+02 7.3440e+02 9.1440e+02 + 4.5720e+02 3.1360e+02 3.8560e+02 9.2190e+02 3.0440e+02 5.1250e+02 3.2669e+03 + 3.0879e+03 1.7823e+03 2.2070e+03 3.2174e+03 6.9860e+02 5.1300e+02 4.7660e+02 + 6.5730e+02 4.8680e+02 4.3270e+02 6.3530e+02 3.0860e+02 2.3140e+02 2.8670e+02 + 4.3340e+02 8.4500e+02 6.6030e+02 4.3660e+02 1.7040e+02 4.7820e+02 4.3350e+02 + 7.2430e+02 1.0432e+03 4.9950e+02 2.8022e+03 4.4533e+03 4.4834e+03 3.3820e+03 + 6.9390e+02 5.7850e+02 5.5730e+02 5.1190e+02 6.8850e+02 1.0923e+03 3.8272e+03 + 3.2605e+03 7.7820e+02 4.6660e+02 8.9030e+02 1.6431e+03 2.0530e+03 2.7728e+03 + 3.2210e+03 1.9609e+03 2.1114e+03 2.0373e+03 2.1869e+03 1.2874e+03 2.9600e+02 + 4.7140e+02 3.7970e+02 2.8560e+02 7.5860e+02 7.1010e+02 2.2720e+02 3.1140e+02 + 6.1380e+02 6.1310e+02 1.1502e+03 2.0112e+03 2.8102e+03 1.0646e+03 1.3151e+03 + 3.0593e+03 1.5619e+03 3.7130e+02 4.2810e+02 4.4530e+02 4.2590e+02 3.0490e+02 + 4.8750e+02 1.1150e+02 5.7240e+02 6.1460e+02 7.6140e+02 3.8460e+02 5.6630e+02 + 4.4780e+02 1.8510e+02 4.7420e+02 5.4310e+02 1.2484e+03 1.5057e+03 1.1748e+03 + 3.2020e+03 3.3548e+03 3.9033e+03 4.5755e+03 1.3124e+03 3.7820e+02 5.5520e+02 + 5.2150e+02 7.8180e+02 1.1041e+03 3.8675e+03 2.3970e+03 8.2080e+02 5.3680e+02 + 2.1656e+03 1.5534e+03 2.3780e+03 1.1140e+03 6.5850e+02 7.6220e+02 2.2958e+03 + 2.4141e+03 2.2176e+03 3.9110e+02 3.5770e+02 3.3460e+02 2.8650e+02 2.4580e+02 + 5.1060e+02 6.8390e+02 6.4630e+02 4.1970e+02 5.5130e+02 1.1256e+03 9.0650e+02 + 3.0237e+03 2.7332e+03 1.8517e+03 2.5438e+03 2.5050e+03 7.1440e+02 4.2400e+02 + 3.2710e+02 5.0580e+02 9.1310e+02 3.7860e+02 3.3910e+02 2.6630e+02 3.6290e+02 + 7.2890e+02 1.1854e+03 4.7210e+02 4.5910e+02 2.9050e+02 5.5310e+02 4.3500e+02 + 1.1134e+03 1.3373e+03 1.1157e+03 1.3174e+03 3.3323e+03 1.9860e+03 1.1223e+03 + 1.7070e+03 2.3880e+03 3.0930e+02 6.8630e+02 7.3620e+02 7.7210e+02 9.5380e+02 + 2.4154e+03 3.4971e+03 8.6800e+02 1.8226e+03 3.2808e+03 3.4250e+03 1.0263e+03 + 4.2760e+02 2.9880e+02 7.9740e+02 2.3024e+03 2.2507e+03 2.6650e+03 6.3550e+02 + 2.4360e+02 3.9610e+02 5.6410e+02 3.6150e+02 7.0550e+02 9.2900e+02 9.1340e+02 + 4.2020e+02 8.9620e+02 2.7030e+02 6.4060e+02 2.9097e+03 3.2021e+03 7.1200e+02 + 2.4481e+03 2.4706e+03 8.8010e+02 5.3300e+02 3.6770e+02 5.8610e+02 1.2665e+03 + 5.0580e+02 3.0930e+02 3.5300e+02 7.8110e+02 1.2083e+03 7.4820e+02 6.2910e+02 + 4.0730e+02 3.6650e+02 7.2430e+02 6.7850e+02 1.4530e+03 1.0485e+03 2.2405e+03 + 2.0572e+03 2.3492e+03 2.0425e+03 7.5500e+02 2.0894e+03 2.7228e+03 7.4940e+02 + 4.7230e+02 6.1090e+02 6.5180e+02 9.0880e+02 1.7310e+03 2.8172e+03 2.9008e+03 + 2.9340e+03 2.7144e+03 2.9822e+03 1.0638e+03 4.9510e+02 1.7620e+02 5.2030e+02 + 1.6460e+03 2.9828e+03 2.9277e+03 3.2650e+02 2.7140e+02 3.1920e+02 5.4360e+02 + 7.2780e+02 6.2220e+02 5.0940e+02 7.8010e+02 1.1896e+03 6.8360e+02 6.4160e+02 + 1.5398e+03 2.4093e+03 3.2393e+03 9.2170e+02 3.7653e+03 2.5405e+03 1.5236e+03 + 9.7230e+02 4.7940e+02 2.7620e+02 7.1850e+02 3.8930e+02 2.3110e+02 3.4230e+02 + 7.5720e+02 6.3970e+02 4.4230e+02 5.1890e+02 5.1900e+02 5.2420e+02 7.3190e+02 + 1.1911e+03 1.8951e+03 2.3733e+03 1.8495e+03 2.4294e+03 1.4914e+03 1.8400e+03 + 8.1200e+02 1.0828e+03 1.1816e+03 8.7890e+02 4.4160e+02 4.3010e+02 5.3820e+02 + 5.3650e+02 1.9017e+03 2.6058e+03 2.6616e+03 2.5099e+03 1.8774e+03 5.7720e+02 + 3.7690e+02 3.8090e+02 2.2190e+02 5.4710e+02 1.7121e+03 3.2437e+03 2.6351e+03 + 5.6310e+02 3.0060e+02 2.9430e+02 6.7690e+02 3.0760e+02 9.3000e+02 8.4260e+02 + 8.1780e+02 5.0970e+02 4.3140e+02 2.8020e+02 7.8410e+02 2.4184e+03 2.2540e+03 + 2.2149e+03 2.5945e+03 3.0141e+03 2.9915e+03 8.5660e+02 9.9760e+02 7.3600e+02 + 6.1500e+02 4.2420e+02 5.0790e+02 4.3600e+02 7.0000e+02 4.6550e+02 2.7460e+02 + 3.3590e+02 4.2530e+02 6.5600e+02 8.2090e+02 8.6810e+02 2.2683e+03 2.8575e+03 + 2.6030e+03 1.5375e+03 7.4220e+02 6.2610e+02 1.0388e+03 6.8260e+02 6.9400e+02 + 6.5570e+02 3.5060e+02 4.8600e+02 5.7570e+02 6.7030e+02 2.2827e+03 2.4493e+03 + 3.7358e+03 4.1194e+03 1.8684e+03 1.0319e+03 5.9760e+02 3.9220e+02 3.0470e+02 + 5.8070e+02 1.4278e+03 2.8088e+03 1.8703e+03 5.3440e+02 2.7070e+02 1.6180e+02 + 4.7090e+02 3.7990e+02 5.2290e+02 8.3200e+02 1.0166e+03 5.7990e+02 3.2390e+02 + 4.5590e+02 1.3271e+03 1.6437e+03 2.0590e+03 1.0627e+03 2.6202e+03 3.6461e+03 + 1.8672e+03 6.6670e+02 9.7410e+02 5.7520e+02 3.3870e+02 4.6510e+02 6.9800e+02 + 8.3730e+02 4.2270e+02 6.0380e+02 3.8570e+02 3.8580e+02 3.8970e+02 3.5870e+02 + 1.7522e+03 1.9869e+03 1.8180e+03 2.2569e+03 2.1298e+03 6.3660e+02 6.4470e+02 + 4.7460e+02 7.7040e+02 1.2779e+03 9.4110e+02 2.4390e+02 3.9000e+02 6.1080e+02 + 5.7500e+02 4.2420e+02 2.0246e+03 4.4604e+03 2.6255e+03 2.8525e+03 9.5890e+02 + 6.0040e+02 4.8350e+02 5.4310e+02 1.2008e+03 8.6570e+02 2.4608e+03 3.0321e+03 + 1.9607e+03 4.3750e+02 4.4400e+02 2.6090e+02 4.4790e+02 4.5440e+02 5.8020e+02 + 1.0008e+03 3.5940e+02 6.4720e+02 2.0390e+02 4.0310e+02 6.3090e+02 2.2375e+03 + 2.4164e+03 1.0615e+03 1.5352e+03 2.2548e+03 1.6444e+03 1.0730e+03 8.7990e+02 + 5.5410e+02 1.2600e+02 3.4230e+02 5.3110e+02 7.5310e+02 7.3600e+02 8.5160e+02 + 7.8990e+02 3.4040e+02 3.7280e+02 1.6249e+03 2.6159e+03 1.5821e+03 2.8199e+03 + 1.8472e+03 1.2010e+03 2.7820e+02 3.2760e+02 3.6290e+02 5.4550e+02 5.4690e+02 + 6.0000e+02 5.5880e+02 3.3740e+02 4.4560e+02 5.1340e+02 6.0570e+02 2.0851e+03 + 4.9000e+03 2.0771e+03 1.2853e+03 5.3340e+02 7.1530e+02 7.1780e+02 6.7510e+02 + 1.5137e+03 9.8650e+02 2.9357e+03 2.1170e+03 6.7410e+02 1.0239e+03 7.1860e+02 + 6.5960e+02 5.1030e+02 5.1980e+02 5.0920e+02 4.6530e+02 6.5880e+02 5.3490e+02 + 6.0420e+02 3.3930e+02 1.3911e+03 2.8597e+03 1.4398e+03 6.9400e+02 1.3406e+03 + 3.0968e+03 3.3809e+03 5.4320e+02 6.7610e+02 5.1920e+02 2.6440e+02 5.3450e+02 + 7.4940e+02 6.9370e+02 3.6740e+02 6.5100e+02 4.9110e+02 4.2640e+02 5.3780e+02 + 2.6975e+03 1.9465e+03 1.6487e+03 8.5250e+02 8.4260e+02 8.5360e+02 4.5810e+02 + 5.0270e+02 5.0780e+02 3.9480e+02 4.5340e+02 7.2800e+02 4.2820e+02 4.2950e+02 + 7.0800e+02 8.3300e+02 4.6340e+02 2.5214e+03 3.5702e+03 2.3641e+03 1.4533e+03 + 5.9830e+02 6.6620e+02 2.0360e+02 4.7900e+02 9.0870e+02 1.3842e+03 3.8430e+03 + 2.8715e+03 9.8960e+02 8.5410e+02 4.0320e+02 5.4060e+02 5.5310e+02 3.7410e+02 + 5.5290e+02 5.1420e+02 6.4150e+02 2.8960e+02 6.6270e+02 6.0970e+02 2.5486e+03 + 3.6415e+03 1.8130e+03 1.1498e+03 1.1214e+03 2.3000e+03 3.9064e+03 5.7710e+02 + 5.4340e+02 5.4880e+02 3.8310e+02 5.9230e+02 1.0050e+03 3.0280e+02 7.7270e+02 + 5.9120e+02 4.6300e+02 3.8530e+02 5.7530e+02 2.0776e+03 2.4878e+03 2.2459e+03 + 6.1820e+02 6.8720e+02 4.7250e+02 4.7970e+02 6.6100e+02 4.9970e+02 4.2190e+02 + 4.0960e+02 3.6210e+02 4.4190e+02 1.7760e+02 1.1027e+03 7.7850e+02 1.6922e+03 + 3.2874e+03 3.1525e+03 8.0190e+02 9.8130e+02 8.4660e+02 6.4520e+02 6.6140e+02 + 6.9090e+02 7.2960e+02 1.6980e+03 4.3417e+03 2.4981e+03 8.3930e+02 6.1900e+02 + 5.0250e+02 7.2940e+02 1.0629e+03 4.2400e+02 3.4740e+02 5.6920e+02 5.6060e+02 + 4.2080e+02 4.4140e+02 7.9480e+02 1.3564e+03 2.6807e+03 2.8680e+03 1.8746e+03 + 6.6550e+02 2.5203e+03 3.9029e+03 2.1743e+03 7.2590e+02 6.6340e+02 7.3780e+02 + 8.8440e+02 7.5360e+02 4.4790e+02 6.5530e+02 5.4430e+02 5.0690e+02 5.2460e+02 + 1.3223e+03 2.3654e+03 2.7145e+03 6.4760e+02 6.3190e+02 4.2240e+02 3.3670e+02 + 4.9330e+02 5.8520e+02 4.6180e+02 3.5440e+02 4.2300e+02 2.0050e+02 2.9770e+02 + 3.8490e+02 7.0420e+02 1.0019e+03 2.8284e+03 2.9782e+03 3.5126e+03 1.2796e+03 + 8.8640e+02 3.1820e+02 3.0430e+02 5.7670e+02 3.1250e+02 3.8230e+02 2.0190e+03 + 2.9561e+03 2.5502e+03 1.1859e+03 3.6360e+02 5.0460e+02 2.8730e+02 8.0130e+02 + 5.4400e+02 3.4300e+02 1.1703e+03 1.0067e+03 7.0790e+02 4.9300e+02 5.2190e+02 + 2.7157e+03 3.9318e+03 3.5872e+03 1.5228e+03 4.9570e+02 1.8385e+03 3.0328e+03 + 1.0936e+03 6.6260e+02 6.2000e+02 7.5220e+02 8.3530e+02 3.6640e+02 6.9990e+02 + 5.7410e+02 6.5400e+02 5.0570e+02 6.8860e+02 2.3736e+03 3.3617e+03 2.2458e+03 + 1.4325e+03 7.0230e+02 2.4810e+02 2.1290e+02 3.9370e+02 5.6360e+02 5.9900e+02 + 4.1930e+02 3.1550e+02 5.1190e+02 5.0960e+02 3.7920e+02 5.4010e+02 1.2376e+03 + 2.5349e+03 2.5077e+03 2.1695e+03 1.0380e+03 5.5070e+02 5.1280e+02 5.8030e+02 + 8.9460e+02 6.5430e+02 5.6510e+02 3.1357e+03 3.0579e+03 2.2742e+03 6.0070e+02 + 5.5750e+02 2.5530e+02 4.7130e+02 7.1720e+02 4.9380e+02 4.2300e+02 5.4860e+02 + 8.8640e+02 6.7520e+02 3.7420e+02 4.4780e+02 2.6826e+03 2.4379e+03 2.7023e+03 + 1.3283e+03 2.1730e+02 1.8624e+03 3.9811e+03 2.1991e+03 9.4040e+02 3.9520e+02 + 3.8810e+02 4.8390e+02 7.6150e+02 5.2510e+02 4.2120e+02 8.1020e+02 3.9790e+02 + 8.5140e+02 2.4419e+03 4.4991e+03 1.3896e+03 6.8470e+02 4.1510e+02 1.7630e+02 + 2.8660e+02 4.0370e+02 5.3020e+02 6.8100e+02 6.2490e+02 4.5300e+02 5.1150e+02 + 7.5580e+02 3.0970e+02 3.7480e+02 1.3232e+03 3.0593e+03 3.3107e+03 4.3920e+02 + 7.9300e+02 8.1390e+02 7.4800e+02 4.4870e+02 8.2060e+02 6.4010e+02 3.5010e+02 + 2.8941e+03 2.3047e+03 1.8134e+03 8.2690e+02 3.4330e+02 5.1450e+02 4.0510e+02 + 9.1580e+02 6.3810e+02 4.7540e+02 3.8720e+02 1.4785e+03 6.6480e+02 5.4010e+02 + 5.5490e+02 2.8401e+03 2.6451e+03 2.5438e+03 1.1048e+03 3.5440e+02 1.3851e+03 + 3.0706e+03 3.7265e+03 1.4827e+03 4.2110e+02 4.1290e+02 2.6450e+02 6.4070e+02 + 5.7440e+02 4.1500e+02 5.3290e+02 7.8820e+02 8.6340e+02 2.9180e+03 4.2823e+03 + 1.4966e+03 9.8740e+02 4.5290e+02 2.2660e+02 2.9730e+02 4.8540e+02 7.8670e+02 + 7.1980e+02 4.8610e+02 4.0210e+02 2.5560e+02 6.3390e+02 5.0190e+02 7.8640e+02 + 2.3127e+03 2.2772e+03 2.7313e+03 4.7620e+02 6.4180e+02 5.2470e+02 6.2200e+02 + 6.7010e+02 1.3187e+03 2.7580e+02 3.7640e+02 2.9796e+03 2.9001e+03 8.0090e+02 + 6.2350e+02 4.8150e+02 2.4510e+02 4.6310e+02 6.2720e+02 3.7520e+02 2.5850e+02 + 3.7570e+02 8.4720e+02 9.6590e+02 6.7590e+02 4.2420e+02 1.8644e+03 2.7959e+03 + 1.8246e+03 4.2430e+02 3.1690e+02 6.4380e+02 1.7229e+03 2.5671e+03 2.2125e+03 + 6.9550e+02 2.9330e+02 2.8790e+02 4.7170e+02 4.5880e+02 2.8480e+02 2.5350e+02 + 7.0430e+02 1.1046e+03 3.5155e+03 1.7639e+03 8.2110e+02 1.1179e+03 2.9730e+02 + 4.6640e+02 4.1720e+02 5.2400e+02 6.3290e+02 5.1340e+02 5.5150e+02 5.6470e+02 + 4.8850e+02 6.3670e+02 2.5640e+02 5.6350e+02 2.6607e+03 2.8505e+03 2.4191e+03 + 5.8190e+02 5.9100e+02 3.3970e+02 6.1980e+02 7.2500e+02 4.6320e+02 3.1530e+02 + 5.6120e+02 2.8817e+03 4.1342e+03 1.2728e+03 8.1370e+02 3.0460e+02 2.9370e+02 + 4.5760e+02 7.7810e+02 5.4460e+02 4.6720e+02 6.2620e+02 5.1910e+02 5.4710e+02 + 8.3100e+02 5.4550e+02 1.1700e+03 3.2861e+03 1.8980e+03 4.0740e+02 4.8630e+02 + 7.8110e+02 1.9608e+03 1.6791e+03 3.0785e+03 1.2474e+03 7.4270e+02 3.9340e+02 + 3.0990e+02 2.1640e+02 4.0880e+02 9.3890e+02 1.3132e+03 1.9331e+03 2.9359e+03 + 2.5836e+03 8.0850e+02 5.9990e+02 2.0030e+02 5.7180e+02 5.4320e+02 7.1080e+02 + 3.5040e+02 3.1900e+02 6.0260e+02 7.8240e+02 6.7350e+02 6.8940e+02 1.5740e+02 + 4.2110e+02 2.6671e+03 3.0652e+03 2.3907e+03 7.6840e+02 7.4300e+02 2.6110e+02 + 3.9260e+02 6.4240e+02 4.7520e+02 2.5200e+02 7.9930e+02 2.3079e+03 3.1832e+03 + 1.2928e+03 4.0840e+02 7.0100e+02 3.5940e+02 4.1980e+02 6.9040e+02 9.2090e+02 + 3.5400e+02 2.8860e+02 4.8330e+02 1.9810e+02 3.4290e+02 8.6010e+02 1.4741e+03 + 2.9231e+03 2.2954e+03 1.4243e+03 6.3780e+02 3.2390e+02 6.1170e+02 2.3589e+03 + 3.5451e+03 1.4817e+03 5.9290e+02 4.9800e+02 4.5460e+02 3.5570e+02 4.6330e+02 + 1.2101e+03 2.6060e+03 2.1515e+03 2.1803e+03 2.2293e+03 4.2990e+02 4.3140e+02 + 2.6800e+02 6.1720e+02 8.8900e+02 1.0770e+03 3.1860e+02 2.7790e+02 3.1680e+02 + 5.0500e+02 8.7250e+02 4.6280e+02 2.4910e+02 7.3990e+02 2.6554e+03 3.7979e+03 + 1.4950e+03 7.1560e+02 7.7020e+02 5.7100e+02 4.3240e+02 1.6530e+02 3.3180e+02 + 5.0540e+02 7.0960e+02 1.5583e+03 3.8253e+03 1.4476e+03 5.3470e+02 4.3980e+02 + 2.1690e+02 4.8210e+02 5.4790e+02 6.4430e+02 6.5520e+02 9.2880e+02 5.7410e+02 + 3.6300e+02 2.5120e+02 3.0410e+02 1.9452e+03 3.0435e+03 2.5093e+03 1.4356e+03 + 7.0540e+02 3.4890e+02 8.0360e+02 1.9724e+03 2.7279e+03 1.9190e+03 1.1788e+03 + 2.7190e+02 3.7290e+02 3.3710e+02 1.4162e+03 2.6139e+03 3.2350e+03 1.6180e+03 + 2.7039e+03 9.7900e+02 7.9330e+02 3.7340e+02 3.3080e+02 1.2372e+03 9.4440e+02 + 7.2680e+02 2.2120e+02 4.5890e+02 4.5590e+02 3.8240e+02 6.4340e+02 3.7570e+02 + 5.9860e+02 3.7150e+02 2.3004e+03 3.3898e+03 2.9230e+03 6.5740e+02 9.4100e+02 + 7.3330e+02 2.9130e+02 1.9180e+02 2.6550e+02 3.6930e+02 8.3760e+02 2.2001e+03 + 3.3718e+03 1.7886e+03 4.5890e+02 6.2420e+02 2.4880e+02 3.8560e+02 4.4550e+02 + 4.3640e+02 4.0980e+02 7.0960e+02 5.0840e+02 5.7570e+02 3.1820e+02 6.1720e+02 + 1.6389e+03 3.3751e+03 2.7203e+03 8.5700e+02 6.6420e+02 4.1560e+02 7.7560e+02 + 7.3790e+02 2.1329e+03 2.6165e+03 7.9920e+02 6.6040e+02 1.3223e+03 8.2720e+02 + 2.9822e+03 1.1136e+03 2.3474e+03 2.3433e+03 1.1968e+03 7.1490e+02 5.8450e+02 + 6.9470e+02 8.7500e+01 6.9870e+02 8.2830e+02 1.0069e+03 7.5380e+02 5.6020e+02 + 6.3060e+02 6.4570e+02 9.0000e+02 2.7740e+02 3.2240e+02 5.7040e+02 2.5955e+03 + 3.5522e+03 1.7581e+03 8.5750e+02 7.4690e+02 3.1200e+02 1.9660e+02 2.4760e+02 + 7.1010e+02 6.2990e+02 6.4110e+02 2.3836e+03 3.1137e+03 2.8531e+03 1.2260e+03 + 4.6140e+02 4.0250e+02 4.6060e+02 5.9210e+02 4.1280e+02 7.6220e+02 7.1650e+02 + 4.8910e+02 4.2300e+02 3.3120e+02 3.7180e+02 1.6858e+03 2.2881e+03 2.8440e+03 + 6.9860e+02 2.9130e+02 4.6160e+02 1.0648e+03 8.6360e+02 1.2346e+03 2.5105e+03 + 2.7597e+03 9.2830e+02 2.1077e+03 2.6692e+03 2.0578e+03 1.7620e+03 2.6576e+03 + 1.7539e+03 6.4260e+02 5.4250e+02 3.8220e+02 3.9170e+02 5.1060e+02 5.4510e+02 + 4.3490e+02 8.7510e+02 6.0330e+02 6.3440e+02 5.8030e+02 1.0060e+03 2.3420e+02 + 8.4690e+02 3.7480e+02 1.0756e+03 1.8435e+03 4.0139e+03 1.4914e+03 7.2580e+02 + 5.1940e+02 3.9660e+02 3.3050e+02 3.7310e+02 8.9140e+02 8.2610e+02 7.2230e+02 + 1.1467e+03 2.3006e+03 3.3894e+03 1.2744e+03 7.1460e+02 3.9720e+02 7.2310e+02 + 5.1650e+02 3.5140e+02 4.1570e+02 4.7980e+02 4.4730e+02 2.8120e+02 1.4280e+02 + 1.6620e+02 1.0251e+03 3.6346e+03 2.1284e+03 1.3826e+03 4.3260e+02 3.6020e+02 + 8.2420e+02 3.5280e+02 5.2280e+02 3.6143e+03 3.8672e+03 1.2942e+03 3.2007e+03 + 2.9748e+03 3.2616e+03 1.3317e+03 1.9028e+03 4.5990e+02 6.8560e+02 3.8860e+02 + 5.8590e+02 8.1260e+02 2.5130e+02 1.0199e+03 8.7160e+02 3.9380e+02 5.6680e+02 + 6.2680e+02 7.7180e+02 6.9140e+02 9.3750e+02 1.0371e+03 5.5740e+02 6.1870e+02 + 3.4115e+03 3.0856e+03 7.9390e+02 3.6490e+02 1.9830e+02 2.6660e+02 3.4730e+02 + 3.0680e+02 6.9750e+02 6.4280e+02 6.6450e+02 7.4010e+02 2.2676e+03 2.5210e+03 + 9.1170e+02 6.2660e+02 6.7080e+02 5.9260e+02 2.0710e+02 2.8720e+02 4.7340e+02 + 6.8790e+02 3.4910e+02 1.1530e+02 4.6670e+02 2.1080e+02 6.0860e+02 2.8121e+03 + 7.0760e+02 1.5856e+03 3.6850e+02 2.2210e+02 7.4480e+02 7.7960e+02 8.2600e+02 + 1.8292e+03 3.6129e+03 1.5590e+03 2.8866e+03 4.5044e+03 7.2590e+02 8.6740e+02 + 1.1003e+03 5.4660e+02 5.6780e+02 5.7970e+02 8.3120e+02 2.9700e+02 4.8020e+02 + 6.5670e+02 1.1493e+03 6.9980e+02 3.9410e+02 7.1780e+02 1.1110e+03 8.8890e+02 + 1.0297e+03 7.5700e+02 6.6770e+02 1.1846e+03 3.4785e+03 4.0203e+03 8.6620e+02 + 4.9520e+02 2.2430e+02 5.9150e+02 2.2730e+02 1.0153e+03 5.9210e+02 6.0490e+02 + 3.0140e+02 5.6860e+02 1.6709e+03 4.0208e+03 1.9505e+03 6.4700e+02 7.6830e+02 + 6.0300e+02 6.6690e+02 2.9870e+02 2.2970e+02 7.3600e+02 6.3110e+02 1.5800e+02 + 3.4430e+02 3.5910e+02 8.4300e+02 3.3992e+03 1.6413e+03 1.0018e+03 5.8630e+02 + 6.8440e+02 3.1270e+02 4.7690e+02 5.8050e+02 2.0523e+03 2.6641e+03 3.2080e+03 + 2.3280e+03 4.1848e+03 7.5190e+02 4.5780e+02 3.0590e+02 5.6030e+02 3.5590e+02 + 7.6410e+02 3.0620e+02 6.3920e+02 1.7690e+02 6.6690e+02 5.7880e+02 5.6300e+02 + 4.9810e+02 6.5120e+02 1.3418e+03 7.8020e+02 4.9210e+02 5.4970e+02 6.8390e+02 + 1.4187e+03 2.0121e+03 2.1818e+03 3.0920e+02 4.5290e+02 3.3070e+02 3.3430e+02 + 4.1480e+02 3.2920e+02 7.9180e+02 7.9270e+02 4.4700e+02 5.0650e+02 1.3517e+03 + 2.9023e+03 2.3212e+03 7.8010e+02 7.8840e+02 5.2480e+02 6.3290e+02 3.3740e+02 + 5.0330e+02 8.2870e+02 3.3080e+02 3.7570e+02 4.7300e+02 3.0490e+02 2.2513e+03 + 3.1319e+03 1.0898e+03 6.3920e+02 3.6930e+02 5.0560e+02 5.5580e+02 8.7050e+02 + 4.4020e+02 1.3450e+03 2.7979e+03 3.4852e+03 4.6592e+03 3.9383e+03 1.9092e+03 + 2.4850e+02 3.8740e+02 4.6190e+02 4.7680e+02 6.6670e+02 3.3190e+02 4.8110e+02 + 2.5230e+02 6.0670e+02 9.0640e+02 4.0550e+02 5.8540e+02 2.2020e+02 6.7360e+02 + 1.3682e+03 1.2266e+03 4.6940e+02 4.8010e+02 1.3300e+03 2.6762e+03 3.1801e+03 + 6.6040e+02 3.1110e+02 3.2010e+02 2.4890e+02 3.3200e+02 2.5910e+02 8.9830e+02 + 6.6410e+02 5.7300e+02 5.2890e+02 2.0719e+03 2.3284e+03 2.9859e+03 1.0394e+03 + 7.0530e+02 2.6920e+02 4.6410e+02 7.3940e+02 2.5530e+02 3.8330e+02 3.1300e+02 + 2.4530e+02 6.0960e+02 2.4429e+03 3.4828e+03 3.8679e+03 6.4670e+02 1.6830e+02 + 4.0830e+02 2.9790e+02 5.2060e+02 4.6100e+02 4.5230e+02 2.9400e+02 1.5426e+03 + 3.2350e+03 4.7928e+03 2.9663e+03 1.7552e+03 1.8300e+02 3.3590e+02 6.4760e+02 + 7.1770e+02 6.2300e+02 5.0340e+02 3.7690e+02 4.0260e+02 7.3660e+02 7.4210e+02 + 6.4200e+02 5.9620e+02 4.0200e+02 6.3520e+02 5.6990e+02 1.3653e+03 6.4770e+02 + 2.2850e+02 7.6760e+02 1.2656e+03 2.2921e+03 5.4780e+02 5.0970e+02 4.1250e+02 + 2.5670e+02 2.8640e+02 2.9390e+02 7.6210e+02 7.6820e+02 4.6900e+02 4.7200e+02 + 7.0970e+02 2.4682e+03 2.9593e+03 1.6207e+03 8.6540e+02 2.0000e+02 3.4510e+02 + 4.6220e+02 3.3810e+02 4.1440e+02 4.6010e+02 4.3420e+02 4.3180e+02 1.1470e+03 + 3.4938e+03 2.9471e+03 5.6270e+02 1.5350e+02 3.2880e+02 6.5860e+02 4.8620e+02 + 7.7780e+02 3.5040e+02 8.3620e+02 1.5140e+03 3.3972e+03 4.4475e+03 2.6902e+03 + 1.5280e+03 5.5750e+02 3.2730e+02 5.6590e+02 8.8180e+02 4.7300e+02 1.7910e+02 + 4.0710e+02 3.4570e+02 5.6820e+02 5.9850e+02 9.0740e+02 1.9050e+02 4.3530e+02 + 2.9630e+02 4.3880e+02 1.8574e+03 7.5380e+02 5.3920e+02 4.4720e+02 1.6650e+03 + 1.8551e+03 1.8726e+03 6.3490e+02 5.7610e+02 7.9130e+02 6.1440e+02 4.9820e+02 + 6.4540e+02 3.9320e+02 3.0750e+02 6.7930e+02 6.9370e+02 1.3469e+03 2.9203e+03 + 2.4944e+03 1.6355e+03 3.0790e+02 5.1370e+02 3.0950e+02 2.9200e+02 8.2900e+02 + 5.8140e+02 6.4480e+02 9.9140e+02 2.4517e+03 3.2707e+03 2.1496e+03 4.1100e+02 + 2.7090e+02 3.3080e+02 5.9480e+02 7.6160e+02 3.9350e+02 1.3610e+02 5.1370e+02 + 1.7691e+03 2.7994e+03 4.1287e+03 2.9099e+03 6.2740e+02 8.9850e+02 5.4080e+02 + 5.0110e+02 5.1660e+02 4.3480e+02 4.4440e+02 4.2970e+02 8.2340e+02 6.8190e+02 + 5.9510e+02 6.1020e+02 8.8190e+02 5.9760e+02 2.6230e+02 1.2110e+02 1.6250e+03 + 6.3580e+02 7.4160e+02 3.1240e+02 9.9850e+02 1.6507e+03 2.1961e+03 1.0966e+03 + 1.0304e+03 5.5160e+02 5.7870e+02 3.8100e+02 6.3880e+02 9.0900e+02 3.3730e+02 + 2.4840e+02 4.7210e+02 5.2890e+02 1.9564e+03 2.7330e+03 1.7077e+03 5.3510e+02 + 7.6750e+02 4.2210e+02 4.4600e+02 7.7960e+02 1.0825e+03 6.7380e+02 7.1960e+02 + 1.8839e+03 1.7578e+03 1.7211e+03 6.0360e+02 5.2900e+02 4.8600e+02 1.0148e+03 + 8.7450e+02 3.7290e+02 4.3770e+02 3.1210e+02 7.3610e+02 1.6718e+03 3.2342e+03 + 2.9706e+03 2.4895e+03 6.2230e+02 4.2070e+02 3.4970e+02 2.7360e+02 5.4510e+02 + 5.4180e+02 2.8390e+02 1.2141e+03 3.4140e+02 8.4310e+02 6.3130e+02 9.4820e+02 + 6.8060e+02 2.2130e+02 1.1470e+02 1.5227e+03 3.9390e+02 8.0900e+02 2.3816e+03 + 2.8722e+03 1.1716e+03 6.0630e+02 5.4130e+02 1.4920e+02 5.0500e+02 3.6534e+03 + 3.3456e+03 1.9795e+03 1.1904e+03 9.9840e+02 1.0301e+03 5.4230e+02 4.0180e+02 + 1.7310e+02 6.1680e+02 1.0152e+03 4.2358e+03 2.7366e+03 1.1221e+03 1.0238e+03 + 5.0550e+02 8.7280e+02 3.0440e+03 2.6312e+03 2.4272e+03 8.6970e+02 8.5850e+02 + 6.9480e+02 4.1410e+02 5.5970e+02 6.2140e+02 4.6620e+02 8.2470e+02 2.0350e+03 + 3.2544e+03 3.5005e+03 4.6837e+03 2.5018e+03 5.9680e+02 3.7710e+02 4.6720e+02 + 1.4580e+02 1.6580e+02 2.1710e+02 4.8170e+02 2.0220e+02 4.6260e+02 5.3320e+02 + 1.2692e+03 7.1100e+02 5.8620e+02 8.2130e+02 1.1615e+03 1.0542e+03 7.5080e+02 + 6.6430e+02 5.2170e+02 8.2070e+02 3.4718e+03 2.6458e+03 8.3080e+02 3.8490e+02 + 4.0700e+02 3.0690e+02 1.3509e+03 2.0088e+03 3.6338e+03 1.0492e+03 5.6030e+02 + 7.0770e+02 6.0060e+02 4.8860e+02 4.4190e+02 2.3160e+02 5.5240e+02 5.0540e+02 + 2.6778e+03 3.2754e+03 2.0459e+03 1.1262e+03 5.5880e+02 4.0560e+02 1.6081e+03 + 3.8068e+03 3.3232e+03 1.3786e+03 8.6880e+02 5.6400e+02 3.2470e+02 6.6230e+02 + 9.3460e+02 7.1700e+02 9.2490e+02 7.1060e+02 1.9616e+03 2*5.6000e+03 + 2.9184e+03 1.1431e+03 3.4630e+02 3.6770e+02 2.5660e+02 2.0190e+02 5.7680e+02 + 2.7270e+02 1.7680e+02 1.6730e+02 7.4560e+02 7.4210e+02 6.2400e+02 4.6540e+02 + 9.9870e+02 9.2350e+02 4.7940e+02 7.2090e+02 2.6270e+02 9.5170e+02 1.0582e+03 + 3.6007e+03 1.7263e+03 8.3270e+02 2.5430e+02 4.1260e+02 3.7720e+02 1.2457e+03 + 4.2684e+03 3.1807e+03 1.5118e+03 5.3090e+02 4.1100e+02 3.6660e+02 4.1570e+02 + 3.1190e+02 3.8270e+02 3.5640e+02 4.8210e+02 1.5003e+03 4.4075e+03 1.0307e+03 + 1.2233e+03 3.0460e+02 2.6340e+02 1.8915e+03 2.0517e+03 2.5639e+03 2.2308e+03 + 1.2110e+03 5.7240e+02 3.5340e+02 7.4650e+02 7.4050e+02 5.4900e+02 4.4710e+02 + 3.4320e+02 2.2966e+03 5.2424e+03 3.6745e+03 4.8856e+03 1.9848e+03 1.3973e+03 + 8.2680e+02 4.2440e+02 2.9570e+02 8.8070e+02 3.9890e+02 3.1740e+02 6.1300e+02 + 5.2990e+02 8.3850e+02 6.1760e+02 4.4980e+02 5.1990e+02 7.4520e+02 4.2570e+02 + 4.8320e+02 1.8929e+03 9.9410e+02 2.6639e+03 2.9142e+03 2.2117e+03 5.4650e+02 + 5.1590e+02 2.5450e+02 6.8650e+02 2.0602e+03 4.0160e+03 2.2141e+03 8.7030e+02 + 3.2040e+02 2.5150e+02 7.5970e+02 4.0930e+02 4.8540e+02 5.1920e+02 4.2750e+02 + 3.2640e+02 2.0978e+03 3.2161e+03 2.2433e+03 7.6880e+02 4.2800e+02 4.1630e+02 + 9.4760e+02 1.7482e+03 2.3047e+03 2.5557e+03 9.8580e+02 3.2020e+02 9.0850e+02 + 1.0436e+03 3.6430e+02 4.2800e+02 2.6200e+02 6.2740e+02 1.1932e+03 3.3769e+03 + 3.5684e+03 3.0743e+03 3.9568e+03 9.6420e+02 7.3960e+02 7.9360e+02 3.0590e+02 + 5.5470e+02 7.0190e+02 4.4740e+02 4.4440e+02 6.0020e+02 4.7120e+02 4.5140e+02 + 8.1520e+02 4.4350e+02 3.1700e+02 8.4390e+02 9.1480e+02 2.1724e+03 2.1870e+03 + 2.3198e+03 2.8978e+03 1.1268e+03 3.4240e+02 4.8620e+02 3.4810e+02 8.7700e+02 + 2.1498e+03 2.6201e+03 2.7544e+03 8.0540e+02 3.9670e+02 5.0210e+02 4.6530e+02 + 3.5720e+02 3.2190e+02 3.7530e+02 7.0310e+02 4.4450e+02 1.4199e+03 3.3570e+03 + 2.9681e+03 1.4159e+03 9.6160e+02 5.7090e+02 1.5607e+03 1.0676e+03 1.1101e+03 + 2.0562e+03 3.3193e+03 1.8168e+03 1.0618e+03 5.7080e+02 4.5580e+02 3.9350e+02 + 1.8420e+02 5.8070e+02 1.9519e+03 2.5433e+03 4.3672e+03 1.9398e+03 4.4180e+03 + 2.1817e+03 6.6520e+02 3.6930e+02 5.2360e+02 4.6050e+02 6.3170e+02 5.3800e+02 + 1.0974e+03 2.2340e+02 3.7940e+02 3.5990e+02 7.7630e+02 3.9120e+02 2.8750e+02 + 5.1070e+02 1.0292e+03 1.8916e+03 1.8348e+03 3.5053e+03 3.6318e+03 4.0810e+02 + 4.3460e+02 6.2340e+02 6.3490e+02 7.1380e+02 2.5718e+03 4.0531e+03 2.7702e+03 + 4.9480e+02 3.3180e+02 4.3570e+02 8.7570e+02 2.6930e+02 2.8580e+02 4.5240e+02 + 4.6110e+02 6.1350e+02 1.4196e+03 2.7842e+03 2.7425e+03 2.1306e+03 7.2190e+02 + 4.9870e+02 7.3020e+02 7.0180e+02 9.0010e+02 2.0205e+03 2.6169e+03 2.5246e+03 + 1.6244e+03 6.1640e+02 6.3420e+02 4.2200e+02 3.3780e+02 4.0700e+02 2.3080e+03 + 2.9260e+03 3.2206e+03 3.9348e+03 4.2729e+03 2.9240e+03 8.5530e+02 5.7890e+02 + 3.4810e+02 8.0770e+02 6.1440e+02 5.5930e+02 2.8970e+02 1.8300e+02 6.3580e+02 + 4.1450e+02 1.1645e+03 3.2170e+02 5.7400e+02 1.1997e+03 2.1464e+03 3.3997e+03 + 3.1880e+03 2.9100e+03 2.0805e+03 5.7900e+02 1.9940e+02 4.2980e+02 4.8980e+02 + 5.3210e+02 2.0018e+03 2.2654e+03 1.9611e+03 1.0721e+03 6.8950e+02 5.8130e+02 + 7.6690e+02 3.0790e+02 2.7600e+02 3.5290e+02 4.7870e+02 8.9410e+02 1.6044e+03 + 2.2089e+03 3.0099e+03 1.9622e+03 7.7110e+02 5.4810e+02 7.3090e+02 6.8040e+02 + 1.2466e+03 2.1292e+03 3.1057e+03 2.8608e+03 2.1496e+03 9.7700e+02 5.3760e+02 + 4.2830e+02 1.8150e+02 3.0020e+02 1.3046e+03 2.1961e+03 2.2596e+03 3.2136e+03 + 2.9219e+03 2.6747e+03 4.5810e+02 2.1610e+02 4.0950e+02 6.4400e+02 1.0575e+03 + 1.1538e+03 4.0130e+02 3.0100e+02 3.2540e+02 5.5240e+02 5.6300e+02 3.9750e+02 + 5.3360e+02 6.5020e+02 2.0050e+03 2.7087e+03 4.2402e+03 3.0391e+03 1.5742e+03 + 2.2400e+02 2.7930e+02 9.6650e+02 8.4310e+02 4.5170e+02 1.2179e+03 3.9450e+03 + 2.0226e+03 7.2130e+02 7.5430e+02 8.1570e+02 7.9350e+02 2.8500e+02 2.7340e+02 + 6.3420e+02 2.9640e+02 2.6550e+02 9.6490e+02 3.0254e+03 3.6537e+03 1.4628e+03 + 7.4900e+02 5.6710e+02 5.0500e+02 3.3050e+02 5.0200e+02 9.2710e+02 2.2404e+03 + 2.6277e+03 2.0262e+03 2.1246e+03 6.0690e+02 2.3380e+02 3.7220e+02 3.4100e+02 + 2.6953e+03 3.0098e+03 2.4505e+03 2.2619e+03 2.4373e+03 2.3647e+03 5.8570e+02 + 3.0020e+02 3.3370e+02 6.7350e+02 8.2710e+02 3.4470e+02 4.7720e+02 3.3380e+02 + 4.8270e+02 5.6180e+02 2.2210e+02 2.8590e+02 4.9930e+02 4.8340e+02 2.0023e+03 + 3.9137e+03 3.4278e+03 3.9016e+03 5.7160e+02 2.0650e+02 6.2510e+02 6.9730e+02 + 5.2320e+02 2.7260e+02 8.5440e+02 3.9242e+03 2.4153e+03 9.1740e+02 7.9690e+02 + 7.3390e+02 9.6180e+02 2.4600e+02 4.6970e+02 6.1190e+02 2.9140e+02 2.9320e+02 + 6.7030e+02 1.9976e+03 3.3504e+03 1.7905e+03 9.8110e+02 4.4200e+02 4.9590e+02 + 5.6590e+02 3.9480e+02 8.1640e+02 1.2799e+03 2.2945e+03 2.9164e+03 2.0133e+03 + 1.1237e+03 3.5710e+02 3.1360e+02 4.5370e+02 2.4274e+03 3.0183e+03 1.1461e+03 + 2.4123e+03 2.3423e+03 1.5130e+03 1.0014e+03 4.4950e+02 4.0590e+02 8.2330e+02 + 6.0320e+02 3.4210e+02 3.0630e+02 3.7470e+02 9.8610e+02 4.9880e+02 3.4600e+02 + 3.1910e+02 3.7370e+02 9.7840e+02 1.9987e+03 3.6350e+03 3.3699e+03 3.0240e+03 + 9.4720e+02 3.0310e+02 2.5810e+02 1.5812e+03 6.5660e+02 3.1800e+02 7.5650e+02 + 3.0004e+03 2.3709e+03 5.1680e+02 7.4440e+02 4.9370e+02 4.7070e+02 6.2350e+02 + 2.8120e+02 5.4500e+02 2.6320e+02 2.0570e+02 5.9060e+02 2.5046e+03 2.9577e+03 + 1.5695e+03 4.2260e+02 8.0090e+02 5.0720e+02 4.7440e+02 4.0680e+02 3.6750e+02 + 7.2560e+02 1.3609e+03 2.8999e+03 2.8205e+03 2.3965e+03 7.5400e+02 3.1260e+02 + 1.6594e+03 2.9411e+03 2.5467e+03 1.8741e+03 2.2797e+03 3.1727e+03 2.1061e+03 + 6.2790e+02 3.0300e+02 3.1480e+02 4.8650e+02 4.4900e+02 1.5020e+02 2.5270e+02 + 2.7590e+02 3.1700e+02 6.5000e+02 3.2850e+02 4.5330e+02 4.3920e+02 7.3190e+02 + 2.2235e+03 3.9365e+03 1.8063e+03 3.6344e+03 9.5490e+02 6.1080e+02 5.2650e+02 + 4.3090e+02 6.9050e+02 3.1300e+02 1.2300e+03 2.4339e+03 2.1437e+03 4.5240e+02 + 6.0580e+02 5.6040e+02 7.4980e+02 7.8340e+02 2.8900e+02 5.2090e+02 5.1740e+02 + 4.8300e+02 4.8110e+02 1.8421e+03 4.5752e+03 1.4374e+03 5.5240e+02 2.6790e+02 + 6.9690e+02 7.7110e+02 4.1690e+02 3.1060e+02 4.3070e+02 5.8520e+02 2.2107e+03 + 4.5535e+03 2.4637e+03 2.9540e+02 6.5790e+02 7.8800e+02 4.3083e+03 2.0816e+03 + 9.7620e+02 2.1093e+03 3.0157e+03 1.8722e+03 7.7550e+02 2.8270e+02 4.0050e+02 + 4.4740e+02 3.7270e+02 2.9410e+02 1.9360e+02 7.9500e+02 4.9660e+02 4.2900e+02 + 3.7650e+02 4.4470e+02 5.3340e+02 1.1498e+03 1.9305e+03 2.9480e+03 2.4512e+03 + 3.2940e+03 2.1240e+03 6.1260e+02 4.4770e+02 1.5833e+03 5.4200e+02 2.0750e+02 + 9.2760e+02 2.0306e+03 3.0737e+03 6.2770e+02 7.7860e+02 5.4620e+02 5.9340e+02 + 6.9570e+02 3.5210e+02 5.4750e+02 4.2650e+02 6.6300e+02 5.4680e+02 2.2349e+03 + 4.2610e+03 2.3745e+03 8.9910e+02 2.9000e+02 3.4770e+02 5.7100e+02 6.8150e+02 + 2.6420e+02 4.2290e+02 7.2920e+02 9.0280e+02 4.3739e+03 3.0405e+03 1.4959e+03 + 1.5472e+03 2.3507e+03 3.2409e+03 1.4220e+03 1.3595e+03 3.7898e+03 2.8599e+03 + 7.9680e+02 4.5240e+02 5.2180e+02 2.2710e+02 4.0500e+02 5.1010e+02 5.4950e+02 + 4.7460e+02 3.9810e+02 5.3920e+02 4.9130e+02 3.8100e+02 6.0690e+02 4.3750e+02 + 1.0073e+03 3.1140e+03 2.5582e+03 2.1288e+03 4.5528e+03 8.1270e+02 1.1453e+03 + 4.8030e+02 9.7760e+02 3.1610e+02 4.0670e+02 2.4510e+02 1.9038e+03 3.2550e+03 + 1.4607e+03 5.5250e+02 4.0160e+02 6.5570e+02 3.5740e+02 3.3420e+02 3.9790e+02 + 4.6510e+02 7.8840e+02 6.2920e+02 1.6010e+03 2.9669e+03 2.1492e+03 6.2730e+02 + 1.5490e+02 5.2510e+02 9.7580e+02 5.7740e+02 6.6290e+02 5.5730e+02 1.9620e+02 + 4.6390e+02 2.4549e+03 2.3195e+03 3.0685e+03 1.7543e+03 2.5639e+03 2.0440e+03 + 1.8088e+03 1.2576e+03 3.8028e+03 3.3131e+03 7.6850e+02 6.0840e+02 3.3520e+02 + 2.9500e+02 2.3970e+02 3.1470e+02 7.2210e+02 4.9620e+02 2.7970e+02 7.0370e+02 + 4.9030e+02 2.7790e+02 4.8390e+02 5.5660e+02 1.6293e+03 3.3937e+03 2.2853e+03 + 2.1149e+03 4.7906e+03 1.2083e+03 1.0777e+03 1.3564e+03 5.8820e+02 7.5160e+02 + 4.3960e+02 4.9480e+02 2.0222e+03 3.8909e+03 2.5456e+03 2.1540e+02 4.9970e+02 + 4.7630e+02 5.4200e+02 4.6840e+02 5.2430e+02 2.4960e+02 1.1164e+03 7.0480e+02 + 2.1169e+03 4.4006e+03 2.0384e+03 5.1930e+02 1.5130e+02 6.3250e+02 2.8260e+02 + 6.6270e+02 5.2360e+02 3.3010e+02 2.3070e+02 2.0840e+02 1.9978e+03 3.5074e+03 + 2.7373e+03 2.2566e+03 2.7985e+03 1.4616e+03 1.2567e+03 1.7894e+03 1.9386e+03 + 2.6752e+03 9.0790e+02 4.0880e+02 5.5300e+02 3.7530e+02 3.0950e+02 2.8420e+02 + 5.3210e+02 5.1950e+02 3.8450e+02 6.3130e+02 6.2000e+02 2.9910e+02 1.8100e+02 + 9.3990e+02 1.4521e+03 2.9953e+03 2.5709e+03 2.0976e+03 3.3690e+03 2.1567e+03 + 5.4870e+02 5.5860e+02 5.5990e+02 6.1490e+02 7.1950e+02 4.4050e+02 9.2460e+02 + 4.3470e+03 4.0010e+03 7.7040e+02 6.3080e+02 8.5520e+02 5.1490e+02 6.0010e+02 + 2.7140e+02 7.9390e+02 7.6030e+02 7.6180e+02 2.9866e+03 4.3348e+03 1.0423e+03 + 4.7030e+02 1.5490e+02 5.9090e+02 7.0630e+02 7.9080e+02 4.2590e+02 5.1090e+02 + 4.6630e+02 3.7170e+02 1.3335e+03 2.1639e+03 4.8413e+03 2.7083e+03 2.3434e+03 + 1.8055e+03 7.1420e+02 1.3244e+03 3.5344e+03 3.3820e+03 5.4550e+02 3.6560e+02 + 5.2560e+02 4.0050e+02 2.9730e+02 4.6590e+02 3.1230e+02 3.4230e+02 6.5220e+02 + 7.7890e+02 6.3210e+02 4.7920e+02 4.4440e+02 7.3960e+02 2.1177e+03 2.6482e+03 + 2.7180e+03 2.2171e+03 4.0645e+03 1.0080e+03 9.2370e+02 5.4580e+02 4.2350e+02 + 8.9320e+02 1.0832e+03 5.1760e+02 5.4250e+02 2.1664e+03 3.2791e+03 1.8494e+03 + 4.3480e+02 5.2960e+02 5.6630e+02 4.3570e+02 8.9910e+02 6.5540e+02 6.4610e+02 + 1.8178e+03 3.5527e+03 3.1316e+03 1.3888e+03 7.2760e+02 3.6630e+02 7.0330e+02 + 5.6530e+02 4.0220e+02 2.6610e+02 8.5930e+02 7.2830e+02 4.5270e+02 1.0284e+03 + 3.0646e+03 5.3468e+03 3.2703e+03 2.8402e+03 1.2593e+03 4.7740e+02 1.5140e+03 + 4.1307e+03 2.1429e+03 4.4140e+02 2.5620e+02 3.8920e+02 3.9660e+02 6.3870e+02 + 5.6700e+02 4.4210e+02 2.9500e+02 3.9130e+02 8.7010e+02 5.3010e+02 4.4000e+02 + 2.2150e+02 6.8530e+02 1.0145e+03 3.9313e+03 2.3889e+03 3.3943e+03 4.6437e+03 + 2.1088e+03 7.0340e+02 2.7480e+02 4.3490e+02 6.1160e+02 7.4720e+02 8.7060e+02 + 1.2734e+03 1.9300e+03 3.5191e+03 4.0411e+03 1.3697e+03 4.4110e+02 7.6110e+02 + 3.7660e+02 3.0920e+02 5.5870e+02 4.8270e+02 2.3419e+03 2.3809e+03 2.8964e+03 + 9.3960e+02 7.5430e+02 5.8520e+02 2.6920e+02 5.1440e+02 2.7010e+02 5.4220e+02 + 4.5330e+02 5.1440e+02 6.8210e+02 4.1480e+02 3.5651e+03 4.2808e+03 5.6000e+03 + 1.8661e+03 6.3150e+02 5.3250e+02 7.8370e+02 3.8896e+03 2.0462e+03 6.7270e+02 + 6.2560e+02 5.1950e+02 4.0450e+02 7.2860e+02 3.4590e+02 6.4600e+02 3.2840e+02 + 2.8230e+02 6.5350e+02 6.7890e+02 4.1120e+02 3.7610e+02 5.3220e+02 5.7320e+02 + 2.6829e+03 3.6897e+03 1.5251e+03 5.3968e+03 2.3727e+03 3.2890e+02 3.3830e+02 + 4.3400e+02 4.5560e+02 5.8640e+02 4.7430e+02 4.2080e+02 1.9691e+03 1.9968e+03 + 4.1724e+03 1.8571e+03 6.5400e+02 5.4070e+02 2.2710e+02 6.6210e+02 3.2150e+02 + 6.5510e+02 1.8264e+03 4.7806e+03 3.0576e+03 1.0254e+03 5.1100e+02 3.5540e+02 + 6.1210e+02 1.2217e+03 5.5930e+02 3.7230e+02 4.6180e+02 3.4750e+02 3.7560e+02 + 1.1086e+03 2.2815e+03 5.6000e+03 3.8338e+03 9.3120e+02 7.8510e+02 8.4670e+02 + 1.3437e+03 3.2696e+03 2.7918e+03 9.3940e+02 7.4780e+02 3.1740e+02 3.2280e+02 + 3.6390e+02 3.1250e+02 6.6120e+02 2.8350e+02 2.9470e+02 5.3480e+02 5.5140e+02 + 2.9770e+02 4.0700e+02 4.1280e+02 5.7880e+02 2.2685e+03 2.3524e+03 2.8905e+03 + 4.4327e+03 2.2664e+03 3.4570e+02 3.7650e+02 8.7580e+02 9.0400e+02 6.1450e+02 + 5.0020e+02 5.3870e+02 8.0920e+02 1.8188e+03 3.1616e+03 3.2104e+03 1.3026e+03 + 7.5830e+02 1.6590e+02 1.6470e+02 2.9080e+02 6.6030e+02 3.4891e+03 3.2498e+03 + 2.3375e+03 6.9180e+02 6.4280e+02 2.8810e+02 5.6100e+02 1.0610e+03 7.1550e+02 + 4.8850e+02 3.2180e+02 6.3300e+02 6.5170e+02 1.0884e+03 3.5876e+03 5.3116e+03 + 5.3204e+03 7.0380e+02 5.6000e+02 5.4150e+02 9.1480e+02 3.0924e+03 5.2328e+03 + 2.3346e+03 6.7880e+02 3.6640e+02 1.6280e+02 5.3280e+02 8.1570e+02 5.0200e+02 + 6.3890e+02 5.9550e+02 6.1370e+02 5.4670e+02 6.2530e+02 7.3440e+02 3.8430e+02 + 2.2820e+02 1.1571e+03 2.2371e+03 2.1084e+03 4.7397e+03 1.9892e+03 3.0390e+02 + 4.6780e+02 1.1751e+03 8.0490e+02 3.2710e+02 1.4410e+02 3.2810e+02 6.5360e+02 + 1.2389e+03 2.1364e+03 3.0078e+03 1.5959e+03 5.8420e+02 4.9130e+02 1.6700e+02 + 4.0380e+02 7.5230e+02 4.1046e+03 3.2329e+03 1.6520e+03 4.3240e+02 6.3680e+02 + 3.7640e+02 3.3220e+02 5.6590e+02 4.5050e+02 6.2740e+02 4.0340e+02 6.6220e+02 + 5.7670e+02 5.6280e+02 3.5516e+03 4.6237e+03 4.8609e+03 8.5480e+02 2.1900e+02 + 3.5070e+02 1.8574e+03 2.4129e+03 4.1208e+03 1.1699e+03 7.9760e+02 8.1730e+02 + 4.1320e+02 9.3100e+02 7.4760e+02 9.3920e+02 5.1590e+02 8.5270e+02 6.4770e+02 + 4.1110e+02 4.6380e+02 8.2780e+02 3.2910e+02 9.2400e+01 1.0906e+03 3.1156e+03 + 2.0710e+03 3.2117e+03 2.9662e+03 6.4340e+02 8.3060e+02 1.0349e+03 5.7770e+02 + 2.9710e+02 1.8420e+02 4.8530e+02 3.0430e+02 1.0339e+03 1.9722e+03 3.2904e+03 + 2.1637e+03 6.3950e+02 4.8960e+02 4.0960e+02 4.9480e+02 1.7257e+03 4.3850e+03 + 2.1605e+03 1.4047e+03 6.8160e+02 1.1426e+03 6.4030e+02 4.2550e+02 7.0150e+02 + 6.2320e+02 6.0370e+02 3.1200e+02 4.6990e+02 5.8920e+02 1.7732e+03 4.2107e+03 + 5.1428e+03 2.1089e+03 1.2280e+03 2.6340e+02 3.0330e+02 9.2200e+02 2.3165e+03 + 4.0800e+03 2.1516e+03 8.5370e+02 8.8350e+02 3.7000e+02 7.2330e+02 8.4540e+02 + 7.6200e+02 6.5020e+02 6.1920e+02 5.0140e+02 2.8380e+02 7.2210e+02 6.9230e+02 + 2.7060e+02 1.6710e+02 4.6060e+02 3.0839e+03 7.7150e+02 3.1197e+03 3.5315e+03 + 6.0040e+02 5.6210e+02 9.1360e+02 6.4500e+02 1.9230e+02 6.8840e+02 3.7680e+02 + 6.3790e+02 7.0570e+02 2.3465e+03 2.1056e+03 3.4585e+03 1.7107e+03 1.2179e+03 + 6.5660e+02 9.4900e+02 2.6500e+03 2.7805e+03 1.9253e+03 4.9440e+02 5.2620e+02 + 8.4150e+02 7.0150e+02 3.4210e+02 2.2340e+02 3.6140e+02 6.3770e+02 6.9730e+02 + 3.6740e+02 4.5710e+02 2.8817e+03 5.0135e+03 4.3217e+03 2.4378e+03 1.4297e+03 + 3.0390e+02 1.7800e+02 4.2520e+02 2.1119e+03 2.5322e+03 1.8462e+03 1.3683e+03 + 9.8760e+02 5.9940e+02 1.3126e+03 1.0824e+03 4.6950e+02 5.7130e+02 6.2920e+02 + 2.1430e+02 7.6060e+02 7.2310e+02 5.0230e+02 5.2810e+02 3.1070e+02 8.8830e+02 + 3.1883e+03 4.4550e+02 3.9062e+03 3.4958e+03 9.2260e+02 3.4250e+02 5.7480e+02 + 3.8950e+02 1.9780e+02 5.4070e+02 3.6770e+02 3.6690e+02 1.0209e+03 1.2442e+03 + 2.3416e+03 2.8336e+03 2.2984e+03 8.7510e+02 1.0117e+03 1.5244e+03 2.4052e+03 + 2.4466e+03 7.8030e+02 6.3030e+02 5.1100e+02 5.5530e+02 3.6870e+02 3.5490e+02 + 5.9230e+02 4.0660e+02 5.6110e+02 2.0740e+02 4.6160e+02 9.7000e+02 2.1927e+03 + 5.6000e+03 4.7834e+03 2.0314e+03 6.0780e+02 3.7260e+02 1.8500e+02 5.0830e+02 + 1.5062e+03 3.1581e+03 2.5692e+03 3.0779e+03 1.9908e+03 1.0711e+03 6.2000e+02 + 7.4670e+02 6.7390e+02 6.5610e+02 6.8360e+02 6.4170e+02 4.8750e+02 8.8010e+02 + 4.0270e+02 5.9340e+02 8.2950e+02 6.7340e+02 3.4272e+03 4.0870e+02 3.0384e+03 + 5.6000e+03 2.2001e+03 4.1640e+02 3.5260e+02 3.7000e+02 3.3220e+02 5.7280e+02 + 2.2240e+02 2.4520e+02 5.7460e+02 9.1800e+02 9.7050e+02 4.4701e+03 2.2371e+03 + 1.9326e+03 1.8881e+03 2.7790e+03 3.0113e+03 9.4480e+02 1.0841e+03 6.1980e+02 + 6.5830e+02 5.1970e+02 5.6810e+02 4.0240e+02 6.7840e+02 4.3860e+02 4.0560e+02 + 3.9190e+02 5.4120e+02 8.5680e+02 2.8344e+03 3.6162e+03 4.5719e+03 2.6459e+03 + 6.4490e+02 5.1150e+02 6.0440e+02 4.2470e+02 1.1095e+03 2.1032e+03 2.1822e+03 + 2.6273e+03 2.2955e+03 1.8613e+03 1.4671e+03 5.3640e+02 7.1640e+02 9.9340e+02 + 1.0533e+03 6.3210e+02 7.3210e+02 6.5290e+02 3.0710e+02 8.9020e+02 1.4225e+03 + 9.6740e+02 2.5538e+03 3.4460e+02 1.8543e+03 5.6000e+03 2.8229e+03 4.6410e+02 + 4.4190e+02 3.6930e+02 3.7190e+02 4.0840e+02 4.8010e+02 3.4440e+02 3.5590e+02 + 4.2420e+02 1.1193e+03 2.0598e+03 2.9552e+03 2.4112e+03 4.4317e+03 2.6324e+03 + 3.6528e+03 9.9020e+02 3.6340e+02 5.4780e+02 2.8110e+02 6.1170e+02 3.4750e+02 + 4.2160e+02 4.9380e+02 6.4180e+02 1.7340e+02 4.3730e+02 7.7570e+02 2.1930e+03 + 3.8240e+03 3.8471e+03 4.9337e+03 8.1500e+02 6.5880e+02 4.8180e+02 6.2030e+02 + 3.1280e+02 5.5380e+02 1.3818e+03 1.8752e+03 2.3201e+03 2.2751e+03 3.3651e+03 + 3.2472e+03 1.3064e+03 8.5540e+02 8.1920e+02 5.4530e+02 1.4841e+03 8.2920e+02 + 5.4250e+02 2.0010e+02 5.4320e+02 1.0081e+03 1.1224e+03 3.8101e+03 4.0040e+02 + 9.9040e+02 4.0340e+03 3.6758e+03 1.1550e+03 2.1620e+02 6.0470e+02 2.6150e+02 + 3.1080e+02 7.1140e+02 6.3690e+02 4.8690e+02 5.2750e+02 5.3730e+02 1.8534e+03 + 2.2465e+03 4.9989e+03 3.6111e+03 2.5645e+03 2.2630e+03 6.4520e+02 3.5800e+02 + 6.9010e+02 5.6760e+02 4.5290e+02 4.9570e+02 3.9640e+02 6.4820e+02 2.8570e+02 + 2.2090e+02 4.9800e+02 5.2180e+02 2.0094e+03 4.9837e+03 5.6000e+03 3.2625e+03 + 6.2110e+02 2.3850e+02 6.9140e+02 4.0710e+02 3.4900e+02 5.2740e+02 5.3330e+02 + 6.4480e+02 1.6140e+03 1.8989e+03 2.8187e+03 2.6213e+03 1.7214e+03 1.9247e+03 + 2.1705e+03 1.2072e+03 1.5311e+03 5.1010e+02 7.5670e+02 5.3790e+02 6.4400e+02 + 3.8090e+02 1.9466e+03 3.5522e+03 2.4740e+02 5.8940e+02 2.3103e+03 3.2835e+03 + 1.6343e+03 1.4117e+03 5.4920e+02 2.2310e+02 3.7980e+02 6.1160e+02 7.9710e+02 + 6.2180e+02 5.5180e+02 5.8340e+02 8.9030e+02 3.7818e+03 5.6000e+03 3.3658e+03 + 2.2971e+03 8.0280e+02 7.6990e+02 3.0320e+02 5.7610e+02 6.6280e+02 4.8260e+02 + 1.4690e+02 4.6420e+02 5.9040e+02 3.8720e+02 4.4400e+02 6.9940e+02 9.4830e+02 + 2.0943e+03 3.2633e+03 4.7954e+03 2.6929e+03 7.9840e+02 4.0800e+02 6.6000e+02 + 4.0920e+02 2.4140e+02 3.0660e+02 8.2540e+02 3.7500e+02 5.0640e+02 8.1080e+02 + 2.0991e+03 2.4428e+03 1.1912e+03 1.3702e+03 1.9015e+03 2.1452e+03 2.0412e+03 + 8.8470e+02 4.7140e+02 7.1900e+02 5.8430e+02 4.0760e+02 2.9976e+03 3.1499e+03 + 3.0660e+02 8.8490e+02 8.0740e+02 2.3314e+03 3.6461e+03 1.6592e+03 9.7340e+02 + 2.1630e+02 3.0580e+02 7.5790e+02 4.7010e+02 8.1310e+02 1.1529e+03 4.9980e+02 + 1.8575e+03 3.4169e+03 5.6000e+03 1.6862e+03 1.8443e+03 8.6730e+02 8.2260e+02 + 6.1500e+02 2.5830e+02 5.6180e+02 8.1090e+02 5.5860e+02 5.0470e+02 5.5860e+02 + 2.7830e+02 4.0940e+02 8.0220e+02 1.3786e+03 3.8261e+03 4.1312e+03 5.3268e+03 + 2.5201e+03 5.0480e+02 6.1410e+02 1.2700e+03 4.0570e+02 3.0950e+02 2.8110e+02 + 3.7890e+02 4.8680e+02 3.0090e+02 4.4990e+02 1.3058e+03 1.4826e+03 5.5280e+02 + 1.7284e+03 1.9545e+03 2.4777e+03 1.6529e+03 1.4724e+03 2.5317e+03 1.1323e+03 + 3.0730e+02 8.1100e+02 3.4068e+03 3.1340e+03 3.5830e+02 7.4830e+02 1.2394e+03 + 2.3997e+03 2.5102e+03 2.7294e+03 6.6630e+02 3.3180e+02 5.3440e+02 7.0650e+02 + 3.9370e+02 4.9100e+02 6.0990e+02 2.2287e+03 2.2204e+03 4.2267e+03 5.6000e+03 + 1.9775e+03 4.0440e+02 6.0540e+02 6.5070e+02 6.6310e+02 5.3620e+02 4.9500e+02 + 5.8220e+02 4.3090e+02 5.0110e+02 2.2190e+02 4.7630e+02 5.3490e+02 1.1772e+03 + 1.8725e+03 3.7769e+03 2.8746e+03 3.2622e+03 2.1686e+03 4.7850e+02 6.9220e+02 + 9.0560e+02 6.6850e+02 6.2260e+02 3.7200e+02 4.7890e+02 7.7770e+02 3.3850e+02 + 1.3000e+02 4.3920e+02 9.0110e+02 9.2800e+02 8.4550e+02 1.0633e+03 1.6970e+03 + 2.3488e+03 2.1768e+03 1.8975e+03 2.4682e+03 2.3738e+03 1.8536e+03 2.0957e+03 + 2.2567e+03 7.8930e+02 8.4050e+02 9.4750e+02 1.3579e+03 3.3202e+03 2.3787e+03 + 1.6212e+03 3.7490e+02 6.5100e+02 4.1190e+02 1.5860e+02 6.2560e+02 1.2732e+03 + 2.8315e+03 2.6486e+03 2.6830e+03 3.3775e+03 2.3946e+03 4.0390e+02 4.8300e+02 + 3.4090e+02 4.0430e+02 6.5520e+02 6.7760e+02 5.1260e+02 3.8660e+02 4.2340e+02 + 2.3980e+02 2.2690e+02 6.1070e+02 2.4280e+03 2.4070e+03 3.5605e+03 2.2468e+03 + 3.0441e+03 1.1087e+03 5.2960e+02 4.8130e+02 9.1120e+02 5.0470e+02 3.3050e+02 + 7.1520e+02 6.4900e+02 6.8290e+02 3.5710e+02 3.4170e+02 2.9020e+02 3.2450e+02 + 5.1910e+02 6.3130e+02 4.9890e+02 1.0645e+03 6.7610e+02 1.8140e+03 1.9592e+03 + 2.2005e+03 4.3082e+03 2.2832e+03 3.7889e+03 1.9781e+03 5.7100e+02 8.7220e+02 + 4.5180e+02 9.9770e+02 2.4646e+03 4.9578e+03 1.9257e+03 4.7810e+02 3.6430e+02 + 5.8150e+02 3.3990e+02 2.1290e+02 1.8968e+03 3.7557e+03 4.0359e+03 2.1054e+03 + 2.9749e+03 1.5472e+03 5.0760e+02 7.6120e+02 1.8130e+02 5.3180e+02 4.1320e+02 + 7.4630e+02 4.9680e+02 2.9540e+02 3.5630e+02 4.1660e+02 3.6870e+02 7.3000e+02 + 2.1678e+03 2.0968e+03 3.1055e+03 3.6196e+03 3.9199e+03 3.6040e+02 5.2190e+02 + 4.9980e+02 4.0070e+02 1.7880e+02 2.9510e+02 9.7310e+02 8.9700e+02 6.0510e+02 + 4.2370e+02 4.6200e+02 2.5930e+02 4.3510e+02 5.5510e+02 4.5560e+02 5.7230e+02 + 9.9550e+02 3.6020e+02 1.0478e+03 1.6530e+03 3.1841e+03 4.5695e+03 4.6139e+03 + 2.6273e+03 7.1220e+02 5.0160e+02 7.8850e+02 5.9840e+02 4.5570e+02 1.0267e+03 + 3.1341e+03 2.5309e+03 6.5720e+02 3.6890e+02 8.9770e+02 7.0940e+02 6.3420e+02 + 2.0326e+03 3.1804e+03 2.1447e+03 1.3250e+03 4.2439e+03 2.2177e+03 1.2157e+03 + 6.5590e+02 5.0210e+02 5.1320e+02 3.5050e+02 7.0460e+02 6.5500e+02 4.1660e+02 + 2.7870e+02 5.7750e+02 2.3550e+02 7.8280e+02 2.1157e+03 4.3231e+03 1.8371e+03 + 3.1203e+03 4.3252e+03 8.4550e+02 4.8020e+02 6.9970e+02 4.4550e+02 3.8670e+02 + 5.3640e+02 5.2540e+02 3.8620e+02 3.6020e+02 4.1090e+02 7.0440e+02 4.6840e+02 + 9.4500e+02 8.8110e+02 5.2880e+02 5.6700e+02 9.9580e+02 6.5080e+02 3.6620e+02 + 4.6220e+02 2.0106e+03 2*5.6000e+03 3.2354e+03 1.0722e+03 7.8020e+02 + 5.8410e+02 1.0745e+03 3.9310e+02 1.4823e+03 3.8191e+03 3.2526e+03 8.8530e+02 + 3.9260e+02 1.0723e+03 9.9890e+02 2.2057e+03 2.5508e+03 2.5029e+03 2.6054e+03 + 1.8510e+03 2.8463e+03 2.6833e+03 1.0915e+03 5.4690e+02 6.3020e+02 4.7450e+02 + 6.5220e+02 7.4020e+02 3.4040e+02 2.7500e+02 3.8260e+02 6.7710e+02 5.0120e+02 + 7.9000e+02 3.7336e+03 3.5290e+03 2.0425e+03 2.2307e+03 3.6770e+03 5.9020e+02 + 3.9020e+02 5.3280e+02 6.2870e+02 5.8730e+02 2.6890e+02 7.1240e+02 3.0260e+02 + 2.6190e+02 4.2210e+02 8.9690e+02 4.1040e+02 7.5290e+02 3.4150e+02 2.4860e+02 + 5.4870e+02 5.5230e+02 6.5420e+02 1.7200e+03 7.8530e+02 2.2056e+03 5.0895e+03 + 5.1238e+03 3.8651e+03 7.9750e+02 5.3750e+02 7.4510e+02 5.4020e+02 8.6610e+02 + 9.6270e+02 4.3739e+03 3.7263e+03 7.3540e+02 5.0890e+02 5.5990e+02 1.8805e+03 + 2.0684e+03 3.1689e+03 2.3571e+03 1.5523e+03 1.9534e+03 2.3900e+03 2.0472e+03 + 9.8970e+02 5.1600e+02 2.8810e+02 2.4870e+02 5.0250e+02 4.8220e+02 5.3590e+02 + 2.8380e+02 2.3010e+02 7.2030e+02 1.1439e+03 1.6705e+03 2.4770e+03 3.2117e+03 + 1.7120e+03 2.3525e+03 3.4963e+03 2.0133e+03 3.9460e+02 4.5810e+02 3.9070e+02 + 7.4420e+02 3.5540e+02 5.7230e+02 1.7980e+02 3.8450e+02 6.3330e+02 6.8680e+02 + 7.5060e+02 7.7610e+02 4.5880e+02 2.9420e+02 5.5370e+02 3.1020e+02 9.5560e+02 + 1.4073e+03 1.1668e+03 3.6595e+03 3.8341e+03 4.4609e+03 5.2292e+03 9.2960e+02 + 4.8500e+02 4.3640e+02 7.1430e+02 9.9530e+02 1.2521e+03 4.4200e+03 2.7394e+03 + 1.1134e+03 4.2260e+02 2.2114e+03 2.2670e+03 2.3705e+03 1.0882e+03 9.0230e+02 + 7.0250e+02 2.2409e+03 2.0753e+03 2.0827e+03 2.8490e+02 2.2550e+02 3.5250e+02 + 3.5500e+02 5.0270e+02 3.6190e+02 5.8580e+02 3.9990e+02 3.4720e+02 4.0960e+02 + 7.7110e+02 5.7310e+02 3.4556e+03 3.1236e+03 2.2474e+03 2.9072e+03 2.8628e+03 + 6.8020e+02 3.6160e+02 3.1530e+02 7.7660e+02 6.1300e+02 4.1580e+02 4.3160e+02 + 2.4310e+02 5.1960e+02 8.9400e+02 5.0030e+02 6.9110e+02 3.0950e+02 3.7450e+02 + 5.5880e+02 5.3760e+02 8.3410e+02 1.7150e+03 1.2985e+03 1.9249e+03 3.8083e+03 + 2.0405e+03 2.2249e+03 2.4027e+03 2.7291e+03 3.0320e+02 5.7770e+02 6.5820e+02 + 8.3230e+02 1.4523e+03 2.7605e+03 3.9967e+03 8.6720e+02 1.8528e+03 3.7495e+03 + 3.9143e+03 1.5043e+03 4.9700e+02 2.6570e+02 8.5810e+02 1.8585e+03 2.2959e+03 + 3.0457e+03 5.7200e+02 2.4470e+02 5.7290e+02 3.5430e+02 5.2920e+02 7.9400e+02 + 9.2360e+02 8.0390e+02 6.3580e+02 5.3980e+02 2.8890e+02 6.7990e+02 2.3512e+03 + 3.6596e+03 9.9740e+02 2.2747e+03 2.8236e+03 7.5300e+02 6.4730e+02 1.9080e+02 + 3.8320e+02 1.1563e+03 4.8990e+02 4.0520e+02 2.9410e+02 1.0612e+03 1.1681e+03 + 5.6540e+02 4.7360e+02 4.4200e+02 3.2030e+02 6.4390e+02 6.0630e+02 8.8690e+02 + 6.8320e+02 1.2597e+03 2.4892e+03 2.6848e+03 2.5486e+03 6.8570e+02 2.0748e+03 + 3.1118e+03 6.9090e+02 6.2880e+02 5.2970e+02 5.7580e+02 6.7220e+02 2.0720e+03 + 3.2197e+03 2.3417e+03 3.3532e+03 3.1022e+03 2.2504e+03 1.3210e+03 4.7060e+02 + 1.5680e+02 8.4170e+02 8.1470e+02 3.4089e+03 3.3460e+03 2.9580e+02 3.6920e+02 + 5.3780e+02 5.8390e+02 5.5250e+02 4.1700e+02 9.1790e+02 9.6440e+02 1.0164e+03 + 5.3830e+02 5.7100e+02 2.0671e+03 2.1311e+03 3.7021e+03 1.2231e+03 4.3031e+03 + 2.5448e+03 1.8052e+03 6.8370e+02 2.7070e+02 4.3810e+02 6.4120e+02 3.0780e+02 + 1.5880e+02 3.9020e+02 5.6650e+02 9.1780e+02 5.1350e+02 5.1790e+02 6.4240e+02 + 4.5330e+02 5.6740e+02 1.5055e+03 1.9050e+03 2.7124e+03 2.0883e+03 2.7765e+03 + 1.8336e+03 1.6044e+03 9.6300e+02 8.4740e+02 1.6064e+03 8.5640e+02 4.2990e+02 + 2.2050e+02 3.5040e+02 7.9740e+02 2.1024e+03 2.5330e+03 3.0419e+03 2.8685e+03 + 2.4661e+03 7.3490e+02 4.7020e+02 2.9530e+02 2.2340e+02 5.0910e+02 2.5057e+03 + 3.7071e+03 2.1062e+03 5.1220e+02 3.2860e+02 1.3930e+02 5.2600e+02 3.2250e+02 + 4.6190e+02 6.8590e+02 1.0435e+03 5.8920e+02 4.6160e+02 2.3890e+02 4.7290e+02 + 2.7639e+03 1.9846e+03 1.7609e+03 2.9651e+03 3.4447e+03 2.2475e+03 1.0721e+03 + 7.2410e+02 4.6540e+02 5.9110e+02 4.4380e+02 4.5940e+02 5.2660e+02 7.2190e+02 + 4.9790e+02 2.4630e+02 5.1940e+02 4.7140e+02 7.7930e+02 8.2730e+02 1.6167e+03 + 2.5923e+03 2.4993e+03 2.9748e+03 1.6039e+03 8.0550e+02 8.2020e+02 7.5580e+02 + 5.6940e+02 5.8450e+02 6.2150e+02 5.9870e+02 4.6050e+02 4.3880e+02 4.1030e+02 + 2.6088e+03 2.7992e+03 4.2695e+03 4.7079e+03 2.2611e+03 1.2430e+03 3.4620e+02 + 3.3470e+02 4.9980e+02 4.6210e+02 2.0268e+03 3.2101e+03 1.9691e+03 3.8160e+02 + 3.4840e+02 2.8710e+02 7.3560e+02 3.7140e+02 4.2900e+02 1.1762e+03 9.6420e+02 + 5.4320e+02 2.7870e+02 4.2810e+02 1.1217e+03 2.1622e+03 2.3593e+03 9.7140e+02 + 2.9945e+03 4.1670e+03 2.0262e+03 6.7160e+02 9.6110e+02 4.7170e+02 4.8110e+02 + 3.6240e+02 7.0090e+02 4.2950e+02 6.2570e+02 3.9350e+02 3.8570e+02 2.5580e+02 + 3.7660e+02 6.8570e+02 1.9651e+03 1.8813e+03 2.2169e+03 2.5793e+03 1.9593e+03 + 6.5920e+02 5.7520e+02 4.7950e+02 5.8740e+02 1.6828e+03 9.6320e+02 2.5600e+02 + 3.1710e+02 7.3760e+02 4.3640e+02 5.1770e+02 2.0411e+03 5.0976e+03 3.0005e+03 + 3.2600e+03 1.2361e+03 4.1650e+02 6.8320e+02 5.5710e+02 5.9270e+02 6.7760e+02 + 2.8123e+03 3.4652e+03 1.4802e+03 6.3360e+02 5.1140e+02 2.4170e+02 4.8690e+02 + 5.1040e+02 4.0280e+02 8.2880e+02 5.1230e+02 5.3000e+02 4.1100e+02 3.2250e+02 + 6.9220e+02 2.4356e+03 2.0459e+03 8.8970e+02 1.6467e+03 2.5769e+03 1.9881e+03 + 8.2930e+02 6.2710e+02 7.7650e+02 2.7740e+02 3.7960e+02 5.6620e+02 1.3928e+03 + 5.8310e+02 7.3990e+02 6.1000e+02 2.8430e+02 3.8630e+02 1.3394e+03 2.9896e+03 + 2.2624e+03 2.4360e+03 2.1442e+03 7.2260e+02 2.6850e+02 3.3550e+02 5.0150e+02 + 6.3530e+02 6.4270e+02 6.5520e+02 5.5430e+02 3.6450e+02 2.5790e+02 5.1570e+02 + 7.7200e+02 2.2858e+03 5.6000e+03 2.5415e+03 1.9585e+03 1.0144e+03 5.3040e+02 + 7.4220e+02 8.7990e+02 1.2387e+03 1.1134e+03 3.3551e+03 2.4575e+03 4.9940e+02 + 7.0400e+02 5.5140e+02 7.3720e+02 4.1620e+02 4.0310e+02 3.7430e+02 6.2030e+02 + 4.2680e+02 3.5270e+02 5.6570e+02 4.7330e+02 1.6844e+03 3.2683e+03 2.1831e+03 + 6.1580e+02 1.3857e+03 3.5392e+03 3.8638e+03 7.4510e+02 6.3380e+02 5.8000e+02 + 3.6630e+02 4.4060e+02 4.2720e+02 6.8350e+02 3.9320e+02 4.2300e+02 4.2310e+02 + 6.6660e+02 4.7220e+02 3.0829e+03 2.5541e+03 1.9189e+03 5.4750e+02 4.2490e+02 + 6.7090e+02 3.7350e+02 6.0580e+02 5.8430e+02 3.4300e+02 4.3080e+02 7.2980e+02 + 4.9270e+02 4.9470e+02 9.8460e+02 8.2900e+02 5.9810e+02 2.8816e+03 4.0802e+03 + 2.7019e+03 1.8332e+03 4.4330e+02 8.3410e+02 5.7100e+02 6.7720e+02 1.4719e+03 + 1.9824e+03 4.3920e+03 2.2990e+03 8.2020e+02 9.7300e+02 4.4350e+02 7.1660e+02 + 7.1440e+02 4.9080e+02 5.0360e+02 5.4890e+02 4.2110e+02 3.2580e+02 6.8600e+02 + 7.0510e+02 2.0510e+03 4.1617e+03 2.2689e+03 9.5030e+02 1.2573e+03 2.1754e+03 + 4.4645e+03 1.1082e+03 8.1390e+02 3.1750e+02 2.7650e+02 6.3150e+02 1.0676e+03 + 3.9060e+02 5.4450e+02 8.2340e+02 5.8360e+02 3.3150e+02 5.2080e+02 2.1314e+03 + 2.8432e+03 1.8321e+03 4.7880e+02 6.6760e+02 5.6820e+02 5.8290e+02 7.3200e+02 + 7.5770e+02 3.8370e+02 6.1130e+02 5.2540e+02 3.7250e+02 2.1360e+02 7.8940e+02 + 4.7900e+02 1.3264e+03 3.7570e+03 3.6028e+03 6.6500e+02 6.1390e+02 6.1270e+02 + 5.9540e+02 3.7840e+02 5.7850e+02 5.0290e+02 1.4571e+03 4.9620e+03 2.8549e+03 + 8.0650e+02 3.9820e+02 5.5460e+02 7.1100e+02 8.8490e+02 4.6550e+02 4.1910e+02 + 3.8090e+02 3.8070e+02 5.5120e+02 4.9950e+02 7.5400e+02 1.0796e+03 3.0637e+03 + 3.2777e+03 1.5859e+03 7.1030e+02 2.1530e+03 4.4604e+03 1.9345e+03 6.7210e+02 + 5.9890e+02 8.8970e+02 9.7190e+02 8.0650e+02 4.8570e+02 4.1970e+02 5.6420e+02 + 7.7360e+02 4.8600e+02 1.1599e+03 2.7033e+03 2.4833e+03 1.1123e+03 3.8340e+02 + 4.8750e+02 2.5280e+02 4.3490e+02 4.4630e+02 6.3810e+02 2.7420e+02 3.3640e+02 + 2.1100e+02 4.1240e+02 2.8230e+02 9.0640e+02 1.0553e+03 3.2324e+03 3.4037e+03 + 4.0144e+03 1.5182e+03 7.3990e+02 5.2070e+02 3.3660e+02 6.4740e+02 3.9950e+02 + 5.0390e+02 1.8666e+03 3.3784e+03 2.1939e+03 9.8790e+02 3.7670e+02 5.5130e+02 + 6.4440e+02 8.5040e+02 5.0700e+02 3.3130e+02 8.9350e+02 9.8690e+02 6.6520e+02 + 2.4820e+02 4.1270e+02 2.2118e+03 4.4935e+03 4.0997e+03 2.0799e+03 4.9220e+02 + 1.4067e+03 3.4661e+03 1.9959e+03 5.1010e+02 6.3020e+02 5.4240e+02 6.8140e+02 + 5.2100e+02 5.5320e+02 5.7530e+02 3.6320e+02 6.3300e+02 6.3610e+02 2.2028e+03 + 3.8419e+03 2.5666e+03 1.3376e+03 4.9820e+02 3.1370e+02 2.2210e+02 2.8690e+02 + 4.6680e+02 7.0690e+02 5.7010e+02 3.7980e+02 4.4800e+02 3.0610e+02 4.4670e+02 + 5.6150e+02 1.7749e+03 2.8970e+03 2.8659e+03 2.0399e+03 5.5830e+02 7.0470e+02 + 5.8190e+02 5.8010e+02 6.5830e+02 5.0690e+02 8.4710e+02 3.5837e+03 3.4947e+03 + 1.8599e+03 6.2470e+02 4.7150e+02 5.1750e+02 5.2150e+02 6.5800e+02 2.9520e+02 + 2.5530e+02 6.0910e+02 1.2213e+03 5.6170e+02 4.6940e+02 5.5740e+02 2.1995e+03 + 2.7862e+03 3.0884e+03 1.2334e+03 2.3810e+02 1.8851e+03 4.5498e+03 2.0229e+03 + 1.1138e+03 6.7660e+02 6.0940e+02 5.7420e+02 5.0680e+02 5.1080e+02 4.5440e+02 + 7.3650e+02 3.8170e+02 8.3070e+02 2.4705e+03 5.1419e+03 2.2007e+03 6.5620e+02 + 6.0100e+02 2.4500e+02 2.4660e+02 3.0260e+02 8.2580e+02 6.5770e+02 4.6890e+02 + 3.5140e+02 4.2050e+02 5.6750e+02 3.1710e+02 3.6320e+02 1.1091e+03 3.4963e+03 + 3.7837e+03 9.3580e+02 8.4350e+02 5.5620e+02 5.7810e+02 7.3700e+02 7.6370e+02 + 6.4640e+02 4.1760e+02 2.2930e+03 2.6340e+03 1.7320e+03 5.9570e+02 2.9070e+02 + 3.5950e+02 4.4250e+02 6.2970e+02 6.9920e+02 3.6510e+02 5.7520e+02 1.0459e+03 + 9.6710e+02 5.3370e+02 6.1410e+02 2.2182e+03 3.0230e+03 2.9072e+03 8.2880e+02 + 3.7140e+02 1.2255e+03 3.5092e+03 4.2589e+03 1.7033e+03 5.9280e+02 4.1880e+02 + 3.6680e+02 6.3090e+02 7.5000e+02 5.7590e+02 4.9780e+02 7.7160e+02 1.1351e+03 + 3.3348e+03 4.8941e+03 1.8177e+03 1.0240e+03 4.4450e+02 2.0050e+02 3.3420e+02 + 6.0850e+02 7.0070e+02 7.5210e+02 5.8330e+02 6.3480e+02 3.0930e+02 5.9760e+02 + 4.2580e+02 5.2220e+02 2.2489e+03 2.6025e+03 3.1215e+03 6.1630e+02 8.5660e+02 + 4.1160e+02 5.6040e+02 7.6260e+02 1.0958e+03 3.1360e+02 3.4580e+02 3.4052e+03 + 3.3144e+03 5.9210e+02 3.6230e+02 5.0020e+02 3.4060e+02 5.4450e+02 6.9110e+02 + 5.6190e+02 2.9940e+02 4.2380e+02 9.7770e+02 7.2720e+02 8.0800e+02 3.2570e+02 + 1.9688e+03 3.1953e+03 2.0015e+03 5.1720e+02 2.4230e+02 6.6230e+02 2.1388e+03 + 2.9338e+03 2.0873e+03 8.6260e+02 5.8300e+02 5.2180e+02 2.4030e+02 4.5520e+02 + 3.1460e+02 2.7240e+02 5.0670e+02 1.4161e+03 4.0177e+03 2.3825e+03 6.8780e+02 + 7.1480e+02 4.7640e+02 4.2140e+02 3.7810e+02 6.3670e+02 6.5640e+02 3.8000e+02 + 5.8330e+02 4.4000e+02 4.1610e+02 8.2000e+02 3.0560e+02 3.3930e+02 1.8226e+03 + 3.2577e+03 1.7985e+03 1.1773e+03 8.8890e+02 4.7060e+02 6.4720e+02 4.7420e+02 + 6.2470e+02 3.9800e+02 6.2780e+02 3.2933e+03 4.7248e+03 1.4150e+03 7.7450e+02 + 4.2990e+02 3.0860e+02 4.6740e+02 6.4680e+02 6.2340e+02 4.9970e+02 4.1810e+02 + 6.3000e+02 5.0860e+02 6.8100e+02 5.5070e+02 1.2789e+03 3.7555e+03 2.0268e+03 + 4.3620e+02 2.5890e+02 8.7700e+02 1.9931e+03 2.3851e+03 3.5183e+03 1.5958e+03 + 8.0950e+02 3.1840e+02 4.5430e+02 5.4180e+02 4.0610e+02 9.1800e+02 1.4715e+03 + 2.1196e+03 3.3553e+03 2.3601e+03 7.2010e+02 4.3150e+02 4.1560e+02 5.1730e+02 + 6.9250e+02 7.5080e+02 5.9580e+02 2.5550e+02 6.6520e+02 6.6440e+02 4.3510e+02 + 9.3370e+02 1.8110e+02 4.6210e+02 3.0481e+03 3.5031e+03 1.8135e+03 6.8010e+02 + 5.1530e+02 3.0340e+02 4.3370e+02 6.1990e+02 4.4150e+02 3.0280e+02 7.2510e+02 + 2.3869e+03 3.6379e+03 1.9381e+03 3.5000e+02 4.3350e+02 3.0960e+02 3.8120e+02 + 8.8810e+02 7.2210e+02 4.2430e+02 6.7940e+02 3.7460e+02 3.6010e+02 4.2330e+02 + 6.3590e+02 1.5527e+03 3.3407e+03 2.2420e+03 1.4889e+03 6.6740e+02 3.8550e+02 + 9.7730e+02 2.6959e+03 4.0515e+03 1.3894e+03 4.4460e+02 5.3500e+02 6.0070e+02 + 2.5760e+02 6.9940e+02 8.8550e+02 2.1863e+03 2.1628e+03 2.0233e+03 2.0952e+03 + 3.6060e+02 7.4490e+02 2.8410e+02 4.2930e+02 9.6680e+02 9.2880e+02 2.6950e+02 + 3.2990e+02 3.0520e+02 5.1420e+02 1.1985e+03 4.4700e+02 3.2330e+02 6.4820e+02 + 2.3078e+03 4.3404e+03 1.7191e+03 7.2820e+02 9.4630e+02 4.8700e+02 4.6060e+02 + 1.9350e+02 2.9290e+02 3.4370e+02 5.7270e+02 2.2784e+03 4.3717e+03 1.2494e+03 + 5.5020e+02 6.9910e+02 1.4040e+02 5.2240e+02 5.1850e+02 7.0560e+02 5.9350e+02 + 9.7890e+02 4.1870e+02 3.5750e+02 5.0540e+02 3.8250e+02 1.8267e+03 3.4783e+03 + 2.8678e+03 1.6200e+03 5.4770e+02 2.7090e+02 7.1200e+02 1.9929e+03 3.1176e+03 + 1.5061e+03 1.0768e+03 4.1280e+02 4.1690e+02 3.9900e+02 1.0238e+03 2.2376e+03 + 3.6972e+03 2.5565e+03 2.1607e+03 1.5512e+03 6.0140e+02 3.0070e+02 3.7200e+02 + 1.0891e+03 1.0006e+03 7.3190e+02 1.9110e+02 4.4940e+02 3.8470e+02 3.8360e+02 + 7.7860e+02 5.0010e+02 3.0420e+02 2.5840e+02 2.6291e+03 3.8741e+03 2.1281e+03 + 8.3020e+02 1.3046e+03 6.7250e+02 3.6380e+02 3.2300e+02 2.7520e+02 5.5820e+02 + 7.1430e+02 1.8656e+03 3.8535e+03 1.8997e+03 4.9630e+02 6.6270e+02 2.5920e+02 + 3.6540e+02 9.2840e+02 6.0890e+02 6.9470e+02 5.5170e+02 5.0330e+02 3.6160e+02 + 2.1170e+02 6.7880e+02 2.1126e+03 3.8572e+03 2.1045e+03 1.0820e+03 5.9880e+02 + 4.5770e+02 8.7650e+02 8.1180e+02 2.2206e+03 2.9903e+03 1.1105e+03 7.3970e+02 + 6.7880e+02 1.1269e+03 2.3304e+03 2.0708e+03 2.6827e+03 2.3589e+03 9.2650e+02 + 1.0711e+03 7.2580e+02 6.0990e+02 1.7730e+02 6.6780e+02 7.0700e+02 9.4710e+02 + 3.6030e+02 4.6770e+02 6.5040e+02 7.0100e+02 6.8090e+02 3.5470e+02 2.9990e+02 + 7.0700e+02 2.9663e+03 4.0597e+03 1.2560e+03 1.0341e+03 7.5060e+02 5.5550e+02 + 2.8630e+02 3.7850e+02 9.5120e+02 5.0570e+02 9.0090e+02 1.7167e+03 3.5585e+03 + 3.2606e+03 1.3764e+03 4.7790e+02 5.1500e+02 4.7390e+02 5.5460e+02 3.6120e+02 + 4.5760e+02 1.1107e+03 5.1080e+02 2.9490e+02 4.5200e+02 3.0440e+02 1.7223e+03 + 2.6150e+03 3.2503e+03 8.5960e+02 3.2810e+02 3.3220e+02 6.2120e+02 5.8620e+02 + 1.1533e+03 2.8691e+03 3.1539e+03 1.3379e+03 1.5592e+03 2.1113e+03 2.3368e+03 + 2.0800e+03 2.2948e+03 1.7118e+03 5.6580e+02 4.6730e+02 4.5760e+02 2.9330e+02 + 4.8640e+02 4.5290e+02 4.8020e+02 5.5300e+02 6.2730e+02 7.1830e+02 3.9000e+02 + 7.1460e+02 2.7480e+02 7.2430e+02 3.6240e+02 9.8870e+02 2.1476e+03 4.5873e+03 + 1.0776e+03 5.7920e+02 3.1210e+02 3.2600e+02 3.0760e+02 4.0770e+02 6.4390e+02 + 1.0796e+03 5.3290e+02 1.1023e+03 2.6293e+03 3.8735e+03 1.6956e+03 5.6770e+02 + 4.6050e+02 8.4350e+02 6.1190e+02 3.7820e+02 6.1130e+02 7.0540e+02 4.7160e+02 + 3.4430e+02 2.6870e+02 2.1230e+02 1.4331e+03 4.1539e+03 1.9665e+03 1.3826e+03 + 3.9790e+02 6.8840e+02 6.9340e+02 2.8070e+02 5.8460e+02 4.1306e+03 4.4196e+03 + 8.5510e+02 3.6579e+03 3.3998e+03 3.7276e+03 1.4406e+03 1.2276e+03 7.9110e+02 + 3.5970e+02 3.8710e+02 4.1490e+02 4.1950e+02 2.6170e+02 8.0360e+02 9.3160e+02 + 8.3070e+02 5.1250e+02 4.5780e+02 7.2320e+02 6.0150e+02 8.1510e+02 8.2530e+02 + 6.7590e+02 1.0206e+03 3.8989e+03 3.5264e+03 4.9930e+02 4.8750e+02 1.8730e+02 + 4.3890e+02 3.0840e+02 4.2360e+02 5.7850e+02 1.0226e+03 3.5860e+02 1.0440e+03 + 1.9951e+03 2.8811e+03 1.2441e+03 7.8450e+02 6.5860e+02 7.4050e+02 4.6470e+02 + 1.6370e+02 8.4830e+02 6.5340e+02 5.4420e+02 1.4360e+02 4.3310e+02 3.5110e+02 + 1.0515e+03 3.2138e+03 1.2493e+03 1.3401e+03 7.7540e+02 3.4950e+02 9.9100e+02 + 7.8760e+02 7.3560e+02 2.0378e+03 4.1291e+03 1.9332e+03 3.2989e+03 5.1479e+03 + 1.5948e+03 5.9170e+02 7.3160e+02 4.6590e+02 5.9400e+02 5.1010e+02 1.0309e+03 + 4.3790e+02 4.0600e+02 4.8690e+02 9.3150e+02 6.2630e+02 3.1590e+02 6.1850e+02 + 1.0262e+03 7.4290e+02 1.3002e+03 8.7100e+02 8.6980e+02 7.6470e+02 3.9754e+03 + 4.5947e+03 1.0431e+03 5.8770e+02 2.5300e+02 3.8930e+02 1.8540e+02 9.0380e+02 + 8.4180e+02 4.7180e+02 3.4870e+02 3.2390e+02 1.9227e+03 4.5952e+03 2.1067e+03 + 8.0910e+02 7.1850e+02 7.9060e+02 8.4980e+02 2.8550e+02 3.1020e+02 8.0200e+02 + 4.9410e+02 1.3040e+02 3.4080e+02 5.8830e+02 1.2545e+03 3.8848e+03 1.9292e+03 + 6.9070e+02 3.8540e+02 5.4070e+02 7.8660e+02 4.8600e+02 3.5510e+02 1.9413e+03 + 3.0447e+03 3.6663e+03 2.6605e+03 4.7827e+03 7.1020e+02 3.6330e+02 5.0460e+02 + 5.7610e+02 3.3340e+02 4.1450e+02 5.0690e+02 5.3520e+02 2.9680e+02 5.9270e+02 + 6.8160e+02 5.7310e+02 3.1930e+02 5.9980e+02 8.0240e+02 1.0548e+03 9.1440e+02 + 7.2400e+02 6.0040e+02 1.3162e+03 2.2420e+03 2.0862e+03 3.3160e+02 3.9150e+02 + 2.8230e+02 3.2680e+02 4.9490e+02 4.0690e+02 5.1040e+02 6.8300e+02 4.4750e+02 + 4.5830e+02 1.8417e+03 3.3169e+03 2.6528e+03 8.3380e+02 6.8850e+02 3.8000e+02 + 4.9670e+02 4.8820e+02 2.9100e+02 9.5880e+02 5.2310e+02 3.0930e+02 2.6960e+02 + 7.7410e+02 2.5729e+03 3.5793e+03 1.2592e+03 5.0290e+02 3.1540e+02 4.0280e+02 + 4.4450e+02 4.4720e+02 3.5630e+02 1.0789e+03 3.1976e+03 3.9831e+03 5.3248e+03 + 4.5009e+03 1.9516e+03 1.7460e+02 3.7200e+02 4.5790e+02 5.7750e+02 6.1310e+02 + 4.4320e+02 4.8370e+02 3.1400e+02 6.0740e+02 7.1580e+02 5.7490e+02 5.7310e+02 + 6.2830e+02 6.5090e+02 1.1926e+03 2.2147e+03 5.0140e+02 4.9910e+02 1.0032e+03 + 3.0586e+03 3.6343e+03 6.7450e+02 3.1560e+02 6.0700e+02 1.2470e+02 3.2580e+02 + 2.8930e+02 6.1930e+02 6.9640e+02 6.3640e+02 4.9690e+02 2.0258e+03 2.6610e+03 + 3.4124e+03 1.6904e+03 5.5000e+02 1.5640e+02 7.0720e+02 7.3430e+02 2.8730e+02 + 4.7330e+02 3.0530e+02 2.6300e+02 8.7090e+02 2.2773e+03 3.9804e+03 4.4204e+03 + 7.0770e+02 3.4640e+02 4.7090e+02 3.8580e+02 7.0300e+02 4.2070e+02 4.8390e+02 + 3.3340e+02 2.0408e+03 3.6972e+03 5.4775e+03 3.3900e+03 1.3172e+03 3.4090e+02 + 3.1280e+02 3.3580e+02 5.8550e+02 4.7260e+02 6.8830e+02 3.2930e+02 3.4590e+02 + 7.3510e+02 6.6260e+02 6.3560e+02 6.5220e+02 4.6670e+02 4.9630e+02 4.1570e+02 + 1.3644e+03 4.9970e+02 2.9640e+02 6.6460e+02 5.3790e+02 2.6195e+03 5.9400e+02 + 3.7220e+02 4.2170e+02 3.5360e+02 1.7080e+02 3.0140e+02 4.8240e+02 7.6140e+02 + 2.1870e+02 4.6610e+02 7.3270e+02 2.8208e+03 3.3820e+03 2.3015e+03 9.0460e+02 + 2.7530e+02 5.2960e+02 3.2410e+02 2.6720e+02 4.6770e+02 3.6740e+02 3.8980e+02 + 4.5510e+02 1.5742e+03 3.9930e+03 3.3681e+03 6.4790e+02 1.4670e+02 4.7420e+02 + 4.9140e+02 5.3450e+02 5.9530e+02 3.1330e+02 6.0460e+02 2.0273e+03 3.8825e+03 + 5.0829e+03 3.0746e+03 1.3494e+03 4.7250e+02 3.0210e+02 3.9340e+02 8.2030e+02 + 5.1360e+02 2.8260e+02 4.1370e+02 3.7860e+02 6.2840e+02 9.3510e+02 9.9640e+02 + 6.9620e+02 5.3580e+02 2.2310e+02 4.7400e+02 2.3321e+03 6.5050e+02 4.3040e+02 + 3.9380e+02 1.9451e+03 1.9589e+03 1.8529e+03 5.1550e+02 6.8730e+02 3.9620e+02 + 5.1240e+02 3.3180e+02 7.8170e+02 3.2300e+02 2.3390e+02 4.8870e+02 4.9560e+02 + 1.2117e+03 3.3375e+03 2.1102e+03 1.7284e+03 3.7180e+02 9.3090e+02 2.9300e+02 + 2.1950e+02 6.5790e+02 3.9570e+02 6.4510e+02 6.2940e+02 2.1808e+03 3.7380e+03 + 2.3481e+03 4.3060e+02 3.3000e+02 3.3750e+02 7.2760e+02 8.7650e+02 2.9980e+02 + 2.1410e+02 4.6990e+02 1.3044e+03 2.5437e+03 4.7185e+03 2.5475e+03 1.2111e+03 + 1.0422e+03 4.4420e+02 4.7270e+02 3.7480e+02 4.5390e+02 4.5370e+02 4.9660e+02 + 9.2120e+02 5.3480e+02 4.2680e+02 6.7170e+02 7.1870e+02 7.1810e+02 2.9950e+02 + 1.2400e+02 2.3404e+03 1.1097e+03 4.7700e+02 4.2180e+02 1.1950e+03 1.8048e+03 + 2.1432e+03 7.4200e+02 1.2307e+03 5.1670e+02 1.1115e+03 2.7560e+02 5.2260e+02 + 6.8390e+02 3.8470e+02 2.9410e+02 8.7300e+02 4.4810e+02 2.0269e+03 3.1235e+03 + 1.3075e+03 2.9800e+02 6.8270e+02 2.1500e+02 4.4980e+02 7.2900e+02 1.2242e+03 + 6.9540e+02 4.9420e+02 2.1170e+03 2.4215e+03 2.1407e+03 6.2090e+02 3.5460e+02 + 3.7320e+02 9.3120e+02 8.2860e+02 3.7950e+02 4.1810e+02 3.5360e+02 8.1210e+02 + 1.9577e+03 3.6963e+03 3.3950e+03 2.1305e+03 7.5140e+02 4.9550e+02 1.6990e+02 + 4.2030e+02 4.7120e+02 3.7110e+02 2.4300e+02 5.8510e+02 8.8490e+02 8.4200e+02 + 7.4860e+02 9.9790e+02 6.3500e+02 3.3640e+02 1.2040e+02 2.0682e+03 5.6920e+02 + 7.4690e+02 2.3816e+03 3.5903e+03 1.5798e+03 6.2860e+02 6.7120e+02 1.9830e+02 + 5.6560e+02 4.5667e+03 4.1820e+03 2.2450e+03 1.0539e+03 7.1200e+02 1.1995e+03 + 5.7410e+02 4.5380e+02 2.1250e+02 4.1580e+02 1.1090e+03 5.2947e+03 3.4207e+03 + 1.3498e+03 1.1001e+03 6.8070e+02 1.0626e+03 3.8050e+03 3.2890e+03 3.0339e+03 + 1.2064e+03 1.5012e+03 6.1890e+02 4.5430e+02 8.8160e+02 5.1810e+02 6.2620e+02 + 8.5360e+02 2.0350e+03 4.0680e+03 4.3756e+03 5.8547e+03 3.1273e+03 3.8140e+02 + 3.8070e+02 4.2580e+02 1.7000e+02 1.0020e+02 4.2520e+02 6.2330e+02 2.2560e+02 + 3.5680e+02 7.5360e+02 9.2500e+02 7.8660e+02 3.9500e+02 9.4710e+02 8.3770e+02 + 6.1430e+02 4.8960e+02 4.4890e+02 6.7470e+02 8.1230e+02 4.3398e+03 3.3072e+03 + 8.4910e+02 5.4390e+02 3.3470e+02 2.2050e+02 9.0030e+02 2.5110e+03 4.5422e+03 + 8.0720e+02 5.9540e+02 7.6540e+02 8.5410e+02 6.7820e+02 6.4240e+02 2.8110e+02 + 5.9930e+02 4.3040e+02 3.3472e+03 4.0943e+03 2.0459e+03 7.9930e+02 6.1340e+02 + 4.4960e+02 1.8004e+03 4.7584e+03 4.1540e+03 1.1130e+03 5.5380e+02 7.1320e+02 + 3.4090e+02 6.0040e+02 8.7300e+02 7.7060e+02 8.1320e+02 8.5760e+02 2.2094e+03 + 2*7.0000e+03 3.6480e+03 7.8880e+02 4.5790e+02 6.7640e+02 2.3330e+02 + 1.5080e+02 3.6660e+02 2.1270e+02 1.0690e+02 1.9170e+02 6.9610e+02 1.1638e+03 + 5.4680e+02 3.4280e+02 8.4750e+02 6.2000e+02 7.8080e+02 7.1860e+02 2.7020e+02 + 7.2690e+02 8.4700e+02 4.5009e+03 2.0131e+03 7.4380e+02 2.9770e+02 2.9560e+02 + 4.4220e+02 1.6208e+03 5.3355e+03 3.9759e+03 1.3151e+03 4.1520e+02 6.2250e+02 + 3.1260e+02 3.6100e+02 3.9890e+02 4.4770e+02 3.2230e+02 6.3260e+02 1.9446e+03 + 5.5094e+03 1.8861e+03 7.6450e+02 6.1070e+02 5.3190e+02 1.8269e+03 2.0517e+03 + 3.2049e+03 2.2308e+03 1.2017e+03 5.4710e+02 4.9450e+02 1.1329e+03 9.3450e+02 + 6.3860e+02 3.4770e+02 5.9370e+02 2.2966e+03 6.5530e+03 4.5931e+03 6.1070e+03 + 2.4810e+03 1.9829e+03 9.4730e+02 3.8660e+02 2.1170e+02 1.0535e+03 4.6200e+02 + 3.6950e+02 4.7390e+02 8.8050e+02 8.0900e+02 3.5080e+02 4.5120e+02 7.9050e+02 + 5.2870e+02 6.8940e+02 7.3500e+02 2.2871e+03 1.3769e+03 3.3298e+03 3.6427e+03 + 2.2117e+03 3.8630e+02 5.3700e+02 3.3690e+02 6.5830e+02 2.0602e+03 5.0200e+03 + 2.2141e+03 8.0410e+02 2.8060e+02 3.3530e+02 4.2870e+02 2.5430e+02 3.5790e+02 + 4.4730e+02 3.0340e+02 3.1230e+02 2.6222e+03 4.0202e+03 2.2433e+03 8.5910e+02 + 2.7650e+02 6.1880e+02 8.9080e+02 1.5773e+03 2.3047e+03 3.1946e+03 1.4067e+03 + 2.6940e+02 8.2000e+02 7.5910e+02 6.6620e+02 4.9020e+02 2.2950e+02 4.3540e+02 + 1.4276e+03 4.2211e+03 4.4605e+03 3.8428e+03 4.9460e+03 1.4963e+03 7.4630e+02 + 5.9760e+02 2.9640e+02 3.2910e+02 6.9650e+02 4.6340e+02 5.4670e+02 6.5310e+02 + 5.7070e+02 5.7450e+02 6.6860e+02 3.8250e+02 2.4580e+02 5.9810e+02 8.2280e+02 + 2.1724e+03 2.1870e+03 2.8997e+03 3.6223e+03 1.7243e+03 3.5360e+02 6.3760e+02 + 3.4270e+02 8.4770e+02 2.6872e+03 3.2752e+03 3.4430e+03 5.0080e+02 5.4870e+02 + 3.9580e+02 5.4380e+02 3.1740e+02 2.7040e+02 4.4370e+02 5.2850e+02 3.4090e+02 + 1.4919e+03 4.1963e+03 3.7101e+03 1.0913e+03 4.0220e+02 5.8590e+02 8.4420e+02 + 1.1416e+03 1.4458e+03 2.5702e+03 4.1492e+03 1.3119e+03 1.3849e+03 4.9030e+02 + 5.3110e+02 4.4380e+02 3.7190e+02 6.1840e+02 2.4399e+03 3.1792e+03 5.4590e+03 + 2.4248e+03 5.5225e+03 2.1817e+03 1.0830e+03 3.9100e+02 5.7050e+02 3.2390e+02 + 5.2360e+02 4.2440e+02 9.1180e+02 2.4450e+02 4.3910e+02 2.9350e+02 1.0180e+03 + 3.6750e+02 2.0560e+02 7.6980e+02 1.0474e+03 1.7147e+03 1.5546e+03 4.3816e+03 + 4.5397e+03 5.8560e+02 2.6420e+02 4.9980e+02 1.4852e+03 9.4980e+02 3.2147e+03 + 5.0664e+03 3.4628e+03 5.1330e+02 3.5290e+02 5.2210e+02 7.6870e+02 2.8350e+02 + 2.3150e+02 5.1880e+02 5.8760e+02 3.2920e+02 9.8670e+02 3.4802e+03 3.4281e+03 + 2.1306e+03 7.2060e+02 4.7800e+02 6.3830e+02 5.6190e+02 1.1889e+03 2.5256e+03 + 3.2711e+03 3.1558e+03 1.0459e+03 5.1850e+02 7.9440e+02 3.9640e+02 2.8610e+02 + 4.2900e+02 2.3080e+03 3.6575e+03 4.0258e+03 4.9185e+03 5.3411e+03 3.6550e+03 + 7.9540e+02 5.4550e+02 2.9620e+02 5.8060e+02 9.1300e+02 5.8480e+02 4.1420e+02 + 1.9340e+02 5.1090e+02 6.9210e+02 9.7550e+02 2.7020e+02 4.5360e+02 7.9050e+02 + 2.6830e+03 4.2496e+03 3.9850e+03 3.6375e+03 2.6006e+03 6.2070e+02 3.0550e+02 + 4.7690e+02 3.1280e+02 5.5510e+02 2.5023e+03 2.8318e+03 2.4514e+03 8.2570e+02 + 5.3540e+02 5.5030e+02 7.3280e+02 4.2820e+02 1.4820e+02 3.2140e+02 5.0500e+02 + 8.0940e+02 9.1120e+02 2.7612e+03 3.7624e+03 2.5437e+03 6.5440e+02 7.5700e+02 + 8.3980e+02 6.9600e+02 1.0825e+03 2.1292e+03 3.8821e+03 3.5759e+03 2.1496e+03 + 9.1310e+02 5.3630e+02 6.2850e+02 1.4800e+02 4.3670e+02 1.2862e+03 2.7451e+03 + 2.8245e+03 4.0170e+03 3.6524e+03 3.3434e+03 4.9470e+02 2.4070e+02 3.4900e+02 + 4.9520e+02 1.3386e+03 1.1086e+03 3.7970e+02 3.5260e+02 6.2050e+02 3.4850e+02 + 6.8710e+02 4.3260e+02 5.7570e+02 6.8890e+02 2.5063e+03 3.3859e+03 5.3003e+03 + 3.7988e+03 1.3715e+03 3.2010e+02 4.3150e+02 8.2820e+02 6.2640e+02 5.7330e+02 + 8.3150e+02 4.9312e+03 2.5282e+03 8.8810e+02 1.0977e+03 5.9580e+02 5.8010e+02 + 3.0600e+02 4.1730e+02 4.9120e+02 3.3890e+02 2.6660e+02 6.1810e+02 3.7817e+03 + 4.5672e+03 1.1875e+03 5.8300e+02 4.3540e+02 4.0810e+02 3.9110e+02 6.7320e+02 + 1.0931e+03 2.8005e+03 3.2846e+03 2.5328e+03 2.1246e+03 9.0280e+02 1.7410e+02 + 4.3640e+02 4.7770e+02 3.3691e+03 3.7623e+03 3.0631e+03 2.8273e+03 3.0466e+03 + 2.9559e+03 5.5960e+02 4.3190e+02 3.9380e+02 6.6450e+02 6.2080e+02 4.0260e+02 + 6.2530e+02 3.9080e+02 5.8560e+02 4.8010e+02 1.2550e+02 2.4030e+02 5.4660e+02 + 4.6760e+02 2.5028e+03 4.8922e+03 4.2847e+03 4.8770e+03 4.8520e+02 1.7980e+02 + 3.3410e+02 5.8270e+02 4.1830e+02 3.5560e+02 7.7380e+02 4.9053e+03 3.0191e+03 + 9.9200e+02 7.5810e+02 5.2380e+02 9.6930e+02 2.5900e+02 7.1230e+02 6.6880e+02 + 2.0880e+02 2.4570e+02 6.1680e+02 2.4970e+03 4.1880e+03 1.5639e+03 1.3808e+03 + 6.5460e+02 6.3950e+02 6.2050e+02 4.6280e+02 4.3790e+02 7.1280e+02 2.2945e+03 + 3.6455e+03 2.5166e+03 1.2909e+03 2.8820e+02 2.8690e+02 6.9050e+02 3.0343e+03 + 3.7729e+03 1.7570e+03 3.0154e+03 2.9279e+03 1.5027e+03 7.9210e+02 2.9540e+02 + 3.7130e+02 1.0456e+03 5.5790e+02 3.0570e+02 2.6760e+02 3.2900e+02 7.9710e+02 + 3.9690e+02 3.1300e+02 1.6760e+02 5.1320e+02 9.9960e+02 1.9039e+03 4.5437e+03 + 4.2124e+03 3.7801e+03 1.1528e+03 4.2840e+02 5.0420e+02 1.2297e+03 7.2350e+02 + 2.7890e+02 5.5560e+02 3.7505e+03 2.3709e+03 4.4310e+02 7.3400e+02 7.2610e+02 + 5.8910e+02 5.9150e+02 4.9210e+02 5.6620e+02 2.8900e+02 1.7410e+02 4.8310e+02 + 3.1307e+03 3.6971e+03 1.6936e+03 2.8950e+02 4.9520e+02 5.9600e+02 4.8220e+02 + 5.1730e+02 3.4950e+02 6.8210e+02 1.0553e+03 3.6249e+03 3.5256e+03 2.9957e+03 + 9.8180e+02 4.3120e+02 9.3200e+02 3.6764e+03 3.1834e+03 1.5954e+03 2.8496e+03 + 3.9659e+03 2.6326e+03 5.2510e+02 1.7940e+02 2.3480e+02 5.9760e+02 3.8590e+02 + 1.9450e+02 1.9130e+02 2.3590e+02 8.4430e+02 1.0104e+03 5.3200e+02 5.2830e+02 + 7.6780e+02 9.0080e+02 2.7794e+03 4.9207e+03 1.9298e+03 4.5430e+03 8.3330e+02 + 5.7210e+02 6.3390e+02 1.0273e+03 6.0110e+02 2.9580e+02 6.9800e+02 3.0424e+03 + 2.6796e+03 7.3250e+02 6.2440e+02 4.7810e+02 3.6700e+02 5.9570e+02 3.9780e+02 + 4.5420e+02 4.0980e+02 5.2810e+02 8.1520e+02 1.5736e+03 5.7189e+03 1.8135e+03 + 4.9310e+02 2.3970e+02 7.6570e+02 1.0509e+03 9.4780e+02 3.1030e+02 3.9140e+02 + 7.3670e+02 2.2107e+03 5.6918e+03 3.0796e+03 9.6590e+02 2.9200e+02 8.2870e+02 + 5.3853e+03 2.6020e+03 1.0110e+03 2.6366e+03 3.7696e+03 1.5304e+03 9.2500e+02 + 3.0270e+02 2.7860e+02 3.6530e+02 4.3950e+02 2.5360e+02 1.8130e+02 5.6250e+02 + 4.6570e+02 5.9490e+02 3.3630e+02 5.3610e+02 4.9900e+02 1.2660e+03 2.4131e+03 + 3.6850e+03 3.0640e+03 4.1176e+03 1.8713e+03 5.5300e+02 7.0180e+02 1.2356e+03 + 6.3450e+02 3.0520e+02 7.5670e+02 2.0306e+03 3.8422e+03 5.3550e+02 4.9980e+02 + 5.8990e+02 5.4960e+02 5.5250e+02 2.0100e+02 5.0050e+02 5.2370e+02 4.0570e+02 + 5.7770e+02 2.2349e+03 5.3262e+03 2.9681e+03 6.7740e+02 3.1760e+02 3.9290e+02 + 6.7660e+02 1.1439e+03 2.5040e+02 3.6570e+02 6.1330e+02 1.1422e+03 5.4674e+03 + 3.8006e+03 1.9541e+03 1.2281e+03 2.9383e+03 4.0511e+03 1.9983e+03 1.5891e+03 + 4.7373e+03 3.5749e+03 7.5650e+02 7.8240e+02 3.1490e+02 2.0130e+02 3.4790e+02 + 7.1680e+02 2.5650e+02 3.6680e+02 3.1200e+02 5.4910e+02 4.6700e+02 3.9340e+02 + 6.0990e+02 5.6780e+02 9.2550e+02 3.8924e+03 3.1977e+03 2.6610e+03 5.6910e+03 + 7.3340e+02 9.6020e+02 5.3600e+02 1.0142e+03 2.4730e+02 2.7140e+02 3.9070e+02 + 1.6464e+03 4.0687e+03 1.6319e+03 5.1850e+02 4.5390e+02 6.4130e+02 3.6710e+02 + 4.4640e+02 4.9860e+02 5.0940e+02 4.7000e+02 5.8740e+02 9.4800e+02 3.7086e+03 + 2.1492e+03 5.0240e+02 1.4200e+02 8.2700e+02 9.0630e+02 8.4800e+02 7.0800e+02 + 6.6030e+02 1.2880e+02 5.6760e+02 3.0686e+03 2.8993e+03 3.8356e+03 1.5287e+03 + 3.2049e+03 2.5550e+03 1.8133e+03 1.3961e+03 4.7536e+03 4.1414e+03 1.3264e+03 + 4.7390e+02 7.1030e+02 3.6440e+02 1.8280e+02 4.3310e+02 6.4270e+02 5.1840e+02 + 3.1830e+02 5.9320e+02 6.2320e+02 1.6800e+02 4.8460e+02 5.6860e+02 1.8771e+03 + 4.2421e+03 2.2853e+03 2.6437e+03 5.9882e+03 9.2520e+02 1.0332e+03 9.1910e+02 + 4.8720e+02 6.2800e+02 3.3320e+02 7.2220e+02 2.0222e+03 4.8636e+03 3.1820e+03 + 5.3970e+02 2.6580e+02 3.9030e+02 6.3270e+02 4.6000e+02 5.3650e+02 2.6520e+02 + 8.8900e+02 9.2500e+02 2.6461e+03 5.5007e+03 2.0384e+03 3.6580e+02 2.4040e+02 + 6.1980e+02 4.3380e+02 4.9260e+02 6.2760e+02 2.9850e+02 2.4440e+02 2.6660e+02 + 1.3160e+03 4.3843e+03 3.4216e+03 2.8208e+03 3.4981e+03 1.4385e+03 1.0658e+03 + 1.5863e+03 2.4233e+03 3.3440e+03 8.4210e+02 6.2430e+02 8.3880e+02 3.8920e+02 + 2.9570e+02 4.5640e+02 7.5040e+02 4.3680e+02 5.1750e+02 4.4150e+02 5.0150e+02 + 2.8740e+02 2.3260e+02 7.5200e+02 1.0675e+03 3.7441e+03 3.2137e+03 2.6219e+03 + 4.2112e+03 2.1567e+03 6.3730e+02 8.1980e+02 6.3120e+02 6.4590e+02 7.8460e+02 + 6.4030e+02 6.9760e+02 5.4338e+03 5.0013e+03 6.2040e+02 4.7130e+02 5.3720e+02 + 4.1360e+02 5.1240e+02 4.1270e+02 8.7950e+02 6.4110e+02 3.0360e+02 3.7332e+03 + 5.4185e+03 1.1000e+03 4.5600e+02 2.1190e+02 6.2910e+02 7.0980e+02 6.4150e+02 + 5.8840e+02 4.0970e+02 4.1610e+02 3.1680e+02 6.4360e+02 2.1639e+03 6.0516e+03 + 3.3854e+03 2.9292e+03 1.4882e+03 1.2292e+03 1.8158e+03 4.4180e+03 4.2275e+03 + 4.4780e+02 4.4700e+02 3.5700e+02 4.8150e+02 2.2250e+02 4.1120e+02 3.7980e+02 + 5.6920e+02 6.1180e+02 7.5840e+02 6.8380e+02 5.0470e+02 3.7820e+02 7.2730e+02 + 2.1177e+03 3.3103e+03 3.3975e+03 2.7714e+03 5.0806e+03 1.4032e+03 8.6190e+02 + 4.5940e+02 3.0440e+02 7.2310e+02 1.4188e+03 6.9580e+02 6.4450e+02 2.7080e+03 + 4.0988e+03 1.7166e+03 5.6900e+02 3.6480e+02 4.8770e+02 3.6390e+02 6.1870e+02 + 6.8430e+02 7.3230e+02 1.2270e+03 4.4409e+03 3.9145e+03 1.2568e+03 6.8550e+02 + 4.4360e+02 6.1460e+02 3.5200e+02 4.6230e+02 2.6740e+02 5.5050e+02 5.3980e+02 + 4.1350e+02 1.1794e+03 3.8308e+03 6.6836e+03 4.0879e+03 3.5502e+03 6.6970e+02 + 6.1800e+02 1.3494e+03 5.1633e+03 2.6786e+03 4.0120e+02 4.0840e+02 3.9660e+02 + 5.1690e+02 5.2830e+02 6.2150e+02 2.1270e+02 2.8550e+02 3.9640e+02 9.1120e+02 + 5.1440e+02 3.4400e+02 2.3690e+02 6.2870e+02 1.2221e+03 4.9142e+03 2.9862e+03 + 4.2428e+03 5.8046e+03 2.6360e+03 6.2200e+02 2.1150e+02 4.0550e+02 6.4470e+02 + 6.9720e+02 6.5600e+02 1.0960e+03 2.1801e+03 4.3989e+03 5.0514e+03 1.0806e+03 + 8.5990e+02 7.0900e+02 3.7840e+02 3.9570e+02 5.0520e+02 5.9150e+02 2.3419e+03 + 2.9761e+03 3.6205e+03 9.2870e+02 5.2150e+02 3.6380e+02 2.8540e+02 4.5370e+02 + 3.7890e+02 5.5300e+02 3.2860e+02 2.3470e+02 4.4040e+02 4.4970e+02 4.4563e+03 + 5.3510e+03 7.0000e+03 2.2152e+03 7.8310e+02 3.1730e+02 1.2161e+03 4.8620e+03 + 2.5577e+03 8.7180e+02 6.3050e+02 3.3110e+02 3.1540e+02 9.2410e+02 3.3890e+02 + 8.5330e+02 2.4600e+02 3.2560e+02 6.9090e+02 5.5580e+02 3.3110e+02 4.4820e+02 + 6.0640e+02 5.1830e+02 3.3537e+03 4.6121e+03 1.7095e+03 6.7459e+03 2.3727e+03 + 3.7370e+02 2.4650e+02 2.4270e+02 7.2240e+02 5.9400e+02 3.6230e+02 8.6790e+02 + 1.8647e+03 2.1559e+03 5.2155e+03 1.4053e+03 5.6860e+02 6.9670e+02 2.1470e+02 + 5.9510e+02 1.8100e+02 1.0261e+03 1.6374e+03 5.9758e+03 3.8220e+03 1.0526e+03 + 5.2930e+02 3.5610e+02 5.6900e+02 8.1650e+02 6.0740e+02 2.8880e+02 7.1650e+02 + 4.4810e+02 2.3530e+02 7.2680e+02 2.2815e+03 7.0000e+03 4.7922e+03 8.6840e+02 + 5.3590e+02 8.1730e+02 1.3395e+03 4.0870e+03 3.4897e+03 1.0197e+03 6.0200e+02 + 3.0110e+02 3.4980e+02 4.2710e+02 6.6970e+02 5.5560e+02 1.8060e+02 2.3480e+02 + 6.9530e+02 7.6080e+02 3.9670e+02 4.9060e+02 5.2810e+02 7.2820e+02 2.8356e+03 + 2.9405e+03 3.6132e+03 5.5409e+03 2.8331e+03 2.8360e+02 3.5620e+02 1.0064e+03 + 6.3130e+02 6.7350e+02 6.3120e+02 6.0400e+02 5.3320e+02 1.4286e+03 3.9521e+03 + 4.0130e+03 9.5310e+02 8.3390e+02 2.0930e+02 1.6390e+02 4.0230e+02 5.6350e+02 + 4.3613e+03 4.0623e+03 2.3375e+03 8.2600e+02 7.5690e+02 3.2350e+02 4.3960e+02 + 6.5300e+02 5.6970e+02 3.7970e+02 4.0490e+02 3.8630e+02 4.8280e+02 5.0740e+02 + 4.4844e+03 6.6395e+03 6.6505e+03 7.5820e+02 5.3620e+02 4.5980e+02 1.2870e+03 + 3.8654e+03 6.5411e+03 2.3346e+03 5.2420e+02 3.1370e+02 1.4320e+02 5.1170e+02 + 6.1960e+02 6.6380e+02 4.9650e+02 4.4060e+02 6.1410e+02 5.8360e+02 6.1200e+02 + 5.4590e+02 4.0600e+02 1.7640e+02 1.3076e+03 2.2371e+03 2.1084e+03 5.9246e+03 + 2.3005e+03 3.1480e+02 5.4090e+02 9.0610e+02 7.3320e+02 2.2480e+02 1.4410e+02 + 4.4050e+02 6.5530e+02 1.5841e+03 2.6705e+03 3.7598e+03 1.3788e+03 8.2560e+02 + 4.4550e+02 1.9810e+02 5.5650e+02 8.5390e+02 5.1308e+03 4.0411e+03 1.5128e+03 + 8.2330e+02 6.9480e+02 6.9210e+02 3.4930e+02 6.4390e+02 4.5510e+02 7.1000e+02 + 3.6220e+02 6.5640e+02 5.2220e+02 6.5050e+02 4.4395e+03 5.7797e+03 6.0761e+03 + 5.7960e+02 2.7330e+02 5.0480e+02 1.4019e+03 3.0161e+03 5.1510e+03 1.8864e+03 + 1.2106e+03 6.2380e+02 4.9000e+02 7.8220e+02 8.7740e+02 8.2050e+02 4.2640e+02 + 7.2270e+02 5.7740e+02 3.9300e+02 5.7850e+02 8.0050e+02 2.7570e+02 5.7900e+01 + 1.0960e+03 3.8945e+03 2.0710e+03 4.0146e+03 3.7078e+03 6.9580e+02 8.4320e+02 + 1.6436e+03 9.7740e+02 3.4550e+02 1.2740e+02 3.9050e+02 3.0470e+02 8.6180e+02 + 2.0509e+03 4.1130e+03 2.7046e+03 8.9110e+02 4.0080e+02 2.8840e+02 5.4370e+02 + 1.3704e+03 5.4812e+03 2.7006e+03 9.7360e+02 6.9180e+02 9.0880e+02 6.0130e+02 + 1.4160e+02 4.4650e+02 6.3170e+02 7.6580e+02 4.5680e+02 2.3660e+02 5.3430e+02 + 1.0241e+03 5.2634e+03 6.4285e+03 2.6362e+03 9.0370e+02 1.7120e+02 4.0730e+02 + 9.5120e+02 2.3165e+03 5.1000e+03 2.1516e+03 8.4850e+02 1.0335e+03 3.7610e+02 + 8.4420e+02 1.2540e+03 5.3040e+02 6.4900e+02 6.7980e+02 3.8890e+02 4.3190e+02 + 6.3570e+02 7.9970e+02 3.9560e+02 1.2770e+02 7.3850e+02 3.8548e+03 1.0758e+03 + 3.8996e+03 4.4144e+03 1.0461e+03 6.5810e+02 1.0255e+03 1.0318e+03 3.1000e+02 + 7.7850e+02 3.8530e+02 4.7690e+02 7.9620e+02 2.3465e+03 2.6320e+03 4.3231e+03 + 1.6140e+03 1.0194e+03 4.9940e+02 6.1070e+02 3.3125e+03 3.4756e+03 1.5696e+03 + 5.0420e+02 3.5820e+02 8.4810e+02 8.8480e+02 2.8980e+02 2.0090e+02 4.8370e+02 + 4.8260e+02 4.6650e+02 4.4460e+02 4.9440e+02 3.6021e+03 6.2668e+03 5.4022e+03 + 3.0473e+03 9.7580e+02 1.6030e+02 2.0520e+02 4.6550e+02 2.1119e+03 3.1652e+03 + 1.6201e+03 1.7671e+03 1.0874e+03 5.6350e+02 1.0200e+03 5.7200e+02 4.0280e+02 + 4.0410e+02 2.9300e+02 3.6210e+02 4.0040e+02 4.3980e+02 5.5220e+02 3.9110e+02 + 3.9780e+02 7.9470e+02 3.9854e+03 6.6660e+02 4.8827e+03 4.3698e+03 8.2470e+02 + 7.7660e+02 4.0090e+02 3.8460e+02 2.9490e+02 6.4070e+02 2.6690e+02 4.0110e+02 + 7.7990e+02 1.4265e+03 2.3416e+03 3.5420e+03 2.8730e+03 8.9950e+02 8.9600e+02 + 1.9072e+03 3.0065e+03 3.0582e+03 5.3600e+02 6.3030e+02 4.4960e+02 4.9890e+02 + 6.3670e+02 4.1250e+02 5.0280e+02 3.0390e+02 4.9980e+02 2.5200e+02 7.6080e+02 + 1.1951e+03 2.7408e+03 7.0000e+03 5.9793e+03 2.0314e+03 8.2430e+02 4.4880e+02 + 2.8100e+02 5.2560e+02 1.0002e+03 3.9477e+03 3.2115e+03 3.8473e+03 2.4885e+03 + 5.7030e+02 7.0300e+02 1.2481e+03 5.8390e+02 4.7020e+02 6.5110e+02 4.1670e+02 + 6.1400e+02 5.7210e+02 4.1100e+02 6.9120e+02 1.0447e+03 8.7240e+02 4.2840e+03 + 5.0300e+02 3.7980e+03 7.0000e+03 2.2001e+03 6.5450e+02 3.0410e+02 3.1480e+02 + 3.5590e+02 4.5630e+02 2.5600e+02 2.6740e+02 3.6200e+02 1.0207e+03 1.2411e+03 + 5.5877e+03 2.2371e+03 2.4158e+03 2.1811e+03 3.4737e+03 3.7641e+03 1.2810e+03 + 8.7130e+02 5.5280e+02 6.8980e+02 4.9530e+02 3.7490e+02 4.0490e+02 4.2600e+02 + 5.3850e+02 3.3860e+02 3.4840e+02 4.4470e+02 1.3208e+03 3.5430e+03 4.5202e+03 + 5.7149e+03 3.3074e+03 4.8390e+02 5.5820e+02 5.1790e+02 3.3840e+02 1.0500e+03 + 2.6290e+03 2.1822e+03 3.2842e+03 2.2955e+03 2.1228e+03 1.6191e+03 7.8400e+02 + 1.3649e+03 8.3520e+02 1.0345e+03 5.4650e+02 6.2060e+02 5.5280e+02 3.1630e+02 + 8.9520e+02 1.1093e+03 8.1770e+02 3.1923e+03 3.8880e+02 1.3267e+03 7.0000e+03 + 3.5286e+03 5.1070e+02 3.4130e+02 2.2720e+02 4.8370e+02 3.7150e+02 4.8020e+02 + 3.7670e+02 3.2300e+02 7.4670e+02 8.1150e+02 2.5748e+03 3.6940e+03 3.0140e+03 + 5.5396e+03 3.2905e+03 4.5660e+03 7.3610e+02 5.6280e+02 5.3380e+02 5.4780e+02 + 5.6380e+02 2.7780e+02 4.9320e+02 4.2640e+02 4.7670e+02 1.1150e+02 4.0960e+02 + 2.8600e+02 2.7413e+03 4.7800e+03 4.8089e+03 6.1672e+03 1.0481e+03 4.3230e+02 + 7.7290e+02 5.6370e+02 3.9400e+02 3.5120e+02 1.3394e+03 1.8040e+03 2.3201e+03 + 2.2751e+03 4.2064e+03 4.0590e+03 1.1299e+03 1.4466e+03 8.0110e+02 7.5260e+02 + 7.5760e+02 1.2590e+03 4.7400e+02 2.7170e+02 3.5830e+02 6.4190e+02 1.5931e+03 + 4.7627e+03 3.4540e+02 5.8850e+02 5.0425e+03 4.5947e+03 1.0350e+03 5.2150e+02 + 6.6430e+02 2.3420e+02 3.3220e+02 8.8450e+02 7.5110e+02 8.1420e+02 4.1790e+02 + 6.9180e+02 1.6494e+03 2.8081e+03 6.2487e+03 4.5139e+03 3.2056e+03 2.2630e+03 + 7.2280e+02 3.5630e+02 5.7870e+02 4.1300e+02 6.6810e+02 4.8220e+02 4.6620e+02 + 6.3430e+02 3.4760e+02 3.2490e+02 6.4160e+02 5.0380e+02 2.5117e+03 6.2296e+03 + 7.0000e+03 4.0781e+03 5.2630e+02 2.5360e+02 6.8410e+02 8.1230e+02 4.1240e+02 + 3.8310e+02 4.4870e+02 8.0580e+02 1.6229e+03 1.7889e+03 3.5233e+03 3.2766e+03 + 1.4377e+03 2.4059e+03 2.1705e+03 1.2890e+03 1.5509e+03 6.9740e+02 5.6790e+02 + 4.7200e+02 5.3240e+02 5.4090e+02 2.4333e+03 4.4403e+03 2.9230e+02 6.7850e+02 + 2.8879e+03 4.1044e+03 1.8503e+03 1.3976e+03 6.9990e+02 2.2110e+02 4.0070e+02 + 7.6800e+02 9.2960e+02 7.8140e+02 4.5950e+02 5.5350e+02 8.3000e+02 4.7272e+03 + 7.0000e+03 4.2072e+03 2.8714e+03 1.0352e+03 9.2780e+02 4.2120e+02 5.1520e+02 + 6.1410e+02 5.2100e+02 5.3720e+02 6.0110e+02 6.9900e+02 4.1520e+02 4.4270e+02 + 3.5770e+02 7.7470e+02 2.6179e+03 4.0792e+03 5.9942e+03 3.3661e+03 7.8520e+02 + 5.7240e+02 1.0571e+03 4.4710e+02 2.1210e+02 1.9340e+02 6.4700e+02 2.6430e+02 + 7.3890e+02 7.7420e+02 2.6239e+03 3.0535e+03 1.1472e+03 1.0175e+03 1.5681e+03 + 2.1452e+03 2.0412e+03 6.6620e+02 1.0172e+03 4.4880e+02 3.9680e+02 5.1340e+02 + 3.7471e+03 3.9374e+03 3.1040e+02 6.5540e+02 1.3259e+03 2.3314e+03 4.5576e+03 + 1.8563e+03 7.5390e+02 2.9210e+02 3.5860e+02 7.9190e+02 4.1510e+02 6.9290e+02 + 8.3610e+02 6.9970e+02 1.7655e+03 4.2712e+03 7.0000e+03 1.8097e+03 1.2860e+03 + 9.2950e+02 9.8080e+02 5.4710e+02 3.8890e+02 7.5020e+02 6.5170e+02 5.7420e+02 + 4.9700e+02 6.5460e+02 4.3750e+02 4.3620e+02 1.2409e+03 1.7087e+03 4.7827e+03 + 5.1640e+03 6.6584e+03 3.1501e+03 6.3350e+02 7.8860e+02 1.1476e+03 3.7760e+02 + 2.0540e+02 2.6860e+02 4.0040e+02 3.2070e+02 2.5150e+02 3.8370e+02 9.8020e+02 + 7.2450e+02 6.3970e+02 7.8110e+02 2.4431e+03 3.0972e+03 2.0910e+03 1.6552e+03 + 3.1646e+03 1.9774e+03 5.7160e+02 1.2029e+03 4.2585e+03 3.9175e+03 3.0040e+02 + 5.3060e+02 1.1759e+03 2.9996e+03 3.1378e+03 3.4117e+03 7.1900e+02 2.8390e+02 + 7.2260e+02 6.4000e+02 3.0320e+02 5.4560e+02 6.2720e+02 2.2287e+03 2.2204e+03 + 5.2833e+03 7.0000e+03 2.4719e+03 4.7940e+02 6.6250e+02 5.5040e+02 5.5490e+02 + 3.9210e+02 7.3060e+02 6.4760e+02 5.5100e+02 4.0380e+02 3.0350e+02 4.5510e+02 + 5.7900e+02 1.0964e+03 1.9853e+03 4.7211e+03 3.5933e+03 4.0777e+03 2.7108e+03 + 6.5550e+02 5.2960e+02 1.1573e+03 6.2020e+02 5.5560e+02 3.2330e+02 7.8360e+02 + 6.2920e+02 3.9650e+02 2.6700e+02 5.9830e+02 8.1030e+02 8.3890e+02 3.9690e+02 + 1.0741e+03 1.2524e+03 2.9360e+03 2.7210e+03 1.9983e+03 3.0853e+03 2.3738e+03 + 1.5263e+03 2.6197e+03 2.8209e+03 6.0920e+02 8.8290e+02 9.7500e+02 1.2754e+03 + 4.1503e+03 2.9734e+03 1.2990e+03 2.8850e+02 4.4620e+02 4.0340e+02 1.4880e+02 + 6.2850e+02 1.1163e+03 3.5394e+03 3.3107e+03 3.3538e+03 4.2218e+03 2.9933e+03 + 5.0140e+02 6.2990e+02 4.5520e+02 4.8200e+02 6.8870e+02 6.9340e+02 5.6090e+02 + 3.7050e+02 3.9420e+02 2.7750e+02 1.3780e+02 5.0010e+02 3.0350e+03 3.0087e+03 + 4.4506e+03 2.8085e+03 3.8051e+03 1.1248e+03 4.8470e+02 4.8500e+02 5.5570e+02 + 4.9910e+02 3.1870e+02 7.2470e+02 5.1720e+02 6.9760e+02 4.3760e+02 2.5870e+02 + 3.1910e+02 2.5370e+02 8.1760e+02 5.8940e+02 4.2410e+02 1.1843e+03 7.8840e+02 + 1.6713e+03 2.4490e+03 2.2005e+03 5.3852e+03 2.8540e+03 4.7361e+03 2.4726e+03 + 5.1660e+02 6.7060e+02 3.5240e+02 1.0428e+03 3.0808e+03 6.1973e+03 2.1239e+03 + 3.6220e+02 4.6720e+02 8.3180e+02 6.3250e+02 6.3380e+02 2.1182e+03 4.6946e+03 + 5.0448e+03 2.1054e+03 3.7186e+03 1.9747e+03 7.9960e+02 8.2800e+02 2.1770e+02 + 4.9760e+02 5.6250e+02 5.3850e+02 4.9470e+02 4.7820e+02 5.3070e+02 5.5140e+02 + 3.3810e+02 5.9820e+02 2.1678e+03 2.6210e+03 3.8819e+03 4.5245e+03 4.8999e+03 + 4.8040e+02 5.2050e+02 5.1500e+02 4.3440e+02 2.7260e+02 2.5510e+02 1.2175e+03 + 6.8630e+02 6.1510e+02 4.2100e+02 2.5950e+02 2.4260e+02 5.0250e+02 4.1380e+02 + 4.0750e+02 5.4270e+02 7.5750e+02 6.5050e+02 1.0751e+03 1.4534e+03 3.9801e+03 + 5.7118e+03 5.7674e+03 3.2841e+03 1.0739e+03 7.0130e+02 4.7190e+02 8.9660e+02 + 5.0320e+02 1.5018e+03 3.9176e+03 3.1636e+03 5.7130e+02 4.0010e+02 6.7310e+02 + 8.7440e+02 6.7000e+02 2.5407e+03 3.9754e+03 2.1447e+03 9.5140e+02 5.3048e+03 + 2.2177e+03 8.7660e+02 7.4310e+02 4.7470e+02 6.6090e+02 4.7960e+02 9.2770e+02 + 6.1310e+02 4.7050e+02 3.1560e+02 5.8150e+02 2.0230e+02 6.8590e+02 2.1157e+03 + 5.4039e+03 1.0272e+03 3.9004e+03 5.4065e+03 6.8240e+02 7.0480e+02 4.5440e+02 + 4.2780e+02 4.8210e+02 3.8690e+02 6.3490e+02 6.2780e+02 4.4760e+02 4.2030e+02 + 5.8750e+02 4.9030e+02 9.3120e+02 4.8230e+02 4.5010e+02 3.5990e+02 7.1880e+02 + 5.7490e+02 5.5380e+02 6.7850e+02 1.6671e+03 2*7.0000e+03 4.0442e+03 + 1.2198e+03 8.7270e+02 5.3960e+02 7.6800e+02 7.3590e+02 1.1067e+03 4.7739e+03 + 4.0657e+03 5.0570e+02 3.4670e+02 1.0179e+03 1.0929e+03 2.2057e+03 3.1884e+03 + 3.1286e+03 3.2568e+03 1.6055e+03 3.5579e+03 3.3541e+03 6.1740e+02 4.6780e+02 + 5.7650e+02 5.7810e+02 3.6220e+02 6.0870e+02 2.8540e+02 1.8440e+02 4.7880e+02 + 9.6240e+02 3.0870e+02 5.2380e+02 4.6670e+03 4.4112e+03 2.5531e+03 2.7883e+03 + 4.5962e+03 7.4060e+02 3.2210e+02 7.2860e+02 4.5260e+02 3.0840e+02 4.8920e+02 + 7.3630e+02 2.5960e+02 2.9430e+02 4.1910e+02 6.5450e+02 5.6500e+02 7.5580e+02 + 4.9980e+02 1.8290e+02 4.5610e+02 6.0630e+02 5.9180e+02 1.3228e+03 5.9460e+02 + 2.2056e+03 6.3619e+03 6.4048e+03 4.8314e+03 1.2404e+03 4.0230e+02 5.9650e+02 + 4.8830e+02 1.0633e+03 8.1680e+02 5.4674e+03 4.6579e+03 9.7580e+02 7.6530e+02 + 1.2104e+03 1.3762e+03 2.0684e+03 3.9612e+03 2.3571e+03 1.1588e+03 2.4417e+03 + 2.9875e+03 2.0472e+03 1.0101e+03 6.5640e+02 2.0980e+02 5.7720e+02 2.9910e+02 + 8.0570e+02 5.5870e+02 2.5500e+02 1.8010e+02 5.1260e+02 8.7250e+02 1.6118e+03 + 3.0963e+03 4.0146e+03 1.8296e+03 2.9406e+03 4.3704e+03 2.1594e+03 3.8640e+02 + 4.5410e+02 4.1510e+02 4.4470e+02 3.6810e+02 6.0500e+02 2.4320e+02 7.5040e+02 + 7.6240e+02 7.9890e+02 6.4660e+02 3.8900e+02 4.9280e+02 2.1680e+02 + 2*5.4490e+02 1.1221e+03 1.3317e+03 9.3230e+02 4.5743e+03 4.7926e+03 + 5.5761e+03 6.5365e+03 9.9220e+02 4.7750e+02 5.4260e+02 5.9510e+02 7.6490e+02 + 1.0818e+03 5.5250e+03 3.4243e+03 7.5500e+02 4.7020e+02 2.2114e+03 2.8337e+03 + 2.3705e+03 1.8731e+03 7.3080e+02 6.6410e+02 2.2409e+03 2.0753e+03 2.6034e+03 + 4.3520e+02 2.9740e+02 3.0630e+02 4.4280e+02 4.0260e+02 5.3730e+02 7.0820e+02 + 4.2700e+02 5.0040e+02 4.2440e+02 8.4110e+02 5.6060e+02 4.3195e+03 3.9045e+03 + 2.8092e+03 3.6340e+03 3.5785e+03 8.0710e+02 4.1990e+02 3.9910e+02 1.0141e+03 + 8.6030e+02 2.6920e+02 3.7220e+02 2.7750e+02 5.1970e+02 7.7700e+02 1.1747e+03 + 7.0320e+02 3.6980e+02 2.3420e+02 7.3180e+02 5.2200e+02 9.9130e+02 1.3378e+03 + 1.3979e+03 1.9266e+03 4.7604e+03 2.5506e+03 2.2249e+03 3.0033e+03 3.4114e+03 + 3.1260e+02 6.4240e+02 6.3140e+02 5.1770e+02 1.0795e+03 3.4506e+03 4.9959e+03 + 9.8620e+02 1.5297e+03 4.6869e+03 4.8928e+03 1.1601e+03 4.2590e+02 1.5970e+02 + 6.5790e+02 1.7109e+03 2.8699e+03 3.8071e+03 5.4960e+02 1.5200e+02 4.1700e+02 + 5.4470e+02 5.9650e+02 6.1340e+02 6.7260e+02 5.9310e+02 7.0730e+02 5.1730e+02 + 3.9620e+02 7.0840e+02 2.3512e+03 4.5745e+03 1.0297e+03 2.2747e+03 3.5295e+03 + 6.8870e+02 5.3120e+02 2.3450e+02 5.8180e+02 1.3528e+03 2.8270e+02 3.0480e+02 + 3.8150e+02 1.2034e+03 1.1998e+03 7.3590e+02 8.0540e+02 4.4670e+02 3.5220e+02 + 3.9360e+02 7.3330e+02 1.2330e+03 1.0545e+03 1.1513e+03 3.1115e+03 3.3560e+03 + 3.1858e+03 6.6490e+02 2.0748e+03 3.8897e+03 5.5340e+02 6.0340e+02 5.1210e+02 + 5.0330e+02 7.7430e+02 2.5900e+03 4.0246e+03 2.3417e+03 4.1914e+03 3.8777e+03 + 2.2504e+03 1.4206e+03 4.6690e+02 2.2130e+02 5.5290e+02 1.0300e+03 4.2611e+03 + 4.1825e+03 2.7850e+02 2.9920e+02 4.4380e+02 7.8360e+02 4.7440e+02 5.8860e+02 + 7.6340e+02 8.0670e+02 7.8430e+02 5.1310e+02 5.8140e+02 2.0671e+03 2.6639e+03 + 4.6276e+03 1.3000e+03 5.3789e+03 3.1810e+03 1.7929e+03 7.9230e+02 4.8840e+02 + 5.2380e+02 5.1430e+02 5.0880e+02 1.1200e+02 3.4520e+02 4.7210e+02 8.5290e+02 + 3.0740e+02 3.2100e+02 4.0460e+02 6.1160e+02 7.5400e+02 9.2280e+02 2.4139e+03 + 3.3905e+03 2.6103e+03 3.4706e+03 2.3496e+03 1.5980e+03 1.1305e+03 1.4906e+03 + 1.6339e+03 8.9720e+02 4.1950e+02 3.8790e+02 6.1860e+02 8.1230e+02 2.6280e+03 + 3.1663e+03 3.8023e+03 3.5856e+03 3.0826e+03 3.4480e+02 6.5250e+02 3.4380e+02 + 2.3600e+02 6.7650e+02 3.1322e+03 4.6338e+03 2.1062e+03 5.4410e+02 2.5730e+02 + 2.2310e+02 6.1890e+02 3.3880e+02 8.2930e+02 9.5940e+02 8.1440e+02 5.5030e+02 + 5.1990e+02 2.6000e+02 9.6570e+02 3.4549e+03 1.3900e+03 1.1173e+03 3.7064e+03 + 4.3058e+03 2.2475e+03 9.2990e+02 9.5280e+02 1.0187e+03 7.5220e+02 2.5730e+02 + 3.6390e+02 4.2450e+02 9.9160e+02 3.7470e+02 3.4220e+02 4.5690e+02 4.9750e+02 + 5.1370e+02 9.9010e+02 1.7794e+03 3.2404e+03 3.1241e+03 3.7186e+03 1.9712e+03 + 5.6500e+02 6.8030e+02 1.0063e+03 5.7810e+02 4.9400e+02 7.1570e+02 4.9690e+02 + 3.8110e+02 5.7540e+02 6.6310e+02 3.2610e+03 3.4990e+03 5.3369e+03 5.8849e+03 + 2.8264e+03 9.9690e+02 3.2070e+02 3.6490e+02 4.2740e+02 4.2660e+02 2.5335e+03 + 4.0126e+03 2.4613e+03 7.5230e+02 5.0340e+02 2.6730e+02 5.5730e+02 4.8740e+02 + 4.6860e+02 1.0311e+03 1.0412e+03 6.2350e+02 3.1100e+02 4.4490e+02 9.1760e+02 + 2.1622e+03 2.9491e+03 1.0625e+03 3.7431e+03 5.2087e+03 2.5328e+03 6.3660e+02 + 7.1300e+02 8.5500e+02 3.8890e+02 4.5980e+02 5.8220e+02 7.0290e+02 3.5580e+02 + 4.2300e+02 4.0090e+02 2.7390e+02 2.8380e+02 7.0220e+02 1.3777e+03 1.3406e+03 + 2.7711e+03 3.2241e+03 2.4491e+03 8.5300e+02 8.0530e+02 4.3080e+02 6.3340e+02 + 1.2388e+03 9.4620e+02 3.1690e+02 4.0900e+02 6.9780e+02 4.3030e+02 5.4880e+02 + 2.0411e+03 6.3720e+03 3.7507e+03 4.0750e+03 9.5130e+02 4.2470e+02 3.9680e+02 + 5.3850e+02 8.6560e+02 8.8480e+02 3.5154e+03 4.3315e+03 1.7134e+03 3.9280e+02 + 5.3960e+02 3.1910e+02 5.4160e+02 1.8960e+02 4.8750e+02 6.1380e+02 7.0730e+02 + 4.9240e+02 2.7420e+02 3.3110e+02 5.4960e+02 3.0445e+03 2.0459e+03 9.4890e+02 + 1.9755e+03 3.2211e+03 2.4852e+03 1.0248e+03 6.3930e+02 7.5240e+02 2.4470e+02 + 2.8380e+02 8.0370e+02 7.7410e+02 6.5480e+02 4.5350e+02 7.3800e+02 4.4450e+02 + 4.3400e+02 1.0398e+03 3.7371e+03 2.8281e+03 3.0450e+03 2.1442e+03 1.0473e+03 + 5.4440e+02 2.6560e+02 5.5950e+02 3.3190e+02 5.0100e+02 6.1220e+02 6.4280e+02 + 2.3240e+02 7.7690e+02 4.3680e+02 9.8500e+02 2.8573e+03 7.0000e+03 3.1769e+03 + 1.8253e+03 8.4710e+02 6.6960e+02 6.2940e+02 7.1360e+02 1.4430e+03 9.6580e+02 + 4.1939e+03 3.0719e+03 5.4710e+02 9.9920e+02 6.2070e+02 7.5200e+02 4.1070e+02 + 3.3330e+02 6.2320e+02 4.7520e+02 5.0970e+02 4.0600e+02 6.5860e+02 3.5590e+02 + 1.7694e+03 4.0853e+03 2.7289e+03 5.4110e+02 1.2257e+03 4.4240e+03 4.8298e+03 + 5.9300e+02 5.9960e+02 6.6690e+02 2.4460e+02 3.5950e+02 5.3750e+02 6.7280e+02 + 4.8850e+02 5.6550e+02 4.2970e+02 3.7900e+02 7.2810e+02 3.8536e+03 3.1926e+03 + 2.1295e+03 3.7660e+02 8.4980e+02 8.8350e+02 4.6850e+02 3.9010e+02 5.4430e+02 + 2.0690e+02 2.7470e+02 1.0336e+03 2.7730e+02 3.8330e+02 8.7650e+02 8.4520e+02 + 3.2460e+02 3.6020e+03 5.1003e+03 3.3773e+03 1.9756e+03 4.7990e+02 6.4680e+02 + 7.3080e+02 4.9720e+02 1.2831e+03 1.9332e+03 5.4900e+03 2.2990e+03 7.3960e+02 + 6.1720e+02 6.3440e+02 5.6900e+02 4.7990e+02 2.7460e+02 5.6300e+02 3.9800e+02 + 6.2460e+02 2.1970e+02 4.6040e+02 4.2480e+02 2.0510e+03 5.2021e+03 2.8362e+03 + 1.3334e+03 1.0254e+03 2.1754e+03 5.5806e+03 6.9780e+02 5.0690e+02 3.8920e+02 + 2.2560e+02 4.4520e+02 1.0397e+03 3.5720e+02 5.6090e+02 5.1340e+02 4.7820e+02 + 6.0030e+02 3.0880e+02 2.6642e+03 3.5540e+03 2.0310e+03 5.2670e+02 7.1240e+02 + 2.6980e+02 5.8010e+02 5.8030e+02 6.3790e+02 4.6270e+02 5.4510e+02 5.5940e+02 + 5.7350e+02 3.3590e+02 7.7000e+02 9.1090e+02 8.8510e+02 4.6963e+03 4.5035e+03 + 7.9770e+02 7.0720e+02 6.5160e+02 7.5110e+02 4.5060e+02 4.5340e+02 5.4680e+02 + 1.3089e+03 6.2025e+03 3.5686e+03 7.4580e+02 8.3370e+02 4.5660e+02 7.6490e+02 + 7.6250e+02 5.1760e+02 4.2590e+02 6.0600e+02 6.8000e+02 4.8300e+02 3.9810e+02 + 5.5750e+02 1.1604e+03 3.8296e+03 4.0972e+03 1.6222e+03 9.8950e+02 2.6912e+03 + 5.5755e+03 2.2306e+03 6.4680e+02 5.7850e+02 9.7330e+02 9.7820e+02 6.4710e+02 + 6.9250e+02 5.5630e+02 4.7530e+02 6.4500e+02 4.1220e+02 1.0521e+03 3.3792e+03 + 3.1041e+03 7.5080e+02 5.0360e+02 6.2830e+02 2.9780e+02 5.4580e+02 7.2590e+02 + 5.5620e+02 3.1080e+02 3.5210e+02 2.1620e+02 4.5360e+02 4.0700e+02 8.8980e+02 + 9.9480e+02 4.0405e+03 4.2546e+03 5.0181e+03 2.2336e+03 8.4580e+02 5.1610e+02 + 3.4570e+02 8.6610e+02 3.0200e+02 3.3470e+02 1.8799e+03 4.2230e+03 2.7424e+03 + 6.9440e+02 3.6460e+02 5.2020e+02 5.0770e+02 6.8520e+02 4.5940e+02 3.9500e+02 + 1.2826e+03 6.6570e+02 6.3000e+02 4.0610e+02 6.4450e+02 2.2118e+03 5.6169e+03 + 5.1246e+03 2.0799e+03 3.5940e+02 1.6651e+03 4.3326e+03 2.4949e+03 3.8500e+02 + 4.3510e+02 6.5420e+02 7.3730e+02 4.3310e+02 6.3520e+02 4.1080e+02 4.0290e+02 + 5.5060e+02 5.7280e+02 2.2028e+03 4.8024e+03 3.2083e+03 1.7504e+03 6.5980e+02 + 3.0100e+02 2.2330e+02 3.8970e+02 4.5430e+02 6.9890e+02 4.5880e+02 3.0010e+02 + 3.9820e+02 4.2520e+02 3.8910e+02 4.5380e+02 1.4392e+03 3.6213e+03 3.5824e+03 + 2.5498e+03 6.5040e+02 7.1460e+02 8.4780e+02 6.3710e+02 6.6780e+02 7.0750e+02 + 5.4250e+02 4.4796e+03 4.3684e+03 1.7834e+03 9.5590e+02 5.3360e+02 3.2920e+02 + 5.3150e+02 6.7930e+02 3.5130e+02 3.9890e+02 6.1830e+02 1.0480e+03 8.8580e+02 + 4.1780e+02 4.3230e+02 2.7494e+03 3.4827e+03 3.8605e+03 9.9870e+02 2.8040e+02 + 1.4254e+03 5.6873e+03 2.5287e+03 9.4100e+02 5.9490e+02 5.8390e+02 4.1400e+02 + 5.9300e+02 3.6560e+02 6.3320e+02 7.3650e+02 2.6910e+02 7.6700e+02 3.0881e+03 + 6.4273e+03 2.7509e+03 9.3280e+02 4.3510e+02 3.1070e+02 3.4110e+02 5.0710e+02 + 6.0180e+02 4.4890e+02 3.2340e+02 3.3550e+02 4.0240e+02 5.4550e+02 3.1790e+02 + 3.3120e+02 6.7120e+02 4.3704e+03 4.7296e+03 7.2070e+02 6.9080e+02 4.4420e+02 + 7.2260e+02 3.8420e+02 8.6400e+02 5.9880e+02 3.0890e+02 2.2930e+03 3.2925e+03 + 1.7406e+03 6.3390e+02 2.5870e+02 3.4860e+02 3.6910e+02 6.1240e+02 6.8450e+02 + 3.3250e+02 5.3770e+02 8.2390e+02 4.1360e+02 3.7940e+02 3.3330e+02 2.2182e+03 + 3.7788e+03 3.6340e+03 9.8020e+02 3.5230e+02 1.1376e+03 4.3865e+03 5.3236e+03 + 1.8780e+03 5.8720e+02 4.6660e+02 2.9330e+02 5.9070e+02 6.4640e+02 5.9320e+02 + 3.9280e+02 3.9470e+02 8.6440e+02 4.1685e+03 6.1176e+03 1.9432e+03 8.1080e+02 + 5.0550e+02 2.5630e+02 3.4980e+02 4.8350e+02 8.0870e+02 5.6950e+02 7.5030e+02 + 4.9080e+02 1.7500e+02 8.2180e+02 4.1450e+02 5.6930e+02 2.2489e+03 3.2531e+03 + 3.9019e+03 8.6430e+02 4.8750e+02 6.0690e+02 5.1860e+02 6.2110e+02 1.0518e+03 + 3.5720e+02 3.3570e+02 4.2565e+03 4.1431e+03 6.9580e+02 5.5430e+02 5.6670e+02 + 2.6550e+02 2.6650e+02 4.4050e+02 7.2510e+02 4.0810e+02 3.6990e+02 8.0400e+02 + 4.7650e+02 7.0190e+02 4.0900e+02 2.4610e+03 3.9941e+03 2.5019e+03 3.6450e+02 + 2.4230e+02 5.9360e+02 1.9255e+03 3.6672e+03 2.0873e+03 7.4040e+02 6.2780e+02 + 3.4010e+02 5.8320e+02 3.7930e+02 3.0040e+02 1.6870e+02 6.1560e+02 1.1399e+03 + 5.0222e+03 2.9782e+03 8.9310e+02 1.0215e+03 2.7590e+02 2.2810e+02 5.1070e+02 + 6.5240e+02 5.9000e+02 4.2600e+02 5.5340e+02 3.5780e+02 3.1050e+02 7.0980e+02 + 2.6220e+02 4.5470e+02 2.1203e+03 4.0721e+03 1.4489e+03 9.4750e+02 7.1300e+02 + 6.5060e+02 7.1210e+02 7.2920e+02 7.4680e+02 2.4580e+02 4.5500e+02 4.1167e+03 + 5.9060e+03 1.5768e+03 7.4080e+02 4.6970e+02 2.8850e+02 6.4120e+02 7.1650e+02 + 8.0440e+02 4.6810e+02 5.3930e+02 6.0840e+02 8.1150e+02 7.6880e+02 5.2080e+02 + 9.1370e+02 4.6944e+03 2.5335e+03 4.5890e+02 3.5870e+02 5.5020e+02 2.4913e+03 + 2.9814e+03 4.3979e+03 6.9170e+02 8.1300e+02 2.3990e+02 4.2820e+02 3.3350e+02 + 5.6860e+02 6.9960e+02 8.8830e+02 2.6495e+03 4.1941e+03 2.3601e+03 7.5880e+02 + 7.8120e+02 3.9590e+02 5.8770e+02 5.2420e+02 5.8030e+02 3.3550e+02 3.1860e+02 + 7.1350e+02 5.6780e+02 4.1050e+02 5.4040e+02 2.5440e+02 4.5160e+02 3.8101e+03 + 4.3789e+03 1.8141e+03 6.8990e+02 7.8570e+02 3.7720e+02 2.5700e+02 5.0120e+02 + 5.4670e+02 2.1400e+02 8.3920e+02 2.3869e+03 4.5474e+03 1.5820e+03 3.7960e+02 + 5.1340e+02 4.8430e+02 4.1560e+02 6.8460e+02 1.0041e+03 4.9300e+02 4.8860e+02 + 3.2220e+02 3.8430e+02 3.3710e+02 9.0650e+02 1.2064e+03 4.1759e+03 2.8025e+03 + 9.6610e+02 5.5390e+02 4.0020e+02 1.0548e+03 3.3699e+03 5.0644e+03 1.7565e+03 + 2.8300e+02 3.9170e+02 3.4150e+02 2.1870e+02 3.4020e+02 1.0869e+03 2.1863e+03 + 2.1628e+03 2.5291e+03 2.0952e+03 6.1460e+02 4.4330e+02 3.3760e+02 5.7870e+02 + 6.9720e+02 1.0691e+03 2.8420e+02 2.1360e+02 2.2870e+02 5.4910e+02 1.0580e+03 + 5.6330e+02 2.8520e+02 7.4480e+02 2.8848e+03 5.4255e+03 1.2853e+03 4.9030e+02 + 1.2933e+03 3.0190e+02 5.8190e+02 2.6360e+02 3.6290e+02 4.0610e+02 5.0310e+02 + 2.8480e+03 5.4647e+03 1.3363e+03 4.6170e+02 8.3980e+02 1.5570e+02 5.4250e+02 + 4.0420e+02 1.1588e+03 7.3340e+02 7.6050e+02 5.6640e+02 4.2180e+02 3.9250e+02 + 3.7840e+02 1.9202e+03 4.3479e+03 3.5848e+03 1.5105e+03 3.4780e+02 4.9100e+02 + 1.2254e+03 2.4440e+03 3.8970e+03 1.8651e+03 1.4043e+03 3.0260e+02 3.1560e+02 + 4.4700e+02 1.2084e+03 2.7970e+03 4.6215e+03 3.1956e+03 2.1607e+03 1.4878e+03 + 7.8070e+02 3.5610e+02 3.6580e+02 8.9590e+02 1.0467e+03 6.2130e+02 2.0160e+02 + 4.4600e+02 3.5150e+02 3.6180e+02 8.5170e+02 4.2970e+02 4.9300e+02 4.1200e+02 + 3.2864e+03 4.8426e+03 2.1281e+03 5.9100e+02 1.0084e+03 7.1400e+02 3.7180e+02 + 3.5500e+02 5.8550e+02 5.3650e+02 6.6850e+02 1.9112e+03 4.8169e+03 2.6548e+03 + 3.6820e+02 4.5860e+02 2.9540e+02 3.3580e+02 4.9030e+02 5.1810e+02 8.2850e+02 + 6.0640e+02 3.6440e+02 4.4200e+02 3.0090e+02 7.3570e+02 2.1126e+03 4.8215e+03 + 2.1045e+03 1.0990e+03 4.7000e+02 5.6580e+02 8.4890e+02 9.9670e+02 2.7758e+03 + 3.7379e+03 1.2886e+03 4.6160e+02 1.0908e+03 1.6021e+03 2.3304e+03 2.0708e+03 + 3.3534e+03 2.3589e+03 1.0189e+03 9.5760e+02 5.4000e+02 6.4220e+02 9.9500e+01 + 4.2520e+02 6.5980e+02 7.3120e+02 6.4970e+02 7.7780e+02 7.1880e+02 4.6940e+02 + 6.0250e+02 2.0460e+02 3.3450e+02 7.9450e+02 3.7079e+03 5.0746e+03 1.0398e+03 + 7.4730e+02 7.5720e+02 4.9000e+02 4.8980e+02 2.5480e+02 3.9950e+02 6.0750e+02 + 7.8780e+02 1.7071e+03 4.4481e+03 4.0758e+03 8.8220e+02 7.4960e+02 4.1630e+02 + 4.9150e+02 6.8860e+02 4.0990e+02 7.3620e+02 6.8640e+02 5.1100e+02 3.6610e+02 + 5.0290e+02 3.6510e+02 1.4400e+03 3.2688e+03 4.0629e+03 1.0339e+03 4.2360e+02 + 5.2790e+02 7.7240e+02 1.1414e+03 1.0420e+03 3.5864e+03 3.9424e+03 9.0000e+02 + 2.4403e+03 2.1113e+03 2.9210e+03 2.6000e+03 2.2948e+03 1.6903e+03 5.7170e+02 + 3.2990e+02 4.0330e+02 4.9880e+02 5.2170e+02 4.7870e+02 7.1930e+02 5.0230e+02 + 6.9750e+02 1.0343e+03 3.0970e+02 9.8090e+02 2.7610e+02 6.6790e+02 3.4410e+02 + 6.4880e+02 2.6845e+03 5.7342e+03 1.7152e+03 5.0500e+02 2.5600e+02 5.4770e+02 + 4.1640e+02 4.5030e+02 7.7650e+02 1.0373e+03 4.8400e+02 9.6300e+02 3.2866e+03 + 4.8419e+03 1.7712e+03 7.1950e+02 6.1910e+02 9.0690e+02 4.6560e+02 4.1810e+02 + 5.1990e+02 9.1480e+02 3.7760e+02 3.3020e+02 2.7840e+02 1.2350e+02 1.5138e+03 + 5.1923e+03 1.6809e+03 1.3374e+03 4.4290e+02 4.0970e+02 5.2390e+02 3.6160e+02 + 5.9220e+02 5.1632e+03 5.5246e+03 8.6580e+02 4.5724e+03 4.2497e+03 4.6595e+03 + 1.2674e+03 1.3901e+03 8.6710e+02 6.1540e+02 4.4640e+02 2.6620e+02 7.5230e+02 + 2.9700e+02 9.3090e+02 1.3243e+03 7.6100e+02 5.4840e+02 4.0240e+02 8.1780e+02 + 7.3050e+02 8.2190e+02 7.1010e+02 5.2290e+02 7.4730e+02 4.8736e+03 4.4080e+03 + 8.4420e+02 5.0590e+02 1.9350e+02 4.2020e+02 3.8420e+02 3.4430e+02 3.8310e+02 + 6.9090e+02 5.1450e+02 1.1029e+03 2.4939e+03 3.6014e+03 1.0604e+03 7.0050e+02 + 5.9380e+02 7.1600e+02 5.2860e+02 3.8670e+02 8.1300e+02 8.4030e+02 5.1180e+02 + 1.0670e+02 3.6250e+02 3.4010e+02 1.1141e+03 4.0172e+03 1.2482e+03 9.0900e+02 + 6.2800e+02 3.3200e+02 9.3700e+02 7.1080e+02 9.2150e+02 2.5472e+03 5.1613e+03 + 2.4165e+03 4.1237e+03 6.4349e+03 1.0134e+03 4.8950e+02 9.2260e+02 6.1740e+02 + 5.3700e+02 6.2150e+02 1.1426e+03 3.7580e+02 5.6270e+02 5.3730e+02 1.1949e+03 + 3.3470e+02 3.8160e+02 8.1560e+02 9.2460e+02 5.1650e+02 7.6480e+02 6.6670e+02 + 6.2200e+02 7.8530e+02 4.9693e+03 5.7433e+03 8.8620e+02 4.8930e+02 2.1160e+02 + 4.6410e+02 1.7270e+02 3.5400e+02 6.3590e+02 7.0120e+02 3.6820e+02 4.6800e+02 + 2.4034e+03 5.7440e+03 2.6333e+03 5.2190e+02 7.3840e+02 7.0500e+02 6.5280e+02 + 3.6050e+02 3.4650e+02 8.4430e+02 4.9270e+02 1.6430e+02 3.8590e+02 5.1390e+02 + 1.6553e+03 4.8559e+03 1.9570e+03 8.5310e+02 4.7690e+02 5.4250e+02 4.9770e+02 + 4.4330e+02 5.8100e+02 2.4266e+03 3.8058e+03 4.5828e+03 3.3257e+03 5.9783e+03 + 8.6780e+02 2.1830e+02 4.6080e+02 6.6300e+02 4.5870e+02 6.9520e+02 6.1690e+02 + 5.4660e+02 3.0120e+02 4.6210e+02 6.6250e+02 8.9560e+02 4.2260e+02 8.4360e+02 + 9.6780e+02 1.0324e+03 6.6390e+02 3.7890e+02 5.0540e+02 1.5116e+03 2.2420e+03 + 2.6077e+03 3.8810e+02 2.8930e+02 3.3770e+02 3.3280e+02 2.0930e+02 4.5570e+02 + 5.8320e+02 9.2290e+02 4.7680e+02 4.3190e+02 1.9101e+03 4.1462e+03 3.3160e+03 + 9.0040e+02 7.7610e+02 6.2270e+02 8.2190e+02 5.2960e+02 6.4110e+02 2.0200e+02 + 5.2270e+02 2.5020e+02 4.0830e+02 5.7530e+02 3.2161e+03 4.4742e+03 1.2861e+03 + 4.7050e+02 4.1040e+02 6.1120e+02 4.3590e+02 5.2040e+02 3.4390e+02 9.3280e+02 + 3.9970e+03 4.9789e+03 6.6560e+03 5.6261e+03 1.3976e+03 2.3010e+02 2.5830e+02 + 6.9290e+02 4.3540e+02 4.7740e+02 5.6460e+02 4.0420e+02 1.6400e+02 4.8950e+02 + 5.4320e+02 4.8210e+02 5.5410e+02 6.7270e+02 7.6050e+02 1.3471e+03 2.7684e+03 + 4.2670e+02 4.6200e+02 8.1630e+02 3.8232e+03 4.5429e+03 7.8040e+02 3.5940e+02 + 5.7950e+02 2.1400e+02 3.2770e+02 3.9760e+02 7.6970e+02 3.7040e+02 4.5730e+02 + 4.3670e+02 2.0258e+03 3.3263e+03 4.2655e+03 1.3842e+03 4.2900e+02 2.4340e+02 + 7.4550e+02 5.7550e+02 2.1910e+02 3.4820e+02 1.9240e+02 2.6690e+02 6.2680e+02 + 2.8466e+03 4.9755e+03 5.5255e+03 7.1500e+02 3.0010e+02 3.8310e+02 3.5480e+02 + 5.5140e+02 5.6290e+02 3.4570e+02 2.8070e+02 2.5511e+03 4.6215e+03 6.8469e+03 + 4.2375e+03 1.7553e+03 2.6920e+02 1.9790e+02 4.8860e+02 4.5750e+02 5.0610e+02 + 5.3810e+02 3.0810e+02 4.6740e+02 3.8490e+02 5.0790e+02 5.9980e+02 5.6030e+02 + 4.2570e+02 4.8840e+02 6.9730e+02 1.3916e+03 6.2890e+02 2.9880e+02 5.9840e+02 + 1.4996e+03 3.2744e+03 4.0770e+02 6.2750e+02 4.8970e+02 3.2850e+02 2.2590e+02 + 3.8010e+02 7.8960e+02 6.4450e+02 4.5320e+02 4.4100e+02 7.7440e+02 3.5260e+03 + 4.2275e+03 2.8768e+03 6.9190e+02 2.7820e+02 6.6590e+02 4.4270e+02 2.6680e+02 + 2.3490e+02 4.5170e+02 4.4920e+02 4.4370e+02 8.0670e+02 4.9912e+03 4.2101e+03 + 6.5230e+02 2.8110e+02 3.9020e+02 7.3940e+02 4.6010e+02 4.7660e+02 5.2410e+02 + 7.0420e+02 2.0273e+03 4.8531e+03 6.3536e+03 3.8432e+03 6.6710e+02 5.0540e+02 + 2.8910e+02 5.3010e+02 9.0980e+02 5.5730e+02 1.7260e+02 5.0180e+02 5.1020e+02 + 3.0960e+02 7.1370e+02 1.1015e+03 5.1860e+02 5.4160e+02 2.5330e+02 2.8410e+02 + 2.9151e+03 5.2160e+02 6.1230e+02 4.1000e+02 2.4314e+03 2.4486e+03 1.7237e+03 + 5.4820e+02 7.8620e+02 8.2930e+02 5.5170e+02 5.5650e+02 8.4750e+02 4.0340e+02 + 1.7840e+02 4.8880e+02 5.9270e+02 1.6127e+03 4.1718e+03 2.6377e+03 1.3871e+03 + 4.0820e+02 6.8640e+02 3.6570e+02 3.3130e+02 7.0150e+02 6.4250e+02 5.3250e+02 + 6.1990e+02 2.7260e+03 4.6725e+03 2.3481e+03 3.8710e+02 3.9340e+02 4.2980e+02 + 6.7230e+02 6.2920e+02 2.7140e+02 3.2050e+02 4.6900e+02 1.3331e+03 3.1797e+03 + 5.8981e+03 3.1844e+03 9.4310e+02 9.7400e+02 5.0170e+02 4.8040e+02 5.0060e+02 + 4.2700e+02 2.0490e+02 5.5300e+02 7.4960e+02 6.5060e+02 6.3720e+02 6.2660e+02 + 8.1010e+02 7.6970e+02 3.2850e+02 1.1770e+02 2.3404e+03 9.2610e+02 3.7060e+02 + 3.2870e+02 1.3999e+03 2.0838e+03 2.1432e+03 1.0915e+03 8.2860e+02 3.6910e+02 + 1.0913e+03 4.4820e+02 3.2990e+02 1.0206e+03 2.9010e+02 3.8180e+02 8.3630e+02 + 7.6090e+02 2.5336e+03 3.9043e+03 1.8953e+03 6.5900e+02 8.6380e+02 2.6270e+02 + 3.8500e+02 6.1540e+02 8.6710e+02 9.7110e+02 7.6490e+02 2.6462e+03 3.0269e+03 + 2.6758e+03 5.7040e+02 7.1410e+02 4.7500e+02 1.1020e+03 7.7510e+02 3.4260e+02 + 2.5430e+02 4.5450e+02 8.7450e+02 2.4472e+03 4.6203e+03 4.2437e+03 2.1305e+03 + 5.8270e+02 5.7740e+02 2.8630e+02 4.6460e+02 3.7080e+02 2.3000e+02 3.0110e+02 + 1.0986e+03 6.6500e+02 3.7560e+02 8.5210e+02 1.1227e+03 4.7520e+02 2.2920e+02 + 1.2700e+02 2.0682e+03 3.7430e+02 6.4570e+02 2.3816e+03 2.8722e+03 1.5231e+03 + 8.5350e+02 2.2570e+02 2.3380e+02 5.9660e+02 3.6534e+03 3.3456e+03 1.9795e+03 + 4.8610e+02 8.0930e+02 1.0326e+03 6.3650e+02 2.9690e+02 9.7600e+01 3.4960e+02 + 9.2440e+02 4.2358e+03 2.7366e+03 1.3672e+03 1.1100e+03 7.3210e+02 1.0697e+03 + 3.0440e+03 2.6312e+03 2.4272e+03 1.1018e+03 1.4069e+03 5.6870e+02 4.8810e+02 + 5.5150e+02 8.7100e+02 5.7830e+02 6.7090e+02 2.0350e+03 3.2544e+03 3.5005e+03 + 4.6837e+03 2.5018e+03 3.5970e+02 5.1480e+02 3.5270e+02 1.8400e+02 2.0240e+02 + 3.2290e+02 4.1330e+02 2.8350e+02 6.0240e+02 7.3720e+02 1.0518e+03 6.6340e+02 + 4.6820e+02 9.9090e+02 7.1880e+02 1.0374e+03 6.4990e+02 8.2270e+02 7.1560e+02 + 6.4730e+02 3.4718e+03 2.6458e+03 9.2890e+02 4.9200e+02 3.8430e+02 2.7880e+02 + 1.0772e+03 2.0088e+03 3.6338e+03 8.2740e+02 7.2850e+02 6.0200e+02 7.9940e+02 + 6.1280e+02 4.7450e+02 2.7100e+02 4.4030e+02 5.9660e+02 2.6778e+03 3.2754e+03 + 2.0459e+03 7.0760e+02 5.7320e+02 4.1810e+02 1.7424e+03 3.8068e+03 3.3232e+03 + 1.4452e+03 1.1152e+03 7.6470e+02 3.6430e+02 4.9800e+02 7.3530e+02 5.9010e+02 + 7.5290e+02 1.0282e+03 1.9616e+03 2*5.6000e+03 2.9184e+03 1.0450e+03 + 3.0820e+02 4.7910e+02 2.7730e+02 1.1380e+02 5.2980e+02 2.7460e+02 2.0450e+02 + 1.1500e+02 7.6340e+02 1.4395e+03 4.8920e+02 6.5420e+02 9.8240e+02 5.7670e+02 + 7.5930e+02 6.9520e+02 3.4550e+02 1.0206e+03 1.1207e+03 3.6007e+03 1.4712e+03 + 9.7880e+02 3.0940e+02 4.0480e+02 3.7980e+02 1.3010e+03 4.2684e+03 3.1807e+03 + 1.3962e+03 2.6490e+02 2.8170e+02 3.0760e+02 3.1990e+02 4.8810e+02 2.7840e+02 + 4.0950e+02 3.2390e+02 1.7761e+03 4.4075e+03 1.4138e+03 1.1201e+03 5.7980e+02 + 2.9330e+02 1.8915e+03 2.0517e+03 2.5639e+03 2.2308e+03 1.3800e+03 5.5690e+02 + 5.2610e+02 9.0270e+02 8.4360e+02 5.3650e+02 2.7540e+02 5.4650e+02 2.2966e+03 + 5.2424e+03 3.6745e+03 4.8856e+03 1.9848e+03 9.9480e+02 8.9620e+02 4.3530e+02 + 1.6750e+02 5.8920e+02 4.8330e+02 3.2330e+02 4.9040e+02 9.4150e+02 4.0260e+02 + 6.2720e+02 4.3310e+02 6.1040e+02 7.4540e+02 4.3600e+02 7.8110e+02 1.8929e+03 + 1.6281e+03 2.6639e+03 2.9142e+03 2.2117e+03 4.5000e+02 4.3530e+02 4.1660e+02 + 5.9370e+02 2.0602e+03 4.0160e+03 2.2141e+03 6.6000e+02 4.6220e+02 3.8160e+02 + 6.1910e+02 3.7460e+02 5.5380e+02 1.6320e+02 3.9090e+02 3.3520e+02 2.0978e+03 + 3.2161e+03 2.2433e+03 6.4730e+02 4.9530e+02 5.6090e+02 6.6570e+02 1.6568e+03 + 2.3047e+03 2.5557e+03 1.5189e+03 2.9080e+02 6.3430e+02 1.1950e+03 6.7390e+02 + 5.0200e+02 2.8280e+02 7.6120e+02 1.2623e+03 3.3769e+03 3.5684e+03 3.0743e+03 + 3.9568e+03 7.8430e+02 8.7200e+02 6.0840e+02 3.0380e+02 4.4060e+02 4.7090e+02 + 5.7080e+02 5.2470e+02 5.8760e+02 4.9680e+02 4.1260e+02 4.9880e+02 2.6230e+02 + 3.4170e+02 5.5300e+02 7.3880e+02 2.1724e+03 2.1870e+03 2.3198e+03 2.8978e+03 + 1.6160e+03 3.1710e+02 5.8020e+02 4.1260e+02 3.3320e+02 2.1498e+03 2.6201e+03 + 2.7544e+03 6.7860e+02 4.0670e+02 3.7620e+02 7.8310e+02 3.0690e+02 2.6130e+02 + 4.7770e+02 5.0100e+02 4.4160e+02 1.4215e+03 3.3570e+03 2.9681e+03 1.1352e+03 + 5.4580e+02 4.7330e+02 8.8500e+02 1.0037e+03 1.5936e+03 2.0562e+03 3.3193e+03 + 1.7811e+03 9.8170e+02 6.0430e+02 5.1220e+02 2.8380e+02 2.7330e+02 5.4060e+02 + 1.9519e+03 2.5433e+03 4.3672e+03 1.9398e+03 4.4180e+03 2.1817e+03 7.3420e+02 + 3.7250e+02 4.7540e+02 4.3690e+02 4.2850e+02 7.8790e+02 8.2410e+02 2.9360e+02 + 3.4330e+02 3.2260e+02 1.4639e+03 3.5080e+02 2.6730e+02 6.8080e+02 9.6100e+02 + 1.8916e+03 1.5852e+03 3.5053e+03 3.6318e+03 6.0250e+02 3.7140e+02 3.7270e+02 + 8.8740e+02 7.3370e+02 2.5718e+03 4.0531e+03 2.7702e+03 7.9650e+02 3.0980e+02 + 5.4030e+02 9.1340e+02 1.9060e+02 2.2480e+02 6.0150e+02 3.5710e+02 3.9740e+02 + 1.1060e+03 2.7842e+03 2.7425e+03 2.1306e+03 1.5530e+02 6.0960e+02 1.0736e+03 + 6.4010e+02 1.6700e+03 2.0205e+03 2.6169e+03 2.5246e+03 1.3917e+03 2.9460e+02 + 6.4670e+02 4.1210e+02 4.3110e+02 3.2110e+02 2.3080e+03 2.9260e+03 3.2206e+03 + 3.9348e+03 4.2729e+03 2.9240e+03 8.6860e+02 4.1350e+02 4.3940e+02 5.0000e+02 + 8.0070e+02 7.0510e+02 3.2250e+02 1.3870e+02 3.7350e+02 5.8390e+02 6.2270e+02 + 2.1370e+02 3.1790e+02 1.0934e+03 2.1464e+03 3.3997e+03 3.1880e+03 2.9100e+03 + 2.0805e+03 5.3310e+02 2.9230e+02 6.8370e+02 5.3400e+02 3.9010e+02 2.0018e+03 + 2.2654e+03 1.9611e+03 5.3460e+02 5.6060e+02 4.3420e+02 8.5050e+02 3.4220e+02 + 2.2370e+02 2.5380e+02 5.6620e+02 7.9990e+02 9.4570e+02 2.2089e+03 3.0099e+03 + 1.9622e+03 7.1160e+02 4.9860e+02 8.2890e+02 7.1520e+02 9.2890e+02 2.1292e+03 + 3.1057e+03 2.8608e+03 2.1496e+03 7.8650e+02 5.1870e+02 7.0100e+02 2.1280e+02 + 2.4710e+02 1.4580e+03 2.1961e+03 2.2596e+03 3.2136e+03 2.9219e+03 2.6747e+03 + 4.8760e+02 3.4090e+02 3.2100e+02 5.2870e+02 7.8500e+02 8.2750e+02 3.7050e+02 + 3.8580e+02 5.5260e+02 2.0780e+02 6.5970e+02 2.8470e+02 3.8340e+02 7.4240e+02 + 2.0050e+03 2.7087e+03 4.2402e+03 3.0391e+03 1.5468e+03 2.6080e+02 3.5510e+02 + 4.6110e+02 8.1200e+02 5.4100e+02 1.1748e+03 3.9450e+03 2.0226e+03 8.8220e+02 + 7.7300e+02 4.8120e+02 7.4530e+02 3.6640e+02 3.7920e+02 4.5430e+02 3.1010e+02 + 2.6700e+02 7.4550e+02 3.0254e+03 3.6537e+03 1.7142e+03 7.0130e+02 3.5680e+02 + 4.5520e+02 3.1430e+02 3.5000e+02 1.0821e+03 2.2404e+03 2.6277e+03 2.0262e+03 + 2.1246e+03 6.4220e+02 3.1920e+02 4.3770e+02 3.9420e+02 2.6953e+03 3.0098e+03 + 2.4505e+03 2.2619e+03 2.4373e+03 2.3647e+03 5.7160e+02 3.3930e+02 2.9800e+02 + 5.5250e+02 5.5210e+02 5.0070e+02 5.0840e+02 5.2110e+02 5.5380e+02 4.6540e+02 + 1.9930e+02 2.1390e+02 7.6050e+02 6.3460e+02 2.0023e+03 3.9137e+03 3.4278e+03 + 3.9016e+03 4.9120e+02 1.8910e+02 6.2050e+02 5.1140e+02 5.5600e+02 2.9700e+02 + 9.6820e+02 3.9242e+03 2.4153e+03 1.1233e+03 7.2970e+02 7.2420e+02 7.3480e+02 + 1.7140e+02 4.6930e+02 5.3710e+02 3.0520e+02 2.0520e+02 5.1330e+02 1.9976e+03 + 3.3504e+03 9.4820e+02 1.3377e+03 8.0680e+02 4.3060e+02 5.2830e+02 3.6920e+02 + 5.1720e+02 9.1340e+02 2.2945e+03 2.9164e+03 2.0133e+03 1.1137e+03 3.5340e+02 + 2.7290e+02 8.5980e+02 2.4274e+03 3.0183e+03 1.8963e+03 2.4123e+03 2.3423e+03 + 1.7259e+03 9.3290e+02 2.7550e+02 3.7230e+02 8.4260e+02 2.2890e+02 2.4260e+02 + 4.5200e+02 2.7880e+02 7.5590e+02 5.5100e+02 2.7780e+02 2.7150e+02 5.0000e+02 + 7.9490e+02 1.9987e+03 3.6350e+03 3.3699e+03 3.0240e+03 9.8880e+02 3.6590e+02 + 5.0320e+02 9.5460e+02 8.0770e+02 3.8650e+02 8.9890e+02 3.0004e+03 2.3709e+03 + 7.9050e+02 4.6130e+02 5.7310e+02 5.3660e+02 6.1670e+02 4.2300e+02 2.7190e+02 + 1.8260e+02 2.1730e+02 4.4990e+02 2.5046e+03 2.9577e+03 1.5101e+03 3.4080e+02 + 6.9080e+02 6.1870e+02 7.0020e+02 4.7840e+02 5.8140e+02 8.7050e+02 1.0125e+03 + 2.8999e+03 2.8205e+03 2.3965e+03 9.1260e+02 5.8040e+02 1.3528e+03 2.9411e+03 + 2.5467e+03 1.6258e+03 2.2797e+03 3.1727e+03 2.1061e+03 6.9500e+02 2.6600e+02 + 2.5730e+02 5.8820e+02 4.0640e+02 2.1650e+02 2.2330e+02 4.3900e+02 6.0000e+02 + 1.1569e+03 4.5020e+02 4.8480e+02 1.9860e+02 7.6260e+02 2.2235e+03 3.9365e+03 + 1.8063e+03 3.6344e+03 9.8510e+02 4.9620e+02 4.3250e+02 9.6210e+02 6.5830e+02 + 3.5180e+02 6.9510e+02 2.4339e+03 2.1437e+03 5.4860e+02 5.7520e+02 3.4260e+02 + 6.1610e+02 6.4960e+02 2.6330e+02 6.6030e+02 5.6080e+02 3.6710e+02 5.5410e+02 + 1.8421e+03 4.5752e+03 1.8384e+03 4.7620e+02 3.7920e+02 7.3120e+02 9.6950e+02 + 7.0900e+02 5.0170e+02 4.5120e+02 1.1082e+03 2.2107e+03 4.5535e+03 2.4637e+03 + 5.0340e+02 7.2590e+02 4.6760e+02 4.3083e+03 2.0816e+03 1.2269e+03 2.1093e+03 + 3.0157e+03 1.8722e+03 5.3180e+02 2.9880e+02 2.9490e+02 3.5810e+02 3.4440e+02 + 3.5590e+02 1.8990e+02 6.2900e+02 4.0860e+02 5.4450e+02 2.7910e+02 4.2450e+02 + 4.3350e+02 1.2217e+03 1.9305e+03 2.9480e+03 2.4512e+03 3.2940e+03 1.6337e+03 + 5.1770e+02 4.0940e+02 9.6950e+02 4.0060e+02 2.3450e+02 5.9500e+02 2.0306e+03 + 3.0737e+03 6.8320e+02 4.7720e+02 5.4510e+02 6.2390e+02 7.2380e+02 4.1200e+02 + 5.9050e+02 3.8850e+02 6.0900e+02 3.2560e+02 2.2349e+03 4.2610e+03 2.3745e+03 + 7.9310e+02 2.7560e+02 3.3880e+02 7.0020e+02 5.3550e+02 3.0560e+02 2.7930e+02 + 6.1770e+02 1.2120e+03 4.3739e+03 3.0405e+03 1.4224e+03 9.6560e+02 2.3507e+03 + 3.2409e+03 1.6193e+03 1.2099e+03 3.7898e+03 2.8599e+03 7.1410e+02 7.0400e+02 + 4.7600e+02 2.9870e+02 4.5150e+02 6.9500e+02 6.5410e+02 4.7020e+02 3.1370e+02 + 8.5910e+02 5.1290e+02 3.2580e+02 7.1550e+02 4.4730e+02 4.9070e+02 3.1140e+03 + 2.5582e+03 2.1288e+03 4.5528e+03 8.6130e+02 1.1783e+03 2.8300e+02 6.0550e+02 + 2.9520e+02 3.2220e+02 5.4240e+02 1.9038e+03 3.2550e+03 1.5476e+03 5.2710e+02 + 4.9610e+02 8.6140e+02 4.0670e+02 2.8750e+02 5.1330e+02 3.2420e+02 9.2560e+02 + 7.2010e+02 1.4741e+03 2.9669e+03 2.1492e+03 4.1330e+02 2.3700e+02 5.8020e+02 + 8.0490e+02 7.2090e+02 5.7910e+02 3.8590e+02 2.5880e+02 6.6870e+02 2.4549e+03 + 2.3195e+03 3.0685e+03 1.7194e+03 2.5639e+03 2.0440e+03 1.6455e+03 1.8512e+03 + 3.8028e+03 3.3131e+03 1.3441e+03 6.9560e+02 4.3550e+02 2.3950e+02 2.3060e+02 + 5.1360e+02 7.1130e+02 7.3440e+02 4.3080e+02 8.4320e+02 8.6220e+02 3.1410e+02 + 4.8960e+02 8.7700e+02 1.7735e+03 3.3937e+03 2.2853e+03 2.1149e+03 4.7906e+03 + 1.2572e+03 1.0919e+03 1.0079e+03 6.1420e+02 7.2410e+02 4.1400e+02 3.7890e+02 + 2.0222e+03 3.8909e+03 2.5456e+03 4.9010e+02 4.2590e+02 4.0310e+02 4.9430e+02 + 6.0150e+02 7.1240e+02 4.3290e+02 9.2430e+02 1.1333e+03 2.1169e+03 4.4006e+03 + 2.0384e+03 7.2760e+02 1.9420e+02 6.4200e+02 7.8110e+02 5.6370e+02 6.0910e+02 + 3.2630e+02 2.7880e+02 2.2130e+02 1.9978e+03 3.5074e+03 2.7373e+03 2.2566e+03 + 2.7985e+03 1.7658e+03 1.2097e+03 9.3990e+02 1.9386e+03 2.6752e+03 9.2800e+02 + 6.1580e+02 5.8690e+02 3.5420e+02 2.5230e+02 3.3730e+02 4.4650e+02 4.7400e+02 + 4.3430e+02 3.8760e+02 7.6070e+02 3.1830e+02 1.9840e+02 1.0948e+03 1.1232e+03 + 2.9953e+03 2.5709e+03 2.0976e+03 3.3690e+03 2.1567e+03 8.0100e+02 8.5300e+02 + 3.5170e+02 6.7210e+02 1.0109e+03 4.7640e+02 1.0120e+03 4.3470e+03 4.0010e+03 + 8.9580e+02 4.5980e+02 8.6440e+02 4.8570e+02 6.6290e+02 4.0550e+02 8.3090e+02 + 7.4770e+02 7.3670e+02 2.9866e+03 4.3348e+03 1.2702e+03 6.0030e+02 2.3820e+02 + 4.7740e+02 7.1870e+02 5.7330e+02 5.4200e+02 4.7690e+02 4.1020e+02 2.8570e+02 + 9.0660e+02 2.1639e+03 4.8413e+03 2.7083e+03 2.3434e+03 2.1750e+03 6.0030e+02 + 1.2600e+03 3.5344e+03 3.3820e+03 3.5190e+02 6.1560e+02 4.6500e+02 2.3200e+02 + 3.0040e+02 4.7000e+02 4.7860e+02 5.9780e+02 5.5290e+02 9.5190e+02 2.3840e+02 + 4.3390e+02 3.9430e+02 5.4450e+02 2.1177e+03 2.6482e+03 2.7180e+03 2.2171e+03 + 4.0645e+03 8.9230e+02 6.8710e+02 4.2230e+02 3.7070e+02 8.9160e+02 1.1356e+03 + 7.8970e+02 5.5020e+02 2.1664e+03 3.2791e+03 1.8494e+03 5.7430e+02 4.6170e+02 + 3.9440e+02 3.1660e+02 6.8830e+02 8.2110e+02 7.0080e+02 1.8178e+03 3.5527e+03 + 3.1316e+03 1.5609e+03 4.9680e+02 4.4260e+02 8.1080e+02 6.8560e+02 5.2660e+02 + 2.4610e+02 5.5980e+02 3.5180e+02 3.8760e+02 1.6760e+03 3.0646e+03 5.3468e+03 + 3.2703e+03 2.8402e+03 1.6600e+03 5.8220e+02 1.2411e+03 4.1307e+03 2.1429e+03 + 3.5140e+02 4.8570e+02 3.6880e+02 4.4960e+02 3.9540e+02 3.9720e+02 3.0070e+02 + 2.2640e+02 4.9050e+02 8.5360e+02 9.2360e+02 3.7870e+02 3.6170e+02 6.5880e+02 + 7.1720e+02 3.9313e+03 2.3889e+03 3.3943e+03 4.6437e+03 2.1088e+03 6.1360e+02 + 3.3520e+02 4.2880e+02 6.1750e+02 6.1840e+02 9.7370e+02 9.0190e+02 1.9300e+03 + 3.5191e+03 4.0411e+03 6.4070e+02 5.6410e+02 6.4260e+02 5.3200e+02 3.1110e+02 + 4.2790e+02 7.1980e+02 2.3419e+03 2.3809e+03 2.8964e+03 8.0210e+02 6.0770e+02 + 3.5950e+02 3.8440e+02 3.7540e+02 3.6460e+02 5.3240e+02 4.4030e+02 3.0930e+02 + 6.8160e+02 5.7540e+02 3.5651e+03 4.2808e+03 5.6000e+03 1.8661e+03 6.8140e+02 + 4.0790e+02 1.0194e+03 3.8896e+03 2.0462e+03 8.3560e+02 6.2810e+02 3.1730e+02 + 2.0070e+02 9.1700e+02 5.8580e+02 4.5280e+02 2.0700e+02 2.7320e+02 1.0153e+03 + 6.6170e+02 5.6060e+02 4.1850e+02 5.4050e+02 6.7710e+02 2.6829e+03 3.6897e+03 + 1.8098e+03 5.3968e+03 2.3727e+03 4.1400e+02 2.6550e+02 3.4820e+02 4.9220e+02 + 5.4440e+02 6.1290e+02 4.2540e+02 1.7336e+03 1.9968e+03 4.1724e+03 1.8571e+03 + 3.9940e+02 6.3540e+02 1.4670e+02 6.4520e+02 2.2580e+02 4.8020e+02 1.8264e+03 + 4.7806e+03 3.0576e+03 1.3069e+03 5.0200e+02 4.3940e+02 8.0950e+02 5.6030e+02 + 5.4110e+02 5.0210e+02 6.8220e+02 4.9490e+02 4.1480e+02 1.0378e+03 2.2815e+03 + 5.6000e+03 3.8338e+03 8.8540e+02 4.8100e+02 4.6750e+02 1.5915e+03 3.2696e+03 + 2.7918e+03 1.0179e+03 6.5370e+02 2.8510e+02 2.7480e+02 6.1030e+02 5.0010e+02 + 6.9940e+02 2.0080e+02 1.7050e+02 4.8930e+02 1.1217e+03 3.9110e+02 5.0550e+02 + 5.6800e+02 5.8190e+02 2.2685e+03 2.3524e+03 2.8905e+03 4.4327e+03 2.2664e+03 + 2.8580e+02 3.5980e+02 8.9890e+02 7.9840e+02 5.7970e+02 4.7060e+02 5.2340e+02 + 8.3610e+02 1.4077e+03 3.1616e+03 3.2104e+03 1.2653e+03 7.4590e+02 2.3160e+02 + 1.5880e+02 2.9700e+02 4.9610e+02 3.4891e+03 3.2498e+03 2.3375e+03 8.4200e+02 + 5.4650e+02 4.0290e+02 6.2460e+02 5.1410e+02 5.8250e+02 5.4850e+02 2.8810e+02 + 6.6950e+02 6.6590e+02 8.8240e+02 3.5876e+03 5.3116e+03 5.3204e+03 5.5200e+02 + 5.6510e+02 5.4510e+02 1.9892e+03 3.0924e+03 5.2328e+03 2.3346e+03 6.2380e+02 + 3.7640e+02 1.2080e+02 5.9040e+02 6.4680e+02 5.4690e+02 3.9260e+02 4.6550e+02 + 5.3640e+02 6.8460e+02 3.8340e+02 6.5390e+02 4.8910e+02 2.8270e+02 1.4432e+03 + 2.2371e+03 2.1084e+03 4.7397e+03 1.9892e+03 3.3280e+02 6.8810e+02 1.0143e+03 + 9.2670e+02 3.0180e+02 1.4380e+02 5.6830e+02 6.6390e+02 1.1792e+03 2.1364e+03 + 3.0078e+03 1.1699e+03 6.5070e+02 3.7540e+02 2.0740e+02 6.0260e+02 7.2620e+02 + 4.1046e+03 3.2329e+03 1.7585e+03 1.1681e+03 7.3620e+02 5.8530e+02 2.8020e+02 + 5.4860e+02 5.3640e+02 5.7100e+02 4.6050e+02 7.0400e+02 3.7730e+02 6.1280e+02 + 3.5516e+03 4.6237e+03 4.8609e+03 4.6240e+02 2.3560e+02 2.7890e+02 6.8180e+02 + 2.4129e+03 4.1208e+03 1.4627e+03 7.7580e+02 6.8810e+02 3.3890e+02 9.9080e+02 + 6.6650e+02 7.2910e+02 4.6010e+02 7.5390e+02 5.7500e+02 3.6620e+02 5.2660e+02 + 6.5050e+02 3.2950e+02 9.7100e+01 1.2832e+03 3.1156e+03 2.0710e+03 3.2117e+03 + 2.9662e+03 6.2230e+02 7.2640e+02 9.7800e+02 9.3230e+02 3.6480e+02 1.9830e+02 + 5.3590e+02 3.1250e+02 1.1483e+03 2.1381e+03 3.2904e+03 2.1637e+03 6.2000e+02 + 3.1680e+02 3.4140e+02 5.2610e+02 1.0434e+03 4.3850e+03 2.1605e+03 1.1862e+03 + 9.4120e+02 8.0570e+02 5.1970e+02 3.5000e+02 5.4350e+02 4.2660e+02 5.7230e+02 + 4.4440e+02 3.7930e+02 7.0710e+02 1.7086e+03 4.2107e+03 5.1428e+03 2.1089e+03 + 1.3115e+03 2.4920e+02 2.0810e+02 1.0293e+03 2.3165e+03 4.0800e+03 2.1516e+03 + 5.8520e+02 9.5250e+02 4.2110e+02 9.8690e+02 8.2260e+02 7.2080e+02 7.1130e+02 + 6.0480e+02 5.4540e+02 4.4070e+02 6.0670e+02 6.5700e+02 3.8330e+02 1.3530e+02 + 7.0180e+02 3.0839e+03 1.2709e+03 3.1197e+03 3.5315e+03 5.7920e+02 6.6920e+02 + 7.7390e+02 5.8730e+02 2.5830e+02 6.0720e+02 3.5900e+02 5.1610e+02 6.3280e+02 + 2.3465e+03 2.1056e+03 3.4585e+03 1.3345e+03 9.6430e+02 6.7590e+02 7.9410e+02 + 2.6500e+03 2.7805e+03 1.8034e+03 3.6040e+02 6.5310e+02 7.0570e+02 6.4870e+02 + 5.7650e+02 2.4020e+02 4.8390e+02 6.7090e+02 3.8930e+02 3.5360e+02 5.2010e+02 + 2.8817e+03 5.0135e+03 4.3217e+03 2.4378e+03 1.4872e+03 3.6080e+02 1.0640e+02 + 4.8290e+02 2.1119e+03 2.5322e+03 1.8413e+03 1.5840e+03 1.0387e+03 4.7160e+02 + 1.0057e+03 6.0790e+02 3.0870e+02 6.1330e+02 6.9520e+02 4.3350e+02 4.9570e+02 + 5.4360e+02 5.5070e+02 4.6770e+02 7.1520e+02 7.2190e+02 3.1883e+03 4.9920e+02 + 3.9062e+03 3.4958e+03 9.9080e+02 5.5360e+02 6.2050e+02 5.8950e+02 3.4120e+02 + 7.4070e+02 3.0280e+02 3.5490e+02 6.9650e+02 1.2286e+03 2.3416e+03 2.8336e+03 + 2.2984e+03 8.7310e+02 8.8060e+02 1.7499e+03 2.4052e+03 2.4466e+03 7.6210e+02 + 6.2720e+02 7.1250e+02 6.0890e+02 5.1870e+02 3.9870e+02 5.8620e+02 4.8890e+02 + 5.4010e+02 2.7080e+02 6.8650e+02 1.2980e+03 2.1927e+03 5.6000e+03 4.7834e+03 + 2.0314e+03 6.2460e+02 4.5770e+02 2.5980e+02 4.7600e+02 1.4514e+03 3.1581e+03 + 2.5692e+03 3.0779e+03 1.9908e+03 6.5840e+02 6.7120e+02 9.3930e+02 4.1360e+02 + 5.6980e+02 5.1080e+02 6.6690e+02 6.7370e+02 5.6020e+02 4.5710e+02 8.7500e+02 + 8.3250e+02 9.8110e+02 3.4272e+03 6.3040e+02 3.0384e+03 5.6000e+03 2.2001e+03 + 5.6400e+02 3.7280e+02 5.2530e+02 4.1330e+02 4.4060e+02 2.2710e+02 2.2440e+02 + 5.8730e+02 1.0182e+03 1.4055e+03 4.4701e+03 2.2371e+03 1.9326e+03 1.8881e+03 + 2.7790e+03 3.0113e+03 1.5971e+03 1.1014e+03 5.8030e+02 7.9170e+02 5.7470e+02 + 4.6470e+02 3.6260e+02 4.6380e+02 4.3820e+02 3.4410e+02 3.5010e+02 5.2010e+02 + 8.9060e+02 2.8344e+03 3.6162e+03 4.5719e+03 2.6459e+03 4.1710e+02 3.8860e+02 + 6.2330e+02 2.7070e+02 6.8850e+02 2.1032e+03 2.1822e+03 2.6273e+03 2.2955e+03 + 1.8613e+03 1.0506e+03 5.6300e+02 1.3978e+03 8.1710e+02 6.8080e+02 1.1815e+03 + 4.4860e+02 5.0390e+02 4.2880e+02 8.2290e+02 9.6550e+02 8.6410e+02 2.5538e+03 + 4.2090e+02 1.9087e+03 5.6000e+03 2.8229e+03 4.6670e+02 4.6960e+02 5.4660e+02 + 1.9620e+02 3.3940e+02 4.5340e+02 3.8690e+02 2.8290e+02 6.0490e+02 7.3680e+02 + 2.0598e+03 2.9552e+03 2.4112e+03 4.4317e+03 2.6324e+03 3.6528e+03 1.0710e+03 + 4.4790e+02 2.6210e+02 5.9200e+02 4.1960e+02 2.8190e+02 3.7130e+02 4.3350e+02 + 5.7620e+02 1.6070e+02 3.6400e+02 6.5930e+02 2.1930e+03 3.8240e+03 3.8471e+03 + 4.9337e+03 7.9130e+02 4.1640e+02 5.2060e+02 6.2790e+02 3.1290e+02 7.4940e+02 + 1.4213e+03 1.8752e+03 2.3201e+03 2.2751e+03 3.3651e+03 3.2472e+03 1.3866e+03 + 9.9350e+02 9.6100e+02 8.5290e+02 7.1260e+02 8.8220e+02 3.0810e+02 1.8640e+02 + 6.0680e+02 6.4590e+02 1.1703e+03 3.8101e+03 3.8230e+02 1.0091e+03 4.0340e+03 + 3.6758e+03 9.4080e+02 4.2380e+02 5.5380e+02 2.8350e+02 3.1930e+02 1.1320e+03 + 7.3540e+02 5.2540e+02 4.1450e+02 4.5940e+02 1.8372e+03 2.2465e+03 4.9989e+03 + 3.6111e+03 2.5645e+03 2.2630e+03 6.5340e+02 3.2900e+02 3.7850e+02 6.0620e+02 + 6.2860e+02 2.8200e+02 4.5560e+02 8.6690e+02 4.0730e+02 2.3290e+02 5.7720e+02 + 5.2470e+02 2.0094e+03 4.9837e+03 5.6000e+03 3.2625e+03 7.0550e+02 2.4900e+02 + 1.0557e+03 4.2340e+02 3.1540e+02 5.2170e+02 7.5990e+02 4.8520e+02 1.8092e+03 + 1.8989e+03 2.8187e+03 2.6213e+03 1.7301e+03 1.9247e+03 2.1705e+03 1.4336e+03 + 1.8601e+03 1.0790e+03 4.7320e+02 4.1740e+02 5.5610e+02 3.9220e+02 1.9466e+03 + 3.5522e+03 3.7220e+02 5.2140e+02 2.3103e+03 3.2835e+03 1.7252e+03 1.3690e+03 + 7.3110e+02 2.1300e+02 3.0710e+02 7.0480e+02 8.7250e+02 5.8080e+02 4.3760e+02 + 8.9060e+02 1.0669e+03 3.7818e+03 5.6000e+03 3.3658e+03 2.2971e+03 8.0330e+02 + 1.1660e+03 3.1460e+02 4.9260e+02 7.4530e+02 4.5920e+02 5.9130e+02 4.8010e+02 + 7.8670e+02 3.2300e+02 4.2090e+02 7.0210e+02 5.2570e+02 2.0943e+03 3.2633e+03 + 4.7954e+03 2.6929e+03 7.6810e+02 4.8480e+02 7.6880e+02 3.3930e+02 1.8290e+02 + 2.6120e+02 3.9460e+02 4.0100e+02 7.4980e+02 7.5710e+02 2.0991e+03 2.4428e+03 + 1.7716e+03 1.2689e+03 1.9015e+03 2.1452e+03 2.0412e+03 1.1391e+03 1.0027e+03 + 7.5660e+02 4.5790e+02 7.2430e+02 2.9976e+03 3.1499e+03 2.3740e+02 8.9130e+02 + 1.2861e+03 2.3314e+03 3.6461e+03 1.7943e+03 1.1640e+03 3.2790e+02 3.2770e+02 + 9.1380e+02 4.3360e+02 7.1630e+02 1.0048e+03 6.7360e+02 1.8575e+03 3.4169e+03 + 5.6000e+03 1.9045e+03 1.0978e+03 8.1640e+02 8.9560e+02 3.1910e+02 3.3990e+02 + 5.8310e+02 9.1010e+02 5.5620e+02 4.0990e+02 5.8410e+02 4.5220e+02 5.3300e+02 + 1.3481e+03 1.6028e+03 3.8261e+03 4.1312e+03 5.3268e+03 2.5201e+03 5.3920e+02 + 9.3080e+02 1.5468e+03 5.6060e+02 1.3560e+02 2.0270e+02 4.9850e+02 3.9600e+02 + 2.6390e+02 2.7960e+02 1.0589e+03 8.9750e+02 5.1790e+02 1.4384e+03 1.9545e+03 + 2.4777e+03 1.7013e+03 9.9350e+02 2.5317e+03 1.2399e+03 5.5430e+02 1.0356e+03 + 3.4068e+03 3.1340e+03 2.0770e+02 6.3860e+02 1.3880e+03 2.3997e+03 2.5102e+03 + 2.7294e+03 1.4871e+03 2.6520e+02 8.2480e+02 6.0530e+02 4.4390e+02 5.1980e+02 + 9.3760e+02 2.2287e+03 2.2204e+03 4.2267e+03 5.6000e+03 1.9775e+03 4.6080e+02 + 5.6320e+02 7.1810e+02 6.5970e+02 4.0300e+02 7.1600e+02 5.7940e+02 4.8710e+02 + 5.2110e+02 1.7610e+02 4.1530e+02 5.5700e+02 1.3320e+03 1.8725e+03 3.7769e+03 + 2.8746e+03 3.2622e+03 2.1686e+03 5.8680e+02 6.4700e+02 1.0017e+03 4.2740e+02 + 4.0680e+02 3.8950e+02 3.0500e+02 5.0520e+02 3.7920e+02 1.8380e+02 5.7860e+02 + 7.7670e+02 1.3037e+03 8.2500e+02 1.3203e+03 1.4159e+03 2.3488e+03 2.1768e+03 + 1.8975e+03 2.4682e+03 2.3738e+03 1.8536e+03 2.0957e+03 2.2567e+03 6.0810e+02 + 5.8680e+02 8.7520e+02 1.1949e+03 3.3202e+03 2.3787e+03 1.9969e+03 3.4250e+02 + 6.0160e+02 5.0320e+02 1.1780e+02 5.5250e+02 1.5081e+03 2.8315e+03 2.6486e+03 + 2.6830e+03 3.3775e+03 2.3946e+03 4.9320e+02 5.6280e+02 3.7740e+02 2.6270e+02 + 8.8090e+02 6.4850e+02 5.0950e+02 3.3900e+02 5.6480e+02 3.6280e+02 1.7220e+02 + 4.8300e+02 2.4280e+03 2.4070e+03 3.5605e+03 2.2468e+03 3.0441e+03 1.1832e+03 + 5.8820e+02 6.4970e+02 7.8730e+02 3.6570e+02 2.7830e+02 7.3140e+02 9.0570e+02 + 7.3010e+02 3.3840e+02 3.9080e+02 4.0510e+02 4.2860e+02 1.0497e+03 5.5940e+02 + 4.8690e+02 7.3570e+02 7.5590e+02 1.8140e+03 1.9592e+03 2.2005e+03 4.3082e+03 + 2.2832e+03 3.7889e+03 1.9781e+03 6.2240e+02 9.4270e+02 5.7160e+02 1.0459e+03 + 2.4646e+03 4.9578e+03 1.9257e+03 3.7630e+02 5.1720e+02 6.1220e+02 2.1230e+02 + 4.0120e+02 1.8968e+03 3.7557e+03 4.0359e+03 2.1054e+03 2.9749e+03 1.3127e+03 + 8.7850e+02 9.4490e+02 1.6650e+02 4.7330e+02 5.8610e+02 3.4610e+02 5.6660e+02 + 2.2880e+02 5.5590e+02 4.4440e+02 4.1250e+02 7.0230e+02 2.1678e+03 2.0968e+03 + 3.1055e+03 3.6196e+03 3.9199e+03 6.8810e+02 5.3420e+02 5.8000e+02 3.3390e+02 + 1.7840e+02 4.2020e+02 7.1890e+02 7.8290e+02 7.6490e+02 3.6590e+02 2.3280e+02 + 2.7230e+02 3.8960e+02 6.2070e+02 5.5260e+02 4.1540e+02 9.5470e+02 5.0120e+02 + 1.4312e+03 9.8340e+02 3.1841e+03 4.5695e+03 4.6139e+03 2.6273e+03 1.6483e+03 + 4.3700e+02 6.0790e+02 6.6380e+02 4.2490e+02 1.6640e+03 3.1341e+03 2.5309e+03 + 7.3840e+02 4.2380e+02 5.9660e+02 6.1020e+02 6.1330e+02 2.0326e+03 3.1804e+03 + 2.1447e+03 1.5673e+03 4.2439e+03 2.2177e+03 9.7860e+02 8.1450e+02 4.4960e+02 + 4.4160e+02 5.4310e+02 9.0570e+02 6.2440e+02 4.7170e+02 3.4830e+02 6.5600e+02 + 2.2330e+02 8.4050e+02 2.1157e+03 4.3231e+03 1.8371e+03 3.1203e+03 4.3252e+03 + 9.3420e+02 6.6100e+02 4.5280e+02 4.4210e+02 4.2910e+02 3.9120e+02 4.8890e+02 + 5.5640e+02 2.1560e+02 2.5220e+02 4.5200e+02 3.0310e+02 8.8700e+02 8.0730e+02 + 2.6590e+02 5.1590e+02 9.7250e+02 7.1920e+02 4.2460e+02 7.0400e+02 1.6642e+03 + 2*5.6000e+03 3.2354e+03 1.0149e+03 9.2970e+02 6.1180e+02 6.6030e+02 + 4.6570e+02 1.2719e+03 3.8191e+03 3.2526e+03 7.9070e+02 3.3990e+02 8.5390e+02 + 1.0091e+03 2.2057e+03 2.5508e+03 2.5029e+03 2.6054e+03 1.8030e+03 2.8463e+03 + 2.6833e+03 1.0007e+03 8.7290e+02 9.0420e+02 4.9330e+02 6.2590e+02 5.2480e+02 + 3.8060e+02 3.0490e+02 2.7070e+02 8.3580e+02 4.5740e+02 4.1010e+02 3.7336e+03 + 3.5290e+03 2.0425e+03 2.2307e+03 3.6770e+03 6.7090e+02 3.9170e+02 6.1390e+02 + 7.1280e+02 4.8940e+02 7.2810e+02 5.9660e+02 2.5890e+02 3.3140e+02 3.7090e+02 + 4.7480e+02 5.8860e+02 1.1012e+03 5.1180e+02 1.8350e+02 6.8990e+02 4.2000e+02 + 8.2350e+02 1.2426e+03 1.2036e+03 2.2056e+03 5.0895e+03 5.1238e+03 3.8651e+03 + 1.3074e+03 3.7820e+02 7.6640e+02 5.6500e+02 6.6040e+02 8.2560e+02 4.3739e+03 + 3.7263e+03 5.4630e+02 4.1410e+02 1.1310e+03 1.3428e+03 2.0684e+03 3.1689e+03 + 2.3571e+03 1.9919e+03 1.9534e+03 2.3900e+03 2.0472e+03 9.3470e+02 5.0380e+02 + 4.3090e+02 4.0230e+02 4.2070e+02 4.9090e+02 4.6930e+02 3.2150e+02 2.8540e+02 + 7.5430e+02 7.9280e+02 1.4414e+03 2.4770e+03 3.2117e+03 1.1759e+03 2.3525e+03 + 3.4963e+03 1.9935e+03 3.3920e+02 5.5470e+02 4.7690e+02 7.0360e+02 5.6140e+02 + 5.2460e+02 2.3760e+02 5.3690e+02 8.1430e+02 1.0999e+03 5.7600e+02 6.1650e+02 + 3.6120e+02 2.8440e+02 6.5710e+02 3.5400e+02 6.4690e+02 1.8235e+03 1.0869e+03 + 3.6595e+03 3.8341e+03 4.4609e+03 5.2292e+03 1.7934e+03 3.4940e+02 5.3980e+02 + 9.1480e+02 7.8430e+02 1.0844e+03 4.4200e+03 2.7394e+03 1.2791e+03 4.8540e+02 + 2.2114e+03 2.2670e+03 2.3705e+03 1.3635e+03 6.7750e+02 7.1870e+02 2.2409e+03 + 2.0753e+03 2.0827e+03 4.6620e+02 2.7760e+02 4.2720e+02 2.7150e+02 4.1790e+02 + 6.3210e+02 8.6990e+02 6.0890e+02 4.0350e+02 4.3780e+02 6.1520e+02 4.0500e+02 + 3.4556e+03 3.1236e+03 2.2474e+03 2.9072e+03 2.8628e+03 8.0520e+02 3.6650e+02 + 3.6800e+02 4.9560e+02 6.1900e+02 3.0290e+02 3.4840e+02 2.0580e+02 4.1110e+02 + 6.5840e+02 1.2777e+03 3.6510e+02 4.2550e+02 3.8550e+02 7.8520e+02 6.9280e+02 + 9.4870e+02 1.3170e+03 1.1400e+03 1.9249e+03 3.8083e+03 2.0405e+03 2.2249e+03 + 2.4027e+03 2.7291e+03 3.4520e+02 4.2060e+02 6.0370e+02 6.2000e+02 1.1326e+03 + 2.7605e+03 3.9967e+03 9.3180e+02 1.8528e+03 3.7495e+03 3.9143e+03 1.3733e+03 + 6.5750e+02 2.4220e+02 5.7940e+02 1.8585e+03 2.2959e+03 3.0457e+03 5.1170e+02 + 2.5850e+02 4.9690e+02 4.9920e+02 5.2840e+02 7.9640e+02 8.0310e+02 1.0020e+03 + 6.3320e+02 5.5700e+02 3.8380e+02 8.3090e+02 2.3512e+03 3.6596e+03 8.2800e+02 + 2.2747e+03 2.8236e+03 7.0020e+02 4.3320e+02 2.1760e+02 5.1510e+02 1.1620e+03 + 5.6150e+02 3.2790e+02 3.7150e+02 7.1350e+02 1.3660e+03 6.2270e+02 8.0190e+02 + 3.8250e+02 2.9070e+02 6.7720e+02 1.1180e+03 1.4417e+03 8.0280e+02 1.9181e+03 + 2.4892e+03 2.6848e+03 2.5486e+03 8.4380e+02 2.0748e+03 3.1118e+03 7.8210e+02 + 3.3280e+02 6.6460e+02 4.6410e+02 1.1056e+03 2.0720e+03 3.2197e+03 2.3417e+03 + 3.3532e+03 3.1022e+03 2.2504e+03 1.7302e+03 6.4220e+02 1.6030e+02 7.7560e+02 + 1.3781e+03 3.4089e+03 3.3460e+03 2.9490e+02 3.3240e+02 2*5.7170e+02 + 4.7890e+02 4.4000e+02 9.7570e+02 9.0650e+02 6.4280e+02 4.6810e+02 4.1160e+02 + 2.0671e+03 2.1311e+03 3.7021e+03 1.1803e+03 4.3031e+03 2.5448e+03 1.8052e+03 + 7.9340e+02 4.9230e+02 4.4790e+02 7.2590e+02 4.8060e+02 2.8530e+02 3.0000e+02 + 5.2970e+02 7.6870e+02 4.2650e+02 4.8380e+02 4.6270e+02 3.3280e+02 7.1590e+02 + 1.4455e+03 1.9050e+03 2.7124e+03 2.0883e+03 2.7765e+03 1.8336e+03 1.5959e+03 + 9.4410e+02 1.7162e+03 1.2119e+03 4.0130e+02 5.7080e+02 3.9380e+02 3.0580e+02 + 6.4190e+02 2.1024e+03 2.5330e+03 3.0419e+03 2.8685e+03 2.4661e+03 9.5140e+02 + 6.3430e+02 4.3420e+02 2.7880e+02 6.6780e+02 2.5057e+03 3.7071e+03 2.1062e+03 + 4.4380e+02 3.1100e+02 2.9180e+02 4.5660e+02 3.7160e+02 7.5900e+02 9.5000e+02 + 8.4940e+02 8.1280e+02 5.8930e+02 1.7650e+02 7.1000e+02 2.7639e+03 1.9846e+03 + 2.0551e+03 2.9651e+03 3.4447e+03 2.2475e+03 9.6150e+02 7.1670e+02 6.6750e+02 + 4.8940e+02 6.0750e+02 4.4290e+02 3.4150e+02 9.1690e+02 4.2040e+02 2.2790e+02 + 4.2570e+02 5.4320e+02 6.9050e+02 1.3451e+03 1.6588e+03 2.5923e+03 2.4993e+03 + 2.9748e+03 1.4712e+03 7.8240e+02 4.0490e+02 8.1660e+02 6.9280e+02 7.1270e+02 + 7.1700e+02 3.1080e+02 4.0440e+02 4.5310e+02 5.6760e+02 2.6088e+03 2.7992e+03 + 4.2695e+03 4.7079e+03 2.2611e+03 1.1966e+03 4.9240e+02 4.3000e+02 3.5180e+02 + 7.5570e+02 2.0268e+03 3.2101e+03 1.9691e+03 6.9950e+02 3.6380e+02 2.1370e+02 + 5.5890e+02 4.4900e+02 4.5150e+02 1.2131e+03 6.1550e+02 5.6390e+02 2.5730e+02 + 3.3110e+02 1.1177e+03 2.1622e+03 2.3593e+03 1.0019e+03 2.9945e+03 4.1670e+03 + 2.0262e+03 4.7060e+02 8.9450e+02 6.1930e+02 3.3450e+02 4.0960e+02 6.3000e+02 + 6.2240e+02 5.2730e+02 4.9680e+02 2.0140e+02 1.7450e+02 3.5620e+02 5.3610e+02 + 1.5036e+03 1.8813e+03 2.2169e+03 2.5793e+03 1.9593e+03 8.2930e+02 5.4620e+02 + 5.0430e+02 9.4320e+02 1.0579e+03 8.5870e+02 3.2800e+02 4.9470e+02 6.9110e+02 + 5.4010e+02 6.5410e+02 2.0411e+03 5.0976e+03 3.0005e+03 3.2600e+03 1.3016e+03 + 3.2830e+02 6.1920e+02 4.9880e+02 1.1856e+03 8.1610e+02 2.8123e+03 3.4652e+03 + 1.9589e+03 6.5340e+02 4.9630e+02 3.1210e+02 4.5430e+02 3.1110e+02 3.7740e+02 + 7.1050e+02 5.6030e+02 3.1560e+02 2.7450e+02 5.3350e+02 3.0490e+02 2.4356e+03 + 2.0459e+03 6.0160e+02 1.8275e+03 2.5769e+03 1.9881e+03 8.6220e+02 6.0580e+02 + 3.7490e+02 2.5320e+02 3.3760e+02 6.7140e+02 1.2966e+03 6.3500e+02 6.8770e+02 + 5.1230e+02 4.5450e+02 4.1400e+02 7.4310e+02 2.9896e+03 2.2624e+03 2.4360e+03 + 2.1442e+03 1.0138e+03 4.9470e+02 2.6950e+02 3.5350e+02 5.0620e+02 9.4430e+02 + 5.8250e+02 3.7170e+02 4.2530e+02 4.1660e+02 4.4230e+02 7.6180e+02 2.2858e+03 + 5.6000e+03 2.5415e+03 1.6178e+03 7.2070e+02 4.6460e+02 7.9060e+02 5.2950e+02 + 1.0809e+03 7.8690e+02 3.3551e+03 2.4575e+03 6.0720e+02 9.5080e+02 7.3280e+02 + 7.9910e+02 3.0610e+02 4.5000e+02 5.8920e+02 7.1000e+02 4.5660e+02 4.7280e+02 + 5.2720e+02 2.3500e+02 1.2077e+03 3.2683e+03 2.1831e+03 6.1950e+02 1.4547e+03 + 3.5392e+03 3.8638e+03 7.3140e+02 8.2340e+02 2.0170e+02 2.5900e+02 4.9880e+02 + 6.4750e+02 8.5480e+02 6.6160e+02 6.1060e+02 6.5960e+02 4.2740e+02 8.1890e+02 + 3.0829e+03 2.5541e+03 1.9189e+03 6.6010e+02 6.8510e+02 1.0691e+03 4.6450e+02 + 3.2250e+02 5.4360e+02 3.9210e+02 4.1890e+02 7.6320e+02 6.6130e+02 4.6980e+02 + 8.7640e+02 1.1087e+03 5.7120e+02 2.8816e+03 4.0802e+03 2.7019e+03 1.6696e+03 + 4.9590e+02 8.5920e+02 2.3860e+02 5.3400e+02 1.0977e+03 2.0327e+03 4.3920e+03 + 2.2990e+03 1.3249e+03 8.7420e+02 5.5840e+02 3.8310e+02 5.9940e+02 6.0960e+02 + 5.2340e+02 4.4240e+02 3.0220e+02 2.9180e+02 6.1780e+02 6.5530e+02 2.0510e+03 + 4.1617e+03 2.2689e+03 1.0708e+03 1.2597e+03 2.1754e+03 4.4645e+03 7.4890e+02 + 6.8910e+02 3.3420e+02 2.9720e+02 5.0410e+02 1.1085e+03 3.1620e+02 6.5650e+02 + 6.4770e+02 6.9410e+02 4.4250e+02 5.5640e+02 2.1314e+03 2.8432e+03 1.8321e+03 + 4.1130e+02 8.0480e+02 7.8340e+02 4.9490e+02 6.7760e+02 3.7250e+02 3.4950e+02 + 6.2250e+02 4.8610e+02 4.8530e+02 2.5040e+02 9.9940e+02 6.1580e+02 1.1599e+03 + 3.7570e+03 3.6028e+03 4.6910e+02 8.8590e+02 9.9190e+02 8.1200e+02 4.8600e+02 + 5.7040e+02 5.8110e+02 1.9333e+03 4.9620e+03 2.8549e+03 9.4990e+02 9.0860e+02 + 4.9270e+02 9.2610e+02 8.9020e+02 5.4540e+02 2.4810e+02 5.9870e+02 5.8200e+02 + 3.9400e+02 3.3120e+02 5.5360e+02 1.5033e+03 3.0637e+03 3.2777e+03 1.6580e+03 + 6.8220e+02 2.1530e+03 4.4604e+03 1.9345e+03 6.4620e+02 6.7850e+02 7.4060e+02 + 9.5580e+02 7.8750e+02 7.9810e+02 5.8410e+02 3.7930e+02 6.8090e+02 3.4590e+02 + 1.3861e+03 2.7033e+03 2.4833e+03 6.6510e+02 4.4910e+02 4.7930e+02 3.3180e+02 + 3.5380e+02 5.1750e+02 8.3770e+02 3.8940e+02 5.0440e+02 2.4470e+02 2.6920e+02 + 4.2310e+02 7.6350e+02 1.0675e+03 3.2324e+03 3.4037e+03 4.0144e+03 1.0767e+03 + 1.0762e+03 4.6480e+02 3.0180e+02 5.5660e+02 3.7870e+02 4.4840e+02 1.8666e+03 + 3.3784e+03 2.1939e+03 1.0779e+03 3.9870e+02 6.6800e+02 4.5700e+02 8.0930e+02 + 5.9790e+02 2.6130e+02 7.1090e+02 8.9340e+02 6.1760e+02 4.1880e+02 6.3620e+02 + 2.2118e+03 4.4935e+03 4.0997e+03 2.0799e+03 3.9650e+02 1.6037e+03 3.4661e+03 + 1.9959e+03 6.2650e+02 4.0070e+02 5.2070e+02 7.0170e+02 4.4090e+02 6.7210e+02 + 4.0990e+02 5.2840e+02 6.5720e+02 6.8960e+02 2.2028e+03 3.8419e+03 2.5666e+03 + 8.7510e+02 5.9790e+02 2.8160e+02 2.5470e+02 4.5090e+02 6.1770e+02 6.2160e+02 + 9.1540e+02 2.7020e+02 3.5030e+02 2.6420e+02 3.8240e+02 6.0720e+02 1.8479e+03 + 2.8970e+03 2.8659e+03 2.0399e+03 1.3681e+03 6.3970e+02 5.3810e+02 7.0030e+02 + 8.0170e+02 5.2490e+02 7.2140e+02 3.5837e+03 3.4947e+03 1.7727e+03 6.3330e+02 + 6.1030e+02 5.8680e+02 5.5080e+02 5.5280e+02 4.2960e+02 3.6140e+02 8.8690e+02 + 1.2161e+03 6.2410e+02 3.0830e+02 5.3090e+02 2.1995e+03 2.7862e+03 3.0884e+03 + 1.3804e+03 2.3080e+02 1.4725e+03 4.5498e+03 2.0229e+03 1.1224e+03 5.2540e+02 + 5.6590e+02 6.3000e+02 5.0210e+02 3.4490e+02 5.0030e+02 8.3260e+02 3.2130e+02 + 1.0795e+03 2.4705e+03 5.1419e+03 2.2007e+03 9.1020e+02 5.9500e+02 2.5060e+02 + 2.7150e+02 2.8590e+02 5.6280e+02 6.9570e+02 9.0310e+02 3.5770e+02 4.9790e+02 + 6.2960e+02 2.6570e+02 4.0130e+02 9.4010e+02 3.4963e+03 3.7837e+03 6.7950e+02 + 1.0630e+03 7.1300e+02 6.3900e+02 4.3900e+02 6.4430e+02 4.8270e+02 4.5530e+02 + 2.2930e+03 2.6340e+03 1.8621e+03 5.8310e+02 4.7580e+02 3.2990e+02 3.7850e+02 + 6.4310e+02 6.4840e+02 4.2340e+02 3.3270e+02 1.0751e+03 1.1407e+03 5.5840e+02 + 5.0070e+02 2.2182e+03 3.0230e+03 2.9072e+03 9.4390e+02 2.1430e+02 9.8560e+02 + 3.5092e+03 4.2589e+03 1.2979e+03 6.1740e+02 4.7380e+02 3.1710e+02 3.9650e+02 + 7.6250e+02 5.0910e+02 5.4460e+02 7.3690e+02 8.2280e+02 3.3348e+03 4.8941e+03 + 1.8177e+03 1.0308e+03 4.8490e+02 2.6110e+02 3.2140e+02 5.1400e+02 6.5140e+02 + 3.4260e+02 5.0920e+02 6.1590e+02 2.2180e+02 5.9120e+02 3.7330e+02 7.7870e+02 + 2.2489e+03 2.6025e+03 3.1215e+03 9.3000e+02 6.8700e+02 5.1310e+02 6.0540e+02 + 5.6920e+02 8.0790e+02 4.1960e+02 2.5700e+02 3.4052e+03 3.3144e+03 4.1130e+02 + 4.6500e+02 4.9080e+02 2.7070e+02 2.5050e+02 7.3010e+02 7.9130e+02 2.8590e+02 + 3.8140e+02 6.6580e+02 6.6780e+02 4.8810e+02 3.1640e+02 1.9688e+03 3.1953e+03 + 2.0015e+03 4.4120e+02 2.4650e+02 6.7600e+02 1.8066e+03 2.9338e+03 2.0873e+03 + 1.0847e+03 3.9410e+02 4.4650e+02 4.1780e+02 5.6110e+02 3.7310e+02 3.8330e+02 + 6.4540e+02 8.9120e+02 4.0177e+03 2.3825e+03 1.3378e+03 1.0549e+03 5.2110e+02 + 5.6170e+02 3.7680e+02 5.0480e+02 6.8870e+02 5.2300e+02 4.1540e+02 3.9340e+02 + 3.3410e+02 6.1100e+02 3.3720e+02 5.2670e+02 1.8226e+03 3.2577e+03 1.8526e+03 + 9.3540e+02 7.7260e+02 6.1050e+02 3.5620e+02 5.9440e+02 7.2560e+02 3.0840e+02 + 4.8560e+02 3.2933e+03 4.7248e+03 1.5624e+03 9.1490e+02 2.9030e+02 3.1700e+02 + 7.3870e+02 5.7070e+02 6.4730e+02 5.5400e+02 6.1870e+02 4.5450e+02 5.7430e+02 + 8.1340e+02 6.3070e+02 9.7830e+02 3.7555e+03 2.0268e+03 4.2610e+02 6.3430e+02 + 3.9880e+02 1.9931e+03 2.3851e+03 3.5183e+03 1.7890e+03 6.5670e+02 2.7720e+02 + 2.5990e+02 3.2360e+02 5.1930e+02 7.7430e+02 1.6885e+03 2.1196e+03 3.3553e+03 + 2.3601e+03 9.0190e+02 7.8230e+02 2.7740e+02 4.3540e+02 4.3380e+02 6.1320e+02 + 4.2190e+02 2.4450e+02 4.4970e+02 7.2430e+02 5.8350e+02 6.0430e+02 2.3450e+02 + 4.3010e+02 3.0481e+03 3.5031e+03 1.8135e+03 5.7600e+02 1.0411e+03 4.1640e+02 + 5.0130e+02 5.6080e+02 8.7900e+02 3.4120e+02 8.4160e+02 2.3869e+03 3.6379e+03 + 1.5551e+03 2.9380e+02 4.1670e+02 3.0960e+02 2.5540e+02 1.0151e+03 7.9370e+02 + 5.0300e+02 4.0110e+02 5.0020e+02 2.5160e+02 3.1170e+02 1.0771e+03 1.9558e+03 + 3.3407e+03 2.2420e+03 1.5495e+03 6.8840e+02 3.7990e+02 8.9400e+02 2.6959e+03 + 4.0515e+03 1.7342e+03 4.7330e+02 4.2120e+02 4.0880e+02 3.0400e+02 5.9350e+02 + 7.6910e+02 2.1863e+03 2.1628e+03 2.0233e+03 2.0952e+03 5.7080e+02 6.1110e+02 + 3.3900e+02 5.1290e+02 8.2470e+02 1.1218e+03 2.8670e+02 2.5120e+02 3.3410e+02 + 5.9180e+02 1.0379e+03 5.0630e+02 2.6660e+02 5.0830e+02 2.3078e+03 4.3404e+03 + 1.6990e+03 6.0840e+02 1.1795e+03 4.1540e+02 4.7840e+02 2.8300e+02 3.5480e+02 + 4.4830e+02 5.8690e+02 2.2784e+03 4.3717e+03 6.9430e+02 4.5520e+02 5.9760e+02 + 2.1320e+02 4.8750e+02 5.6600e+02 1.0740e+03 7.0160e+02 6.7590e+02 7.0580e+02 + 2.9770e+02 2.7270e+02 2.7780e+02 1.8267e+03 3.4783e+03 2.8678e+03 1.5355e+03 + 8.6540e+02 3.5790e+02 8.9540e+02 1.9929e+03 3.1176e+03 1.8373e+03 9.4490e+02 + 3.1730e+02 3.1650e+02 3.0250e+02 1.2061e+03 2.2376e+03 3.6972e+03 2.5565e+03 + 2.1607e+03 1.1352e+03 7.5910e+02 2.5420e+02 2.7810e+02 7.6680e+02 1.4473e+03 + 6.3090e+02 2.1250e+02 3.4800e+02 3.5740e+02 3.0220e+02 5.3090e+02 5.7520e+02 + 5.9400e+02 5.0670e+02 2.6291e+03 3.8741e+03 2.1281e+03 1.0527e+03 1.3138e+03 + 7.2730e+02 2.5480e+02 2.5820e+02 6.7560e+02 4.4370e+02 5.1530e+02 1.9264e+03 + 3.8535e+03 1.8997e+03 4.1850e+02 7.2370e+02 1.4540e+02 2.0650e+02 6.1460e+02 + 2.2320e+02 6.5680e+02 4.4760e+02 4.0580e+02 4.7290e+02 2.6190e+02 7.0270e+02 + 2.1126e+03 3.8572e+03 2.1045e+03 1.1243e+03 5.0530e+02 4.2840e+02 7.3880e+02 + 9.4010e+02 2.2206e+03 2.9903e+03 1.2411e+03 4.4340e+02 1.4081e+03 2.0110e+03 + 2.3304e+03 2.0708e+03 2.6827e+03 2.3589e+03 1.0117e+03 7.6400e+02 8.0120e+02 + 5.2760e+02 1.4150e+02 4.5910e+02 9.7920e+02 6.5590e+02 6.1530e+02 7.0270e+02 + 6.2360e+02 6.7480e+02 5.0290e+02 2.6460e+02 3.3270e+02 7.9260e+02 2.9663e+03 + 4.0597e+03 1.7709e+03 1.0370e+03 6.0960e+02 4.5380e+02 3.5050e+02 2.8740e+02 + 7.1010e+02 6.1700e+02 6.2420e+02 1.6076e+03 3.5585e+03 3.2606e+03 1.3081e+03 + 4.1910e+02 4.2200e+02 4.6410e+02 5.5570e+02 4.2480e+02 6.0650e+02 1.0501e+03 + 4.1680e+02 2.9370e+02 4.7300e+02 2.9610e+02 2.0700e+03 2.6150e+03 3.2503e+03 + 1.0885e+03 4.6370e+02 5.6960e+02 1.0089e+03 9.0380e+02 1.4163e+03 2.8691e+03 + 3.1539e+03 9.9720e+02 2.1236e+03 2.1113e+03 2.3368e+03 2.0800e+03 2.2948e+03 + 1.7198e+03 5.2630e+02 3.5470e+02 4.0870e+02 2.7260e+02 4.1890e+02 7.9220e+02 + 7.7450e+02 5.7620e+02 6.7440e+02 4.8650e+02 6.1670e+02 1.0153e+03 2.7500e+02 + 7.8880e+02 3.7300e+02 7.4690e+02 2.1476e+03 4.5873e+03 9.4360e+02 7.1660e+02 + 5.1470e+02 4.6330e+02 3.8210e+02 4.9680e+02 5.3620e+02 8.7620e+02 6.2010e+02 + 1.8936e+03 2.6293e+03 3.8735e+03 1.2899e+03 4.4210e+02 5.0530e+02 7.9590e+02 + 4.7630e+02 5.0730e+02 6.5030e+02 7.0650e+02 3.9190e+02 2.5470e+02 2.8490e+02 + 2.2360e+02 1.2069e+03 4.1539e+03 1.9665e+03 1.1241e+03 5.0900e+02 6.5240e+02 + 4.4250e+02 4.0720e+02 4.6000e+02 4.1306e+03 4.4196e+03 1.3307e+03 3.6579e+03 + 3.3998e+03 3.7276e+03 1.3124e+03 1.0910e+03 9.1340e+02 7.6940e+02 5.3470e+02 + 4.9130e+02 5.2980e+02 3.1790e+02 1.1081e+03 8.0960e+02 4.5840e+02 3.8380e+02 + 5.7800e+02 8.3060e+02 6.7920e+02 8.9870e+02 7.2990e+02 5.9030e+02 9.0930e+02 + 3.8989e+03 3.5264e+03 4.7380e+02 4.0320e+02 2.4220e+02 3.6440e+02 3.9790e+02 + 5.2890e+02 5.3210e+02 9.6800e+02 5.2110e+02 1.0378e+03 1.9951e+03 2.8811e+03 + 1.5364e+03 4.3410e+02 7.3110e+02 7.6740e+02 6.1360e+02 2.5210e+02 2.0490e+02 + 9.0380e+02 5.0970e+02 1.4690e+02 4.4750e+02 2.1710e+02 1.3081e+03 3.2138e+03 + 8.0630e+02 8.8430e+02 5.8700e+02 2.5620e+02 8.4180e+02 5.8330e+02 7.8170e+02 + 2.0378e+03 4.1291e+03 1.9332e+03 3.2989e+03 5.1479e+03 9.3090e+02 8.3000e+02 + 9.3650e+02 5.5730e+02 5.4590e+02 4.1200e+02 6.9200e+02 4.4730e+02 3.6670e+02 + 8.5930e+02 1.1481e+03 7.7170e+02 2.8080e+02 6.3970e+02 7.6140e+02 9.4320e+02 + 1.1218e+03 9.9310e+02 5.9110e+02 1.0779e+03 3.9754e+03 4.5947e+03 9.9450e+02 + 6.3450e+02 2.2630e+02 4.7930e+02 2.4300e+02 5.1920e+02 4.7240e+02 7.1690e+02 + 3.5920e+02 5.1800e+02 1.9227e+03 4.5952e+03 2.1067e+03 5.3980e+02 5.3070e+02 + 7.3110e+02 7.2020e+02 3.1780e+02 3.4700e+02 6.2900e+02 5.6230e+02 1.0890e+02 + 2.9340e+02 6.5370e+02 9.3760e+02 3.8848e+03 1.9292e+03 7.4840e+02 4.3330e+02 + 7.4300e+02 5.4300e+02 7.6840e+02 3.7420e+02 1.9413e+03 3.0447e+03 3.6663e+03 + 2.6605e+03 4.7827e+03 8.0910e+02 3.2660e+02 4.7880e+02 7.2440e+02 5.0550e+02 + 6.0880e+02 6.5200e+02 6.1320e+02 3.4460e+02 4.9220e+02 6.0610e+02 5.5920e+02 + 3.9520e+02 5.3290e+02 8.9130e+02 8.8020e+02 1.0670e+03 6.8810e+02 5.8430e+02 + 1.1258e+03 2.2420e+03 2.0862e+03 3.8570e+02 1.9360e+02 3.1720e+02 2.9210e+02 + 4.8310e+02 3.0520e+02 5.1890e+02 1.1890e+03 6.3870e+02 3.3990e+02 1.8417e+03 + 3.3169e+03 2.6528e+03 9.6820e+02 7.2040e+02 5.9770e+02 6.4320e+02 5.3090e+02 + 5.3670e+02 6.7160e+02 4.3480e+02 3.7450e+02 4.5830e+02 1.0598e+03 2.5729e+03 + 3.5793e+03 1.2542e+03 4.5670e+02 3.2240e+02 6.1370e+02 3.8640e+02 3.4550e+02 + 3.6320e+02 8.2780e+02 3.1976e+03 3.9831e+03 5.3248e+03 4.5009e+03 1.9516e+03 + 2.5410e+02 3.1670e+02 3.5050e+02 4.8740e+02 4.0820e+02 5.6980e+02 4.0110e+02 + 2.2840e+02 7.2560e+02 9.6300e+02 5.7000e+02 5.5040e+02 5.2960e+02 6.9830e+02 + 1.1911e+03 2.2147e+03 4.1590e+02 4.0020e+02 1.1913e+03 3.0586e+03 3.6343e+03 + 8.7870e+02 3.5090e+02 4.0010e+02 2.3490e+02 3.6220e+02 2.6990e+02 5.6290e+02 + 8.4850e+02 5.3540e+02 5.1990e+02 2.0258e+03 2.6610e+03 3.4124e+03 1.1115e+03 + 5.9840e+02 2.4320e+02 5.4680e+02 7.3820e+02 3.5000e+02 3.9470e+02 3.4790e+02 + 2.9340e+02 6.4490e+02 2.2773e+03 3.9804e+03 4.4204e+03 6.9060e+02 2.5800e+02 + 3.0100e+02 2.9600e+02 7.8300e+02 3.8650e+02 3.1870e+02 3.7600e+02 2.0408e+03 + 3.6972e+03 5.4775e+03 3.3900e+03 7.8940e+02 1.9560e+02 3.3960e+02 5.4660e+02 + 5.0600e+02 4.9710e+02 5.3420e+02 2.7580e+02 4.9170e+02 5.6750e+02 6.1810e+02 + 7.1050e+02 7.5890e+02 3.6120e+02 6.8840e+02 6.6780e+02 1.2312e+03 6.2310e+02 + 2.5580e+02 7.2570e+02 1.1681e+03 2.6195e+03 5.0580e+02 4.7970e+02 4.8140e+02 + 3.6130e+02 2.6900e+02 3.4960e+02 4.0240e+02 6.8500e+02 5.3850e+02 3.1390e+02 + 6.3250e+02 2.8208e+03 3.3820e+03 2.3015e+03 9.6570e+02 2.3880e+02 7.3480e+02 + 6.1170e+02 3.4180e+02 5.1140e+02 4.7240e+02 3.7430e+02 6.0070e+02 7.5420e+02 + 3.9930e+03 3.3681e+03 8.2990e+02 1.9270e+02 3.8920e+02 6.5620e+02 3.6250e+02 + 7.1850e+02 6.0860e+02 7.9580e+02 2.0273e+03 3.8825e+03 5.0829e+03 3.0746e+03 + 1.5577e+03 3.9670e+02 2.7190e+02 4.2030e+02 7.9990e+02 8.1180e+02 3.0200e+02 + 2.6170e+02 3.1860e+02 3.9480e+02 5.9780e+02 4.6640e+02 4.1160e+02 5.8990e+02 + 2.0810e+02 3.5030e+02 2.3321e+03 4.5990e+02 5.0040e+02 4.9610e+02 1.9451e+03 + 1.9589e+03 1.8529e+03 5.1180e+02 5.0390e+02 7.2690e+02 3.7700e+02 3.6360e+02 + 5.4080e+02 4.1010e+02 1.7850e+02 2.6750e+02 4.9120e+02 1.0525e+03 3.3375e+03 + 2.1102e+03 1.5971e+03 3.9210e+02 5.1100e+02 3.2500e+02 3.3840e+02 5.9020e+02 + 6.5650e+02 8.4300e+02 7.4000e+02 2.1808e+03 3.7380e+03 2.3481e+03 3.5630e+02 + 2.7820e+02 3.8120e+02 3.9300e+02 6.6060e+02 3.4530e+02 2.6530e+02 3.3480e+02 + 8.4490e+02 2.5437e+03 4.7185e+03 2.5475e+03 7.9620e+02 8.8080e+02 3.5600e+02 + 5.5950e+02 5.2050e+02 5.0880e+02 3.0850e+02 5.4000e+02 9.1290e+02 7.5860e+02 + 4.9340e+02 6.8450e+02 8.7620e+02 7.0950e+02 4.8200e+02 1.3250e+02 2.3404e+03 + 9.8830e+02 6.3900e+02 4.1320e+02 1.4106e+03 1.8048e+03 2.1432e+03 1.1034e+03 + 1.3183e+03 6.1300e+02 9.8070e+02 6.0160e+02 4.7900e+02 7.4650e+02 2.5000e+02 + 5.0940e+02 5.8540e+02 1.0960e+03 2.0269e+03 3.1235e+03 1.5041e+03 7.0260e+02 + 8.0830e+02 3.6290e+02 4.2540e+02 8.2670e+02 9.8180e+02 1.0518e+03 4.0930e+02 + 2.1170e+03 2.4215e+03 2.1407e+03 4.6440e+02 6.0010e+02 4.1460e+02 9.2310e+02 + 7.2610e+02 4.2690e+02 3.2590e+02 4.4730e+02 7.0400e+02 1.9577e+03 3.6963e+03 + 3.3950e+03 2.1305e+03 6.4750e+02 7.0200e+02 2.8440e+02 4.2970e+02 4.9020e+02 + 4.0090e+02 2.2510e+02 1.1003e+03 5.7590e+02 4.8390e+02 6.8200e+02 1.5312e+03 + 4.8130e+02 3.5370e+02 1.1610e+02 2.0682e+03 4.1760e+02 6.0520e+02 2.0508e+03 + 2.5132e+03 1.6967e+03 5.6490e+02 5.7660e+02 2.2490e+02 4.7800e+02 3.1967e+03 + 2.9274e+03 2.0109e+03 1.0683e+03 7.0640e+02 1.2751e+03 5.8920e+02 2.8680e+02 + 2.0570e+02 6.3560e+02 1.2745e+03 3.7063e+03 2.3945e+03 1.0598e+03 1.0011e+03 + 8.2580e+02 1.0958e+03 2.6635e+03 2.3023e+03 1.8762e+03 7.8530e+02 1.1784e+03 + 4.6490e+02 3.6570e+02 5.0990e+02 7.5310e+02 6.9420e+02 3.9550e+02 1.8119e+03 + 2.8476e+03 3.0629e+03 4.0983e+03 2.2247e+03 4.9840e+02 4.0840e+02 4.9290e+02 + 1.4690e+02 2.1330e+02 3.5940e+02 7.1890e+02 3.6270e+02 4.0890e+02 5.3550e+02 + 8.3070e+02 6.9700e+02 4.9200e+02 8.2320e+02 1.2051e+03 1.0985e+03 8.5300e+02 + 6.3850e+02 7.2990e+02 6.1170e+02 3.0378e+03 2.3150e+03 4.7050e+02 4.0630e+02 + 3.4000e+02 2.1980e+02 8.5800e+02 1.6666e+03 3.1796e+03 1.2527e+03 5.4370e+02 + 5.1620e+02 5.9580e+02 5.0090e+02 5.4620e+02 2.4020e+02 4.3760e+02 6.7720e+02 + 2.3430e+03 2.8660e+03 2.4415e+03 6.9380e+02 6.8470e+02 4.4020e+02 1.5340e+03 + 3.3309e+03 2.9078e+03 1.1133e+03 7.4650e+02 6.0570e+02 2.5630e+02 5.9030e+02 + 6.2890e+02 7.8900e+02 8.5090e+02 8.1450e+02 1.7997e+03 2*4.9000e+03 + 2.5536e+03 1.1097e+03 4.0370e+02 8.4180e+02 2.5240e+02 1.5090e+02 5.4100e+02 + 3.9750e+02 1.7910e+02 1.5750e+02 6.6650e+02 1.2614e+03 5.4430e+02 4.8810e+02 + 1.0614e+03 8.6710e+02 7.9630e+02 6.1870e+02 1.6320e+02 7.9760e+02 6.8980e+02 + 3.1506e+03 1.8518e+03 1.2620e+03 2.6970e+02 3.4040e+02 5.3480e+02 9.2400e+02 + 3.7348e+03 2.7831e+03 9.1420e+02 4.1460e+02 3.8500e+02 3.3240e+02 6.4220e+02 + 3.5890e+02 6.2590e+02 4.3250e+02 6.1790e+02 2.1494e+03 3.8566e+03 1.8274e+03 + 1.1251e+03 5.4330e+02 2.4800e+02 1.6042e+03 1.5902e+03 2.2434e+03 2.7891e+03 + 9.3170e+02 6.2150e+02 5.2550e+02 1.0435e+03 7.1800e+02 6.1590e+02 2.2320e+02 + 5.3720e+02 1.9919e+03 4.5871e+03 3.2152e+03 4.2749e+03 2.5659e+03 1.5672e+03 + 9.4700e+02 4.7600e+02 2.2120e+02 7.5980e+02 6.3490e+02 3.8290e+02 4.7770e+02 + 4.9230e+02 6.8360e+02 7.4800e+02 4.5410e+02 6.6920e+02 8.0130e+02 5.6510e+02 + 9.8050e+02 1.7510e+03 8.6680e+02 2.3309e+03 2.5499e+03 1.4497e+03 5.1230e+02 + 4.6560e+02 3.6360e+02 6.3870e+02 2.1238e+03 3.5140e+03 2.1129e+03 7.2820e+02 + 2.8940e+02 4.5620e+02 5.6100e+02 3.4380e+02 4.0200e+02 6.5150e+02 4.1870e+02 + 3.0460e+02 2.4436e+03 2.8141e+03 2.4726e+03 1.0114e+03 4.4520e+02 6.2250e+02 + 6.6910e+02 1.5175e+03 1.9312e+03 1.7058e+03 1.7446e+03 3.3780e+02 7.9240e+02 + 6.9570e+02 5.7720e+02 4.7980e+02 3.3710e+02 5.2430e+02 1.6454e+03 2.9548e+03 + 3.1223e+03 2.6900e+03 3.4622e+03 1.2572e+03 7.0330e+02 6.3680e+02 2.3960e+02 + 6.3180e+02 6.4620e+02 4.1770e+02 4.1620e+02 5.1330e+02 6.0540e+02 5.3340e+02 + 3.8120e+02 4.3400e+02 2.5710e+02 3.9630e+02 8.5180e+02 1.7875e+03 2.6508e+03 + 3.1109e+03 2.5356e+03 1.4687e+03 6.1370e+02 4.6570e+02 4.8640e+02 5.1710e+02 + 1.2739e+03 2.2926e+03 2.4101e+03 5.5950e+02 5.0090e+02 3.6830e+02 7.3740e+02 + 1.9760e+02 2.6360e+02 3.8460e+02 5.6450e+02 3.0670e+02 1.1654e+03 2.9374e+03 + 2.5971e+03 1.1352e+03 5.3870e+02 5.1350e+02 1.1561e+03 7.5920e+02 1.1039e+03 + 1.2312e+03 2.9044e+03 1.7057e+03 7.7290e+02 4.3190e+02 5.3880e+02 5.2270e+02 + 3.5470e+02 4.4760e+02 1.5847e+03 2.0625e+03 3.8213e+03 1.8078e+03 3.8657e+03 + 2.9871e+03 9.4860e+02 3.0290e+02 5.5060e+02 2.7710e+02 5.5750e+02 5.3370e+02 + 7.4070e+02 2.5170e+02 2.1090e+02 3.8080e+02 9.0740e+02 3.5350e+02 2.5230e+02 + 1.0223e+03 1.7700e+03 1.3409e+03 1.7029e+03 3.0671e+03 3.1778e+03 7.1000e+02 + 3.3630e+02 3.4860e+02 1.1045e+03 7.9770e+02 2.2503e+03 3.5465e+03 2.4240e+03 + 5.2990e+02 3.8340e+02 5.5030e+02 7.1420e+02 1.8900e+02 2.0860e+02 4.4860e+02 + 6.0580e+02 4.3460e+02 1.1003e+03 2.4362e+03 2.3996e+03 2.7065e+03 4.8250e+02 + 3.8110e+02 1.0111e+03 6.2420e+02 1.1934e+03 1.6656e+03 2.2897e+03 2.3849e+03 + 7.0940e+02 3.4670e+02 7.7530e+02 3.9120e+02 3.0120e+02 4.1970e+02 2.3644e+03 + 2.5602e+03 2.8181e+03 3.4430e+03 3.7388e+03 2.5585e+03 6.4540e+02 4.9920e+02 + 3.1680e+02 4.0870e+02 8.0930e+02 6.5710e+02 3.9520e+02 1.0950e+02 3.5890e+02 + 6.0870e+02 9.0970e+02 3.1480e+02 4.4410e+02 8.4180e+02 2.1817e+03 2.9747e+03 + 2.7895e+03 2.5463e+03 1.9423e+03 5.4770e+02 2.6240e+02 6.2860e+02 3.7650e+02 + 6.5040e+02 1.6982e+03 1.2980e+03 1.9098e+03 1.4833e+03 5.4750e+02 4.8800e+02 + 9.1360e+02 3.0850e+02 2.2280e+02 3.2710e+02 6.4400e+02 1.1767e+03 1.4063e+03 + 2.0269e+03 2.6337e+03 1.8891e+03 6.0500e+02 6.1950e+02 5.2150e+02 5.9500e+02 + 1.1184e+03 2.2746e+03 2.7175e+03 2.5032e+03 2.2739e+03 7.9050e+02 3.9460e+02 + 6.1850e+02 1.5720e+02 4.7130e+02 1.4366e+03 1.6768e+03 1.7487e+03 2.8119e+03 + 2.5567e+03 2.3404e+03 3.9820e+02 2.5720e+02 3.2430e+02 6.8700e+02 5.4240e+02 + 1.1475e+03 3.7470e+02 3.8150e+02 5.3970e+02 2.9270e+02 5.8020e+02 2.5200e+02 + 5.5830e+02 5.2590e+02 1.8682e+03 2.3701e+03 3.7102e+03 2.6592e+03 1.4143e+03 + 2.1340e+02 4.6840e+02 6.2690e+02 3.6410e+02 4.0790e+02 1.5618e+03 3.4518e+03 + 2.1128e+03 9.6380e+02 8.1310e+02 6.0080e+02 6.2230e+02 3.3810e+02 4.7520e+02 + 5.5020e+02 2.6370e+02 2.6750e+02 1.0187e+03 2.6472e+03 3.1970e+03 1.7681e+03 + 6.7230e+02 6.8190e+02 5.6120e+02 3.7540e+02 5.8420e+02 9.0610e+02 1.4196e+03 + 2.2992e+03 1.9010e+03 1.5797e+03 8.2320e+02 2.1740e+02 3.3050e+02 3.2780e+02 + 2.3584e+03 2.6336e+03 1.8773e+03 2.5081e+03 1.7682e+03 2.0884e+03 5.0810e+02 + 3.6480e+02 3.9530e+02 6.6580e+02 7.7620e+02 4.4170e+02 5.5490e+02 2.7490e+02 + 5.2160e+02 3.9160e+02 2.2100e+02 2.6460e+02 5.7430e+02 6.4120e+02 1.5532e+03 + 3.4245e+03 2.9993e+03 3.4139e+03 9.9350e+02 2.1310e+02 3.8290e+02 5.1420e+02 + 4.2150e+02 4.1690e+02 1.0466e+03 3.4337e+03 2.4898e+03 9.8000e+02 6.6050e+02 + 6.6630e+02 8.1310e+02 1.8160e+02 5.2530e+02 4.3660e+02 2.5060e+02 1.9850e+02 + 8.4520e+02 1.5414e+03 2.9316e+03 1.2458e+03 1.5559e+03 5.3890e+02 6.4160e+02 + 4.3320e+02 5.1570e+02 9.0220e+02 1.1472e+03 2.8437e+03 2.5519e+03 1.8898e+03 + 1.3350e+03 3.5970e+02 2.7820e+02 4.6380e+02 1.5802e+03 2.6410e+03 2.0892e+03 + 1.9072e+03 1.4236e+03 1.6715e+03 1.1275e+03 2.7170e+02 5.1900e+02 1.1420e+03 + 5.7280e+02 2.4960e+02 4.0460e+02 5.8070e+02 6.9270e+02 5.5860e+02 2.6360e+02 + 2.2040e+02 5.7910e+02 9.7400e+02 2.2207e+03 3.1806e+03 2.9487e+03 2.6460e+03 + 8.3110e+02 5.6510e+02 6.0020e+02 9.1220e+02 4.5900e+02 2.1400e+02 8.1780e+02 + 2.6254e+03 2.2959e+03 4.4990e+02 8.0930e+02 3.8780e+02 3.4780e+02 4.6160e+02 + 4.8970e+02 6.5330e+02 2.1020e+02 1.9390e+02 6.1400e+02 2.1172e+03 2.5880e+03 + 9.1740e+02 3.2830e+02 4.7640e+02 4.7730e+02 3.0230e+02 4.7740e+02 5.5130e+02 + 7.2690e+02 8.6710e+02 2.5374e+03 2.4679e+03 1.9021e+03 6.9180e+02 4.5080e+02 + 1.3242e+03 2.5734e+03 1.7543e+03 1.3416e+03 2.4816e+03 2.7761e+03 1.0306e+03 + 6.6780e+02 2.7920e+02 2.6170e+02 4.2820e+02 3.6720e+02 2.1280e+02 2.4140e+02 + 3.7720e+02 5.0490e+02 1.2447e+03 4.8460e+02 4.1910e+02 4.6740e+02 4.4710e+02 + 2.0574e+03 3.4445e+03 1.9242e+03 3.1801e+03 9.8000e+02 5.6750e+02 7.2610e+02 + 1.0171e+03 4.4950e+02 2.1670e+02 9.1090e+02 1.6563e+03 2.2506e+03 3.7940e+02 + 6.0050e+02 4.1630e+02 8.6700e+02 5.2110e+02 3.5570e+02 5.7910e+02 4.8580e+02 + 3.8040e+02 5.5310e+02 1.8293e+03 4.0033e+03 1.3912e+03 4.1860e+02 1.9970e+02 + 6.1860e+02 1.0779e+03 7.0500e+02 4.4630e+02 4.7810e+02 5.2140e+02 1.9789e+03 + 3.9843e+03 2.0404e+03 4.6180e+02 6.9600e+02 8.5680e+02 3.7697e+03 1.6345e+03 + 6.2080e+02 1.7189e+03 2.6387e+03 2.1605e+03 9.3290e+02 4.4470e+02 3.4160e+02 + 4.2040e+02 4.2130e+02 3.1520e+02 1.8350e+02 6.8700e+02 5.7680e+02 4.0500e+02 + 3.4470e+02 6.6850e+02 4.9380e+02 1.2771e+03 1.2518e+03 2.5795e+03 1.4788e+03 + 2.8823e+03 1.7216e+03 5.5240e+02 5.3560e+02 1.0283e+03 1.7910e+02 2.2750e+02 + 7.5440e+02 1.9665e+03 2.6895e+03 7.3100e+02 3.9140e+02 8.1090e+02 4.5800e+02 + 5.7860e+02 3.4420e+02 5.4440e+02 4.4200e+02 4.5330e+02 5.1130e+02 2.8980e+03 + 3.7284e+03 1.5843e+03 5.5210e+02 3.8300e+02 4.1820e+02 8.9080e+02 9.6520e+02 + 3.0360e+02 3.0210e+02 4.4240e+02 1.1200e+03 3.8272e+03 2.6604e+03 1.2570e+03 + 1.0861e+03 1.4882e+03 2.8358e+03 1.3885e+03 1.5542e+03 3.3161e+03 2.5024e+03 + 7.4700e+02 7.5310e+02 3.4130e+02 2.2870e+02 4.1190e+02 7.6240e+02 5.3530e+02 + 5.5600e+02 3.2450e+02 8.3610e+02 9.0970e+02 4.3360e+02 4.6120e+02 8.5400e+02 + 5.7380e+02 2.7247e+03 2.4704e+03 1.6567e+03 3.9837e+03 5.6330e+02 9.6860e+02 + 5.3140e+02 7.0040e+02 3.3780e+02 3.6850e+02 5.5190e+02 1.9874e+03 2.8481e+03 + 1.6594e+03 7.7680e+02 4.5160e+02 7.0220e+02 4.4680e+02 5.2260e+02 4.5230e+02 + 7.0330e+02 4.8480e+02 5.1660e+02 1.6201e+03 2.5961e+03 1.8756e+03 4.7680e+02 + 2.4630e+02 6.7680e+02 8.4080e+02 5.9680e+02 5.6820e+02 4.2380e+02 1.7510e+02 + 5.2760e+02 2.3001e+03 1.9326e+03 2.6849e+03 2.0948e+03 2.2434e+03 1.5278e+03 + 1.4001e+03 1.1735e+03 3.3275e+03 2.8990e+03 9.2650e+02 5.9970e+02 3.4230e+02 + 2.4110e+02 2.5690e+02 3.5620e+02 7.4700e+02 7.2150e+02 5.6260e+02 6.5640e+02 + 9.0660e+02 3.7110e+02 4.7130e+02 7.9870e+02 1.1816e+03 2.9694e+03 2.2485e+03 + 1.7479e+03 4.1917e+03 9.8090e+02 9.7530e+02 9.9470e+02 8.0460e+02 5.8180e+02 + 3.7510e+02 4.7370e+02 1.8509e+03 3.4046e+03 1.3316e+03 5.3430e+02 3.5190e+02 + 3.8730e+02 3.7990e+02 3.5050e+02 8.1950e+02 4.1410e+02 8.3540e+02 1.1228e+03 + 1.6428e+03 3.8505e+03 2.5423e+03 4.7330e+02 2.1270e+02 4.2950e+02 6.0510e+02 + 5.2940e+02 4.4200e+02 2.3460e+02 1.7330e+02 2.5070e+02 1.7627e+03 3.0690e+03 + 2.3951e+03 2.1498e+03 2.4487e+03 1.6335e+03 8.0340e+02 1.2199e+03 1.3666e+03 + 2.3408e+03 8.0550e+02 5.8810e+02 8.5210e+02 5.5770e+02 2.6820e+02 4.2310e+02 + 4.6450e+02 3.8520e+02 5.7820e+02 6.2760e+02 4.8420e+02 1.9370e+02 2.9710e+02 + 1.1094e+03 1.3642e+03 2.6209e+03 2.2496e+03 2.3249e+03 2.9479e+03 2.2454e+03 + 6.4710e+02 6.4780e+02 5.7590e+02 5.8620e+02 8.9900e+02 5.4060e+02 1.1622e+03 + 3.8037e+03 3.5009e+03 1.0055e+03 4.5570e+02 5.2930e+02 5.6720e+02 3.6170e+02 + 4.0620e+02 9.3380e+02 8.0470e+02 6.0230e+02 2.6133e+03 3.7930e+03 9.3200e+02 + 5.4310e+02 1.7260e+02 5.6240e+02 5.0580e+02 7.5740e+02 3.5140e+02 3.5290e+02 + 4.5350e+02 2.8700e+02 8.0550e+02 2.2591e+03 4.2361e+03 2.3698e+03 3.2769e+03 + 1.4118e+03 8.4750e+02 1.3975e+03 3.0926e+03 2.9593e+03 2.9790e+02 4.7770e+02 + 5.2500e+02 2.6330e+02 2.1810e+02 4.6270e+02 4.6330e+02 5.0940e+02 6.1920e+02 + 6.9500e+02 6.6580e+02 4.6690e+02 3.2480e+02 5.9020e+02 2.0036e+03 2.3172e+03 + 2.3783e+03 2.5683e+03 3.5564e+03 7.1340e+02 6.3040e+02 5.5820e+02 3.7130e+02 + 6.4720e+02 1.2550e+03 5.7280e+02 7.7250e+02 1.5913e+03 2.8692e+03 1.8973e+03 + 5.6870e+02 4.7970e+02 4.6350e+02 3.6360e+02 8.2930e+02 7.6460e+02 6.5170e+02 + 1.4331e+03 3.1086e+03 2.7401e+03 8.6490e+02 7.3310e+02 5.5390e+02 6.3700e+02 + 5.1620e+02 4.2980e+02 2.7740e+02 5.5490e+02 5.8510e+02 2.7570e+02 2.0721e+03 + 2.6815e+03 4.6785e+03 2.8615e+03 2.4851e+03 1.0942e+03 4.2930e+02 1.1479e+03 + 3.6143e+03 2.3742e+03 4.5030e+02 4.6810e+02 3.7820e+02 5.4760e+02 3.1240e+02 + 4.8670e+02 3.1400e+02 2.5690e+02 4.3550e+02 7.8280e+02 1.0206e+03 5.0080e+02 + 2.6940e+02 4.2680e+02 1.9011e+03 3.4399e+03 1.9781e+03 2.9700e+03 4.0632e+03 + 2.1445e+03 5.1180e+02 2.1450e+02 3.7810e+02 6.4640e+02 4.4970e+02 6.8260e+02 + 1.0033e+03 1.7795e+03 3.0793e+03 3.5360e+03 1.4152e+03 5.2240e+02 7.1490e+02 + 4.8720e+02 4.3150e+02 1.8920e+02 8.5010e+02 1.6311e+03 2.0498e+03 2.5344e+03 + 1.0624e+03 7.9570e+02 5.7250e+02 2.3030e+02 4.8180e+02 4.3750e+02 3.4300e+02 + 5.1340e+02 2.1510e+02 4.3670e+02 6.8210e+02 3.1194e+03 3.7457e+03 4.9000e+03 + 1.3801e+03 1.0845e+03 2.8710e+02 8.5890e+02 3.4034e+03 1.9818e+03 7.0380e+02 + 7.6930e+02 3.7870e+02 3.0300e+02 7.8750e+02 4.6680e+02 6.0020e+02 2.9320e+02 + 3.3520e+02 7.2500e+02 7.6030e+02 4.9050e+02 2.3100e+02 5.4030e+02 6.8140e+02 + 2.3476e+03 3.2285e+03 1.7669e+03 4.7222e+03 2.3140e+03 4.4430e+02 4.1600e+02 + 4.5710e+02 4.6070e+02 4.0700e+02 3.8010e+02 5.4330e+02 1.8105e+03 1.9823e+03 + 3.6509e+03 1.4261e+03 6.6120e+02 7.0180e+02 1.3160e+02 4.2730e+02 3.4370e+02 + 5.0860e+02 1.2196e+03 4.1831e+03 2.6754e+03 1.0946e+03 5.2420e+02 3.1670e+02 + 6.7700e+02 1.0093e+03 4.5300e+02 3.8850e+02 3.2500e+02 4.6760e+02 2.4320e+02 + 9.1730e+02 3.4097e+03 4.9000e+03 3.3546e+03 6.2330e+02 5.6070e+02 7.0430e+02 + 1.0851e+03 2.8609e+03 2.4428e+03 1.1424e+03 4.7800e+02 2.9520e+02 3.0150e+02 + 4.0460e+02 5.2850e+02 4.8180e+02 2.8370e+02 3.0560e+02 5.7030e+02 5.8750e+02 + 3.4530e+02 4.1910e+02 5.4660e+02 6.0900e+02 1.9913e+03 1.8002e+03 2.5292e+03 + 3.8786e+03 1.8313e+03 2.8300e+02 3.7770e+02 7.9430e+02 8.9430e+02 5.9310e+02 + 7.3210e+02 4.6820e+02 9.7960e+02 1.7765e+03 2.7664e+03 2.8091e+03 9.1910e+02 + 8.2140e+02 2.2610e+02 1.1800e+02 2.2020e+02 4.0670e+02 3.0529e+03 2.8436e+03 + 2.5100e+03 6.8690e+02 5.4700e+02 3.0150e+02 8.6400e+02 7.2380e+02 4.3690e+02 + 4.9510e+02 2.5570e+02 4.5020e+02 3.7090e+02 8.2190e+02 3.1391e+03 4.6477e+03 + 4.6553e+03 4.3810e+02 5.5830e+02 5.8210e+02 7.1800e+02 2.7058e+03 4.5787e+03 + 2.7763e+03 3.2950e+02 4.3770e+02 1.3780e+02 4.7090e+02 8.7440e+02 5.0190e+02 + 2.7880e+02 5.4610e+02 7.0620e+02 4.8440e+02 6.6700e+02 7.1980e+02 3.8870e+02 + 2.4850e+02 1.0900e+03 1.6568e+03 2.8312e+03 4.1472e+03 1.9071e+03 3.6220e+02 + 5.7170e+02 1.0636e+03 7.8330e+02 2.5100e+02 1.5980e+02 2.9910e+02 7.3710e+02 + 1.4428e+03 1.5185e+03 2.6318e+03 1.0425e+03 8.3020e+02 4.0880e+02 1.9640e+02 + 4.4460e+02 5.1350e+02 3.5916e+03 2.8288e+03 1.3229e+03 7.6350e+02 5.8250e+02 + 4.0450e+02 4.1120e+02 7.4220e+02 4.5560e+02 6.7530e+02 5.2930e+02 4.5060e+02 + 2.1890e+02 8.5750e+02 3.1077e+03 4.0458e+03 4.2533e+03 8.3590e+02 1.7700e+02 + 4.2510e+02 1.0621e+03 1.7114e+03 3.6057e+03 1.8563e+03 9.7890e+02 7.0090e+02 + 3.8050e+02 5.8580e+02 8.6680e+02 8.6420e+02 5.3950e+02 6.8840e+02 4.7860e+02 + 5.0300e+02 3.9950e+02 7.3830e+02 2.1130e+02 1.0190e+02 5.4830e+02 2.7261e+03 + 1.7976e+03 2.8102e+03 2.5955e+03 7.7040e+02 8.0790e+02 1.0975e+03 7.3220e+02 + 2.4670e+02 2.4040e+02 3.0810e+02 2.6640e+02 6.9890e+02 1.4153e+03 2.8791e+03 + 1.9369e+03 8.3970e+02 5.2740e+02 3.4630e+02 4.5160e+02 1.2947e+03 3.8368e+03 + 2.0019e+03 1.3480e+03 7.0550e+02 8.2740e+02 3.6410e+02 3.2300e+02 4.6500e+02 + 5.4990e+02 6.9800e+02 5.4560e+02 3.4110e+02 6.4630e+02 2.1809e+03 3.6843e+03 + 4.4999e+03 1.7725e+03 1.1060e+03 1.9710e+02 3.0960e+02 1.0824e+03 2.4076e+03 + 3.5700e+03 2.0389e+03 6.0030e+02 6.4640e+02 4.5360e+02 9.5070e+02 7.9510e+02 + 4.4250e+02 4.0490e+02 7.2050e+02 6.4530e+02 4.9410e+02 6.7270e+02 7.6110e+02 + 4.7120e+02 7.3500e+01 9.2910e+02 2.6984e+03 1.0833e+03 2.7297e+03 3.0901e+03 + 7.0540e+02 6.2500e+02 1.0611e+03 6.8970e+02 2.4990e+02 6.5790e+02 5.5590e+02 + 5.6270e+02 9.7840e+02 3.2423e+03 9.9920e+02 3.0262e+03 1.0006e+03 7.7650e+02 + 6.6840e+02 6.0980e+02 2.3188e+03 2.4329e+03 2.0285e+03 3.4030e+02 6.3210e+02 + 7.3500e+02 6.5580e+02 3.5100e+02 2.5530e+02 2.4380e+02 5.6610e+02 5.9410e+02 + 3.9340e+02 5.4430e+02 2.5215e+03 4.3868e+03 3.7815e+03 1.4495e+03 8.9350e+02 + 2.4940e+02 1.7880e+02 4.9540e+02 1.9000e+03 1.9867e+03 1.8375e+03 9.7380e+02 + 9.8050e+02 6.4370e+02 1.2262e+03 7.8670e+02 3.8050e+02 6.9680e+02 7.9440e+02 + 4.2570e+02 5.1120e+02 7.7970e+02 6.3440e+02 3.8540e+02 6.3450e+02 9.0930e+02 + 2.7898e+03 4.5250e+02 3.4179e+03 3.0589e+03 9.0880e+02 6.3570e+02 6.1880e+02 + 5.7460e+02 2.3580e+02 5.6900e+02 2.2830e+02 3.6090e+02 8.2160e+02 1.0996e+03 + 2.4500e+03 2.4794e+03 2.5780e+03 1.2916e+03 7.1400e+02 2.2100e+03 1.6422e+03 + 2.4731e+03 6.6340e+02 5.9520e+02 7.2190e+02 4.3710e+02 5.6520e+02 4.3920e+02 + 5.9320e+02 5.2800e+02 7.5620e+02 1.6520e+02 4.3190e+02 1.1834e+03 2.0395e+03 + 4.9000e+03 4.1855e+03 2.4312e+03 6.5810e+02 4.7180e+02 2.4510e+02 5.4990e+02 + 1.6782e+03 2.7634e+03 2.2480e+03 2.6931e+03 1.6676e+03 8.7250e+02 1.0476e+03 + 1.1354e+03 4.5320e+02 5.7410e+02 7.3300e+02 5.9480e+02 4.9550e+02 5.4860e+02 + 4.7040e+02 8.4160e+02 9.1140e+02 8.6720e+02 2.9988e+03 3.8490e+02 2.6586e+03 + 4.9000e+03 2.8537e+03 5.1240e+02 4.0310e+02 3.4490e+02 4.0940e+02 5.4770e+02 + 2.7920e+02 2.7450e+02 3.4900e+02 7.9050e+02 8.9460e+02 3.9114e+03 1.9010e+03 + 1.6534e+03 2.0433e+03 2.4316e+03 2.6348e+03 1.3741e+03 9.2110e+02 4.0240e+02 + 5.3160e+02 4.0930e+02 4.1770e+02 5.1370e+02 5.9270e+02 3.5110e+02 4.8230e+02 + 3.7350e+02 4.9110e+02 8.1400e+02 2.4801e+03 3.1641e+03 4.0004e+03 2.3151e+03 + 6.2820e+02 4.7270e+02 2.9400e+02 2.7760e+02 1.4428e+03 2.4830e+03 2.0199e+03 + 2.2989e+03 1.8441e+03 2.0192e+03 1.1150e+03 7.2290e+02 9.0290e+02 9.1430e+02 + 1.0614e+03 8.0590e+02 5.6870e+02 7.5220e+02 2.4380e+02 1.3209e+03 1.2231e+03 + 9.5240e+02 2.4828e+03 5.0570e+02 1.1895e+03 4.9000e+03 2.4700e+03 3.8740e+02 + 4.4210e+02 2.9610e+02 2.0290e+02 3.7790e+02 7.2710e+02 4.1540e+02 2.7770e+02 + 4.3770e+02 1.0914e+03 2.5008e+03 2.5858e+03 1.8840e+03 3.8777e+03 2.3034e+03 + 3.1962e+03 8.2520e+02 5.8840e+02 5.5580e+02 4.3520e+02 7.1500e+02 2.4150e+02 + 4.3170e+02 5.1480e+02 5.4730e+02 1.5050e+02 2.5480e+02 5.2170e+02 1.0114e+03 + 3.3460e+03 3.3662e+03 4.3170e+03 8.3780e+02 5.6420e+02 7.0660e+02 4.8980e+02 + 3.6680e+02 7.3570e+02 1.3389e+03 1.7852e+03 2.4919e+03 2.5768e+03 2.9444e+03 + 2.8413e+03 1.0881e+03 1.3590e+03 9.8900e+02 6.9520e+02 8.3170e+02 8.3320e+02 + 5.0610e+02 3.6800e+02 8.4460e+02 7.0170e+02 8.0660e+02 3.3339e+03 4.4270e+02 + 8.0770e+02 3.5297e+03 3.2163e+03 1.2114e+03 3.5370e+02 4.2880e+02 2.7030e+02 + 3.2860e+02 8.8490e+02 4.1070e+02 5.3750e+02 3.9140e+02 4.7630e+02 1.4626e+03 + 2.2374e+03 4.3741e+03 3.1597e+03 2.2439e+03 1.2666e+03 6.8510e+02 3.5040e+02 + 5.8650e+02 7.5480e+02 5.6660e+02 4.5200e+02 6.3130e+02 9.8310e+02 4.1850e+02 + 2.4530e+02 5.1310e+02 6.5010e+02 1.7119e+03 4.3607e+03 4.9000e+03 2.8547e+03 + 6.7630e+02 4.2250e+02 7.5630e+02 5.3060e+02 2.8540e+02 5.2490e+02 8.3190e+02 + 4.6040e+02 1.4292e+03 2.3347e+03 2.4663e+03 2.2936e+03 1.4503e+03 2.4320e+03 + 3.4166e+03 1.3940e+03 1.6923e+03 1.1504e+03 6.2190e+02 4.7080e+02 6.2660e+02 + 6.1520e+02 1.6656e+03 3.1082e+03 2.7660e+02 5.0510e+02 1.9672e+03 2.8731e+03 + 1.4149e+03 1.2524e+03 7.7520e+02 2.4740e+02 4.4440e+02 6.5480e+02 7.6970e+02 + 6.4160e+02 4.5870e+02 6.7390e+02 1.3420e+03 3.3091e+03 4.9000e+03 2.9450e+03 + 2.0539e+03 1.1488e+03 9.3730e+02 3.5380e+02 3.5880e+02 6.5260e+02 7.9860e+02 + 5.5120e+02 5.6920e+02 7.7010e+02 4.3050e+02 4.0910e+02 6.8460e+02 7.2570e+02 + 8.1820e+02 2.8554e+03 4.1959e+03 2.3563e+03 7.8750e+02 5.5450e+02 8.9900e+02 + 5.7970e+02 1.7190e+02 3.4240e+02 6.1250e+02 5.8910e+02 7.8940e+02 8.0750e+02 + 2.0195e+03 2.0016e+03 1.1428e+03 7.0750e+02 2.8338e+03 2.6235e+03 1.9957e+03 + 8.4880e+02 8.9270e+02 6.2410e+02 5.7070e+02 4.9230e+02 2.6229e+03 2.7562e+03 + 3.0530e+02 9.2970e+02 1.1794e+03 1.8583e+03 3.1903e+03 2.1820e+03 1.0491e+03 + 2.5430e+02 3.2890e+02 5.0530e+02 6.8680e+02 7.7780e+02 8.9900e+02 4.7110e+02 + 1.7998e+03 2.9898e+03 4.9000e+03 2.4769e+03 1.3492e+03 9.2780e+02 7.7210e+02 + 4.0230e+02 2.9380e+02 6.8180e+02 9.7570e+02 5.6520e+02 4.7430e+02 5.2460e+02 + 3.1730e+02 5.0750e+02 1.1649e+03 1.4508e+03 3.3479e+03 3.6148e+03 4.6609e+03 + 2.6517e+03 3.5690e+02 1.0859e+03 1.6546e+03 5.1010e+02 2.9710e+02 2.5260e+02 + 4.7720e+02 2.4580e+02 2.2260e+02 3.8290e+02 1.5214e+03 1.0321e+03 6.5630e+02 + 1.5343e+03 1.7842e+03 3.5022e+03 1.2340e+03 1.6481e+03 1.6851e+03 1.3960e+03 + 7.5480e+02 7.9850e+02 2.9810e+03 2.7422e+03 4.7990e+02 6.2800e+02 1.7160e+03 + 2.0820e+03 1.8984e+03 2.3882e+03 9.2500e+02 4.3850e+02 5.2070e+02 6.4150e+02 + 3.7760e+02 3.2960e+02 6.7590e+02 2.9255e+03 2.0540e+03 3.6983e+03 4.9000e+03 + 1.4498e+03 4.8900e+02 5.1850e+02 3.3280e+02 4.2850e+02 3.7990e+02 5.6460e+02 + 5.1420e+02 6.0520e+02 3.1930e+02 2.4080e+02 4.7770e+02 6.8560e+02 7.3510e+02 + 1.7330e+03 3.3047e+03 2.5153e+03 2.8544e+03 2.0092e+03 7.5440e+02 5.9730e+02 + 8.7810e+02 7.0050e+02 6.0640e+02 3.7300e+02 2.5970e+02 6.1630e+02 3.3760e+02 + 1.8840e+02 5.6900e+02 7.2930e+02 1.5152e+03 8.7270e+02 9.4990e+02 1.1593e+03 + 2.2909e+03 2.1100e+03 1.6823e+03 1.9951e+03 2.3617e+03 2.2256e+03 1.6271e+03 + 2.2665e+03 6.5360e+02 7.4160e+02 6.0720e+02 1.4544e+03 2.9052e+03 2.0213e+03 + 2.7431e+03 3.0690e+02 5.0160e+02 5.1590e+02 8.1800e+01 5.4040e+02 1.2840e+03 + 2.4776e+03 2.3175e+03 2.3476e+03 2.9553e+03 2.3551e+03 5.0210e+02 4.4510e+02 + 3.4310e+02 6.3280e+02 4.8790e+02 7.3230e+02 8.3610e+02 4.1400e+02 2.9770e+02 + 4.4840e+02 1.9300e+02 6.7820e+02 1.8790e+03 1.7808e+03 3.1154e+03 2.3703e+03 + 2.6636e+03 1.7664e+03 4.2970e+02 6.2390e+02 5.6740e+02 6.8840e+02 2.7140e+02 + 4.7030e+02 6.5320e+02 6.9020e+02 3.4170e+02 4.9760e+02 2.9130e+02 3.3720e+02 + 8.6020e+02 6.1620e+02 4.2750e+02 7.0940e+02 1.0423e+03 2.0689e+03 1.5421e+03 + 2.0636e+03 3.7696e+03 1.7722e+03 3.3153e+03 1.9824e+03 7.9140e+02 8.5780e+02 + 4.9280e+02 1.2156e+03 2.1213e+03 4.3381e+03 1.9360e+03 4.9450e+02 4.4120e+02 + 6.5400e+02 4.0790e+02 4.5060e+02 1.9348e+03 3.2862e+03 3.5314e+03 1.8471e+03 + 2.6030e+03 1.1317e+03 8.2840e+02 5.3220e+02 1.6490e+02 7.2410e+02 4.1120e+02 + 5.3050e+02 6.1480e+02 3.3140e+02 5.0170e+02 2.7430e+02 4.7080e+02 7.1060e+02 + 1.7529e+03 1.7289e+03 2.7173e+03 3.1672e+03 3.4299e+03 4.7950e+02 5.3380e+02 + 5.2360e+02 4.7590e+02 2.8150e+02 4.0050e+02 7.8030e+02 8.1750e+02 7.2040e+02 + 4.9470e+02 2.8960e+02 2.0270e+02 3.9160e+02 6.1910e+02 5.1210e+02 5.9380e+02 + 9.2440e+02 6.2740e+02 1.1847e+03 1.2382e+03 2.7861e+03 3.9983e+03 4.0372e+03 + 2.2989e+03 1.1676e+03 7.7870e+02 1.0037e+03 3.9890e+02 4.5440e+02 1.0594e+03 + 2.7423e+03 2.5211e+03 4.7290e+02 4.0560e+02 7.8250e+02 8.3740e+02 8.0940e+02 + 1.7045e+03 2.7828e+03 1.9740e+03 1.1579e+03 3.7134e+03 1.9951e+03 1.3863e+03 + 7.3720e+02 5.7470e+02 5.9250e+02 4.8720e+02 6.4130e+02 6.0330e+02 3.3400e+02 + 4.1570e+02 6.6750e+02 2.5780e+02 6.4840e+02 2.4687e+03 3.7828e+03 1.3569e+03 + 2.7302e+03 3.7845e+03 9.7340e+02 4.9150e+02 6.6080e+02 3.7910e+02 3.5740e+02 + 4.2280e+02 5.7070e+02 4.3620e+02 4.4110e+02 3.2130e+02 6.6660e+02 2.2940e+02 + 8.7100e+02 6.4890e+02 4.6480e+02 4.7300e+02 8.5750e+02 5.3350e+02 7.4410e+02 + 6.3260e+02 1.1698e+03 2*4.9000e+03 2.8309e+03 1.7239e+03 1.0524e+03 + 5.3600e+02 7.4750e+02 4.4950e+02 1.0745e+03 3.3417e+03 2.8460e+03 6.1830e+02 + 4.4110e+02 1.2032e+03 1.1320e+03 2.3303e+03 8.5480e+02 2.2846e+03 2.2797e+03 + 1.2697e+03 2.4905e+03 2.3478e+03 9.6450e+02 5.8280e+02 8.6480e+02 5.7190e+02 + 5.2640e+02 7.7780e+02 3.0350e+02 2.7460e+02 4.5380e+02 7.8360e+02 4.3800e+02 + 4.8030e+02 3.2669e+03 3.0879e+03 1.2485e+03 2.8503e+03 3.2174e+03 8.5230e+02 + 5.0530e+02 7.5080e+02 5.3110e+02 4.1170e+02 6.7470e+02 6.8580e+02 3.2770e+02 + 2.8540e+02 4.1560e+02 7.1690e+02 5.9740e+02 9.1820e+02 3.9290e+02 3.1070e+02 + 4.5320e+02 4.4370e+02 6.7170e+02 1.0899e+03 9.8300e+02 2.5853e+03 4.4533e+03 + 4.4834e+03 3.3820e+03 1.0737e+03 5.5710e+02 6.6810e+02 7.2380e+02 8.0830e+02 + 9.8250e+02 3.8272e+03 3.2605e+03 7.3520e+02 6.1930e+02 7.1480e+02 1.3423e+03 + 1.6086e+03 2.7728e+03 2.5174e+03 1.2555e+03 2.0293e+03 2.6685e+03 1.7790e+03 + 7.5640e+02 1.7700e+02 3.8970e+02 3.9180e+02 3.1310e+02 4.8570e+02 5.2740e+02 + 3.7960e+02 2.5860e+02 8.0590e+02 5.7560e+02 2.1028e+03 2.5224e+03 2.8102e+03 + 1.5618e+03 2.3072e+03 3.0593e+03 1.4207e+03 2.7440e+02 3.1030e+02 4.7060e+02 + 6.6640e+02 2.4470e+02 7.3880e+02 1.9930e+02 4.6810e+02 6.0440e+02 1.3101e+03 + 4.5230e+02 6.2520e+02 6.4320e+02 2.5910e+02 5.1700e+02 4.9570e+02 1.0659e+03 + 7.0710e+02 1.1236e+03 3.2020e+03 3.3548e+03 3.9033e+03 4.5755e+03 1.1498e+03 + 4.0050e+02 4.3730e+02 6.6910e+02 1.0732e+03 1.1745e+03 3.8675e+03 2.3970e+03 + 7.5540e+02 6.5920e+02 1.3937e+03 2.2419e+03 2.7999e+03 9.8760e+02 7.0580e+02 + 7.6720e+02 1.5645e+03 1.7869e+03 1.9613e+03 5.3710e+02 3.0450e+02 2.8150e+02 + 3.4730e+02 6.6960e+02 5.2750e+02 4.6310e+02 5.6300e+02 4.4880e+02 3.6900e+02 + 5.4410e+02 9.6040e+02 3.0237e+03 2.7332e+03 2.0136e+03 2.5438e+03 2.5050e+03 + 6.2660e+02 5.0220e+02 3.8600e+02 7.4310e+02 4.5940e+02 2.3290e+02 4.1860e+02 + 2.9560e+02 4.8310e+02 7.9370e+02 1.0141e+03 7.0180e+02 4.1460e+02 4.0050e+02 + 4.4840e+02 5.8590e+02 1.3778e+03 1.6438e+03 1.0725e+03 1.6526e+03 3.3323e+03 + 1.9349e+03 2.0867e+03 2.1863e+03 2.3880e+03 3.7790e+02 4.9890e+02 5.5320e+02 + 4.2060e+02 1.1308e+03 2.4154e+03 3.4971e+03 6.0690e+02 1.5312e+03 3.2808e+03 + 3.4250e+03 1.0433e+03 6.3830e+02 2.4810e+02 6.8180e+02 1.7405e+03 2.7565e+03 + 2.6650e+03 5.9280e+02 1.9220e+02 4.1960e+02 4.7390e+02 5.1220e+02 6.6700e+02 + 8.5820e+02 9.8270e+02 6.7090e+02 5.6150e+02 4.5260e+02 6.7250e+02 1.9286e+03 + 3.2021e+03 8.5560e+02 2.7524e+03 2.4706e+03 5.0270e+02 5.8700e+02 1.9210e+02 + 4.6120e+02 1.2365e+03 7.2110e+02 3.8430e+02 2.8340e+02 8.4070e+02 1.1312e+03 + 6.2340e+02 6.6840e+02 4.1590e+02 2.4350e+02 6.4210e+02 9.4280e+02 1.4622e+03 + 9.1130e+02 1.5916e+03 1.8418e+03 2.3492e+03 8.7000e+02 9.0210e+02 2.3841e+03 + 2.7228e+03 7.4250e+02 5.4960e+02 5.4490e+02 7.4210e+02 8.0930e+02 2.4009e+03 + 2.8172e+03 1.9843e+03 2.9340e+03 2.7144e+03 2.1479e+03 1.6062e+03 3.5940e+02 + 1.7340e+02 1.0932e+03 1.3275e+03 2.9828e+03 2.9277e+03 3.6140e+02 4.4860e+02 + 4.9620e+02 4.2410e+02 6.1670e+02 2.8890e+02 7.7000e+02 8.2060e+02 1.0349e+03 + 2.9220e+02 4.5960e+02 1.7442e+03 1.2466e+03 3.2393e+03 1.2061e+03 3.7653e+03 + 1.9746e+03 1.7742e+03 6.9770e+02 4.8010e+02 3.8080e+02 7.1300e+02 4.7450e+02 + 2.4490e+02 2.3050e+02 6.6530e+02 5.8600e+02 3.2250e+02 4.2460e+02 4.8250e+02 + 4.7230e+02 7.1010e+02 1.0381e+03 1.6237e+03 2.3733e+03 2.0880e+03 2.4294e+03 + 9.9670e+02 1.5127e+03 9.1220e+02 1.2263e+03 1.5875e+03 5.9980e+02 5.2240e+02 + 4.6500e+02 4.7400e+02 8.1070e+02 1.8543e+03 1.5945e+03 2.6616e+03 2.5099e+03 + 1.9621e+03 1.0756e+03 3.9860e+02 5.7210e+02 2.0920e+02 4.6320e+02 1.6373e+03 + 3.2437e+03 2.4319e+03 3.4370e+02 3.7190e+02 2.2920e+02 3.9090e+02 4.1540e+02 + 7.4280e+02 8.9340e+02 7.4860e+02 5.1320e+02 6.2370e+02 2.5850e+02 7.1890e+02 + 2.4184e+03 2.2109e+03 1.7006e+03 2.5945e+03 3.0141e+03 2.1128e+03 5.2500e+02 + 6.9870e+02 8.4180e+02 7.3630e+02 4.9380e+02 3.7070e+02 5.0000e+02 9.3620e+02 + 4.9280e+02 1.1900e+02 4.9880e+02 4.6950e+02 8.7420e+02 1.0693e+03 2.0511e+03 + 2.2683e+03 1.7403e+03 2.6030e+03 1.2860e+03 8.5190e+02 8.2890e+02 7.8470e+02 + 5.7760e+02 7.7320e+02 6.3280e+02 6.2450e+02 4.8030e+02 4.4480e+02 4.7110e+02 + 2.2827e+03 2.4493e+03 3.7358e+03 4.1194e+03 1.4144e+03 9.7490e+02 2.9190e+02 + 2.9360e+02 4.8120e+02 5.1160e+02 1.7524e+03 2.8088e+03 5.3710e+02 4.6600e+02 + 2.8980e+02 2.4700e+02 5.6750e+02 4.3540e+02 3.1300e+02 5.6550e+02 4.2160e+02 + 8.6920e+02 3.3490e+02 4.0770e+02 8.4460e+02 2.6923e+03 2.3244e+03 1.0301e+03 + 2.6202e+03 3.6461e+03 1.5144e+03 4.8660e+02 9.8060e+02 2.2980e+02 3.8100e+02 + 5.9360e+02 4.6380e+02 8.3200e+02 2.8790e+02 4.0230e+02 3.7450e+02 2.7160e+02 + 3.4290e+02 6.4490e+02 1.3611e+03 1.4234e+03 1.7085e+03 2.2569e+03 2.4017e+03 + 1.0487e+03 6.7670e+02 4.4970e+02 7.7770e+02 1.1239e+03 6.3680e+02 3.7060e+02 + 4.3360e+02 7.1380e+02 4.9050e+02 5.1250e+02 2.4269e+03 4.4604e+03 2.6255e+03 + 2.8525e+03 1.2877e+03 4.8680e+02 5.2220e+02 6.3420e+02 9.1030e+02 7.5850e+02 + 2.4608e+03 3.0321e+03 1.2063e+03 6.0660e+02 6.0190e+02 2.7050e+02 4.5660e+02 + 4.9090e+02 3.2400e+02 7.3720e+02 6.7390e+02 4.5800e+02 3.0790e+02 3.5860e+02 + 6.5080e+02 2.0902e+03 1.8236e+03 9.9680e+02 2.1528e+03 2.2548e+03 1.8056e+03 + 9.4990e+02 4.7670e+02 5.8710e+02 2.0370e+02 3.9480e+02 6.4670e+02 7.7650e+02 + 4.1850e+02 6.3310e+02 6.6570e+02 3.7140e+02 4.0500e+02 1.0131e+03 2.6159e+03 + 1.6656e+03 1.9514e+03 1.9082e+03 7.9200e+02 3.8330e+02 3.3640e+02 3.4130e+02 + 4.0440e+02 8.4460e+02 4.6770e+02 3.3820e+02 3.8450e+02 5.1970e+02 3.1340e+02 + 8.5340e+02 1.6006e+03 4.9000e+03 1.8482e+03 1.3456e+03 8.6840e+02 7.6200e+02 + 8.5680e+02 5.8820e+02 1.4048e+03 6.7560e+02 2.9357e+03 2.5371e+03 8.9380e+02 + 1.0196e+03 6.4950e+02 1.1089e+03 3.1860e+02 3.8640e+02 5.3340e+02 4.2270e+02 + 4.9430e+02 3.0290e+02 7.8340e+02 2.0790e+02 1.2070e+03 2.8597e+03 1.4547e+03 + 9.8840e+02 1.2708e+03 3.0968e+03 3.3809e+03 5.8050e+02 7.8450e+02 5.8440e+02 + 3.1000e+02 5.6110e+02 5.6970e+02 6.8560e+02 6.0250e+02 4.1820e+02 5.6070e+02 + 4.2630e+02 8.7220e+02 2.6975e+03 2.9435e+03 2.4223e+03 8.0170e+02 9.2880e+02 + 7.1860e+02 4.7960e+02 4.0580e+02 5.1140e+02 4.7870e+02 4.0550e+02 1.0594e+03 + 4.9320e+02 3.2140e+02 1.0042e+03 9.1920e+02 3.4530e+02 2.5214e+03 3.5702e+03 + 2.3641e+03 2.2593e+03 4.4240e+02 7.4230e+02 7.2550e+02 8.1630e+02 1.1013e+03 + 1.8631e+03 3.8430e+03 1.0961e+03 8.5820e+02 8.2260e+02 6.1080e+02 5.0470e+02 + 5.2420e+02 3.5310e+02 3.6220e+02 3.6920e+02 5.7040e+02 2.7580e+02 6.3220e+02 + 6.8210e+02 2.6344e+03 3.6415e+03 1.4718e+03 1.0442e+03 1.0728e+03 1.9310e+03 + 3.9064e+03 7.5640e+02 6.9000e+02 4.8590e+02 3.3280e+02 6.8850e+02 8.6890e+02 + 3.1440e+02 8.1300e+02 6.4150e+02 5.1770e+02 3.7730e+02 4.6770e+02 1.5246e+03 + 2.4878e+03 2.3922e+03 3.0570e+02 5.9930e+02 6.3860e+02 6.6090e+02 6.4830e+02 + 5.3380e+02 3.5100e+02 5.5610e+02 3.9570e+02 3.4540e+02 3.1270e+02 1.1401e+03 + 9.6990e+02 1.1990e+03 3.2874e+03 3.1525e+03 8.5350e+02 8.9650e+02 6.5370e+02 + 7.8970e+02 5.9220e+02 9.2080e+02 6.2440e+02 2.0919e+03 4.3417e+03 2.4981e+03 + 9.6930e+02 9.2760e+02 4.5850e+02 5.0990e+02 1.0403e+03 5.0020e+02 1.9270e+02 + 9.4920e+02 7.9840e+02 5.2370e+02 4.4480e+02 6.7280e+02 1.3627e+03 2.6807e+03 + 2.8680e+03 1.8398e+03 5.8120e+02 2.0323e+03 3.9029e+03 1.8833e+03 5.6460e+02 + 8.0200e+02 4.7740e+02 8.8230e+02 6.4600e+02 6.3710e+02 5.1470e+02 4.6170e+02 + 4.0620e+02 5.8520e+02 1.0793e+03 2.3654e+03 1.5653e+03 6.6500e+02 5.1290e+02 + 3.2610e+02 4.5860e+02 5.7460e+02 6.7710e+02 5.9230e+02 3.1580e+02 3.6750e+02 + 2.4150e+02 3.1850e+02 3.8770e+02 5.1730e+02 1.1502e+03 2.8284e+03 2.9782e+03 + 3.5126e+03 1.8461e+03 7.6850e+02 5.0470e+02 3.5470e+02 5.2310e+02 3.4250e+02 + 4.5300e+02 2.3323e+03 2.9561e+03 2.0798e+03 9.4160e+02 4.5430e+02 6.7330e+02 + 7.7290e+02 4.6210e+02 4.3700e+02 1.9120e+02 1.0133e+03 6.2780e+02 5.6010e+02 + 3.7120e+02 5.2420e+02 1.9302e+03 3.9318e+03 3.5872e+03 2.0262e+03 4.9830e+02 + 1.1244e+03 3.0328e+03 1.8618e+03 4.6340e+02 5.6600e+02 4.8880e+02 4.5230e+02 + 5.0680e+02 7.5600e+02 2.5090e+02 5.1840e+02 5.0200e+02 4.5550e+02 2.3024e+03 + 3.3617e+03 2.2458e+03 1.9614e+03 4.4910e+02 3.4740e+02 2.4180e+02 3.8610e+02 + 5.2830e+02 5.0140e+02 5.5030e+02 2.8390e+02 4.1380e+02 4.0700e+02 3.7390e+02 + 5.1690e+02 1.8222e+03 2.5349e+03 2.5077e+03 1.9406e+03 7.7630e+02 7.5260e+02 + 5.4920e+02 5.7880e+02 8.0530e+02 5.2060e+02 7.4910e+02 3.1357e+03 3.0579e+03 + 1.9851e+03 1.0278e+03 7.0740e+02 3.7790e+02 5.2870e+02 7.2830e+02 2.7140e+02 + 3.7750e+02 7.5280e+02 7.6150e+02 8.1840e+02 2.6060e+02 4.8110e+02 2.2443e+03 + 2.4379e+03 2.7023e+03 8.1120e+02 2.0400e+02 1.2572e+03 3.9811e+03 2.3445e+03 + 9.2020e+02 6.3140e+02 6.1390e+02 4.3620e+02 5.0180e+02 5.8240e+02 5.3230e+02 + 6.1190e+02 3.3540e+02 9.9760e+02 2.3700e+03 4.4991e+03 1.4869e+03 7.6330e+02 + 2.9090e+02 2.9970e+02 1.8200e+02 5.3500e+02 6.2570e+02 8.1590e+02 5.4440e+02 + 2.9070e+02 5.6920e+02 7.7380e+02 2.5330e+02 5.1790e+02 9.9210e+02 3.0593e+03 + 3.3107e+03 4.6690e+02 8.7120e+02 7.2850e+02 7.5270e+02 6.5890e+02 7.1390e+02 + 4.9740e+02 3.2320e+02 2.0040e+03 2.3047e+03 1.4361e+03 8.5330e+02 3.6880e+02 + 2.9150e+02 3.1380e+02 7.2050e+02 7.3440e+02 3.5670e+02 6.4270e+02 1.2738e+03 + 1.3238e+03 4.5060e+02 4.2530e+02 1.9098e+03 2.6451e+03 2.5438e+03 7.7200e+02 + 3.4600e+02 1.0251e+03 3.0706e+03 3.7265e+03 1.5075e+03 6.1290e+02 3.6660e+02 + 3.0590e+02 4.6710e+02 6.1320e+02 5.5180e+02 5.0090e+02 2.8770e+02 9.4780e+02 + 2.9180e+03 4.2823e+03 1.8117e+03 1.0246e+03 4.6580e+02 1.7750e+02 4.5890e+02 + 6.4960e+02 6.5800e+02 4.3510e+02 3.5640e+02 4.0140e+02 2.8000e+02 8.3780e+02 + 3.7860e+02 5.5450e+02 1.7465e+03 2.2772e+03 2.7313e+03 5.4540e+02 6.1300e+02 + 2*5.6950e+02 8.4950e+02 9.8680e+02 2.6260e+02 3.9530e+02 2.9796e+03 + 2.9001e+03 6.5000e+02 5.9550e+02 5.1170e+02 3.0550e+02 5.7240e+02 6.6880e+02 + 1.0886e+03 1.8760e+02 2.0390e+02 9.1400e+02 1.0496e+03 5.9140e+02 2.6990e+02 + 1.4893e+03 2.7959e+03 1.4757e+03 4.6450e+02 3.9590e+02 6.7020e+02 1.8080e+03 + 2.5671e+03 1.8679e+03 8.1850e+02 6.5670e+02 3.0390e+02 4.5880e+02 5.2990e+02 + 2.5760e+02 3.0740e+02 6.8820e+02 1.0458e+03 3.5155e+03 2.4692e+03 1.2024e+03 + 6.7080e+02 3.8710e+02 6.5010e+02 4.9850e+02 5.5020e+02 4.7070e+02 5.0860e+02 + 4.5470e+02 3.9190e+02 3.8610e+02 7.2340e+02 2.5410e+02 4.5660e+02 1.9185e+03 + 2.8505e+03 1.8418e+03 9.8960e+02 1.0698e+03 4.1200e+02 5.8220e+02 5.0140e+02 + 7.7250e+02 2.7280e+02 5.8200e+02 2.8817e+03 4.1342e+03 1.5986e+03 6.6650e+02 + 4.1300e+02 3.3090e+02 5.2920e+02 6.7840e+02 7.0550e+02 2.9680e+02 5.8280e+02 + 4.7580e+02 5.6290e+02 5.7780e+02 6.3170e+02 6.1050e+02 3.2861e+03 2.2683e+03 + 3.3530e+02 3.7080e+02 1.0102e+03 1.7434e+03 1.7839e+03 3.0785e+03 1.9985e+03 + 3.6000e+02 3.0330e+02 2.6210e+02 4.2480e+02 4.0360e+02 7.5500e+02 1.5827e+03 + 2.4987e+03 2.9359e+03 2.1636e+03 9.2640e+02 7.3040e+02 3.5410e+02 5.7400e+02 + 4.7020e+02 9.1360e+02 2.9050e+02 2.4840e+02 7.3850e+02 6.3360e+02 6.4050e+02 + 3.4300e+02 2.6520e+02 4.6430e+02 2.6671e+03 3.0652e+03 1.4953e+03 6.6150e+02 + 1.0669e+03 3.6490e+02 6.5590e+02 4.5420e+02 5.3000e+02 2.3850e+02 9.8610e+02 + 2.4835e+03 3.1832e+03 1.1957e+03 3.8650e+02 4.1720e+02 5.1340e+02 3.9700e+02 + 5.3480e+02 9.4900e+02 4.7060e+02 5.6620e+02 3.5970e+02 4.4280e+02 3.3810e+02 + 8.2080e+02 1.8221e+03 2.9231e+03 2.0024e+03 8.7720e+02 5.8350e+02 4.3600e+02 + 7.0490e+02 2.3589e+03 3.5451e+03 1.8660e+03 6.7390e+02 5.3510e+02 3.2870e+02 + 2.6850e+02 7.1060e+02 5.8670e+02 2.4095e+03 2.5092e+03 2.3287e+03 2.1412e+03 + 3.9040e+02 4.4140e+02 2.9190e+02 4.2510e+02 4.5460e+02 1.0744e+03 3.3020e+02 + 2.8180e+02 3.3290e+02 4.7440e+02 1.2749e+03 3.5120e+02 2.8570e+02 7.0700e+02 + 1.2669e+03 3.7979e+03 9.0020e+02 4.8100e+02 1.0783e+03 3.2790e+02 3.1390e+02 + 2.4070e+02 3.3030e+02 4.3860e+02 8.5720e+02 9.8420e+02 3.8253e+03 1.2806e+03 + 4.0020e+02 4.2520e+02 1.6980e+02 4.5270e+02 4.5710e+02 9.7280e+02 6.6990e+02 + 8.6330e+02 6.5610e+02 4.1000e+02 2.9280e+02 3.9630e+02 1.8008e+03 3.0435e+03 + 2.5093e+03 1.8968e+03 6.8850e+02 4.1740e+02 6.9970e+02 1.5493e+03 2.7279e+03 + 1.4747e+03 8.9900e+02 4.5910e+02 3.6250e+02 4.0710e+02 1.2821e+03 1.6120e+03 + 3.2350e+03 2.5341e+03 2.0251e+03 1.5580e+03 7.5470e+02 2.1320e+02 2.7810e+02 + 9.8040e+02 1.0911e+03 7.2910e+02 2.5800e+02 3.1910e+02 3.2360e+02 3.4170e+02 + 8.1740e+02 3.7640e+02 4.5160e+02 6.0350e+02 2.3004e+03 3.3898e+03 1.4363e+03 + 5.9020e+02 1.4363e+03 6.2970e+02 3.4510e+02 2.1440e+02 5.1520e+02 5.1340e+02 + 6.9760e+02 2.1095e+03 3.3718e+03 1.7125e+03 4.7600e+02 3.8380e+02 2.0110e+02 + 2.6140e+02 6.3060e+02 4.4360e+02 6.1330e+02 5.0600e+02 4.3160e+02 5.5970e+02 + 3.3280e+02 8.3520e+02 2.0146e+03 3.3751e+03 2.3150e+03 1.0114e+03 4.9720e+02 + 4.0750e+02 1.1294e+03 9.7880e+02 1.7762e+03 2.6165e+03 1.1840e+03 5.9490e+02 + 9.1900e+02 1.4267e+03 2.2129e+03 2.5690e+03 2.3474e+03 2.5537e+03 1.2612e+03 + 8.5010e+02 5.7300e+02 5.3550e+02 1.1690e+02 5.8520e+02 6.8660e+02 8.0220e+02 + 4.8150e+02 7.8920e+02 8.4280e+02 4.3760e+02 5.7480e+02 3.0330e+02 3.4080e+02 + 9.8650e+02 2.5955e+03 3.5522e+03 1.2379e+03 1.1638e+03 9.1780e+02 6.0030e+02 + 3.3540e+02 2.2660e+02 9.4720e+02 6.1850e+02 6.0840e+02 1.7153e+03 3.1137e+03 + 2.8531e+03 1.1129e+03 5.5090e+02 4.0710e+02 2.2320e+02 3.6970e+02 3.6050e+02 + 9.0750e+02 8.3750e+02 4.8560e+02 3.3870e+02 4.0210e+02 4.0050e+02 1.2802e+03 + 2.2881e+03 2.8440e+03 7.4010e+02 3.9490e+02 4.3710e+02 6.7210e+02 7.0520e+02 + 7.8140e+02 2.5105e+03 2.7597e+03 1.1572e+03 2.0919e+03 2.2512e+03 2.5146e+03 + 2.0097e+03 3.1629e+03 1.9093e+03 5.1920e+02 3.2020e+02 3.5000e+02 4.2870e+02 + 3.5190e+02 6.0860e+02 6.3810e+02 9.2810e+02 6.7930e+02 9.4060e+02 5.7010e+02 + 8.3980e+02 3.2960e+02 6.5740e+02 3.3290e+02 8.8370e+02 2.6095e+03 4.0139e+03 + 1.4358e+03 7.5530e+02 5.3670e+02 4.1320e+02 2.8590e+02 4.8250e+02 7.8200e+02 + 8.3090e+02 7.1860e+02 1.6533e+03 2.3006e+03 3.3894e+03 1.4020e+03 6.0210e+02 + 5.0970e+02 7.7930e+02 4.8550e+02 5.3970e+02 4.6030e+02 6.0210e+02 2.4900e+02 + 2.4470e+02 2.9890e+02 1.6920e+02 1.2715e+03 3.6346e+03 1.6215e+03 1.3924e+03 + 4.6500e+02 6.8360e+02 5.8900e+02 4.0020e+02 5.9570e+02 3.6143e+03 3.8672e+03 + 1.3601e+03 3.2007e+03 2.9748e+03 3.2616e+03 1.7636e+03 1.1449e+03 9.5040e+02 + 5.3830e+02 3.6280e+02 4.9410e+02 8.0300e+02 3.1740e+02 9.8330e+02 8.3030e+02 + 7.5680e+02 4.5340e+02 3.6890e+02 6.2320e+02 7.6860e+02 1.0073e+03 5.7930e+02 + 6.3320e+02 1.0869e+03 3.4115e+03 3.0856e+03 6.2180e+02 4.7930e+02 1.3820e+02 + 3.2470e+02 3.6790e+02 3.8670e+02 8.0960e+02 3.8970e+02 5.5250e+02 1.2334e+03 + 1.4838e+03 2.5210e+03 1.4141e+03 6.4950e+02 4.9600e+02 8.2930e+02 3.9230e+02 + 2.5690e+02 7.7430e+02 9.1280e+02 4.2590e+02 1.0030e+02 3.1490e+02 3.0810e+02 + 7.6870e+02 2.8121e+03 1.3126e+03 8.6770e+02 5.1450e+02 4.4120e+02 1.0306e+03 + 5.7870e+02 7.6200e+02 2.0281e+03 3.6129e+03 2.4509e+03 2.8866e+03 4.5044e+03 + 8.8740e+02 8.6260e+02 1.0015e+03 5.7650e+02 5.6120e+02 6.0630e+02 7.4400e+02 + 6.6060e+02 3.1790e+02 7.0100e+02 1.2624e+03 6.0360e+02 4.6680e+02 5.7010e+02 + 1.0102e+03 8.0800e+02 7.7880e+02 7.0310e+02 8.6190e+02 1.0565e+03 3.4785e+03 + 4.0203e+03 7.9560e+02 5.7740e+02 2.4470e+02 4.8160e+02 2.0310e+02 1.1342e+03 + 7.6220e+02 4.1970e+02 2.5820e+02 5.2680e+02 2.1399e+03 4.0208e+03 1.2306e+03 + 8.4040e+02 4.8390e+02 4.3450e+02 7.4720e+02 3.3550e+02 3.9950e+02 9.3480e+02 + 4.6480e+02 1.5510e+02 3.8350e+02 5.7780e+02 1.5184e+03 3.3992e+03 1.7667e+03 + 6.2670e+02 7.9420e+02 7.9760e+02 4.8780e+02 4.9990e+02 6.4240e+02 7.5890e+02 + 2.6641e+03 3.2080e+03 2.3280e+03 4.1848e+03 8.9640e+02 3.7980e+02 2.8450e+02 + 5.9090e+02 4.9900e+02 6.3800e+02 2*5.0690e+02 3.4200e+02 6.3800e+02 + 5.7750e+02 4.4650e+02 3.6190e+02 6.4250e+02 9.9020e+02 1.1112e+03 8.6180e+02 + 7.8920e+02 4.2700e+02 1.3560e+03 2.0474e+03 2.0351e+03 4.5140e+02 4.8350e+02 + 3.7140e+02 2.7680e+02 4.1340e+02 2.4400e+02 3.1670e+02 9.2690e+02 5.3720e+02 + 3.2490e+02 2.1513e+03 2.9023e+03 2.3212e+03 9.2950e+02 9.0530e+02 4.4370e+02 + 6.2370e+02 5.2000e+02 4.5730e+02 8.9550e+02 3.5490e+02 3.9870e+02 2.8500e+02 + 6.6460e+02 2.2513e+03 3.1319e+03 1.1255e+03 7.3390e+02 4.9030e+02 3.8720e+02 + 5.5520e+02 5.6330e+02 4.5580e+02 9.8530e+02 2.7979e+03 3.4852e+03 4.6592e+03 + 3.9383e+03 2.0345e+03 2.5630e+02 3.3560e+02 7.3300e+02 3.4460e+02 4.3310e+02 + 2.7750e+02 5.5740e+02 1.9710e+02 5.9820e+02 7.8020e+02 6.7250e+02 7.2940e+02 + 4.1330e+02 7.9370e+02 8.3610e+02 1.8935e+03 5.2420e+02 3.9520e+02 1.2253e+03 + 2.6762e+03 3.1801e+03 6.5730e+02 3.9610e+02 5.8820e+02 1.8300e+02 2.5550e+02 + 1.6570e+02 5.8130e+02 6.9250e+02 5.9870e+02 5.1410e+02 2.2470e+03 2.3284e+03 + 2.9859e+03 1.5400e+03 5.5370e+02 3.3000e+02 7.6470e+02 6.2920e+02 2.2190e+02 + 3.9350e+02 2.1550e+02 2.8150e+02 7.3740e+02 2.1524e+03 3.4828e+03 3.8679e+03 + 7.3530e+02 2.5520e+02 5.2390e+02 4.3350e+02 7.0770e+02 7.0270e+02 5.0680e+02 + 4.0090e+02 1.3702e+03 3.2350e+03 4.7928e+03 2.9663e+03 1.2355e+03 2.0230e+02 + 3.0230e+02 6.0190e+02 6.0940e+02 4.4160e+02 5.6530e+02 4.0820e+02 4.0590e+02 + 4.7190e+02 7.8430e+02 7.5780e+02 6.6280e+02 4.4260e+02 4.7830e+02 5.6060e+02 + 1.3892e+03 5.3970e+02 2.2350e+02 7.8740e+02 1.1310e+03 2.2921e+03 7.4440e+02 + 4.1380e+02 5.5290e+02 3.3360e+02 1.6610e+02 3.3200e+02 9.9080e+02 7.9070e+02 + 4.7810e+02 4.1950e+02 7.9810e+02 2.4682e+03 2.9593e+03 1.9947e+03 8.7810e+02 + 2.0510e+02 7.5080e+02 4.9240e+02 3.7270e+02 4.8500e+02 3.0310e+02 4.2660e+02 + 6.3360e+02 1.3381e+03 3.4938e+03 2.9471e+03 6.2520e+02 2.1860e+02 2.2210e+02 + 5.6570e+02 4.2770e+02 7.5890e+02 3.4330e+02 6.5490e+02 2.2039e+03 3.3972e+03 + 4.4475e+03 2.6902e+03 1.4898e+03 3.4320e+02 3.0080e+02 6.3490e+02 8.5170e+02 + 6.9040e+02 2.7980e+02 3.7300e+02 5.3060e+02 3.6550e+02 1.0567e+03 9.0870e+02 + 6.6290e+02 5.0440e+02 2.8390e+02 3.9720e+02 2.3297e+03 5.0760e+02 4.5300e+02 + 3.5290e+02 1.7261e+03 1.7077e+03 1.3963e+03 4.2570e+02 8.0800e+02 7.8770e+02 + 3.4860e+02 3.4760e+02 9.4400e+02 3.6300e+02 2.7620e+02 3.4250e+02 7.3310e+02 + 1.4184e+03 2.9203e+03 2.0053e+03 1.6180e+03 4.4090e+02 8.8200e+02 2.3470e+02 + 2.4840e+02 6.1190e+02 5.9150e+02 4.5280e+02 7.8040e+02 2.3154e+03 3.2707e+03 + 2.9770e+03 3.3230e+02 3.1490e+02 3.4830e+02 4.8730e+02 6.9430e+02 3.9760e+02 + 2.6770e+02 3.7310e+02 1.1148e+03 2.0071e+03 4.1287e+03 1.7777e+03 5.0340e+02 + 8.5420e+02 5.3020e+02 5.7550e+02 5.9180e+02 6.5850e+02 2.4290e+02 4.3350e+02 + 1.1037e+03 6.4730e+02 4.4050e+02 7.3290e+02 8.7030e+02 3.8890e+02 3.4250e+02 + 9.9000e+01 1.8070e+03 1.2108e+03 6.2370e+02 3.4130e+02 1.4198e+03 2.1679e+03 + 1.6450e+03 8.6110e+02 1.2899e+03 7.2160e+02 9.8690e+02 4.9480e+02 4.7280e+02 + 6.6470e+02 1.8940e+02 3.5360e+02 8.6630e+02 8.8960e+02 1.9140e+03 2.7330e+03 + 1.2597e+03 6.7330e+02 6.6540e+02 2.2100e+02 5.4270e+02 6.4600e+02 4.7950e+02 + 8.3140e+02 6.5770e+02 1.7796e+03 2.2572e+03 1.3452e+03 7.1520e+02 3.3490e+02 + 4.3160e+02 9.5710e+02 1.0750e+03 4.3970e+02 1.1480e+02 6.4640e+02 7.4440e+02 + 1.9821e+03 3.2342e+03 2.9706e+03 2.2112e+03 5.0150e+02 7.1640e+02 2.2120e+02 + 2.8070e+02 4.8800e+02 3.6950e+02 1.8560e+02 1.0977e+03 8.6530e+02 6.2440e+02 + 8.0660e+02 1.1557e+03 4.1390e+02 2.0350e+02 8.4400e+01 2.3341e+03 5.2680e+02 + 7.4090e+02 1.2929e+03 1.7951e+03 1.5245e+03 5.2470e+02 6.2410e+02 1.5780e+02 + 7.5270e+02 2.2834e+03 2.0910e+03 1.2465e+03 8.7080e+02 8.8590e+02 1.1585e+03 + 4.6950e+02 3.5170e+02 2.5290e+02 6.4240e+02 1.0420e+03 2.6474e+03 1.7103e+03 + 1.2374e+03 1.2885e+03 7.5830e+02 4.8910e+02 1.9025e+03 1.6445e+03 1.5170e+03 + 7.4200e+02 1.4441e+03 9.0810e+02 4.7850e+02 6.6800e+02 7.5000e+02 6.2990e+02 + 9.2730e+02 1.1590e+03 2.0340e+03 2.1878e+03 2.9273e+03 1.5637e+03 4.4650e+02 + 3.9110e+02 5.0430e+02 1.5660e+02 1.7170e+02 2.9170e+02 6.1420e+02 3.8340e+02 + 5.2430e+02 8.0660e+02 1.1332e+03 8.0050e+02 4.8980e+02 7.7420e+02 1.1755e+03 + 7.8650e+02 6.5250e+02 8.2200e+02 4.9670e+02 4.9610e+02 2.1699e+03 1.6536e+03 + 8.2740e+02 6.1010e+02 3.3010e+02 3.2010e+02 1.2244e+03 1.4921e+03 2.2711e+03 + 7.3560e+02 5.8970e+02 7.0870e+02 7.1510e+02 5.5940e+02 5.2050e+02 3.4390e+02 + 3.0150e+02 4.9200e+02 1.6736e+03 2.0471e+03 1.2122e+03 9.6600e+02 6.1420e+02 + 4.3950e+02 6.5330e+02 2.3792e+03 2.0770e+03 1.4462e+03 1.0846e+03 6.5050e+02 + 2.3200e+02 8.1680e+02 6.5290e+02 5.1070e+02 1.0254e+03 7.2100e+02 3.8180e+02 + 2*3.5000e+03 1.8240e+03 1.0235e+03 3.6900e+02 6.8070e+02 2.3740e+02 + 1.6910e+02 4.3750e+02 3.9350e+02 1.2250e+02 2.0120e+02 7.2010e+02 1.3657e+03 + 4.7050e+02 4.9910e+02 8.8000e+02 6.3970e+02 7.8560e+02 5.4100e+02 2.9690e+02 + 9.3480e+02 9.1700e+02 2.2505e+03 1.1541e+03 1.2206e+03 4.1090e+02 4.1340e+02 + 4.0320e+02 9.1930e+02 2.6677e+03 1.9880e+03 1.5268e+03 3.3960e+02 4.4070e+02 + 4.2350e+02 4.3490e+02 3.6960e+02 4.8990e+02 4.0330e+02 6.7600e+02 1.0504e+03 + 2.7547e+03 1.4891e+03 1.1088e+03 5.6210e+02 3.4970e+02 7.4790e+02 1.1031e+03 + 1.6024e+03 6.4050e+02 1.0827e+03 4.7380e+02 4.5390e+02 8.4010e+02 4.7710e+02 + 8.4670e+02 3.2690e+02 4.4960e+02 1.5520e+03 3.2765e+03 2.2965e+03 3.0535e+03 + 8.0000e+02 1.5601e+03 4.3800e+02 4.9460e+02 2.2710e+02 1.0418e+03 4.0290e+02 + 3.8930e+02 2.8990e+02 8.1130e+02 6.8870e+02 6.8320e+02 5.4260e+02 5.8060e+02 + 6.0590e+02 5.8490e+02 7.7100e+02 5.7520e+02 1.4116e+03 1.6649e+03 1.8214e+03 + 1.0987e+03 5.0510e+02 5.5040e+02 3.3240e+02 7.5400e+02 1.1045e+03 2.5100e+03 + 1.3058e+03 9.1380e+02 2.5800e+02 3.7060e+02 5.4890e+02 4.3200e+02 3.2330e+02 + 7.5720e+02 5.0910e+02 3.3050e+02 7.5070e+02 2.0101e+03 1.3907e+03 6.4350e+02 + 4.8500e+02 3.9310e+02 6.9500e+02 1.5524e+03 1.2181e+03 1.5973e+03 1.6171e+03 + 3.6410e+02 6.7890e+02 9.5800e+02 8.7670e+02 4.0470e+02 2.7360e+02 6.3640e+02 + 1.2355e+03 2.1106e+03 2.2302e+03 1.9214e+03 2.4730e+03 1.2996e+03 7.0020e+02 + 6.8390e+02 1.8030e+02 4.0520e+02 6.6690e+02 6.9460e+02 4.5970e+02 3.6390e+02 + 4.2390e+02 4.2160e+02 6.1510e+02 4.1570e+02 3.2630e+02 4.5490e+02 1.0803e+03 + 8.3610e+02 1.2506e+03 1.4903e+03 1.8111e+03 1.6937e+03 3.5460e+02 6.3800e+02 + 5.8850e+02 4.9950e+02 1.4403e+03 1.6376e+03 1.7215e+03 7.3830e+02 4.2070e+02 + 3.4940e+02 6.2540e+02 3.2350e+02 2.7340e+02 3.5920e+02 4.8800e+02 5.2400e+02 + 1.5547e+03 2.0981e+03 1.8550e+03 6.4900e+02 6.8070e+02 5.6600e+02 1.3182e+03 + 8.1900e+02 1.9097e+03 1.2201e+03 2.0746e+03 9.7870e+02 1.0207e+03 3.8360e+02 + 4.3520e+02 4.4300e+02 3.9800e+02 5.3760e+02 1.3467e+03 1.5896e+03 2.7295e+03 + 1.5821e+03 2.7612e+03 1.1335e+03 1.0159e+03 2.8150e+02 5.2900e+02 2.5130e+02 + 6.1660e+02 8.3660e+02 8.4790e+02 2.3500e+02 3.2770e+02 4.9990e+02 1.0539e+03 + 3.7460e+02 2.2850e+02 8.8570e+02 1.0653e+03 4.7400e+02 6.9030e+02 2.1908e+03 + 2.2699e+03 5.8460e+02 3.6870e+02 4.0720e+02 1.2485e+03 7.4360e+02 1.6074e+03 + 2.5332e+03 1.7314e+03 7.1210e+02 3.6060e+02 6.5550e+02 5.3870e+02 1.3850e+02 + 2.8140e+02 3.6530e+02 4.9480e+02 6.6890e+02 9.0900e+02 1.7401e+03 1.7140e+03 + 1.2424e+03 5.3300e+02 5.1190e+02 1.2390e+03 6.2760e+02 1.3099e+03 1.4751e+03 + 1.6355e+03 1.5779e+03 1.5376e+03 4.5730e+02 6.3240e+02 5.1570e+02 3.4510e+02 + 3.4760e+02 9.3450e+02 1.8287e+03 2.0129e+03 2.4593e+03 2.6705e+03 1.8275e+03 + 6.5280e+02 4.6800e+02 4.9820e+02 5.8390e+02 8.2900e+02 9.4470e+02 2.1530e+02 + 1.4520e+02 3.9280e+02 6.3590e+02 1.0880e+03 3.3510e+02 5.2500e+02 1.0693e+03 + 9.7750e+02 2.1248e+03 1.9925e+03 1.8188e+03 1.4520e+03 5.7150e+02 3.7020e+02 + 6.0900e+02 5.4340e+02 5.3810e+02 1.5131e+03 1.6989e+03 1.4964e+03 8.4670e+02 + 4.6050e+02 5.5110e+02 7.4500e+02 3.5020e+02 2.4450e+02 3.4480e+02 5.3540e+02 + 8.1950e+02 7.6110e+02 1.2151e+03 1.8812e+03 8.6780e+02 1.0274e+03 6.3810e+02 + 5.4340e+02 6.1080e+02 9.1660e+02 9.6440e+02 1.9411e+03 1.7880e+03 5.2480e+02 + 9.2960e+02 6.4180e+02 6.6780e+02 1.7820e+02 4.8750e+02 1.2617e+03 1.2534e+03 + 1.6164e+03 2.0085e+03 1.8262e+03 1.6717e+03 4.4050e+02 3.3420e+02 3.0990e+02 + 5.9060e+02 9.0890e+02 9.5470e+02 4.1060e+02 4.8420e+02 4.6560e+02 5.3080e+02 + 9.0090e+02 3.3150e+02 5.2410e+02 5.6560e+02 1.2820e+03 1.6930e+03 2.6501e+03 + 1.8994e+03 1.5406e+03 2.1780e+02 4.2960e+02 8.9650e+02 6.1110e+02 5.2450e+02 + 1.8558e+03 2.4656e+03 1.2611e+03 9.8810e+02 8.0090e+02 6.7390e+02 6.7700e+02 + 2.7330e+02 3.5440e+02 4.8740e+02 3.3280e+02 2.9080e+02 7.9400e+02 1.8909e+03 + 2.2836e+03 8.3890e+02 7.1040e+02 1.9070e+02 4.0030e+02 4.0820e+02 6.4800e+02 + 7.8270e+02 1.4022e+03 1.6423e+03 1.2990e+03 1.4845e+03 8.1620e+02 3.8210e+02 + 4.5390e+02 4.6900e+02 1.6845e+03 1.8811e+03 1.5316e+03 1.2008e+03 1.5233e+03 + 1.6769e+03 6.4270e+02 3.7440e+02 3.9970e+02 7.2060e+02 6.2880e+02 4.4940e+02 + 4.5740e+02 3.2710e+02 6.0340e+02 6.3420e+02 1.8620e+02 2.7030e+02 4.3340e+02 + 3.2320e+02 1.3155e+03 2.4461e+03 2.1424e+03 2.4385e+03 7.1120e+02 2.8000e+02 + 3.7380e+02 5.1280e+02 4.1400e+02 2.8780e+02 8.9010e+02 2.4526e+03 1.5096e+03 + 1.1015e+03 6.3590e+02 4.5350e+02 1.0340e+03 2.8060e+02 5.5340e+02 7.3250e+02 + 2.3680e+02 2.6610e+02 6.8380e+02 1.1886e+03 2.0940e+03 1.5996e+03 7.1010e+02 + 4.7370e+02 5.1990e+02 6.1240e+02 4.2520e+02 5.6440e+02 1.3583e+03 1.1252e+03 + 1.8228e+03 1.3333e+03 8.8310e+02 3.9450e+02 2.4560e+02 4.3610e+02 1.5171e+03 + 1.8864e+03 1.5094e+03 1.5077e+03 9.6770e+02 7.2930e+02 8.5220e+02 3.9840e+02 + 3.6590e+02 7.2660e+02 5.8160e+02 3.0040e+02 2.7190e+02 4.3290e+02 9.5240e+02 + 5.6550e+02 2.2760e+02 2.1610e+02 4.7480e+02 1.1250e+03 8.2830e+02 2.2718e+03 + 2.1062e+03 1.8900e+03 9.0520e+02 3.1380e+02 7.3200e+02 1.0593e+03 6.3680e+02 + 2.2710e+02 8.1780e+02 1.8753e+03 1.3544e+03 7.2410e+02 5.7310e+02 9.4610e+02 + 5.5450e+02 4.2990e+02 4.4920e+02 5.8250e+02 2.7120e+02 1.1500e+02 3.5950e+02 + 1.5654e+03 1.8485e+03 1.8579e+03 3.2530e+02 5.5420e+02 6.8880e+02 6.5350e+02 + 5.3090e+02 5.5920e+02 8.4280e+02 1.4245e+03 1.8124e+03 1.7628e+03 1.5944e+03 + 8.4600e+02 2.8920e+02 9.3260e+02 1.8382e+03 1.5917e+03 1.5066e+03 1.6804e+03 + 1.9830e+03 1.4166e+03 5.2830e+02 2.4920e+02 2.5880e+02 6.6830e+02 3.8790e+02 + 1.7690e+02 1.6800e+02 3.8690e+02 6.2110e+02 1.3341e+03 4.9270e+02 3.8470e+02 + 6.4200e+02 9.9200e+02 1.2732e+03 2.4603e+03 9.7140e+02 2.2715e+03 1.0723e+03 + 3.6700e+02 5.1530e+02 6.4190e+02 5.2580e+02 2.0380e+02 9.1610e+02 1.5212e+03 + 1.2530e+03 4.4610e+02 5.3370e+02 4.4340e+02 8.2870e+02 7.7600e+02 4.6650e+02 + 6.2910e+02 5.7230e+02 4.0290e+02 6.4300e+02 8.9940e+02 2.8595e+03 1.0779e+03 + 3.9850e+02 3.6610e+02 8.1200e+02 1.4974e+03 6.1220e+02 3.9420e+02 4.3370e+02 + 5.9830e+02 8.2670e+02 2.8459e+03 1.5398e+03 4.7660e+02 7.9060e+02 8.6690e+02 + 2.6927e+03 1.6647e+03 1.1225e+03 1.7636e+03 1.8848e+03 8.9150e+02 1.2243e+03 + 3.5420e+02 2.3000e+02 4.6570e+02 3.9730e+02 2.0860e+02 1.6540e+02 6.4490e+02 + 7.2950e+02 3.9720e+02 3.3470e+02 3.7740e+02 6.3700e+02 1.5335e+03 1.3093e+03 + 1.8425e+03 1.5320e+03 2.0588e+03 1.5398e+03 5.4090e+02 6.7640e+02 7.3560e+02 + 5.3540e+02 2.2330e+02 7.1490e+02 1.0671e+03 1.9211e+03 6.0730e+02 3.3200e+02 + 5.2920e+02 5.3730e+02 5.7860e+02 3.4350e+02 5.1140e+02 2.9260e+02 5.6480e+02 + 4.7570e+02 9.8500e+02 2.6631e+03 1.3356e+03 6.9060e+02 3.1980e+02 2.7150e+02 + 8.4740e+02 6.7850e+02 2.4090e+02 3.7280e+02 6.2300e+02 1.1347e+03 2.7337e+03 + 1.9003e+03 7.5010e+02 1.0688e+03 1.5450e+03 2.0256e+03 6.6090e+02 1.1939e+03 + 2.3686e+03 1.7874e+03 1.2044e+03 7.5540e+02 3.2530e+02 1.8060e+02 3.5720e+02 + 5.8070e+02 4.5610e+02 5.2680e+02 3.1720e+02 5.9290e+02 5.2170e+02 4.4760e+02 + 7.5170e+02 3.7460e+02 8.7260e+02 1.9462e+03 1.5988e+03 1.7852e+03 2.8455e+03 + 8.8590e+02 1.0064e+03 6.2340e+02 9.5940e+02 4.5840e+02 4.0680e+02 6.1570e+02 + 7.7890e+02 2.0344e+03 8.3330e+02 5.1490e+02 4.3230e+02 8.6880e+02 2.2150e+02 + 3.2170e+02 4.3090e+02 3.0800e+02 7.8410e+02 4.9210e+02 9.4750e+02 1.8543e+03 + 1.2055e+03 6.2290e+02 1.8760e+02 6.1370e+02 5.1060e+02 6.3260e+02 7.2640e+02 + 5.3850e+02 1.9990e+02 8.1050e+02 1.5343e+03 1.3106e+03 1.9178e+03 9.4760e+02 + 1.6024e+03 1.4448e+03 6.5660e+02 1.2951e+03 2.3768e+03 2.0707e+03 9.5610e+02 + 3.9390e+02 6.0100e+02 4.6040e+02 1.7050e+02 5.2610e+02 7.5910e+02 7.4020e+02 + 4.0670e+02 4.9180e+02 7.8500e+02 2.9000e+02 4.3290e+02 6.6300e+02 1.1832e+03 + 2.1210e+03 1.1518e+03 1.6325e+03 2.9941e+03 9.0020e+02 9.8840e+02 1.0144e+03 + 4.9450e+02 4.1550e+02 3.5330e+02 5.2680e+02 1.0693e+03 2.4318e+03 1.5910e+03 + 4.1650e+02 4.4640e+02 3.0540e+02 4.5360e+02 5.3790e+02 8.7770e+02 4.0050e+02 + 1.2061e+03 1.0481e+03 1.7701e+03 2.7504e+03 8.2020e+02 5.8490e+02 1.7190e+02 + 4.4010e+02 6.7130e+02 6.4180e+02 6.9540e+02 3.0210e+02 1.0410e+02 1.9590e+02 + 8.5880e+02 2.1921e+03 1.7108e+03 1.5177e+03 1.7491e+03 5.9660e+02 1.3377e+03 + 1.4320e+03 1.2588e+03 1.6720e+03 8.0980e+02 3.8770e+02 8.7560e+02 3.9420e+02 + 2.1530e+02 3.5760e+02 5.6390e+02 5.8720e+02 5.6270e+02 4.4800e+02 6.4990e+02 + 3.0870e+02 2.2290e+02 7.4640e+02 1.1375e+03 1.8720e+03 1.6068e+03 1.4024e+03 + 2.1056e+03 1.2668e+03 6.5380e+02 6.0910e+02 6.5250e+02 5.6680e+02 1.1675e+03 + 5.4020e+02 7.1850e+02 2.7169e+03 2.5006e+03 9.2000e+02 5.8320e+02 8.2050e+02 + 5.8760e+02 4.5850e+02 4.1400e+02 1.0882e+03 4.4020e+02 8.2420e+02 1.8666e+03 + 2.7093e+03 1.0960e+03 5.5000e+02 1.4500e+02 4.3150e+02 6.7000e+02 7.7460e+02 + 5.9200e+02 5.2210e+02 5.8750e+02 3.7140e+02 8.0670e+02 1.0694e+03 3.0258e+03 + 1.6927e+03 1.5551e+03 1.5249e+03 9.6200e+02 1.8337e+03 2.2090e+03 2.1138e+03 + 4.3640e+02 7.2060e+02 2.9060e+02 3.9690e+02 2.5010e+02 3.1190e+02 4.1630e+02 + 4.9730e+02 8.0140e+02 8.1890e+02 8.4520e+02 3.1460e+02 3.9310e+02 8.2470e+02 + 1.3146e+03 1.6551e+03 1.6988e+03 6.7810e+02 2.5403e+03 1.0402e+03 5.7770e+02 + 4.5750e+02 2.8690e+02 1.0247e+03 1.4829e+03 4.9920e+02 7.5790e+02 1.0493e+03 + 2.0494e+03 1.0401e+03 5.1800e+02 6.7040e+02 4.9190e+02 4.1900e+02 4.3470e+02 + 7.5270e+02 6.1650e+02 9.0570e+02 2.2205e+03 1.9572e+03 1.0974e+03 7.2650e+02 + 3.5360e+02 9.1070e+02 6.5310e+02 4.4720e+02 2.7350e+02 5.2830e+02 3.7920e+02 + 5.1240e+02 1.5785e+03 1.9154e+03 3.3418e+03 2.0439e+03 1.7751e+03 1.0722e+03 + 7.3380e+02 9.3070e+02 2.5817e+03 1.8119e+03 4.7570e+02 5.2180e+02 2.8630e+02 + 3.7140e+02 5.2730e+02 4.1740e+02 2.7490e+02 3.7660e+02 4.6270e+02 5.1370e+02 + 5.8940e+02 3.8550e+02 3.0520e+02 3.7800e+02 1.5415e+03 2.4571e+03 2.0727e+03 + 2.1214e+03 2.9023e+03 1.4486e+03 4.8430e+02 2.3250e+02 3.3960e+02 5.7110e+02 + 8.0080e+02 7.3530e+02 1.1796e+03 1.2983e+03 2.1995e+03 2.5257e+03 9.9690e+02 + 4.5720e+02 5.2820e+02 4.5970e+02 3.9670e+02 4.7240e+02 7.8500e+02 8.3040e+02 + 1.8480e+03 1.8103e+03 1.2268e+03 6.8980e+02 5.2540e+02 3.3900e+02 4.4080e+02 + 4.1320e+02 4.0300e+02 4.4060e+02 1.7940e+02 4.9900e+02 5.0070e+02 2.2282e+03 + 2.6755e+03 3.5000e+03 1.1068e+03 8.4260e+02 3.2290e+02 8.7950e+02 2.4310e+03 + 1.2622e+03 7.8340e+02 6.8250e+02 5.4250e+02 3.0310e+02 6.3680e+02 3.8570e+02 + 6.6180e+02 2.3350e+02 2.7600e+02 7.9170e+02 4.9970e+02 4.1580e+02 4.2000e+02 + 4.2330e+02 5.1770e+02 1.6768e+03 2.3061e+03 8.4590e+02 3.3730e+03 1.1468e+03 + 3.7000e+02 3.8420e+02 4.1160e+02 5.4180e+02 5.6250e+02 3.7200e+02 5.5770e+02 + 8.1270e+02 1.2150e+03 2.6078e+03 8.6580e+02 5.6530e+02 5.6490e+02 1.7600e+02 + 5.2660e+02 1.6760e+02 7.0680e+02 9.8320e+02 2.9879e+03 1.9110e+03 1.0398e+03 + 5.0560e+02 4.1130e+02 4.9580e+02 6.3960e+02 6.0830e+02 3.9700e+02 4.5920e+02 + 5.3070e+02 2.5470e+02 8.2280e+02 1.3545e+03 3.5000e+03 2.3961e+03 8.1080e+02 + 6.6100e+02 7.1720e+02 5.7630e+02 2.0435e+03 1.7449e+03 9.1880e+02 4.3250e+02 + 3.0480e+02 3.7810e+02 5.2960e+02 5.2300e+02 7.5300e+02 1.9970e+02 2.5550e+02 + 7.5020e+02 8.5840e+02 4.2020e+02 4.4650e+02 6.6550e+02 7.5980e+02 1.2488e+03 + 9.8360e+02 1.8066e+03 2.7705e+03 1.4134e+03 2.9740e+02 2.9870e+02 6.7580e+02 + 8.2800e+02 6.0710e+02 4.2000e+02 4.6180e+02 1.1196e+03 1.5461e+03 1.9760e+03 + 2.0065e+03 1.0148e+03 8.2510e+02 2.1250e+02 1.6110e+02 2.8570e+02 4.3780e+02 + 2.1807e+03 2.0312e+03 1.2992e+03 5.6470e+02 5.0300e+02 2.9000e+02 4.5890e+02 + 8.8610e+02 4.9670e+02 5.3510e+02 3.4930e+02 5.1680e+02 4.9020e+02 8.3870e+02 + 2.2422e+03 3.3198e+03 3.3252e+03 8.1650e+02 4.5290e+02 4.8750e+02 1.5949e+03 + 1.9327e+03 3.2705e+03 1.4688e+03 4.8320e+02 2.8210e+02 1.1970e+02 6.1330e+02 + 1.1544e+03 4.8710e+02 4.7690e+02 4.5680e+02 6.6030e+02 7.0860e+02 7.3210e+02 + 9.3220e+02 3.2340e+02 2.3640e+02 1.0805e+03 1.3395e+03 1.2212e+03 2.9623e+03 + 1.2102e+03 2.3820e+02 5.6970e+02 1.1767e+03 9.6520e+02 2.3150e+02 2.2260e+02 + 5.4430e+02 6.7400e+02 1.5579e+03 1.4254e+03 1.8799e+03 1.3008e+03 4.6880e+02 + 3.1770e+02 2.6290e+02 4.3770e+02 8.9740e+02 2.5654e+03 2.0206e+03 6.9310e+02 + 1.0997e+03 6.9990e+02 6.3950e+02 3.2120e+02 8.2790e+02 5.2910e+02 4.7550e+02 + 4.2480e+02 6.6270e+02 5.2570e+02 4.6750e+02 2.2198e+03 2.8898e+03 3.0380e+03 + 6.6670e+02 2.2540e+02 2.5720e+02 1.5198e+03 1.5080e+03 2.5755e+03 1.3845e+03 + 1.0515e+03 3.4960e+02 2.7030e+02 7.4880e+02 6.8280e+02 6.2810e+02 2.8920e+02 + 8.8100e+02 4.5700e+02 2.8620e+02 4.4040e+02 7.8730e+02 3.2450e+02 5.3900e+01 + 7.4250e+02 1.9472e+03 9.6760e+02 2.0073e+03 1.8539e+03 8.9610e+02 5.9680e+02 + 9.8630e+02 8.2570e+02 3.1100e+02 1.5500e+02 5.5640e+02 4.0380e+02 6.7460e+02 + 1.5402e+03 2.0565e+03 8.6250e+02 6.5930e+02 3.0700e+02 3.8070e+02 7.2700e+02 + 1.1424e+03 2.7406e+03 2.0193e+03 1.2683e+03 6.5320e+02 5.1340e+02 5.0990e+02 + 5.2370e+02 5.8390e+02 4.6410e+02 8.4520e+02 3.9500e+02 4.7420e+02 6.4050e+02 + 9.5900e+02 2.6317e+03 3.2142e+03 9.6140e+02 1.0501e+03 2.8730e+02 3.7950e+02 + 7.3490e+02 1.1377e+03 2.5500e+03 1.0354e+03 8.4220e+02 8.1720e+02 4.2160e+02 + 1.1872e+03 1.4157e+03 7.3500e+02 2.6480e+02 7.1530e+02 6.3800e+02 4.1750e+02 + 6.7020e+02 6.8460e+02 3.3560e+02 7.8100e+01 7.9180e+02 1.9274e+03 1.3582e+03 + 1.9498e+03 2.2072e+03 5.0530e+02 6.2440e+02 9.1120e+02 5.7300e+02 3.2080e+02 + 5.3990e+02 4.5630e+02 6.9280e+02 9.9260e+02 1.0474e+03 1.3899e+03 2.1615e+03 + 1.7053e+03 5.5970e+02 8.1130e+02 7.5320e+02 1.6563e+03 1.7378e+03 8.2320e+02 + 5.0750e+02 6.8450e+02 7.4790e+02 5.6070e+02 2.5320e+02 2.2300e+02 4.3130e+02 + 7.3710e+02 4.6770e+02 3.4660e+02 5.1880e+02 1.8011e+03 3.1334e+03 2.7011e+03 + 1.5237e+03 1.4229e+03 2.5790e+02 1.9710e+02 5.4590e+02 8.3770e+02 1.5826e+03 + 9.3520e+02 1.4355e+03 1.0889e+03 6.7630e+02 1.2363e+03 6.0460e+02 4.1380e+02 + 6.6700e+02 7.4260e+02 5.9040e+02 6.3930e+02 7.6700e+02 6.8850e+02 6.7200e+02 + 8.6660e+02 7.9280e+02 1.9927e+03 5.4660e+02 2.4414e+03 2.1849e+03 9.7170e+02 + 7.0730e+02 4.6610e+02 6.2810e+02 2.7550e+02 4.9200e+02 2.8090e+02 4.9670e+02 + 7.5770e+02 1.3304e+03 1.5370e+03 1.7710e+03 1.8576e+03 7.9850e+02 9.3890e+02 + 7.7880e+02 1.5032e+03 1.5291e+03 4.8160e+02 3.9910e+02 5.1160e+02 3.7870e+02 + 3.9970e+02 4.3640e+02 5.0140e+02 4.1690e+02 6.3480e+02 3.0100e+02 6.5300e+02 + 1.5297e+03 1.0438e+03 3.5000e+03 2.9896e+03 1.0352e+03 7.6800e+02 5.0230e+02 + 3.5820e+02 5.4450e+02 2.0543e+03 1.9738e+03 1.6057e+03 1.9237e+03 1.6275e+03 + 8.6300e+02 8.0840e+02 1.1221e+03 6.0510e+02 4.3250e+02 6.6890e+02 4.4890e+02 + 6.3670e+02 7.5730e+02 2.1330e+02 5.3550e+02 8.5410e+02 9.4440e+02 2.1420e+03 + 5.4090e+02 1.8990e+03 3.5000e+03 1.4841e+03 5.5730e+02 3.6920e+02 2.9320e+02 + 4.0350e+02 2.6580e+02 2.6170e+02 2.9860e+02 2.5900e+02 8.7410e+02 9.9830e+02 + 2.7938e+03 9.2190e+02 1.0101e+03 8.9420e+02 1.7369e+03 1.8820e+03 1.2642e+03 + 9.0080e+02 4.3030e+02 4.4150e+02 5.6210e+02 5.6540e+02 3.7680e+02 5.9240e+02 + 5.2110e+02 5.6570e+02 2.8430e+02 6.3510e+02 1.1735e+03 1.7715e+03 2.2601e+03 + 2.8574e+03 1.6537e+03 7.1840e+02 4.2340e+02 4.0180e+02 3.8540e+02 1.4839e+03 + 1.1028e+03 9.9820e+02 1.6421e+03 1.2892e+03 7.9640e+02 1.5431e+03 6.3120e+02 + 9.9270e+02 1.0007e+03 8.3530e+02 1.0939e+03 6.9660e+02 4.4420e+02 2.4950e+02 + 7.3510e+02 9.2400e+02 8.4430e+02 1.5961e+03 2.1420e+02 7.9310e+02 3.5000e+03 + 1.7643e+03 4.4400e+02 6.0180e+02 5.1370e+02 4.1400e+02 3.5220e+02 5.3970e+02 + 4.8480e+02 4.6750e+02 7.1550e+02 1.1215e+03 1.2816e+03 1.8470e+03 1.5070e+03 + 2.7698e+03 1.6453e+03 2.2830e+03 5.9180e+02 3.0160e+02 5.2240e+02 2.9660e+02 + 4.3790e+02 2.7030e+02 3.7750e+02 3.2870e+02 7.0220e+02 2.1620e+02 3.5830e+02 + 7.8500e+02 9.5020e+02 2.3900e+03 2.4044e+03 3.0836e+03 8.0390e+02 5.4880e+02 + 6.4100e+02 4.6900e+02 3.9040e+02 8.0420e+02 1.3366e+03 1.0464e+03 1.6515e+03 + 1.0305e+03 2.1032e+03 2.0295e+03 1.4094e+03 1.7198e+03 9.0920e+02 7.5240e+02 + 6.1650e+02 7.9080e+02 4.1250e+02 3.8000e+02 9.1100e+02 7.7330e+02 1.7986e+03 + 2.3813e+03 4.2280e+02 4.5240e+02 2.5212e+03 2.2974e+03 1.2676e+03 4.3450e+02 + 5.6820e+02 2.4500e+02 3.6530e+02 9.6130e+02 4.0350e+02 6.2510e+02 4.2780e+02 + 5.5240e+02 9.1370e+02 1.5440e+03 3.1243e+03 2.2570e+03 1.6028e+03 1.3432e+03 + 7.1590e+02 2.5590e+02 6.1370e+02 6.0120e+02 4.2690e+02 4.9250e+02 4.0830e+02 + 7.2740e+02 3.9660e+02 4.0320e+02 5.8130e+02 4.2220e+02 1.5410e+03 3.1148e+03 + 3.5000e+03 2.0391e+03 7.0350e+02 3.1660e+02 7.2820e+02 6.6020e+02 4.3720e+02 + 4.2410e+02 6.2810e+02 5.0350e+02 1.0666e+03 8.8540e+02 1.7617e+03 1.6383e+03 + 9.2230e+02 1.3511e+03 7.3950e+02 1.0865e+03 1.5305e+03 1.0249e+03 6.1850e+02 + 3.0780e+02 4.7370e+02 5.3460e+02 1.2921e+03 2.2201e+03 3.3710e+02 5.1250e+02 + 1.8154e+03 2.0522e+03 8.3460e+02 1.1103e+03 8.4000e+02 2.4770e+02 3.5080e+02 + 7.6880e+02 9.9800e+02 7.1710e+02 4.8150e+02 1.0036e+03 1.1593e+03 2.3636e+03 + 3.5000e+03 2.1036e+03 1.5514e+03 1.2045e+03 9.3940e+02 4.8190e+02 4.9410e+02 + 3.4000e+02 5.7460e+02 4.4650e+02 5.1130e+02 7.4790e+02 3.2580e+02 3.0010e+02 + 6.6940e+02 4.9730e+02 1.6502e+03 2.0396e+03 2.9971e+03 1.6831e+03 6.3970e+02 + 3.6850e+02 1.0210e+03 4.0920e+02 1.5890e+02 2.1460e+02 6.8970e+02 4.6060e+02 + 5.7780e+02 9.8400e+02 1.5707e+03 1.5268e+03 1.5473e+03 1.0541e+03 9.8610e+02 + 1.0919e+03 1.0012e+03 7.3130e+02 7.9120e+02 2.2910e+02 4.2170e+02 5.4150e+02 + 1.8735e+03 1.9687e+03 2.8790e+02 6.3620e+02 1.4156e+03 1.0809e+03 2.2788e+03 + 7.7100e+02 1.2615e+03 2.7730e+02 3.4620e+02 8.7180e+02 5.0800e+02 8.4680e+02 + 9.4110e+02 5.4440e+02 9.7620e+02 2.1356e+03 3.5000e+03 1.0700e+03 1.7635e+03 + 8.5840e+02 6.0060e+02 5.7450e+02 2.1900e+02 9.4030e+02 6.9820e+02 6.3260e+02 + 3.4160e+02 5.5150e+02 3.4300e+02 6.1770e+02 9.9370e+02 1.5552e+03 2.3913e+03 + 2.5820e+03 3.3292e+03 1.5751e+03 5.6590e+02 6.0610e+02 5.6460e+02 5.0150e+02 + 2.6020e+02 2.4590e+02 3.4370e+02 3.6380e+02 2.2480e+02 3.6120e+02 1.5392e+03 + 7.9290e+02 1.0080e+03 7.6860e+02 1.5234e+03 1.5486e+03 1.0673e+03 9.4160e+02 + 1.5823e+03 1.2345e+03 5.2690e+02 1.0182e+03 2.1293e+03 1.9587e+03 3.5610e+02 + 4.3450e+02 1.4718e+03 2.0288e+03 1.5689e+03 1.7059e+03 1.1037e+03 2.1430e+02 + 4.8300e+02 6.9290e+02 3.4170e+02 6.3740e+02 5.5100e+02 8.7970e+02 9.2170e+02 + 2.6417e+03 3.5000e+03 1.4979e+03 3.5650e+02 5.1050e+02 7.4000e+02 6.3580e+02 + 5.2070e+02 5.5210e+02 5.5700e+02 6.5630e+02 4.0720e+02 2.8040e+02 3.4170e+02 + 6.6630e+02 1.2074e+03 7.2070e+02 2.3605e+03 1.7966e+03 2.0389e+03 9.1090e+02 + 6.8370e+02 5.6060e+02 1.1003e+03 5.1380e+02 5.1020e+02 2.6710e+02 9.1570e+02 + 4.9930e+02 3.6860e+02 2.4780e+02 5.3360e+02 6.7720e+02 9.5990e+02 6.6730e+02 + 1.1752e+03 1.5026e+03 9.1600e+02 1.2631e+03 8.0200e+02 1.5426e+03 9.2430e+02 + 1.0998e+03 1.2476e+03 1.7121e+03 7.6970e+02 9.0230e+02 1.0048e+03 9.6610e+02 + 2.0752e+03 1.5454e+03 1.5271e+03 2.5010e+02 4.6280e+02 3.6900e+02 1.6870e+02 + 4.5410e+02 1.6061e+03 1.7697e+03 1.6554e+03 1.6769e+03 2.1109e+03 1.2887e+03 + 4.8240e+02 4.4680e+02 4.3040e+02 4.8230e+02 9.2230e+02 5.2400e+02 7.6740e+02 + 6.9290e+02 3.3830e+02 3.8600e+02 1.2320e+02 4.7670e+02 1.5175e+03 1.5044e+03 + 2.2253e+03 1.0401e+03 1.9026e+03 9.0560e+02 3.9760e+02 5.4330e+02 7.9860e+02 + 3.8090e+02 3.0650e+02 6.1090e+02 8.4580e+02 8.1360e+02 3.3190e+02 4.7040e+02 + 3.0050e+02 3.4100e+02 5.2410e+02 7.1080e+02 3.8460e+02 8.5570e+02 4.5870e+02 + 9.0520e+02 1.3477e+03 1.4052e+03 2.6926e+03 1.0727e+03 2.3681e+03 1.1979e+03 + 4.7590e+02 7.6770e+02 4.2970e+02 8.6130e+02 1.5404e+03 3.0986e+03 1.1374e+03 + 4.2930e+02 3.4830e+02 8.2650e+02 4.0590e+02 1.9650e+02 1.0724e+03 2.3473e+03 + 2.5224e+03 1.3579e+03 1.8593e+03 1.5972e+03 7.7910e+02 6.9860e+02 1.6500e+02 + 5.9840e+02 4.6010e+02 7.8600e+02 4.3720e+02 4.3870e+02 3.9000e+02 4.1290e+02 + 3.1600e+02 5.5330e+02 8.9260e+02 1.5750e+03 1.9409e+03 2.2623e+03 2.4499e+03 + 5.9000e+02 4.4550e+02 5.4870e+02 2.2860e+02 3.0810e+02 4.2290e+02 1.1661e+03 + 6.7730e+02 6.2430e+02 3.8690e+02 3.8200e+02 2.1000e+02 3.4250e+02 7.2120e+02 + 4.1930e+02 2.6250e+02 8.7080e+02 7.9070e+02 1.4400e+03 2.0601e+03 1.9901e+03 + 2.8559e+03 2.8837e+03 1.6421e+03 1.5364e+03 5.1510e+02 7.7100e+02 7.5420e+02 + 6.0030e+02 1.7754e+03 1.9588e+03 1.5818e+03 6.2670e+02 5.1440e+02 7.3310e+02 + 6.5740e+02 7.7310e+02 1.4203e+03 1.9877e+03 1.2705e+03 1.1287e+03 2.6524e+03 + 1.1521e+03 8.5140e+02 5.0310e+02 4.6060e+02 5.2040e+02 5.9850e+02 5.6770e+02 + 6.8070e+02 5.0880e+02 2.1490e+02 6.0470e+02 2.5050e+02 7.2300e+02 1.1781e+03 + 2.7020e+03 9.9290e+02 1.9502e+03 2.7032e+03 9.7520e+02 4.0560e+02 6.7460e+02 + 4.0190e+02 2.9170e+02 2.3010e+02 6.7770e+02 5.9290e+02 3.4680e+02 3.4300e+02 + 5.7840e+02 5.0510e+02 8.5520e+02 8.2340e+02 2.9420e+02 4.6920e+02 9.0300e+02 + 1.0275e+03 3.1080e+02 5.6910e+02 1.0539e+03 2*3.5000e+03 2.0221e+03 + 1.1879e+03 7.6980e+02 4.9370e+02 5.3450e+02 4.9960e+02 1.0908e+03 2.3870e+03 + 2.0329e+03 6.6380e+02 2.1860e+02 6.8110e+02 9.7260e+02 1.2136e+03 1.5942e+03 + 1.5643e+03 1.6284e+03 8.2990e+02 1.7789e+03 1.6770e+03 7.5720e+02 5.6840e+02 + 5.3250e+02 4.2570e+02 4.0960e+02 8.1800e+02 5.3810e+02 2.7550e+02 3.9160e+02 + 7.5020e+02 5.3240e+02 6.3360e+02 2.3335e+03 2.2056e+03 1.5529e+03 1.0429e+03 + 2.2981e+03 6.8640e+02 4.2850e+02 5.9310e+02 6.1040e+02 6.0260e+02 4.1710e+02 + 6.2910e+02 2.3800e+02 2.4980e+02 2.9080e+02 5.3280e+02 4.4530e+02 1.0799e+03 + 4.5380e+02 1.9550e+02 5.1040e+02 5.3760e+02 7.6990e+02 1.1448e+03 1.0354e+03 + 8.8470e+02 3.1809e+03 3.2024e+03 2.4157e+03 1.0456e+03 3.9630e+02 8.7720e+02 + 5.6630e+02 5.9850e+02 8.2460e+02 2.7337e+03 2.3289e+03 6.9050e+02 4.5020e+02 + 9.2560e+02 1.9435e+03 8.6870e+02 1.9806e+03 1.0886e+03 1.0545e+03 7.8120e+02 + 1.2552e+03 1.1494e+03 5.9890e+02 6.5700e+02 2.9840e+02 3.5270e+02 2.5900e+02 + 5.6760e+02 5.1760e+02 2.7200e+02 2.5670e+02 5.1820e+02 6.2690e+02 1.3962e+03 + 1.5481e+03 2.0073e+03 1.5464e+03 1.3932e+03 2.1852e+03 4.8420e+02 4.0750e+02 + 4.4140e+02 5.6050e+02 6.6130e+02 4.6360e+02 6.7460e+02 1.4920e+02 4.4710e+02 + 8.0750e+02 1.0034e+03 6.5390e+02 5.6710e+02 6.5080e+02 2.7900e+02 1.2380e+02 + 3.3750e+02 7.3390e+02 1.1553e+03 8.7750e+02 2.2872e+03 2.3963e+03 2.7881e+03 + 3.2682e+03 1.2632e+03 3.7880e+02 4.7400e+02 6.4450e+02 8.6270e+02 1.0908e+03 + 2.7625e+03 1.7121e+03 7.7140e+02 5.3800e+02 1.0117e+03 1.3130e+03 1.1552e+03 + 1.4191e+03 7.6040e+02 3.4350e+02 5.4660e+02 7.4450e+02 1.1531e+03 6.8450e+02 + 4.0540e+02 3.5120e+02 2.9130e+02 4.7700e+02 5.7870e+02 6.3780e+02 4.4460e+02 + 4.3800e+02 1.9830e+02 9.6430e+02 6.0290e+02 2.1598e+03 1.9523e+03 1.5931e+03 + 1.8170e+03 1.7893e+03 9.2810e+02 2.7260e+02 3.6670e+02 6.3010e+02 7.6130e+02 + 3.2190e+02 4.3470e+02 1.9640e+02 2.4870e+02 4.9020e+02 7.6730e+02 5.6010e+02 + 3.6860e+02 3.6350e+02 4.2920e+02 5.5790e+02 1.0052e+03 1.1440e+03 1.0330e+03 + 1.2642e+03 2.3802e+03 1.0732e+03 1.1438e+03 1.5017e+03 1.7057e+03 3.6320e+02 + 5.8370e+02 6.7160e+02 6.8290e+02 1.2188e+03 1.7253e+03 2.4979e+03 9.9160e+02 + 9.5240e+02 2.3435e+03 2.4464e+03 1.4247e+03 6.9770e+02 2.1470e+02 6.0980e+02 + 1.0084e+03 1.1048e+03 1.9035e+03 5.6050e+02 2.3970e+02 4.0400e+02 3.7190e+02 + 5.5430e+02 6.8200e+02 7.5950e+02 7.3880e+02 6.7270e+02 4.4800e+02 4.6990e+02 + 6.9960e+02 1.2629e+03 2.2872e+03 1.0969e+03 1.4970e+03 1.7647e+03 8.1550e+02 + 3.7210e+02 2.2160e+02 5.0540e+02 6.0320e+02 6.5190e+02 2.5910e+02 3.2150e+02 + 1.0169e+03 9.8930e+02 6.5330e+02 7.7260e+02 3.3230e+02 3.0120e+02 5.9520e+02 + 6.5910e+02 1.8988e+03 9.5410e+02 1.6544e+03 1.5558e+03 1.6780e+03 1.5929e+03 + 7.8920e+02 8.0690e+02 1.9449e+03 7.7520e+02 5.3180e+02 4.8030e+02 3.8150e+02 + 6.5160e+02 8.9050e+02 2.0123e+03 1.2617e+03 2.0957e+03 1.9389e+03 1.4820e+03 + 1.5231e+03 4.2530e+02 1.2400e+02 7.8910e+02 1.1704e+03 2.1306e+03 2.0912e+03 + 3.5020e+02 2.2340e+02 5.9210e+02 6.4360e+02 7.4510e+02 4.5840e+02 6.1400e+02 + 9.2770e+02 8.8760e+02 5.2150e+02 5.4020e+02 1.0616e+03 1.3140e+03 2.3138e+03 + 1.5143e+03 2.6895e+03 1.5905e+03 7.3880e+02 7.4060e+02 2.8600e+02 5.1890e+02 + 6.7870e+02 4.0600e+02 1.7770e+02 4.8600e+02 6.3740e+02 5.3270e+02 3.0440e+02 + 4.9870e+02 4.0080e+02 4.9110e+02 6.1970e+02 1.3599e+03 1.3246e+03 1.6952e+03 + 1.4096e+03 1.7353e+03 9.1490e+02 1.5212e+03 8.3610e+02 1.4967e+03 1.5300e+03 + 8.9090e+02 3.6680e+02 6.2250e+02 5.6980e+02 8.6210e+02 1.0520e+03 1.5831e+03 + 1.9012e+03 1.7928e+03 1.5413e+03 7.9570e+02 4.3250e+02 2.4280e+02 2.4100e+02 + 5.8140e+02 1.5661e+03 2.3169e+03 1.0967e+03 4.4730e+02 2.6780e+02 2.1430e+02 + 4.1080e+02 3.4430e+02 7.4080e+02 9.6050e+02 1.1221e+03 7.8340e+02 5.3570e+02 + 3.8990e+02 7.1140e+02 1.7274e+03 9.1770e+02 1.5896e+03 1.8532e+03 2.1529e+03 + 1.2436e+03 9.0070e+02 6.6440e+02 7.6600e+02 6.6700e+02 4.3870e+02 3.5430e+02 + 5.8440e+02 1.1188e+03 3.4860e+02 2.0830e+02 3.9620e+02 5.2540e+02 6.3090e+02 + 9.8490e+02 1.5646e+03 1.6202e+03 1.5621e+03 1.8593e+03 4.1440e+02 8.2820e+02 + 4.7630e+02 1.0068e+03 4.6350e+02 8.8280e+02 8.8860e+02 4.7460e+02 5.5580e+02 + 2.4930e+02 5.8980e+02 1.6305e+03 1.7495e+03 2.6684e+03 2.9424e+03 1.0866e+03 + 1.1672e+03 4.6500e+02 5.0520e+02 3.3690e+02 6.1040e+02 1.2891e+03 2.0063e+03 + 9.1120e+02 5.5600e+02 3.9730e+02 1.3660e+02 4.4080e+02 3.3590e+02 3.3980e+02 + 8.4530e+02 8.2030e+02 4.6590e+02 3.4880e+02 4.2180e+02 5.4030e+02 1.3437e+03 + 1.3996e+03 1.2902e+03 1.8715e+03 2.6043e+03 9.4810e+02 5.9660e+02 1.0681e+03 + 7.5190e+02 3.8420e+02 4.5210e+02 6.6240e+02 6.9770e+02 2.8950e+02 5.0940e+02 + 3.7930e+02 3.2590e+02 2.4790e+02 5.6130e+02 6.9590e+02 1.1709e+03 1.4618e+03 + 1.6120e+03 1.1166e+03 8.1120e+02 4.9000e+02 5.5130e+02 7.4850e+02 9.4940e+02 + 6.6970e+02 2.2280e+02 3.9330e+02 1.0163e+03 5.0290e+02 5.2490e+02 8.7060e+02 + 3.1860e+03 1.8753e+03 2.0375e+03 1.1195e+03 5.9380e+02 4.5460e+02 5.2780e+02 + 1.0227e+03 1.1043e+03 1.7577e+03 2.1658e+03 8.8250e+02 6.3330e+02 4.8760e+02 + 2.2510e+02 4.0930e+02 2.2080e+02 2.5230e+02 7.5360e+02 4.6990e+02 3.8620e+02 + 3.4760e+02 4.0220e+02 2.6610e+02 1.5223e+03 8.6860e+02 7.9930e+02 7.4970e+02 + 1.6105e+03 1.5621e+03 7.3240e+02 6.5920e+02 7.1630e+02 1.6680e+02 3.9500e+02 + 1.1179e+03 1.2376e+03 5.9530e+02 6.5260e+02 7.5550e+02 3.3230e+02 2.8180e+02 + 8.8640e+02 1.8685e+03 1.4053e+03 1.5225e+03 1.4227e+03 1.1502e+03 5.7940e+02 + 3.7040e+02 5.1650e+02 3.5260e+02 9.5180e+02 6.6580e+02 5.4060e+02 3.5240e+02 + 6.1840e+02 5.9080e+02 7.2050e+02 1.4997e+03 3.5000e+03 1.5884e+03 1.8821e+03 + 7.1080e+02 5.2630e+02 7.4170e+02 5.0850e+02 8.6070e+02 6.8870e+02 2.0969e+03 + 1.5359e+03 8.6370e+02 6.9860e+02 6.4020e+02 7.8170e+02 5.2650e+02 5.3600e+02 + 7.4070e+02 5.1530e+02 3.4520e+02 4.8060e+02 6.2450e+02 5.4570e+02 2.2125e+03 + 2.0427e+03 1.1295e+03 1.0518e+03 1.1360e+03 2.2120e+03 2.4149e+03 7.1770e+02 + 6.7820e+02 5.9200e+02 2.6510e+02 5.4950e+02 6.5540e+02 9.5590e+02 5.5420e+02 + 4.4060e+02 5.6830e+02 5.3450e+02 7.0870e+02 1.9268e+03 1.5963e+03 9.8370e+02 + 5.1860e+02 6.9740e+02 7.6330e+02 4.1050e+02 4.7440e+02 5.5620e+02 2.6310e+02 + 4.0020e+02 8.2440e+02 4.1950e+02 3.9830e+02 7.6870e+02 8.8290e+02 4.2270e+02 + 1.8010e+03 2.5501e+03 1.6887e+03 1.0243e+03 2.4600e+02 8.2140e+02 4.8670e+02 + 7.3770e+02 1.1292e+03 9.3830e+02 2.7450e+03 1.1998e+03 1.2509e+03 9.1130e+02 + 5.7500e+02 6.1310e+02 6.3220e+02 5.3430e+02 5.3810e+02 3.7050e+02 3.7110e+02 + 2.3300e+02 4.5650e+02 5.8560e+02 1.3832e+03 2.6011e+03 1.6340e+03 8.9320e+02 + 1.3836e+03 1.1536e+03 2.7903e+03 8.9890e+02 8.0500e+02 3.8060e+02 2.5770e+02 + 6.2120e+02 5.0880e+02 4.1930e+02 6.5850e+02 5.5660e+02 9.0070e+02 4.7910e+02 + 5.0200e+02 1.1890e+03 1.7770e+03 7.6280e+02 4.3710e+02 6.0180e+02 4.7610e+02 + 5.0080e+02 3.4000e+02 4.7750e+02 4.7110e+02 4.4300e+02 2.6240e+02 3.4770e+02 + 2.6370e+02 9.7580e+02 6.7410e+02 1.1853e+03 2.3482e+03 2.2518e+03 7.7370e+02 + 7.2110e+02 8.2750e+02 5.8500e+02 7.0050e+02 4.1620e+02 4.8710e+02 9.4920e+02 + 3.1012e+03 1.7843e+03 4.9360e+02 9.4170e+02 6.4920e+02 8.2690e+02 8.5880e+02 + 3.3560e+02 3.8230e+02 6.8280e+02 5.6320e+02 2.2650e+02 3.3960e+02 5.6030e+02 + 9.8050e+02 1.9148e+03 2.0486e+03 5.5980e+02 9.0350e+02 1.3183e+03 2.7878e+03 + 7.3520e+02 7.5860e+02 7.0890e+02 6.1800e+02 6.9590e+02 5.8770e+02 4.5910e+02 + 6.2430e+02 5.9540e+02 5.4210e+02 4.4070e+02 9.5090e+02 1.6896e+03 1.5521e+03 + 5.4150e+02 3.4180e+02 2.5940e+02 3.6070e+02 5.2790e+02 3.4270e+02 5.0360e+02 + 3.6140e+02 5.3340e+02 2.0520e+02 2.5610e+02 3.0870e+02 7.6690e+02 1.3666e+03 + 2.0203e+03 2.1273e+03 2.5090e+03 1.5742e+03 6.7420e+02 4.9640e+02 3.6220e+02 + 8.4690e+02 2.6250e+02 3.8070e+02 1.1232e+03 2.1115e+03 1.4450e+03 5.3200e+02 + 5.5460e+02 8.0070e+02 4.6150e+02 8.9380e+02 6.3540e+02 2.8030e+02 1.0097e+03 + 8.0070e+02 5.2060e+02 5.0970e+02 3.0250e+02 1.1916e+03 2.8084e+03 2.5623e+03 + 1.3223e+03 4.5620e+02 7.4990e+02 2.1663e+03 1.2886e+03 6.1320e+02 7.9010e+02 + 7.2330e+02 7.6170e+02 4.9550e+02 4.1200e+02 6.0740e+02 3.4680e+02 5.9580e+02 + 6.0930e+02 1.0138e+03 2.4012e+03 1.6042e+03 1.0373e+03 5.7970e+02 2.0330e+02 + 2.6490e+02 3.8930e+02 4.9280e+02 7.3940e+02 4.8250e+02 3.7620e+02 3.3760e+02 + 3.6990e+02 5.3300e+02 6.5460e+02 8.7770e+02 1.8106e+03 1.7912e+03 1.5473e+03 + 9.7390e+02 8.4820e+02 6.8470e+02 7.7800e+02 8.1570e+02 6.8440e+02 5.9210e+02 + 2.2398e+03 2.1842e+03 8.7680e+02 7.3580e+02 5.8750e+02 5.6670e+02 4.4120e+02 + 7.6950e+02 3.3690e+02 2.8720e+02 5.3910e+02 8.6110e+02 9.5980e+02 4.3180e+02 + 4.6890e+02 9.7490e+02 1.7414e+03 1.9302e+03 1.3435e+03 3.1190e+02 5.5170e+02 + 2.8436e+03 1.5648e+03 8.2650e+02 6.9940e+02 8.1290e+02 4.3580e+02 7.1790e+02 + 4.7430e+02 5.1930e+02 8.1360e+02 4.6660e+02 8.0580e+02 1.5441e+03 3.2137e+03 + 1.4341e+03 1.3820e+03 3.9240e+02 1.4830e+02 4.0270e+02 3.9380e+02 4.4140e+02 + 7.3860e+02 5.0820e+02 3.5670e+02 4.0710e+02 7.1310e+02 4.6000e+02 5.5980e+02 + 5.1930e+02 2.1852e+03 2.3648e+03 6.7070e+02 1.1679e+03 6.8430e+02 8.4870e+02 + 7.0150e+02 1.1838e+03 6.1760e+02 2.8310e+02 1.0532e+03 1.6462e+03 1.3646e+03 + 5.1850e+02 4.1920e+02 3.4530e+02 3.3390e+02 5.2050e+02 8.2010e+02 4.1330e+02 + 5.2880e+02 1.2096e+03 1.2578e+03 5.3000e+02 6.2520e+02 1.2430e+03 1.8894e+03 + 1.8170e+03 9.5320e+02 3.7050e+02 1.3987e+03 2.1933e+03 2.6618e+03 1.4221e+03 + 5.6330e+02 4.1230e+02 2.0940e+02 5.2040e+02 7.9170e+02 5.3440e+02 5.8540e+02 + 4.8030e+02 7.9330e+02 2.0843e+03 3.0588e+03 1.1811e+03 9.7590e+02 5.6200e+02 + 1.9300e+02 3.7340e+02 8.3280e+02 7.9960e+02 3.1860e+02 7.7330e+02 4.4030e+02 + 3.4690e+02 6.7530e+02 5.0260e+02 6.3890e+02 1.4094e+03 1.6265e+03 1.9509e+03 + 8.4540e+02 6.0720e+02 5.6420e+02 7.0470e+02 8.2800e+02 8.4150e+02 4.0900e+02 + 2.8200e+02 2.1283e+03 2.0715e+03 5.7170e+02 4.9830e+02 4.8210e+02 2.4150e+02 + 3.5170e+02 7.0420e+02 7.2710e+02 3.3990e+02 3.6300e+02 9.5680e+02 9.0740e+02 + 5.0940e+02 3.4910e+02 1.5741e+03 1.9970e+03 8.0080e+02 4.5610e+02 2.0040e+02 + 7.1060e+02 9.6610e+02 1.8336e+03 9.2290e+02 9.1140e+02 6.7790e+02 3.6800e+02 + 6.3190e+02 4.2090e+02 3.8770e+02 3.3320e+02 5.2720e+02 9.3240e+02 2.5111e+03 + 1.2073e+03 1.2914e+03 9.9090e+02 5.6860e+02 6.0540e+02 4.2920e+02 7.6190e+02 + 5.3800e+02 3.9780e+02 5.0620e+02 3.4260e+02 3.9220e+02 7.4230e+02 2.7320e+02 + 4.8020e+02 7.6960e+02 2.0360e+03 7.3570e+02 9.0410e+02 8.8960e+02 4.5240e+02 + 5.9110e+02 4.0540e+02 5.3030e+02 2.7570e+02 6.6950e+02 2.0583e+03 2.9530e+03 + 1.1933e+03 8.3230e+02 3.5070e+02 2.7060e+02 4.6560e+02 8.3910e+02 5.9930e+02 + 5.1640e+02 3.3630e+02 7.2790e+02 6.0140e+02 5.9570e+02 3.5450e+02 7.7870e+02 + 2.3472e+03 1.2183e+03 4.8050e+02 4.4780e+02 1.0096e+03 1.6747e+03 2.1044e+03 + 2.1990e+03 1.0607e+03 5.4210e+02 4.0730e+02 2.9290e+02 4.0160e+02 3.9110e+02 + 8.6590e+02 1.4126e+03 9.5980e+02 2.0971e+03 8.4220e+02 9.4650e+02 5.1740e+02 + 2.9890e+02 6.0880e+02 4.6230e+02 7.7430e+02 3.0650e+02 2.8530e+02 5.4150e+02 + 4.5670e+02 5.3770e+02 4.3660e+02 2.2940e+02 6.0830e+02 1.9051e+03 2.1894e+03 + 6.1300e+02 6.5190e+02 6.5090e+02 3.3450e+02 6.3860e+02 5.9560e+02 7.7290e+02 + 2.3880e+02 6.3490e+02 1.0457e+03 2.2737e+03 1.5301e+03 3.6570e+02 4.2230e+02 + 4.9600e+02 2.8810e+02 6.8170e+02 9.1380e+02 4.3700e+02 4.0270e+02 3.7010e+02 + 2.9110e+02 4.6510e+02 5.6450e+02 1.5943e+03 2.0879e+03 1.3906e+03 1.1418e+03 + 4.7170e+02 3.2780e+02 7.5800e+02 1.6849e+03 2.5322e+03 1.5579e+03 4.9690e+02 + 4.7640e+02 4.3060e+02 2.6900e+02 6.0850e+02 7.0660e+02 8.6380e+02 9.7450e+02 + 1.1241e+03 9.9250e+02 4.3240e+02 4.8950e+02 2.8510e+02 5.6910e+02 7.9010e+02 + 1.1358e+03 3.0480e+02 2.0680e+02 3.0300e+02 5.7200e+02 1.0092e+03 5.1270e+02 + 2.9020e+02 6.0980e+02 1.3082e+03 2.7128e+03 1.1408e+03 6.8470e+02 8.2890e+02 + 4.9100e+02 5.1530e+02 1.7160e+02 3.7150e+02 5.8360e+02 7.6840e+02 1.4225e+03 + 2.7323e+03 8.9500e+02 3.9460e+02 5.2130e+02 1.3510e+02 4.2060e+02 5.8490e+02 + 7.3570e+02 6.3450e+02 4.6670e+02 7.6880e+02 4.7700e+02 2.2020e+02 4.0440e+02 + 5.7400e+02 2.1740e+03 1.7924e+03 1.7099e+03 5.5340e+02 4.4930e+02 9.6320e+02 + 9.3110e+02 1.9485e+03 8.4180e+02 9.0540e+02 3.1380e+02 3.6880e+02 3.3570e+02 + 7.8230e+02 1.3003e+03 2.3107e+03 1.5978e+03 1.0277e+03 1.9187e+03 8.1210e+02 + 3.9360e+02 4.5120e+02 1.0926e+03 1.2950e+03 6.7090e+02 3.3160e+02 4.6320e+02 + 3.8910e+02 4.3310e+02 8.9930e+02 5.4660e+02 4.7460e+02 3.5260e+02 1.6432e+03 + 2.4213e+03 1.0597e+03 1.1323e+03 1.0466e+03 5.9970e+02 3.1720e+02 2.3790e+02 + 5.7450e+02 5.6620e+02 7.8590e+02 7.4710e+02 2.4084e+03 8.1520e+02 4.0830e+02 + 7.4850e+02 2.3420e+02 4.5420e+02 8.0450e+02 6.4180e+02 5.4560e+02 4.8380e+02 + 5.0730e+02 4.0850e+02 2.9320e+02 8.0260e+02 8.7270e+02 2.4108e+03 1.1650e+03 + 6.8060e+02 4.0250e+02 4.8310e+02 8.8200e+02 6.1690e+02 2.1216e+03 1.8689e+03 + 9.7720e+02 4.8400e+02 9.0630e+02 1.1091e+03 1.3591e+03 1.0934e+03 1.6767e+03 + 1.0706e+03 1.1318e+03 6.3640e+02 5.3380e+02 4.4610e+02 1.0580e+02 5.7780e+02 + 6.1730e+02 7.9310e+02 6.3800e+02 7.1260e+02 7.1420e+02 5.6860e+02 4.4530e+02 + 2.7370e+02 3.0050e+02 4.5710e+02 1.8540e+03 2.5373e+03 1.7718e+03 1.0752e+03 + 5.2560e+02 4.3650e+02 3.0350e+02 1.9950e+02 6.5020e+02 6.9180e+02 5.9950e+02 + 1.0920e+03 2.2241e+03 2.0379e+03 8.2220e+02 4.5570e+02 3.2460e+02 4.1550e+02 + 5.9580e+02 3.9720e+02 7.1930e+02 6.1730e+02 5.0090e+02 3.0350e+02 4.4230e+02 + 4.2300e+02 1.5214e+03 1.6344e+03 2.0314e+03 1.1623e+03 3.4010e+02 5.0990e+02 + 6.8490e+02 7.6800e+02 1.2334e+03 1.7932e+03 1.9712e+03 1.7471e+03 7.0650e+02 + 1.4394e+03 1.3781e+03 1.0024e+03 1.4042e+03 1.0707e+03 4.8470e+02 3.6900e+02 + 3.6360e+02 5.6090e+02 4.9560e+02 9.4130e+02 7.8830e+02 5.4220e+02 6.8340e+02 + 9.5530e+02 3.8740e+02 1.0206e+03 3.4660e+02 5.3960e+02 3.6350e+02 9.1710e+02 + 1.1175e+03 2.8671e+03 1.2044e+03 6.0140e+02 4.6840e+02 4.9020e+02 3.2620e+02 + 5.2490e+02 9.8570e+02 9.3210e+02 6.1310e+02 1.5194e+03 1.6433e+03 2.4210e+03 + 1.3033e+03 6.4330e+02 4.7380e+02 8.3850e+02 4.3620e+02 2.3290e+02 6.2910e+02 + 5.0780e+02 4.8590e+02 4.0670e+02 2.9440e+02 1.5530e+02 9.3940e+02 2.5962e+03 + 1.2639e+03 1.1937e+03 2.9920e+02 6.4250e+02 6.0070e+02 3.3570e+02 3.7490e+02 + 2.5816e+03 2.7623e+03 1.0558e+03 2.2862e+03 2.1249e+03 2.3297e+03 1.5725e+03 + 1.5509e+03 9.7040e+02 6.6960e+02 4.1720e+02 6.6780e+02 9.3720e+02 3.7840e+02 + 1.0803e+03 9.9120e+02 7.3260e+02 5.3410e+02 6.2830e+02 5.2490e+02 5.7540e+02 + 9.8340e+02 5.5850e+02 4.6360e+02 8.6380e+02 2.4368e+03 2.2040e+03 6.6440e+02 + 4.7760e+02 2.1570e+02 4.0760e+02 4.0220e+02 2.6970e+02 8.4240e+02 7.9750e+02 + 5.3770e+02 9.0830e+02 1.3753e+03 1.8007e+03 1.2170e+03 5.6320e+02 4.5630e+02 + 8.1980e+02 4.8790e+02 2.5190e+02 6.5710e+02 5.9480e+02 3.4780e+02 1.3870e+02 + 5.7760e+02 3.5340e+02 1.2363e+03 2.0086e+03 1.2233e+03 9.4560e+02 6.6680e+02 + 2.7510e+02 8.3810e+02 6.7480e+02 6.6210e+02 1.0556e+03 2.5807e+03 1.4419e+03 + 2.0618e+03 3.2175e+03 1.1726e+03 8.0860e+02 6.9160e+02 5.8840e+02 5.8210e+02 + 4.9840e+02 7.0250e+02 4.0270e+02 4.9340e+02 8.2350e+02 9.3910e+02 5.4050e+02 + 3.8620e+02 6.4910e+02 8.2510e+02 8.9960e+02 9.3210e+02 1.0338e+03 8.4090e+02 + 6.1030e+02 2.4846e+03 2.8717e+03 8.5110e+02 4.9750e+02 2.2770e+02 2.5120e+02 + 3.5030e+02 8.1720e+02 6.9490e+02 6.6430e+02 3.0850e+02 5.8780e+02 9.4540e+02 + 2.8720e+03 2.0277e+03 6.9100e+02 4.9260e+02 8.1300e+02 1.0408e+03 2.9640e+02 + 3.3570e+02 6.9520e+02 5.4240e+02 1.1270e+02 3.3610e+02 5.2920e+02 1.5098e+03 + 2.4280e+03 1.2832e+03 6.7640e+02 6.7100e+02 4.8690e+02 5.4600e+02 3.7140e+02 + 4.3220e+02 1.3602e+03 1.9029e+03 2.2914e+03 1.6628e+03 2.9892e+03 8.8220e+02 + 4.6730e+02 4.3390e+02 6.6790e+02 3.8280e+02 5.3800e+02 6.5510e+02 4.5070e+02 + 3.5600e+02 6.1550e+02 7.9560e+02 5.0750e+02 3.3840e+02 4.3530e+02 8.4290e+02 + 8.5640e+02 9.2090e+02 6.5900e+02 5.9220e+02 1.4079e+03 1.2669e+03 1.5993e+03 + 3.5710e+02 5.6660e+02 2.8410e+02 4.0390e+02 3.0320e+02 2.0160e+02 5.7830e+02 + 9.3620e+02 6.0640e+02 5.1740e+02 9.3180e+02 2.0731e+03 1.6580e+03 7.7920e+02 + 6.1570e+02 3.5230e+02 7.1380e+02 4.7360e+02 5.4680e+02 6.0740e+02 5.0530e+02 + 1.4780e+02 4.2830e+02 8.8460e+02 1.6080e+03 2.2371e+03 1.0777e+03 7.9580e+02 + 2.9970e+02 6.5830e+02 4.4270e+02 4.8320e+02 4.5230e+02 1.2202e+03 1.9985e+03 + 2.4894e+03 3.3280e+03 2.8131e+03 9.3390e+02 2.6860e+02 4.0050e+02 4.3190e+02 + 3.2370e+02 5.7000e+02 4.9160e+02 3.0620e+02 2.4860e+02 5.0490e+02 4.9020e+02 + 3.3240e+02 3.4330e+02 7.7340e+02 9.4960e+02 1.4130e+03 1.5589e+03 6.2330e+02 + 4.9730e+02 1.0130e+03 1.9116e+03 2.2715e+03 6.9280e+02 4.0840e+02 4.3250e+02 + 1.5760e+02 4.5800e+02 3.4360e+02 4.3500e+02 5.4360e+02 6.5550e+02 5.4660e+02 + 9.7590e+02 1.6631e+03 2.1328e+03 1.7446e+03 5.7760e+02 2.1510e+02 7.0830e+02 + 4.3640e+02 1.6710e+02 4.4720e+02 1.8220e+02 2.4750e+02 1.0979e+03 9.6490e+02 + 2.4877e+03 2.7628e+03 9.2650e+02 2.7240e+02 3.9710e+02 3.6790e+02 6.5610e+02 + 4.6890e+02 4.3640e+02 3.9930e+02 9.4070e+02 2.3107e+03 3.4234e+03 2.1188e+03 + 1.5981e+03 1.5350e+02 2.1590e+02 5.2190e+02 5.4040e+02 2.0690e+02 7.8350e+02 + 2.8680e+02 2.6330e+02 3.7410e+02 6.4560e+02 5.2090e+02 6.7450e+02 4.1580e+02 + 5.4560e+02 7.3800e+02 1.3057e+03 7.0930e+02 3.0410e+02 5.0550e+02 1.3445e+03 + 1.6372e+03 4.6910e+02 5.4320e+02 4.7040e+02 4.6100e+02 2.8330e+02 3.3100e+02 + 5.3630e+02 6.1690e+02 3.9210e+02 4.7130e+02 6.8800e+02 1.7630e+03 2.1138e+03 + 1.5043e+03 5.2080e+02 2.8820e+02 3.7490e+02 7.3150e+02 3.8700e+02 5.4570e+02 + 3.7680e+02 4.5140e+02 7.9600e+02 1.1984e+03 2.4956e+03 2.1051e+03 8.5750e+02 + 2.5050e+02 3.1180e+02 5.8530e+02 5.2720e+02 6.1130e+02 3.7080e+02 5.0460e+02 + 1.1160e+03 2.4266e+03 3.1768e+03 1.9216e+03 1.5110e+03 5.4510e+02 3.3930e+02 + 4.1050e+02 6.1530e+02 7.4360e+02 2.5040e+02 4.7600e+02 4.7780e+02 4.9870e+02 + 6.8140e+02 6.0030e+02 6.5580e+02 4.3820e+02 2.5840e+02 3.3510e+02 1.9224e+03 + 6.3560e+02 5.4390e+02 3.7320e+02 1.4463e+03 1.0356e+03 6.3520e+02 5.0060e+02 + 9.0030e+02 5.3080e+02 5.4190e+02 3.2680e+02 1.0364e+03 3.0970e+02 2.9090e+02 + 2.6180e+02 6.2740e+02 9.7560e+02 2.0859e+03 1.2944e+03 7.0110e+02 4.0390e+02 + 1.0720e+03 2.9950e+02 3.5660e+02 6.6550e+02 5.2570e+02 8.4910e+02 7.5900e+02 + 1.1121e+03 2.3362e+03 8.3670e+02 3.1420e+02 2.4200e+02 4.1570e+02 5.7480e+02 + 6.6430e+02 3.5080e+02 3.2450e+02 6.4600e+02 1.2871e+03 1.5898e+03 2.9490e+03 + 1.5922e+03 9.2930e+02 9.9070e+02 4.2790e+02 3.3500e+02 3.7570e+02 5.1320e+02 + 5.5210e+02 4.5950e+02 5.9900e+02 5.0100e+02 5.0340e+02 4.7880e+02 7.3080e+02 + 5.5540e+02 3.1620e+02 1.0440e+02 1.1530e+03 8.0630e+02 5.6870e+02 3.4050e+02 + 1.3805e+03 8.5300e+02 1.3135e+03 1.3573e+03 8.3570e+02 5.9040e+02 1.1998e+03 + 4.4040e+02 4.3790e+02 6.5340e+02 2.1450e+02 4.3770e+02 5.1870e+02 6.8150e+02 + 1.2301e+03 1.9522e+03 1.5424e+03 6.5320e+02 1.0164e+03 3.6830e+02 3.7320e+02 + 5.1590e+02 7.5600e+02 5.3260e+02 8.8610e+02 1.5439e+03 1.5135e+03 1.3703e+03 + 5.6190e+02 7.3280e+02 5.1170e+02 9.2040e+02 8.0210e+02 3.9750e+02 2.2910e+02 + 4.8250e+02 6.7560e+02 1.3865e+03 2.3102e+03 2.1219e+03 1.0545e+03 7.6310e+02 + 3.4340e+02 2.6040e+02 4.4280e+02 4.0420e+02 4.6490e+02 3.1210e+02 6.5560e+02 + 7.4520e+02 6.4100e+02 1.0219e+03 1.1484e+03 8.5250e+02 2.7660e+02 1.1350e+02 + 8.7170e+02 +/ diff --git a/examples/egg/eclipse/include/realizations/realization-1/eclipse/include/grid/active.inc b/examples/egg/eclipse/include/realizations/realization-1/eclipse/include/grid/active.inc new file mode 120000 index 00000000000..2ab54c5daeb --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-1/eclipse/include/grid/active.inc @@ -0,0 +1 @@ +../../../../../grid/active.inc \ No newline at end of file diff --git a/examples/egg/eclipse/include/realizations/realization-1/eclipse/include/schedule b/examples/egg/eclipse/include/realizations/realization-1/eclipse/include/schedule new file mode 120000 index 00000000000..ed5b970d39c --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-1/eclipse/include/schedule @@ -0,0 +1 @@ +../../../../schedule \ No newline at end of file diff --git a/examples/egg/eclipse/include/realizations/realization-1/eclipse/include/summary b/examples/egg/eclipse/include/realizations/realization-1/eclipse/include/summary new file mode 120000 index 00000000000..e5a0eb405d3 --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-1/eclipse/include/summary @@ -0,0 +1 @@ +../../../../summary \ No newline at end of file diff --git a/examples/egg/eclipse/include/realizations/realization-1/eclipse/model/EGG.DATA b/examples/egg/eclipse/include/realizations/realization-1/eclipse/model/EGG.DATA new file mode 120000 index 00000000000..e4b3ffa3150 --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-1/eclipse/model/EGG.DATA @@ -0,0 +1 @@ +../../../../EGG.DATA \ No newline at end of file diff --git a/examples/egg/eclipse/include/realizations/realization-1/eclipse/model/EGG_FLOW.DATA b/examples/egg/eclipse/include/realizations/realization-1/eclipse/model/EGG_FLOW.DATA new file mode 120000 index 00000000000..931f4143326 --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-1/eclipse/model/EGG_FLOW.DATA @@ -0,0 +1 @@ +../../../../EGG_FLOW.DATA \ No newline at end of file diff --git a/examples/egg/eclipse/include/realizations/realization-2/eclipse/include/grid/PERM.INC b/examples/egg/eclipse/include/realizations/realization-2/eclipse/include/grid/PERM.INC new file mode 100755 index 00000000000..193aa6e4a91 --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-2/eclipse/include/grid/PERM.INC @@ -0,0 +1,3602 @@ +PERMX + 8.5560e+02 9.8940e+02 1.7479e+03 1.8062e+03 1.1048e+03 7.8720e+02 4.8150e+02 + 8.5810e+02 1.0992e+03 2.3509e+03 2.0607e+03 8.4160e+02 4.7460e+02 4.7940e+02 + 7.8600e+02 6.5740e+02 1.9203e+03 7.2440e+02 4.3250e+02 4.1160e+02 2.0250e+02 + 8.2620e+02 1.8796e+03 1.6634e+03 1.0043e+03 1.1475e+03 8.4960e+02 4.3810e+02 + 3.3180e+02 4.2900e+02 5.8800e+02 4.6920e+02 2.0310e+02 6.9160e+02 7.4050e+02 + 1.0559e+03 1.6230e+03 6.8400e+02 8.5930e+02 6.1830e+02 3.5840e+02 4.6230e+02 + 5.0810e+02 2.0316e+03 1.9857e+03 6.0450e+02 1.9410e+02 6.2230e+02 5.2790e+02 + 4.1990e+02 6.7660e+02 7.4810e+02 8.1530e+02 4.3730e+02 1.0640e+03 1.8627e+03 + 2.5085e+03 1.5177e+03 8.8390e+02 3.1200e+02 1.0016e+03 9.8060e+02 1.0884e+03 + 2.0001e+03 1.3838e+03 4.9660e+02 6.9580e+02 5.7970e+02 7.7100e+02 2.0663e+03 + 3.4269e+03 7.7660e+02 7.0150e+02 3.7500e+02 6.2110e+02 1.6662e+03 2.4333e+03 + 9.6470e+02 5.1860e+02 2.1730e+02 1.5920e+02 4.1950e+02 8.4720e+02 2.1968e+03 + 2.0830e+03 1.0472e+03 4.9370e+02 8.3170e+02 5.8110e+02 4.4770e+02 4.4450e+02 + 3.6550e+02 3.1090e+02 6.1170e+02 9.9980e+02 1.6023e+03 1.7656e+03 1.2556e+03 + 2.2820e+02 7.5560e+02 6.4510e+02 3.6450e+02 4.0600e+02 1.3093e+03 3.1124e+03 + 1.0465e+03 4.3670e+02 3.3330e+02 2.2040e+02 6.9560e+02 5.5920e+02 6.7970e+02 + 8.3910e+02 6.9480e+02 1.3991e+03 1.7890e+03 2.5937e+03 1.4176e+03 3.8500e+02 + 4.9560e+02 8.3440e+02 1.2713e+03 9.6610e+02 1.6299e+03 1.5497e+03 8.0400e+02 + 4.1800e+02 6.7900e+02 8.1340e+02 1.7450e+03 2.1390e+03 1.9358e+03 8.9250e+02 + 2.9430e+02 6.5780e+02 1.9918e+03 3.0522e+03 8.5430e+02 3.9000e+02 2.8050e+02 + 7.2340e+02 5.1220e+02 8.4090e+02 1.9357e+03 2.0294e+03 9.6030e+02 4.6220e+02 + 6.8230e+02 4.1070e+02 3.3600e+02 7.9270e+02 3.8180e+02 6.5930e+02 5.3690e+02 + 1.8150e+03 2.5736e+03 9.9290e+02 7.5240e+02 2.4250e+02 2.3350e+02 8.0900e+02 + 7.1380e+02 1.0806e+03 1.8292e+03 3.3340e+03 7.0950e+02 3.5590e+02 2.6290e+02 + 1.8550e+02 5.1010e+02 9.7610e+02 6.1250e+02 6.3120e+02 7.2480e+02 1.5170e+03 + 1.5625e+03 1.8781e+03 7.7380e+02 5.3290e+02 8.8730e+02 7.3070e+02 7.3380e+02 + 1.5557e+03 1.7776e+03 1.9412e+03 5.0550e+02 6.4310e+02 7.5720e+02 8.4160e+02 + 1.3480e+03 2.7822e+03 2.2649e+03 1.3250e+03 3.3670e+02 7.9400e+02 1.0123e+03 + 3.5000e+03 5.4910e+02 2.1560e+02 5.1500e+02 7.3310e+02 6.7800e+02 6.4330e+02 + 2.4223e+03 2.1855e+03 6.8160e+02 3.3830e+02 5.0510e+02 5.0580e+02 7.2530e+02 + 5.5920e+02 5.6440e+02 3.4490e+02 4.3110e+02 1.5688e+03 2.5773e+03 9.9920e+02 + 3.6600e+02 1.8600e+02 3.9490e+02 8.0510e+02 9.6210e+02 6.2300e+02 9.9010e+02 + 2.2075e+03 1.0792e+03 5.5430e+02 2.0050e+02 2.6760e+02 2.6370e+02 1.0140e+03 + 6.2240e+02 5.3900e+02 7.5340e+02 1.5468e+03 1.6812e+03 1.2201e+03 5.9500e+02 + 6.4040e+02 9.4820e+02 7.4840e+02 5.6110e+02 1.0790e+03 2.0092e+03 1.5120e+03 + 1.0451e+03 1.1179e+03 6.7910e+02 6.9400e+02 7.7670e+02 1.3455e+03 1.8449e+03 + 9.3170e+02 6.9130e+02 3.6880e+02 1.3680e+03 3.1841e+03 1.6390e+03 3.8270e+02 + 3.6340e+02 1.1080e+03 7.9840e+02 4.8630e+02 1.8977e+03 2.3190e+03 7.8400e+02 + 3.8130e+02 1.8660e+02 5.3650e+02 7.3760e+02 5.8040e+02 4.4460e+02 3.9460e+02 + 8.7790e+02 1.0730e+03 2.5171e+03 1.2392e+03 2.6580e+02 2.1170e+02 5.9560e+02 + 9.1700e+02 8.4790e+02 5.4170e+02 1.8540e+03 1.7923e+03 6.3840e+02 1.2745e+03 + 4.4760e+02 2.9870e+02 3.4060e+02 2.8640e+02 6.2130e+02 3.8060e+02 7.4110e+02 + 1.5430e+03 1.6713e+03 2.0194e+03 5.5040e+02 4.9220e+02 7.6200e+02 8.8340e+02 + 4.6990e+02 1.7679e+03 2.1206e+03 1.9450e+03 1.0378e+03 4.0880e+02 6.4910e+02 + 5.4550e+02 3.8410e+02 7.5210e+02 2.0235e+03 1.2054e+03 6.6140e+02 7.8070e+02 + 1.0438e+03 3.3999e+03 6.7640e+02 6.3560e+02 6.7560e+02 7.1380e+02 1.0036e+03 + 1.2823e+03 7.5290e+02 2.1584e+03 1.5460e+03 5.0420e+02 5.2010e+02 3.4310e+02 + 6.0760e+02 5.0820e+02 3.6970e+02 3.7890e+02 1.5600e+03 2.3409e+03 1.7744e+03 + 1.2156e+03 3.1700e+02 1.7740e+02 4.1130e+02 6.9390e+02 5.9490e+02 5.5550e+02 + 9.9600e+02 1.8624e+03 8.9290e+02 7.4280e+02 5.1860e+02 5.0860e+02 3.9590e+02 + 2.4260e+02 6.0290e+02 5.8100e+02 7.9990e+02 7.4510e+02 2.3079e+03 1.6979e+03 + 1.3369e+03 3.3550e+02 6.6280e+02 3.2200e+02 5.2570e+02 8.5610e+02 1.7481e+03 + 1.8847e+03 4.5800e+02 5.5590e+02 4.3520e+02 2.7640e+02 5.5520e+02 1.3153e+03 + 1.9702e+03 1.5786e+03 9.2690e+02 7.9850e+02 1.1667e+03 2.7678e+03 8.1490e+02 + 5.8830e+02 4.8720e+02 6.4220e+02 4.9600e+02 7.6470e+02 1.5944e+03 2.7914e+03 + 7.3060e+02 8.8770e+02 7.0730e+02 2.0470e+02 4.0620e+02 7.1440e+02 4.7420e+02 + 4.7600e+02 7.3470e+02 2.4035e+03 1.9186e+03 1.1862e+03 4.7150e+02 5.0140e+02 + 4.9520e+02 6.7870e+02 8.8780e+02 1.1734e+03 1.0632e+03 1.5820e+03 5.5240e+02 + 7.7630e+02 3.2660e+02 8.2620e+02 3.8090e+02 8.1600e+01 3.3130e+02 4.9220e+02 + 5.0830e+02 8.5590e+02 1.1898e+03 2.1788e+03 1.1996e+03 1.3813e+03 8.3320e+02 + 4.0030e+02 4.5890e+02 8.2360e+02 1.0895e+03 2.7474e+03 8.5050e+02 3.7650e+02 + 1.2150e+02 5.0370e+02 8.9250e+02 8.6880e+02 1.7377e+03 3.0454e+03 1.5376e+03 + 9.9240e+02 1.0448e+03 2.5404e+03 8.6160e+02 9.7950e+02 4.8320e+02 4.3960e+02 + 6.1420e+02 1.1371e+03 1.2212e+03 1.7086e+03 1.1488e+03 1.3196e+03 7.2410e+02 + 5.5500e+01 3.2340e+02 4.9370e+02 7.5210e+02 5.3560e+02 9.8180e+02 3.0488e+03 + 2.4214e+03 1.0949e+03 4.3700e+02 5.4060e+02 7.2640e+02 7.2590e+02 9.8580e+02 + 1.5168e+03 1.3704e+03 1.3342e+03 9.0970e+02 5.7100e+02 2.9850e+02 7.0380e+02 + 7.4140e+02 1.5630e+02 4.3630e+02 5.6170e+02 4.6550e+02 7.5410e+02 7.9880e+02 + 1.6763e+03 2.3470e+03 1.1633e+03 5.4230e+02 1.6520e+02 3.8360e+02 1.1989e+03 + 2.5554e+03 1.8580e+03 1.1387e+03 3.7020e+02 3.3030e+02 3.1350e+02 7.7200e+02 + 3.8850e+02 8.3750e+02 1.5654e+03 2.0807e+03 1.0042e+03 7.0140e+02 3.0061e+03 + 7.8160e+02 5.7450e+02 3.1880e+02 5.7740e+02 1.0639e+03 4.5040e+02 5.4650e+02 + 1.7077e+03 2.0527e+03 7.5830e+02 6.3280e+02 4.3550e+02 9.7740e+02 6.8820e+02 + 1.0291e+03 9.0030e+02 8.3670e+02 1.9162e+03 3.0306e+03 8.8650e+02 6.2560e+02 + 5.4530e+02 9.9000e+02 1.4299e+03 1.2913e+03 1.7908e+03 6.5430e+02 1.3149e+03 + 6.0740e+02 5.4110e+02 3.8790e+02 8.3490e+02 5.9500e+02 4.0120e+02 4.4220e+02 + 6.1770e+02 4.7530e+02 6.9810e+02 1.8560e+03 2.2437e+03 2.7735e+03 1.5766e+03 + 9.4200e+02 2.5070e+02 2.2770e+02 8.1780e+02 1.8647e+03 2.3259e+03 7.8020e+02 + 9.6830e+02 3.8250e+02 7.1430e+02 6.9340e+02 5.6780e+02 4.6230e+02 2.2894e+03 + 2.6540e+03 1.3787e+03 7.1300e+02 1.6494e+03 8.1180e+02 7.1020e+02 5.6290e+02 + 2.8030e+02 7.5270e+02 5.5970e+02 8.4110e+02 2.8407e+03 2.0097e+03 1.2682e+03 + 7.5810e+02 2.5810e+02 4.9750e+02 7.6720e+02 7.4770e+02 7.9390e+02 6.9290e+02 + 1.6838e+03 1.9528e+03 9.4500e+02 1.1673e+03 1.5454e+03 1.0492e+03 1.5078e+03 + 1.5544e+03 1.6435e+03 9.4580e+02 5.8660e+02 3.6050e+02 4.1510e+02 3.6340e+02 + 6.6980e+02 5.8180e+02 6.3710e+02 6.2420e+02 4.3650e+02 3.0330e+02 3.4570e+02 + 5.0190e+02 1.5444e+03 1.9340e+03 2.1290e+03 1.2674e+03 2.7740e+02 1.7940e+02 + 4.8930e+02 1.5804e+03 2.0257e+03 1.1544e+03 5.4470e+02 7.4050e+02 1.2877e+03 + 6.2390e+02 4.4500e+02 5.0470e+02 1.5861e+03 2.7812e+03 2.3742e+03 1.1426e+03 + 1.9712e+03 8.8700e+02 6.7240e+02 5.0070e+02 4.2880e+02 5.7530e+02 3.6040e+02 + 1.8465e+03 2.5605e+03 2.0471e+03 7.5730e+02 5.0300e+02 6.4490e+02 5.5700e+02 + 7.6000e+02 1.1842e+03 1.4496e+03 9.0020e+02 2.5372e+03 2.0095e+03 1.9097e+03 + 7.0300e+02 1.4213e+03 1.6150e+03 1.8574e+03 1.8159e+03 8.0100e+02 1.2385e+03 + 3.2420e+02 3.9080e+02 2.9480e+02 2.8890e+02 3.7900e+02 5.8270e+02 2.2580e+02 + 9.2630e+02 3.1970e+02 3.2280e+02 3.8190e+02 5.7190e+02 1.1233e+03 1.8424e+03 + 1.8686e+03 1.0442e+03 2.9000e+02 4.6170e+02 8.0890e+02 7.3290e+02 1.8447e+03 + 9.5860e+02 5.2700e+02 6.0090e+02 8.6420e+02 7.8310e+02 3.5900e+02 2.8230e+02 + 1.3554e+03 2.1094e+03 1.7238e+03 1.6985e+03 3.1498e+03 6.9740e+02 7.0160e+02 + 5.8820e+02 3.3470e+02 3.4880e+02 3.0080e+02 1.5210e+03 2.1698e+03 1.6078e+03 + 4.1520e+02 5.8690e+02 4.7000e+02 3.8140e+02 2.3980e+02 1.0723e+03 7.1130e+02 + 1.6313e+03 3.5000e+03 2.5943e+03 1.3572e+03 1.5489e+03 1.0186e+03 1.7438e+03 + 1.9643e+03 1.0805e+03 7.0820e+02 4.5810e+02 6.8760e+02 4.6750e+02 4.2810e+02 + 3.0260e+02 7.1380e+02 5.9990e+02 5.4800e+02 5.6140e+02 6.6370e+02 2.6540e+02 + 1.7860e+02 3.7730e+02 6.8240e+02 1.7514e+03 2.0668e+03 2.2294e+03 7.6520e+02 + 4.0750e+02 5.1190e+02 1.3136e+03 2.1596e+03 1.8598e+03 7.2180e+02 5.2090e+02 + 9.5310e+02 4.2820e+02 7.0030e+02 4.7880e+02 6.6630e+02 8.4470e+02 3.5000e+03 + 3.1363e+03 2.3696e+03 9.0390e+02 6.3510e+02 5.4340e+02 1.8640e+02 2.9770e+02 + 4.5510e+02 1.3465e+03 1.1387e+03 1.6768e+03 1.1351e+03 5.0040e+02 7.9950e+02 + 5.2270e+02 1.4623e+03 1.8250e+03 1.6428e+03 1.1503e+03 3.0393e+03 2.4090e+03 + 1.7524e+03 1.5705e+03 1.1808e+03 1.5274e+03 8.0860e+02 7.3890e+02 3.6830e+02 + 5.0610e+02 6.5540e+02 5.5910e+02 4.3240e+02 3.2720e+02 4.2520e+02 5.5660e+02 + 4.9130e+02 7.6190e+02 4.4430e+02 1.8900e+02 3.4090e+02 3.7800e+02 4.7400e+02 + 1.2064e+03 1.9096e+03 2.1546e+03 5.7320e+02 7.4210e+02 4.4470e+02 1.5958e+03 + 1.5937e+03 2.5469e+03 7.1500e+02 4.7640e+02 7.4550e+02 5.5540e+02 4.6690e+02 + 4.9670e+02 6.2620e+02 7.2610e+02 2.9884e+03 3.5000e+03 1.7654e+03 6.0060e+02 + 6.5660e+02 5.5680e+02 2.4420e+02 5.2680e+02 4.2920e+02 9.3810e+02 1.2909e+03 + 1.5745e+03 1.0355e+03 1.0875e+03 9.4440e+02 1.5453e+03 1.5718e+03 1.2280e+03 + 1.1393e+03 7.0960e+02 2.4390e+03 3.1946e+03 9.3930e+02 1.0134e+03 8.1460e+02 + 1.1933e+03 1.3614e+03 3.7140e+02 3.1620e+02 5.2180e+02 3.4840e+02 7.1320e+02 + 4.2530e+02 5.0470e+02 5.0120e+02 2.8480e+02 3.2660e+02 6.8370e+02 2.1020e+02 + 2.9170e+02 1.7400e+02 5.5200e+02 3.8550e+02 9.7310e+02 1.8881e+03 9.5020e+02 + 5.9870e+02 6.9040e+02 4.8630e+02 9.4450e+02 8.5200e+02 2.2195e+03 7.0550e+02 + 6.1300e+02 7.7830e+02 3.3370e+02 8.7780e+02 5.3760e+02 1.1341e+03 8.3010e+02 + 1.1076e+03 3.5000e+03 1.5902e+03 8.0760e+02 5.1580e+02 3.2590e+02 3.0460e+02 + 3.7920e+02 5.0190e+02 1.1442e+03 2.1458e+03 1.2560e+03 9.5740e+02 6.8720e+02 + 1.0112e+03 1.1230e+03 2.1674e+03 1.1196e+03 1.7331e+03 1.2293e+03 1.9554e+03 + 1.7475e+03 1.6185e+03 4.4060e+02 5.0860e+02 9.9180e+02 7.7770e+02 8.4040e+02 + 4.8820e+02 4.3070e+02 2.8970e+02 2.3300e+02 4.8410e+02 7.1470e+02 6.7730e+02 + 3.8170e+02 2.2480e+02 1.7190e+02 1.5070e+02 3.8990e+02 5.0790e+02 3.9500e+02 + 6.6920e+02 9.2030e+02 9.3980e+02 2.1029e+03 5.3010e+02 5.2230e+02 9.2370e+02 + 1.3411e+03 1.2481e+03 1.3589e+03 1.5523e+03 9.2900e+02 4.8320e+02 4.8090e+02 + 6.8070e+02 8.4970e+02 1.0127e+03 4.0610e+02 6.2990e+02 3.5000e+03 2.3905e+03 + 1.1979e+03 5.4560e+02 4.4140e+02 4.4850e+02 4.8700e+02 1.0688e+03 1.5875e+03 + 2.6361e+03 1.4936e+03 1.0183e+03 7.0520e+02 1.2735e+03 1.6559e+03 9.0510e+02 + 7.3540e+02 2.4090e+02 7.6580e+02 1.7664e+03 2.3413e+03 1.5331e+03 6.6720e+02 + 2.8700e+02 6.1400e+02 1.2280e+03 8.3380e+02 9.5220e+02 6.2170e+02 4.8060e+02 + 3.7350e+02 7.8680e+02 1.0809e+03 7.8530e+02 2.9930e+02 5.6990e+02 2.8630e+02 + 2.4080e+02 3.4320e+02 4.0020e+02 3.0920e+02 5.9590e+02 6.8030e+02 1.1081e+03 + 1.6845e+03 4.9290e+02 3.9240e+02 7.9890e+02 1.2920e+03 9.5310e+02 1.4171e+03 + 1.1820e+03 5.9450e+02 5.4950e+02 5.7900e+02 2.8020e+02 5.4690e+02 4.2530e+02 + 4.1800e+02 1.7820e+03 2.9772e+03 2.9286e+03 1.0441e+03 5.6850e+02 1.7910e+02 + 3.9070e+02 4.4330e+02 8.2710e+02 1.5889e+03 2.0833e+03 1.0135e+03 2.7250e+02 + 5.3480e+02 2.0696e+03 3.3336e+03 1.1164e+03 1.1290e+03 4.9970e+02 1.5361e+03 + 8.8850e+02 2.6421e+03 1.4374e+03 1.0060e+03 4.8720e+02 4.8530e+02 4.8060e+02 + 6.7450e+02 8.9410e+02 4.2830e+02 5.5090e+02 5.2610e+02 4.0070e+02 4.9970e+02 + 4.3200e+02 2.7840e+02 2.5930e+02 5.4180e+02 9.0570e+02 4.1200e+02 7.5010e+02 + 3.4760e+02 6.4950e+02 4.0180e+02 4.4120e+02 7.9160e+02 4.8340e+02 6.5900e+02 + 6.2980e+02 7.5780e+02 1.4495e+03 1.5362e+03 1.2201e+03 1.1173e+03 4.7870e+02 + 3.1130e+02 5.3550e+02 3.2340e+02 2.0060e+02 7.2470e+02 1.4034e+03 3.5000e+03 + 2.9461e+03 5.9980e+02 6.0960e+02 2.4070e+02 5.6730e+02 7.9440e+02 5.2600e+02 + 2.1076e+03 1.9744e+03 1.3398e+03 2.5780e+02 6.6450e+02 1.4667e+03 1.9543e+03 + 1.0882e+03 5.1540e+02 8.1770e+02 1.1400e+03 9.0370e+02 2.5747e+03 2.2252e+03 + 8.5100e+02 3.4280e+02 3.7710e+02 7.6660e+02 6.4450e+02 7.6660e+02 7.5750e+02 + 4.9600e+02 3.7350e+02 4.6400e+02 9.5800e+02 3.8170e+02 2.5630e+02 2.6710e+02 + 9.5340e+02 8.7020e+02 5.4570e+02 6.7390e+02 5.1600e+02 4.0370e+02 4.8110e+02 + 3.2140e+02 2.6720e+02 4.0670e+02 5.0580e+02 5.6430e+02 5.2930e+02 9.0770e+02 + 2.2259e+03 1.5542e+03 7.1460e+02 8.5250e+02 4.9860e+02 5.5990e+02 2.9890e+02 + 3.2450e+02 4.4970e+02 1.5235e+03 2.8255e+03 2.4985e+03 2.0758e+03 5.3040e+02 + 2.2630e+02 2.9320e+02 5.1000e+02 5.6580e+02 8.6190e+02 1.7473e+03 1.0813e+03 + 2.7780e+02 4.5120e+02 2.7542e+03 2.3684e+03 8.7530e+02 6.5860e+02 6.5640e+02 + 8.7910e+02 7.8310e+02 2.2491e+03 2.4485e+03 1.0927e+03 3.6220e+02 2.8010e+02 + 6.7770e+02 5.0860e+02 5.7050e+02 3.0150e+02 8.9090e+02 5.5000e+02 2.8590e+02 + 5.7470e+02 8.9830e+02 2.5450e+02 4.0800e+02 5.6070e+02 5.4810e+02 4.6340e+02 + 4.0810e+02 4.4020e+02 4.5800e+02 8.0060e+02 4.8120e+02 3.8770e+02 3.4290e+02 + 7.4230e+02 4.8380e+02 3.5510e+02 8.8280e+02 1.9723e+03 2.4486e+03 5.3880e+02 + 3.4040e+02 4.5280e+02 3.7720e+02 3.3260e+02 8.9860e+02 1.9453e+03 1.6031e+03 + 2.6852e+03 2.8743e+03 1.8779e+03 1.3924e+03 2.6380e+02 1.7460e+02 3.1260e+02 + 1.0698e+03 1.3503e+03 2.6122e+03 1.4250e+03 7.0110e+02 6.3730e+02 5.9070e+02 + 1.9976e+03 1.9100e+03 1.3578e+03 4.8300e+02 5.2370e+02 8.3340e+02 1.5409e+03 + 2.7687e+03 4.8550e+02 2.6540e+02 3.3720e+02 3.6450e+02 4.7590e+02 8.2280e+02 + 5.5230e+02 7.2980e+02 3.9090e+02 2.2210e+02 7.7500e+02 6.0290e+02 5.4400e+02 + 3.6950e+02 9.9350e+02 8.3360e+02 5.1900e+02 6.3710e+02 5.6240e+02 4.3390e+02 + 3.9910e+02 2.6890e+02 4.4940e+02 3.7170e+02 3.7960e+02 3.0020e+02 4.2510e+02 + 9.1190e+02 1.6449e+03 2.7571e+03 6.1280e+02 5.1470e+02 7.6280e+02 4.3750e+02 + 6.6650e+02 8.6960e+02 1.4823e+03 1.7549e+03 1.6033e+03 1.7378e+03 1.6588e+03 + 7.7930e+02 4.8120e+02 4.2670e+02 1.2790e+02 3.9530e+02 1.1563e+03 2.2773e+03 + 6.8970e+02 7.7990e+02 8.5980e+02 1.2052e+03 2.5069e+03 1.8602e+03 5.7650e+02 + 3.0690e+02 6.5330e+02 6.5110e+02 2.1025e+03 2.0233e+03 1.3372e+03 4.1380e+02 + 2.9420e+02 5.7810e+02 9.4100e+02 4.6010e+02 3.8290e+02 4.3910e+02 6.8280e+02 + 5.0270e+02 7.7210e+02 6.6250e+02 4.4240e+02 9.7080e+02 8.7930e+02 3.0200e+02 + 3.6300e+02 6.1240e+02 4.2110e+02 2.7460e+02 2.4360e+02 3.2510e+02 7.8420e+02 + 4.0900e+02 2.4860e+02 7.1530e+02 2.0540e+02 4.6790e+02 8.3080e+02 1.5478e+03 + 1.4630e+03 3.7080e+02 4.2260e+02 3.0780e+02 3.5050e+02 1.3507e+03 2.7334e+03 + 2.2701e+03 1.0863e+03 1.3702e+03 1.8401e+03 7.6870e+02 5.7140e+02 3.1010e+02 + 2.2420e+02 3.1130e+02 1.1166e+03 2.1255e+03 9.4980e+02 5.3600e+02 5.5560e+02 + 8.9430e+02 3.1025e+03 1.6769e+03 9.7060e+02 4.7070e+02 3.4160e+02 5.4590e+02 + 1.5146e+03 1.8965e+03 6.1160e+02 3.8320e+02 5.4310e+02 5.3020e+02 5.9800e+02 + 3.8130e+02 2.3730e+02 6.9420e+02 6.6290e+02 3.1520e+02 6.9330e+02 4.4970e+02 + 7.7990e+02 1.2974e+03 7.5850e+02 6.5550e+02 2.2810e+02 2.3170e+02 4.8130e+02 + 3.2630e+02 2.9430e+02 4.1320e+02 4.2260e+02 2.3870e+02 3.4910e+02 3.9860e+02 + 4.0170e+02 6.9710e+02 1.9380e+03 1.3260e+03 4.1910e+02 4.4050e+02 2.3480e+02 + 2.9470e+02 5.2260e+02 1.2943e+03 2.8267e+03 1.0036e+03 1.5186e+03 1.2969e+03 + 1.5243e+03 2.3794e+03 1.2470e+03 6.1740e+02 4.1260e+02 6.0900e+02 7.7780e+02 + 2.7234e+03 1.1219e+03 4.3860e+02 2.8110e+02 1.2933e+03 1.9733e+03 1.4178e+03 + 7.8870e+02 1.1513e+03 4.8640e+02 3.4820e+02 1.2605e+03 2.2298e+03 1.2207e+03 + 5.4920e+02 7.0530e+02 7.3630e+02 4.9890e+02 2.9030e+02 3.2440e+02 4.6880e+02 + 5.5620e+02 4.5700e+02 4.4490e+02 2.7570e+02 4.0590e+02 6.1250e+02 6.7010e+02 + 3.0790e+02 2.7630e+02 4.4510e+02 6.8030e+02 3.6050e+02 1.9930e+02 4.1660e+02 + 4.2720e+02 6.7670e+02 2.3930e+02 5.8020e+02 4.2650e+02 1.1910e+03 1.7079e+03 + 2.1014e+03 8.8000e+02 3.5240e+02 2.6750e+02 2.6650e+02 8.9680e+02 2.4363e+03 + 2.1115e+03 1.5459e+03 5.7310e+02 8.4050e+02 1.8967e+03 1.7133e+03 1.4453e+03 + 5.3810e+02 2.9480e+02 7.4540e+02 1.2083e+03 2.9417e+03 1.5526e+03 3.8360e+02 + 5.3060e+02 1.6228e+03 2.0820e+03 2.3547e+03 1.3274e+03 8.0900e+02 7.2320e+02 + 4.5740e+02 1.3021e+03 1.7015e+03 1.7693e+03 8.3850e+02 7.1920e+02 5.7770e+02 + 8.7340e+02 3.1510e+02 4.5000e+02 3.3760e+02 5.2640e+02 7.1420e+02 8.0900e+02 + 5.8780e+02 3.3430e+02 4.6490e+02 2.0080e+02 2.9240e+02 3.0590e+02 7.6920e+02 + 5.4850e+02 7.6270e+02 4.7220e+02 7.1640e+02 3.7900e+02 3.5670e+02 5.5870e+02 + 3.4050e+02 7.4320e+02 9.4700e+02 1.7902e+03 1.4645e+03 7.6750e+02 4.1910e+02 + 2.4470e+02 4.3440e+02 9.1150e+02 2.2134e+03 2.0140e+03 1.5155e+03 3.4520e+02 + 5.9850e+02 1.8503e+03 1.6944e+03 1.6144e+03 4.1350e+02 3.6400e+02 5.2190e+02 + 9.6010e+02 1.7788e+03 1.1194e+03 6.7330e+02 4.3490e+02 9.5630e+02 9.8030e+02 + 1.2835e+03 1.5624e+03 1.5880e+03 8.1030e+02 1.0357e+03 1.0664e+03 1.0694e+03 + 2.1370e+03 1.9312e+03 7.3610e+02 5.8540e+02 6.7000e+02 4.0310e+02 3.9120e+02 + 4.1670e+02 3.5300e+02 6.9720e+02 1.0027e+03 4.6700e+02 4.1330e+02 2.3240e+02 + 2.5480e+02 1.9880e+02 3.9180e+02 6.1340e+02 6.3380e+02 4.7440e+02 9.7140e+02 + 4.6960e+02 4.0550e+02 3.9650e+02 5.9240e+02 5.7360e+02 5.3970e+02 1.5863e+03 + 2.5290e+03 8.2700e+02 5.4650e+02 7.7560e+02 2.7900e+02 2.3680e+02 2.1475e+03 + 2.0163e+03 1.7847e+03 3.8420e+02 5.0970e+02 5.9370e+02 8.7440e+02 1.6856e+03 + 2.4230e+03 7.2270e+02 2.5270e+02 5.0610e+02 1.5309e+03 1.4678e+03 1.9151e+03 + 1.3712e+03 6.6760e+02 5.3640e+02 8.7860e+02 1.5694e+03 1.6492e+03 1.8543e+03 + 9.1400e+02 1.2221e+03 1.1104e+03 7.3170e+02 1.6735e+03 2.3535e+03 9.1230e+02 + 7.5330e+02 5.0300e+02 3.4570e+02 3.4170e+02 5.0660e+02 3.8720e+02 4.2060e+02 + 7.8230e+02 8.1980e+02 7.2320e+02 2.8950e+02 2.1590e+02 3.1530e+02 3.4040e+02 + 7.3390e+02 6.9390e+02 4.9290e+02 5.7700e+02 6.8100e+02 6.6660e+02 2.3970e+02 + 6.8090e+02 4.1340e+02 1.0813e+03 1.5313e+03 2.1690e+03 8.8010e+02 4.8110e+02 + 7.5580e+02 3.4180e+02 1.0989e+03 2.6221e+03 1.2770e+03 6.4020e+02 3.4590e+02 + 4.3960e+02 3.8470e+02 2.9510e+02 1.3820e+03 1.7321e+03 1.0807e+03 4.4030e+02 + 4.4490e+02 1.4439e+03 8.4310e+02 2.0188e+03 7.4760e+02 1.4244e+03 2.0040e+02 + 6.4740e+02 9.1160e+02 1.0650e+03 1.3808e+03 1.1610e+03 9.0210e+02 1.2590e+03 + 1.3726e+03 1.5428e+03 1.8060e+03 1.4909e+03 6.9660e+02 5.0180e+02 4.0570e+02 + 3.9690e+02 5.4910e+02 3.0890e+02 6.1060e+02 9.0910e+02 4.0980e+02 2.6240e+02 + 1.7920e+02 3.3900e+02 6.4970e+02 3.2700e+02 5.3670e+02 5.9790e+02 5.2270e+02 + 3.9800e+02 7.7130e+02 4.3640e+02 3.3380e+02 8.7120e+02 1.1672e+03 8.1720e+02 + 2.0347e+03 8.3880e+02 5.5210e+02 3.5880e+02 4.1480e+02 3.6430e+02 1.9882e+03 + 2.7147e+03 1.7225e+03 3.0260e+02 3.4820e+02 3.0850e+02 4.6360e+02 1.1177e+03 + 5.1870e+02 2.8528e+03 1.9025e+03 3.1450e+02 3.4970e+02 9.5130e+02 1.2563e+03 + 1.9481e+03 1.7080e+03 4.8950e+02 1.4680e+02 4.1160e+02 5.1720e+02 7.4390e+02 + 4.1070e+02 1.2389e+03 1.7614e+03 2.0869e+03 1.8616e+03 2.7324e+03 3.5000e+03 + 2.1561e+03 9.2040e+02 3.4970e+02 2.0000e+02 6.4660e+02 5.5200e+02 1.5020e+02 + 3.1580e+02 6.5200e+02 4.9000e+02 3.1300e+02 4.0240e+02 6.3220e+02 5.0520e+02 + 5.5950e+02 4.0830e+02 5.1460e+02 5.1480e+02 3.4210e+02 6.0030e+02 5.8310e+02 + 6.2640e+02 1.0556e+03 1.5901e+03 2.1618e+03 1.9594e+03 7.8830e+02 3.8790e+02 + 3.6730e+02 4.6460e+02 9.7010e+02 2.4258e+03 1.3764e+03 1.5644e+03 5.1840e+02 + 4.1390e+02 4.4460e+02 5.1220e+02 3.8060e+02 1.1715e+03 2.8622e+03 2.2220e+03 + 7.0920e+02 8.1880e+02 7.9190e+02 1.1813e+03 1.1992e+03 2.1366e+03 1.0280e+03 + 3.5480e+02 3.6870e+02 6.1340e+02 5.8440e+02 7.4750e+02 7.0600e+02 1.0002e+03 + 9.7960e+02 2.0334e+03 3.1261e+03 3.1029e+03 2.8061e+03 1.5826e+03 7.4120e+02 + 4.7280e+02 3.8300e+02 6.9840e+02 3.7650e+02 3.3960e+02 4.0810e+02 6.1680e+02 + 2.5870e+02 6.7220e+02 5.8690e+02 8.9470e+02 5.8400e+02 3.0420e+02 4.5070e+02 + 7.7170e+02 4.0190e+02 4.9760e+02 1.5973e+03 4.1840e+02 5.8940e+02 1.5843e+03 + 1.6913e+03 1.5678e+03 5.6220e+02 6.4170e+02 3.4390e+02 4.0550e+02 1.3627e+03 + 1.5115e+03 1.0136e+03 8.7980e+02 4.6140e+02 3.8780e+02 4.5890e+02 4.4650e+02 + 2.1980e+02 6.5520e+02 1.5716e+03 2.6595e+03 1.0341e+03 3.7140e+02 5.1300e+02 + 7.0340e+02 1.5594e+03 3.1058e+03 2.1971e+03 2.1430e+02 7.3090e+02 5.3440e+02 + 3.8720e+02 5.1350e+02 3.4090e+02 4.5090e+02 1.0805e+03 1.5031e+03 2.0203e+03 + 1.9319e+03 3.5000e+03 2.1828e+03 4.4200e+02 4.0140e+02 5.6990e+02 4.4860e+02 + 3.4750e+02 3.1170e+02 3.2800e+02 5.3450e+02 3.8050e+02 4.7070e+02 6.0180e+02 + 1.2012e+03 7.1970e+02 3.1360e+02 4.8430e+02 6.6600e+02 3.9560e+02 4.0330e+02 + 9.8470e+02 2.4150e+02 3.9760e+02 1.1145e+03 2.1776e+03 9.2890e+02 9.1640e+02 + 4.7360e+02 3.7240e+02 4.4350e+02 2.3628e+03 2.4403e+03 7.5930e+02 3.3430e+02 + 6.2330e+02 8.5810e+02 4.9890e+02 3.2950e+02 3.2800e+02 6.1730e+02 1.3663e+03 + 2.6790e+03 1.1832e+03 3.9490e+02 2.6610e+02 6.3380e+02 1.5593e+03 2.6729e+03 + 1.8928e+03 1.6270e+03 1.3189e+03 4.8070e+02 4.0750e+02 3.9280e+02 5.2670e+02 + 6.2970e+02 4.4060e+02 5.7790e+02 6.6420e+02 1.7701e+03 2.3619e+03 2.6584e+03 + 1.0010e+03 6.2600e+02 7.0530e+02 3.3340e+02 2.8300e+02 1.9890e+02 4.8740e+02 + 5.8550e+02 6.4930e+02 3.7930e+02 7.6550e+02 5.0930e+02 5.2750e+02 4.7940e+02 + 7.4210e+02 9.5450e+02 4.3790e+02 6.2800e+02 1.1916e+03 6.5480e+02 5.6890e+02 + 2.4721e+03 1.7695e+03 7.4900e+02 6.9190e+02 6.5870e+02 3.4950e+02 4.7290e+02 + 1.3173e+03 2.6575e+03 7.9430e+02 1.7500e+02 3.5740e+02 1.1483e+03 6.6360e+02 + 2.7480e+02 3.7160e+02 8.6850e+02 8.4350e+02 2.1866e+03 1.7868e+03 9.0940e+02 + 3.1400e+02 3.9440e+02 7.9840e+02 1.2165e+03 2.2584e+03 2.1632e+03 1.3669e+03 + 5.5170e+02 3.7720e+02 2.1220e+02 6.5510e+02 5.2900e+02 4.6740e+02 5.2200e+02 + 6.3230e+02 1.1123e+03 3.4378e+03 3.5000e+03 1.7868e+03 7.6660e+02 1.0100e+03 + 6.0530e+02 3.4850e+02 1.0640e+02 4.3840e+02 5.5270e+02 5.4330e+02 5.7470e+02 + 6.6300e+02 8.6950e+02 4.0720e+02 5.6540e+02 5.3430e+02 7.2000e+02 3.5880e+02 + 4.5590e+02 7.3600e+02 5.9950e+02 1.5208e+03 2.3029e+03 7.5470e+02 1.7139e+03 + 6.4110e+02 4.9820e+02 4.1640e+02 7.6400e+02 2.4533e+03 2.3311e+03 1.4121e+03 + 2.3560e+02 4.9700e+02 9.9560e+02 5.5900e+02 2.7610e+02 4.5980e+02 4.7930e+02 + 6.6350e+02 1.1668e+03 2.4636e+03 6.4500e+02 3.8760e+02 5.3030e+02 4.4700e+02 + 9.9630e+02 1.0130e+03 1.8112e+03 1.0731e+03 5.8380e+02 3.1780e+02 2.1410e+02 + 5.8200e+02 5.1090e+02 5.8100e+02 4.0440e+02 7.3640e+02 9.8340e+02 2.7532e+03 + 2.2254e+03 3.1944e+03 1.4879e+03 1.5014e+03 7.3400e+02 2.6380e+02 1.8040e+02 + 3.4020e+02 5.1000e+02 6.2500e+02 6.0350e+02 7.5540e+02 5.7050e+02 6.3460e+02 + 3.8360e+02 3.6070e+02 4.6210e+02 7.0670e+02 5.2900e+02 1.6714e+03 1.3499e+03 + 1.9852e+03 1.8115e+03 1.0312e+03 6.1890e+02 5.1020e+02 4.8250e+02 5.8480e+02 + 1.2960e+03 2.1085e+03 1.5706e+03 7.5520e+02 5.3000e+02 2.8900e+02 5.0210e+02 + 5.0520e+02 3.6670e+02 5.1860e+02 4.1790e+02 4.5950e+02 1.5368e+03 2.0273e+03 + 1.4903e+03 6.0740e+02 3.6040e+02 6.9910e+02 4.5090e+02 9.2560e+02 1.5873e+03 + 1.5429e+03 7.8070e+02 3.9280e+02 1.8310e+02 6.5490e+02 7.7600e+02 5.0950e+02 + 3.5560e+02 5.2960e+02 7.9920e+02 1.8747e+03 1.9856e+03 1.8521e+03 2.2399e+03 + 5.2030e+02 4.9870e+02 6.1310e+02 2.6320e+02 7.9370e+02 5.2260e+02 3.9890e+02 + 4.9240e+02 6.1690e+02 2.4840e+02 7.7220e+02 1.0128e+03 3.6890e+02 4.7330e+02 + 5.1600e+02 1.2133e+03 1.3747e+03 1.2718e+03 1.4058e+03 1.8798e+03 1.5893e+03 + 5.2380e+02 5.7640e+02 4.0460e+02 6.1210e+02 1.5960e+03 1.8577e+03 2.3358e+03 + 1.8804e+03 7.9860e+02 2.4290e+02 3.5680e+02 5.3540e+02 3.7930e+02 6.6440e+02 + 3.8370e+02 2.4170e+02 1.1850e+03 1.9490e+03 2.0389e+03 1.6568e+03 5.2090e+02 + 5.0380e+02 5.0430e+02 7.9820e+02 1.5585e+03 1.1998e+03 2.2664e+03 1.2544e+03 + 4.4630e+02 7.5790e+02 8.0510e+02 8.0140e+02 3.1010e+02 4.6650e+02 1.4915e+03 + 1.2006e+03 2.5069e+03 1.0418e+03 2.3746e+03 9.7890e+02 7.5570e+02 5.1580e+02 + 5.9210e+02 4.6220e+02 4.2240e+02 3.9370e+02 8.3800e+02 6.0550e+02 3.1210e+02 + 3.6940e+02 4.1700e+02 5.4230e+02 5.2730e+02 5.5710e+02 1.1630e+03 9.7340e+02 + 1.5569e+03 1.9011e+03 2.0226e+03 4.9300e+02 5.1780e+02 4.9190e+02 6.5100e+02 + 5.8450e+02 1.8722e+03 2.8482e+03 2.2749e+03 1.2327e+03 7.4530e+02 3.5240e+02 + 4.9190e+02 4.7450e+02 3.7030e+02 6.5950e+02 3.5950e+02 4.7370e+02 8.2330e+02 + 1.8002e+03 2.0955e+03 1.8692e+03 1.0614e+03 4.9490e+02 6.4720e+02 4.9040e+02 + 9.6520e+02 1.3415e+03 1.9799e+03 1.3694e+03 9.1790e+02 8.2230e+02 8.8650e+02 + 4.4080e+02 2.3860e+02 3.1500e+02 1.2455e+03 1.9088e+03 1.7687e+03 2.3949e+03 + 2.4257e+03 1.5400e+03 8.0300e+02 6.7940e+02 6.0810e+02 7.9890e+02 5.6310e+02 + 4.3870e+02 5.4430e+02 4.0060e+02 4.0500e+02 7.5430e+02 1.0378e+03 5.4700e+02 + 5.2880e+02 7.4470e+02 1.5847e+03 2.4749e+03 2.2975e+03 2.0523e+03 1.4542e+03 + 3.0280e+02 1.6830e+02 5.0990e+02 5.1110e+02 3.7700e+02 1.5606e+03 1.6004e+03 + 1.5707e+03 7.8850e+02 6.1310e+02 3.5230e+02 8.5300e+02 6.4850e+02 2.8880e+02 + 2.4140e+02 1.5900e+02 4.1820e+02 9.9060e+02 1.0150e+03 2.1213e+03 1.4050e+03 + 7.8760e+02 6.9080e+02 1.8070e+02 5.6650e+02 9.2450e+02 1.3268e+03 2.1698e+03 + 1.5983e+03 1.4219e+03 1.3024e+03 7.1880e+02 3.0980e+02 1.1230e+02 4.9480e+02 + 1.5759e+03 1.6394e+03 1.3677e+03 1.9712e+03 1.9162e+03 1.5227e+03 5.2690e+02 + 5.8780e+02 5.2160e+02 4.1800e+02 6.1600e+02 8.3630e+02 6.1940e+02 4.8530e+02 + 7.6030e+02 3.9270e+02 5.8890e+02 4.8610e+02 5.5410e+02 6.6910e+02 1.0175e+03 + 1.6583e+03 2.5503e+03 2.1809e+03 1.6315e+03 1.7740e+02 3.3430e+02 2.9410e+02 + 7.8690e+02 1.0211e+03 9.8320e+02 2.2841e+03 9.9460e+02 9.2440e+02 9.9840e+02 + 4.3800e+02 8.8730e+02 5.5240e+02 2.5900e+02 3.9560e+02 3.4310e+02 5.4600e+02 + 5.1180e+02 1.7934e+03 2.3399e+03 8.9150e+02 1.1458e+03 4.5920e+02 4.8330e+02 + 3.3750e+02 7.1630e+02 1.1017e+03 1.3322e+03 1.6129e+03 1.6250e+03 1.0004e+03 + 9.2560e+02 1.5070e+02 1.5180e+02 3.8580e+02 1.6842e+03 1.8546e+03 1.1623e+03 + 1.6965e+03 1.9601e+03 1.6523e+03 8.1230e+02 8.4200e+02 5.8190e+02 6.1430e+02 + 6.4440e+02 7.0050e+02 3.1940e+02 2.9150e+02 9.7470e+02 6.9930e+02 1.4540e+02 + 2.9530e+02 8.4850e+02 1.2791e+03 1.0931e+03 2.3757e+03 2.5542e+03 2.8294e+03 + 4.5790e+02 3.9270e+02 3.5400e+02 2.7410e+02 4.8880e+02 5.6150e+02 7.6660e+02 + 2.2391e+03 1.5006e+03 1.0464e+03 4.7740e+02 8.8630e+02 1.2918e+03 4.4560e+02 + 2.7150e+02 4.1330e+02 2.6310e+02 4.0330e+02 8.0190e+02 6.7280e+02 2.3077e+03 + 1.0605e+03 1.2987e+03 3.8930e+02 1.8060e+02 6.0150e+02 1.0943e+03 4.2800e+02 + 6.6350e+02 1.7422e+03 1.9906e+03 1.5201e+03 1.2699e+03 1.4570e+02 2.7950e+02 + 8.1670e+02 1.5325e+03 1.8168e+03 1.0977e+03 1.9431e+03 2.0545e+03 1.0904e+03 + 6.7880e+02 5.5270e+02 4.4390e+02 4.0920e+02 5.6450e+02 3.8660e+02 2.4150e+02 + 2.9660e+02 5.7360e+02 4.7040e+02 3.4780e+02 3.6700e+02 7.2120e+02 1.0656e+03 + 8.5790e+02 2.0126e+03 2.1241e+03 2.0991e+03 8.7380e+02 4.7240e+02 6.6170e+02 + 3.4870e+02 6.2660e+02 7.5700e+02 1.1748e+03 1.8328e+03 8.1380e+02 4.5710e+02 + 4.8100e+02 7.6010e+02 1.1114e+03 5.9200e+02 2.1810e+02 3.2200e+02 2.4940e+02 + 2.0920e+02 9.8020e+02 9.5820e+02 1.0972e+03 8.7480e+02 7.1590e+02 7.3460e+02 + 3.0660e+02 4.1520e+02 8.9050e+02 8.6050e+02 5.6300e+02 4.7040e+02 1.7436e+03 + 2.0855e+03 1.9432e+03 4.8730e+02 4.6890e+02 1.3294e+03 1.9698e+03 1.8386e+03 + 8.9990e+02 1.5477e+03 2.6923e+03 1.3873e+03 6.9400e+02 3.6670e+02 2.6290e+02 + 5.2490e+02 4.0320e+02 2.2640e+02 9.9500e+01 3.9000e+02 3.6190e+02 7.6050e+02 + 3.3430e+02 2.4470e+02 4.0020e+02 6.5220e+02 1.0701e+03 2.1113e+03 1.2614e+03 + 2.3160e+03 1.3194e+03 5.4990e+02 4.8070e+02 2.4250e+02 3.9970e+02 3.8310e+02 + 5.9580e+02 1.6215e+03 1.3117e+03 3.1130e+02 5.2190e+02 1.1005e+03 1.5209e+03 + 3.5920e+02 2.7730e+02 6.6150e+02 7.6340e+02 3.6510e+02 1.1402e+03 9.5190e+02 + 2.5160e+03 1.2098e+03 9.5290e+02 2.6300e+02 6.7920e+02 5.8990e+02 6.5110e+02 + 4.3780e+02 3.6790e+02 3.6450e+02 1.1493e+03 3.0544e+03 1.8156e+03 3.7820e+02 + 1.4228e+03 1.3132e+03 2.9482e+03 9.3850e+02 1.5678e+03 1.1376e+03 2.1392e+03 + 8.4330e+02 4.5590e+02 5.9740e+02 4.1920e+02 4.1090e+02 3.8240e+02 2.3030e+02 + 4.2470e+02 5.5610e+02 4.8410e+02 6.1630e+02 4.9060e+02 4.5890e+02 4.3090e+02 + 8.5440e+02 1.4450e+03 1.6190e+03 2.2485e+03 2.0475e+03 1.5612e+03 6.7120e+02 + 4.5190e+02 3.5950e+02 1.5090e+02 2.3130e+02 4.7160e+02 9.4210e+02 1.7623e+03 + 3.7860e+02 4.9130e+02 8.8410e+02 7.5810e+02 4.7590e+02 3.5140e+02 5.3470e+02 + 5.9920e+02 7.0830e+02 5.1400e+02 9.9930e+02 2.1898e+03 1.0736e+03 9.6570e+02 + 6.5890e+02 5.2530e+02 7.5900e+02 9.0640e+02 2.7730e+02 3.7170e+02 2.7900e+02 + 9.4310e+02 2.9332e+03 2.2834e+03 1.3851e+03 1.3707e+03 1.0618e+03 2.1663e+03 + 1.0336e+03 8.9360e+02 2.5874e+03 1.5022e+03 6.4510e+02 7.5630e+02 6.7040e+02 + 4.7190e+02 4.1310e+02 5.3610e+02 2.7920e+02 4.6850e+02 4.8700e+02 8.6530e+02 + 8.3860e+02 4.4170e+02 4.4110e+02 5.2880e+02 3.9460e+02 2.1887e+03 1.7762e+03 + 1.5893e+03 3.3003e+03 5.7470e+02 6.8470e+02 5.8490e+02 4.1100e+02 5.2800e+02 + 4.1370e+02 2.3050e+02 1.4835e+03 1.8697e+03 9.9460e+02 5.9290e+02 4.2920e+02 + 9.1450e+02 3.2430e+02 2.9370e+02 1.0745e+03 5.3030e+02 6.1880e+02 8.6310e+02 + 9.8460e+02 1.3898e+03 8.7420e+02 6.0540e+02 5.1970e+02 1.2112e+03 8.2130e+02 + 5.2140e+02 2.5810e+02 4.6430e+02 4.0360e+02 7.0610e+02 1.6059e+03 1.7569e+03 + 1.7614e+03 1.0089e+03 2.0421e+03 1.5023e+03 8.9690e+02 1.6489e+03 2.6493e+03 + 2.1031e+03 1.3867e+03 6.8620e+02 7.4090e+02 6.5340e+02 4.3270e+02 6.4580e+02 + 6.9980e+02 8.8730e+02 6.3700e+02 4.8720e+02 4.6780e+02 3.3640e+02 4.4600e+02 + 5.6820e+02 1.2295e+03 1.9333e+03 9.3190e+02 1.6377e+03 3.0082e+03 1.2588e+03 + 2.2850e+02 4.4530e+02 6.4430e+02 8.7310e+02 3.0770e+02 3.0120e+02 1.7653e+03 + 2.5263e+03 1.4939e+03 3.8750e+02 4.8130e+02 5.0090e+02 3.9720e+02 5.5790e+02 + 6.8410e+02 6.0660e+02 4.3530e+02 8.8770e+02 1.1305e+03 2.4879e+03 1.2378e+03 + 5.0940e+02 5.2350e+02 4.3540e+02 6.8620e+02 4.9340e+02 2.2960e+02 2.2630e+02 + 4.9250e+02 6.5510e+02 1.2875e+03 2.2459e+03 1.5858e+03 1.3446e+03 1.9309e+03 + 1.5617e+03 1.1720e+03 1.2108e+03 9.7660e+02 1.6623e+03 5.5050e+02 7.2640e+02 + 1.1654e+03 5.6460e+02 4.3020e+02 4.7030e+02 6.8820e+02 2.8060e+02 6.4170e+02 + 7.7660e+02 6.2450e+02 7.2150e+02 6.2030e+02 7.0600e+02 1.2576e+03 2.1470e+03 + 7.9120e+02 1.1108e+03 2.0234e+03 1.6819e+03 2.9940e+02 1.3520e+02 8.8270e+02 + 8.7900e+02 8.9200e+02 4.1410e+02 7.6830e+02 2.6333e+03 2.2435e+03 2.8500e+02 + 7.7520e+02 6.7760e+02 1.9810e+02 3.6130e+02 6.0450e+02 9.7070e+02 4.4790e+02 + 7.1690e+02 2.1108e+03 2.5280e+03 8.5810e+02 5.9560e+02 3.6820e+02 5.4780e+02 + 4.4980e+02 4.9470e+02 4.1320e+02 7.3440e+02 6.8370e+02 4.1580e+02 7.0360e+02 + 1.2355e+03 2.5117e+03 1.4664e+03 1.8470e+03 9.4900e+02 9.4190e+02 8.9870e+02 + 2.3513e+03 2.5865e+03 2.3370e+02 4.0280e+02 7.0510e+02 7.1340e+02 3.3140e+02 + 4.9790e+02 3.9440e+02 3.4420e+02 6.0150e+02 5.0620e+02 4.3820e+02 7.2850e+02 + 4.2660e+02 4.0790e+02 9.4060e+02 1.7153e+03 1.2798e+03 1.4709e+03 2.5637e+03 + 4.8330e+02 6.6710e+02 1.8430e+02 5.8810e+02 6.5820e+02 9.8250e+02 6.0500e+02 + 8.0130e+02 1.5489e+03 1.7386e+03 1.6657e+03 3.4120e+02 5.6980e+02 3.9380e+02 + 3.3190e+02 7.9030e+02 4.7050e+02 3.9740e+02 1.1670e+03 2.8401e+03 1.7804e+03 + 1.5603e+03 8.4530e+02 7.2210e+02 7.8140e+02 6.9360e+02 3.2270e+02 5.8640e+02 + 6.3210e+02 7.5560e+02 5.6040e+02 1.0878e+03 1.7795e+03 3.3037e+03 2.2318e+03 + 1.9348e+03 1.4839e+03 4.6480e+02 7.5370e+02 2.5373e+03 1.3728e+03 6.1980e+02 + 3.7000e+02 6.1650e+02 4.3490e+02 3.0430e+02 5.7330e+02 2.7360e+02 3.2500e+02 + 4.3260e+02 6.0420e+02 6.1420e+02 6.7400e+02 6.8570e+02 3.4520e+02 1.7956e+03 + 2.6594e+03 1.7464e+03 1.9383e+03 2.6848e+03 1.1906e+03 7.3210e+02 2.0110e+02 + 3.5710e+02 5.2010e+02 7.7950e+02 7.2640e+02 1.3433e+03 9.8250e+02 2.0124e+03 + 2.7838e+03 1.2447e+03 6.5360e+02 6.4110e+02 6.2240e+02 3.2950e+02 6.5000e+02 + 4.6190e+02 1.1392e+03 1.9124e+03 1.9057e+03 1.0122e+03 9.3190e+02 4.4850e+02 + 5.6480e+02 5.7060e+02 6.6100e+02 5.3340e+02 9.1920e+02 4.8830e+02 6.7140e+02 + 3.6680e+02 2.3508e+03 2.9598e+03 3.5000e+03 1.1400e+03 7.4760e+02 6.6040e+02 + 1.2924e+03 2.5097e+03 1.3492e+03 9.2340e+02 4.1880e+02 4.0290e+02 3.9070e+02 + 8.0500e+02 2.9340e+02 3.3500e+02 2.3490e+02 6.2870e+02 6.9430e+02 4.7030e+02 + 8.5050e+02 4.7300e+02 5.6710e+02 8.3990e+02 2.0189e+03 2.7357e+03 1.5802e+03 + 2.7662e+03 1.0422e+03 2.6410e+02 2.1940e+02 3.3080e+02 7.5530e+02 9.5550e+02 + 8.4470e+02 9.2860e+02 1.2685e+03 1.4747e+03 3.3371e+03 6.7450e+02 3.7260e+02 + 7.1140e+02 5.5450e+02 6.6130e+02 2.8370e+02 8.7940e+02 9.7930e+02 3.2667e+03 + 2.1523e+03 1.0777e+03 4.7530e+02 4.8820e+02 5.5100e+02 5.4880e+02 6.6010e+02 + 3.3020e+02 8.5410e+02 8.9450e+02 2.7380e+02 6.9870e+02 6.2970e+02 3.5000e+03 + 2.7424e+03 6.2860e+02 5.1020e+02 7.2450e+02 1.5465e+03 1.7115e+03 1.6929e+03 + 8.5970e+02 5.1090e+02 4.9940e+02 3.5690e+02 4.2520e+02 2.6410e+02 2.0570e+02 + 2.2920e+02 5.4480e+02 7.3280e+02 6.2050e+02 3.7160e+02 4.1110e+02 4.3480e+02 + 7.6800e+02 1.1739e+03 1.9299e+03 1.6068e+03 2.6519e+03 2.0513e+03 6.5150e+02 + 1.6160e+02 2.0720e+02 4.3990e+02 9.9310e+02 6.2620e+02 4.3320e+02 2.3370e+02 + 9.7340e+02 2.6180e+03 2.1403e+03 5.9100e+02 4.8160e+02 3.5270e+02 3.4100e+02 + 5.7120e+02 4.9830e+02 1.9781e+03 2.2544e+03 1.9175e+03 8.4670e+02 5.4570e+02 + 3.5110e+02 5.8350e+02 4.7540e+02 4.7230e+02 2.4710e+02 3.7310e+02 6.2610e+02 + 4.9230e+02 6.8230e+02 2.2118e+03 3.2524e+03 3.5000e+03 7.4530e+02 6.1550e+02 + 3.7560e+02 1.6094e+03 1.7908e+03 2.5755e+03 1.3672e+03 7.1370e+02 3.5870e+02 + 2.5310e+02 5.7490e+02 1.2013e+03 4.1330e+02 9.8440e+02 4.8860e+02 5.6650e+02 + 6.4180e+02 6.7810e+02 3.5370e+02 5.7010e+02 5.8240e+02 8.4770e+02 1.5499e+03 + 1.2853e+03 2.8372e+03 1.5924e+03 6.9820e+02 4.4510e+02 6.7270e+02 5.7910e+02 + 6.0190e+02 6.4230e+02 5.9890e+02 2.9270e+02 1.8457e+03 1.5764e+03 1.8754e+03 + 1.1119e+03 4.8920e+02 2.6020e+02 2.7530e+02 4.7340e+02 8.7030e+02 2.5811e+03 + 2.2603e+03 1.1030e+03 6.8070e+02 2.9700e+02 6.1990e+02 3.9580e+02 3.4270e+02 + 2.5270e+02 1.7130e+02 5.7540e+02 5.2510e+02 4.7300e+02 7.1950e+02 2.5426e+03 + 3.0112e+03 3.1557e+03 6.2450e+02 4.7210e+02 2.1910e+02 1.0959e+03 2.0081e+03 + 2.1181e+03 1.5394e+03 1.0755e+03 6.8400e+02 2.5610e+02 3.8740e+02 6.6750e+02 + 6.1010e+02 2.9300e+02 6.1530e+02 6.5360e+02 4.8500e+02 5.1770e+02 5.0890e+02 + 3.2680e+02 4.5090e+02 1.2502e+03 2.0504e+03 8.2180e+02 1.9082e+03 2.5428e+03 + 9.9090e+02 2.5850e+02 4.1710e+02 5.0490e+02 6.0470e+02 8.2700e+02 5.4680e+02 + 3.5490e+02 7.1570e+02 1.1695e+03 2.1305e+03 8.6180e+02 4.0490e+02 3.6130e+02 + 3.1740e+02 7.1170e+02 8.6580e+02 2.9036e+03 1.5226e+03 1.3290e+03 7.4460e+02 + 6.7700e+02 5.7360e+02 2.6800e+02 4.4740e+02 4.2720e+02 4.4110e+02 3.2760e+02 + 4.5500e+02 5.6970e+02 1.3667e+03 2.8032e+03 3.0642e+03 1.3973e+03 6.3430e+02 + 4.2770e+02 4.4620e+02 3.1810e+02 1.5808e+03 2.8286e+03 1.6113e+03 9.1240e+02 + 5.4990e+02 2.3280e+02 3.9240e+02 4.0190e+02 4.7460e+02 3.6680e+02 2.8690e+02 + 4.7270e+02 4.4240e+02 1.0169e+03 4.0700e+02 6.8910e+02 7.7550e+02 7.2750e+02 + 2.0208e+03 8.5840e+02 1.7954e+03 1.9968e+03 7.4910e+02 6.2000e+02 4.4940e+02 + 9.6380e+02 9.7810e+02 3.7870e+02 3.9490e+02 5.7750e+02 9.3400e+02 1.3230e+03 + 1.6628e+03 2.4056e+03 6.9360e+02 2.5330e+02 6.4890e+02 6.9310e+02 2.0617e+03 + 1.9691e+03 1.5026e+03 9.7290e+02 8.2400e+02 8.1690e+02 5.9140e+02 4.3770e+02 + 3.1660e+02 3.7180e+02 4.0150e+02 3.5060e+02 4.2430e+02 2.9710e+02 2.2675e+03 + 3.1793e+03 2.5055e+03 1.6297e+03 3.7740e+02 4.4880e+02 4.8960e+02 4.1360e+02 + 1.1877e+03 1.8276e+03 9.5930e+02 1.0185e+03 5.9390e+02 4.6990e+02 4.9760e+02 + 1.0151e+03 8.3510e+02 4.6540e+02 3.9180e+02 4.6870e+02 8.6820e+02 8.0270e+02 + 4.4810e+02 3.3530e+02 6.0880e+02 5.6830e+02 1.6907e+03 8.9610e+02 2.4115e+03 + 1.9199e+03 8.8770e+02 1.0154e+03 4.1720e+02 5.0480e+02 6.7790e+02 9.6550e+02 + 5.7420e+02 5.3260e+02 7.4340e+02 3.1210e+02 1.3431e+03 1.8956e+03 1.6964e+03 + 7.5080e+02 5.7320e+02 8.4530e+02 1.6460e+03 1.1605e+03 6.0370e+02 5.3510e+02 + 5.7480e+02 2.9840e+02 3.8320e+02 4.2190e+02 5.3710e+02 4.2230e+02 5.7920e+02 + 5.0430e+02 3.7780e+02 1.1556e+03 1.2485e+03 3.5000e+03 2.7536e+03 1.5195e+03 + 3.1250e+02 3.1070e+02 4.6950e+02 3.3800e+02 5.7890e+02 1.8145e+03 1.6359e+03 + 1.4957e+03 7.6300e+02 8.0670e+02 6.6340e+02 9.7840e+02 7.8090e+02 5.5840e+02 + 3.1680e+02 4.2010e+02 3.7360e+02 7.8320e+02 2.5800e+02 1.7760e+02 4.8470e+02 + 7.7750e+02 1.9995e+03 1.1772e+03 1.8182e+03 3.3876e+03 8.5960e+02 5.7340e+02 + 6.2970e+02 3.6240e+02 6.1120e+02 6.6560e+02 7.3780e+02 5.2710e+02 5.6960e+02 + 5.4750e+02 1.1212e+03 3.0717e+03 9.5130e+02 1.1491e+03 1.5407e+03 1.6073e+03 + 1.8895e+03 8.7720e+02 4.4190e+02 2.7020e+02 5.2770e+02 2.2240e+02 5.5360e+02 + 3.6180e+02 7.2730e+02 4.4430e+02 6.5280e+02 6.4460e+02 4.5340e+02 7.1710e+02 + 1.6080e+03 2.3646e+03 2.6613e+03 1.3945e+03 5.3410e+02 3.0430e+02 4.3120e+02 + 3.9220e+02 3.5270e+02 1.1154e+03 1.0185e+03 1.2922e+03 1.3310e+03 1.2635e+03 + 9.6380e+02 4.6350e+02 8.2730e+02 5.6550e+02 5.2740e+02 2.9730e+02 6.7820e+02 + 1.1666e+03 3.1170e+02 7.0100e+01 2.5040e+02 1.1562e+03 1.7837e+03 5.9440e+02 + 1.0927e+03 2.9975e+03 1.3418e+03 5.4520e+02 6.0440e+02 2.3110e+02 1.7680e+02 + 1.0072e+03 7.1240e+02 5.8110e+02 6.5050e+02 4.0620e+02 1.2768e+03 1.6163e+03 + 1.7860e+03 1.2064e+03 2.5630e+03 1.5643e+03 1.8439e+03 7.3680e+02 3.3460e+02 + 4.7220e+02 5.6570e+02 3.3940e+02 3.3550e+02 5.6420e+02 3.4120e+02 2.4460e+02 + 2.6410e+02 5.2080e+02 1.1485e+03 9.3620e+02 2.1112e+03 2.0968e+03 3.0547e+03 + 8.3510e+02 5.7440e+02 2.8470e+02 6.9270e+02 5.7400e+02 6.0110e+02 1.0574e+03 + 9.4810e+02 6.8510e+02 1.1908e+03 2.3830e+03 1.8180e+03 8.6510e+02 6.8800e+02 + 8.2230e+02 3.2030e+02 5.4310e+02 7.2580e+02 7.5960e+02 3.7550e+02 1.1510e+02 + 3.4200e+02 1.2379e+03 1.9959e+03 6.5970e+02 1.2977e+03 2.2815e+03 2.3655e+03 + 1.2085e+03 1.1577e+03 2.5000e+02 5.2410e+02 3.4260e+02 6.7900e+02 3.9350e+02 + 3.5530e+02 2.7470e+02 4.6520e+02 7.7040e+02 1.7945e+03 3.3880e+03 2.4967e+03 + 1.4001e+03 1.1460e+03 5.1400e+02 1.5500e+02 7.4400e+02 3.9540e+02 5.2510e+02 + 4.7480e+02 5.2520e+02 4.3960e+02 6.8300e+01 7.0900e+01 5.4010e+02 7.4710e+02 + 1.1650e+03 2.7411e+03 3.1085e+03 2.0680e+03 8.9270e+02 3.8660e+02 6.8880e+02 + 5.4250e+02 5.4470e+02 5.0290e+02 6.0170e+02 6.2270e+02 1.1358e+03 1.0505e+03 + 2.0672e+03 9.8050e+02 1.1079e+03 1.5059e+03 2.1025e+03 1.4600e+03 1.5394e+03 + 9.5410e+02 1.0113e+03 7.3360e+02 2.6820e+02 4.9030e+02 1.1134e+03 1.7296e+03 + 4.9950e+02 7.3410e+02 9.2540e+02 1.9514e+03 1.2856e+03 1.3164e+03 4.7810e+02 + 3.8950e+02 8.9530e+02 3.7010e+02 7.4980e+02 2.8910e+02 4.5260e+02 9.1150e+02 + 1.2979e+03 2.2198e+03 3.5000e+03 2.5989e+03 1.6041e+03 5.4080e+02 3.5660e+02 + 3.1610e+02 4.4550e+02 5.1480e+02 3.4950e+02 5.2540e+02 4.4160e+02 5.4000e+02 + 2.5050e+02 1.7740e+02 8.7970e+02 7.7400e+02 1.7779e+03 1.8482e+03 2.7156e+03 + 1.9416e+03 5.8290e+02 4.9910e+02 1.4155e+03 5.4560e+02 4.5010e+02 6.1340e+02 + 1.1470e+03 7.9590e+02 4.0410e+02 5.0270e+02 1.5458e+03 9.2490e+02 1.5853e+03 + 8.9910e+02 1.1899e+03 1.4827e+03 7.0910e+02 1.6524e+03 4.6740e+02 8.6430e+02 + 4.1530e+02 9.6810e+02 1.6733e+03 1.7267e+03 7.9710e+02 7.1750e+02 7.3820e+02 + 1.1473e+03 2.3360e+03 1.5314e+03 3.6490e+02 5.5770e+02 7.6430e+02 6.1400e+02 + 3.0400e+02 3.6600e+02 4.7050e+02 5.4920e+02 1.5461e+03 2.1366e+03 3.5000e+03 + 1.4575e+03 1.5184e+03 7.4430e+02 4.2990e+02 4.5410e+02 5.3080e+02 7.3070e+02 + 6.1780e+02 1.0134e+03 4.5380e+02 2.6930e+02 4.1780e+02 2.8810e+02 4.1550e+02 + 8.2410e+02 2.6850e+03 2.3848e+03 3.5000e+03 2.0877e+03 5.7850e+02 5.5430e+02 + 1.0898e+03 6.4980e+02 4.2920e+02 4.6420e+02 1.2934e+03 4.9920e+02 3.3280e+02 + 6.3410e+02 9.9490e+02 9.5030e+02 7.8290e+02 1.1614e+03 1.4788e+03 1.9946e+03 + 1.5279e+03 9.6870e+02 1.2216e+03 7.2370e+02 5.3990e+02 8.1470e+02 1.9406e+03 + 1.6615e+03 6.8580e+02 8.1850e+02 1.1956e+03 1.2626e+03 1.6272e+03 1.6276e+03 + 1.0931e+03 3.3250e+02 4.8570e+02 6.9140e+02 5.3000e+02 5.9790e+02 2.5610e+02 + 9.4500e+02 8.0430e+02 2.2027e+03 3.5000e+03 1.7251e+03 7.2240e+02 3.1350e+02 + 2.4170e+02 4.5250e+02 5.2090e+02 1.0776e+03 7.6200e+02 7.0540e+02 4.6580e+02 + 2.5730e+02 6.4700e+02 8.1640e+02 3.5470e+02 1.8082e+03 2.4007e+03 1.8104e+03 + 2.0916e+03 1.8683e+03 6.6650e+02 2.7500e+02 8.1310e+02 4.0330e+02 4.7170e+02 + 2.3410e+02 3.3520e+02 6.7400e+02 4.6410e+02 3.1840e+02 8.7810e+02 1.7764e+03 + 1.5720e+03 7.3150e+02 1.2634e+03 8.1820e+02 1.9142e+03 1.9717e+03 1.6874e+03 + 1.4954e+03 1.0483e+03 5.8650e+02 1.7524e+03 1.5057e+03 9.7800e+02 4.6650e+02 + 6.8520e+02 1.1716e+03 2.0321e+03 1.5567e+03 1.1569e+03 3.6170e+02 1.5540e+02 + 2.9060e+02 4.9630e+02 6.2990e+02 6.6230e+02 1.1792e+03 1.4654e+03 1.5974e+03 + 2.1659e+03 1.7297e+03 1.0368e+03 5.6250e+02 2.5350e+02 8.9360e+02 1.1166e+03 + 8.8610e+02 9.9450e+02 9.3060e+02 5.9330e+02 5.7360e+02 2.4960e+02 4.7950e+02 + 9.3380e+02 1.2530e+03 1.9306e+03 1.0529e+03 1.6241e+03 8.3800e+02 7.6890e+02 + 3.1980e+02 3.3260e+02 2.3670e+02 4.1220e+02 2.1090e+02 1.6280e+02 4.0850e+02 + 4.2760e+02 4.1700e+02 9.5440e+02 1.0276e+03 9.1800e+02 4.2810e+02 7.4660e+02 + 1.5968e+03 7.0270e+02 1.4203e+03 1.7576e+03 1.2715e+03 2.2611e+03 1.1866e+03 + 2.2881e+03 1.7672e+03 9.9410e+02 1.0870e+03 2.4470e+03 2.5287e+03 1.8776e+03 + 5.0140e+02 4.6310e+02 8.0680e+02 1.2586e+03 3.2913e+03 2.8849e+03 2.2462e+03 + 4.5280e+02 5.6300e+02 7.8590e+02 1.4585e+03 2.6885e+03 6.2370e+02 2.8040e+02 + 3.5600e+02 1.5990e+02 8.5320e+02 2.6314e+03 2.3287e+03 1.4707e+03 1.1480e+03 + 8.0720e+02 3.5620e+02 3.6940e+02 4.2250e+02 4.1220e+02 3.4010e+02 3.5210e+02 + 7.7040e+02 8.9310e+02 1.7692e+03 2.0269e+03 1.2722e+03 8.5370e+02 6.7850e+02 + 3.8630e+02 2.3490e+02 5.7510e+02 2.8442e+03 2.7800e+03 1.2688e+03 2.0460e+02 + 6.4150e+02 5.1270e+02 4.9330e+02 5.6220e+02 6.7290e+02 3.1460e+02 3.9230e+02 + 6.9290e+02 2.6078e+03 3.5119e+03 1.9022e+03 5.0910e+02 4.1690e+02 1.0984e+03 + 7.4960e+02 2.1808e+03 2.8002e+03 1.9772e+03 3.1170e+02 5.5730e+02 2.8870e+02 + 5.9230e+02 2.8929e+03 4.7976e+03 2.3422e+03 6.3480e+02 4.7860e+02 7.6180e+02 + 2.3327e+03 3.4066e+03 1.7001e+03 3.5630e+02 2.2660e+02 1.8100e+02 7.1110e+02 + 3.0888e+03 3.0755e+03 2.9162e+03 1.1410e+03 4.9400e+02 6.5940e+02 4.3530e+02 + 4.1990e+02 5.1530e+02 4.1750e+02 3.9710e+02 6.2260e+02 2.0574e+03 2.2432e+03 + 2.4719e+03 1.2522e+03 5.9960e+02 6.5900e+02 7.9900e+02 4.1860e+02 5.1350e+02 + 2.5037e+03 4.3573e+03 1.1202e+03 2.6810e+02 3.7960e+02 3.7640e+02 6.6270e+02 + 5.6800e+02 6.5770e+02 6.8500e+02 5.6640e+02 1.4055e+03 2.5047e+03 3.6312e+03 + 5.2280e+02 3.2320e+02 5.3350e+02 6.3780e+02 7.5510e+02 9.8030e+02 2.2818e+03 + 2.2622e+03 5.1930e+02 3.3650e+02 6.0360e+02 1.0301e+03 2.4430e+03 2.9946e+03 + 2.7101e+03 6.9590e+02 3.2130e+02 6.2110e+02 2.7885e+03 4.2730e+03 1.2006e+03 + 2.7090e+02 3.6100e+02 7.6340e+02 7.4140e+02 1.0888e+03 2.7100e+03 2.8412e+03 + 9.1530e+02 4.7450e+02 7.8510e+02 6.7820e+02 5.2360e+02 7.6600e+02 3.3180e+02 + 4.8010e+02 4.4700e+02 2.5410e+03 3.6031e+03 2.4225e+03 5.3050e+02 2.4240e+02 + 4.9420e+02 1.2189e+03 7.3420e+02 1.0350e+03 1.8874e+03 4.6676e+03 3.2705e+03 + 2.9540e+02 1.8740e+02 2.8470e+02 4.4630e+02 1.3616e+03 6.1650e+02 4.4770e+02 + 8.6730e+02 1.3973e+03 2.2159e+03 2.6294e+03 7.7720e+02 4.5960e+02 7.9210e+02 + 9.9330e+02 8.4810e+02 2.3443e+03 2.4887e+03 2.7176e+03 8.0140e+02 6.9150e+02 + 4.3420e+02 8.0270e+02 1.2919e+03 3.8951e+03 3.1708e+03 9.4670e+02 3.5600e+02 + 7.3760e+02 1.9942e+03 4.9000e+03 2.5398e+03 1.6250e+02 4.6580e+02 7.1380e+02 + 6.5350e+02 5.8710e+02 3.3912e+03 3.0597e+03 1.0762e+03 2.2910e+02 7.9570e+02 + 5.0930e+02 6.4780e+02 5.2730e+02 3.2690e+02 3.3980e+02 4.5180e+02 3.4167e+03 + 3.6082e+03 1.9390e+03 3.8340e+02 2.1760e+02 2.9900e+02 4.9820e+02 1.0203e+03 + 1.0102e+03 1.9164e+03 3.0905e+03 9.9870e+02 6.3640e+02 3.1440e+02 2.6760e+02 + 3.6200e+02 9.4310e+02 6.9030e+02 6.3730e+02 7.1570e+02 1.5301e+03 2.3536e+03 + 2.9815e+03 6.7780e+02 4.8910e+02 1.0157e+03 1.0094e+03 6.7440e+02 1.1123e+03 + 2.8129e+03 2.1105e+03 1.1283e+03 1.3512e+03 4.5500e+02 5.8800e+02 7.6190e+02 + 2.4680e+03 2.5829e+03 1.3181e+03 6.2460e+02 3.8170e+02 2.1287e+03 4.4578e+03 + 2.2946e+03 3.0750e+02 3.7000e+02 6.0420e+02 9.6070e+02 4.9410e+02 2.6568e+03 + 3.2466e+03 1.7340e+03 3.6140e+02 2.5550e+02 3.5490e+02 6.4930e+02 6.2290e+02 + 4.2160e+02 3.3860e+02 7.7150e+02 1.2728e+03 3.5239e+03 9.8480e+02 2.4790e+02 + 1.9050e+02 5.0600e+02 8.5820e+02 8.7440e+02 5.1150e+02 2.5956e+03 2.5093e+03 + 7.5010e+02 1.0567e+03 5.4130e+02 2.6960e+02 2.7980e+02 3.7300e+02 7.4950e+02 + 3.2120e+02 6.6910e+02 1.6922e+03 2.3399e+03 2.8272e+03 6.2260e+02 5.2400e+02 + 9.9060e+02 9.8230e+02 5.0620e+02 1.2283e+03 2.9689e+03 2.7230e+03 1.1656e+03 + 4.0520e+02 5.2180e+02 6.2540e+02 4.2870e+02 1.3333e+03 2.8330e+03 1.9590e+03 + 5.4520e+02 8.6310e+02 1.9895e+03 4.7599e+03 2.1219e+03 5.3840e+02 8.2070e+02 + 6.2830e+02 7.9060e+02 1.0994e+03 2.0190e+03 3.0218e+03 1.8885e+03 4.4940e+02 + 5.3750e+02 4.5980e+02 7.5090e+02 4.6670e+02 3.7090e+02 3.5180e+02 1.0272e+03 + 3.2772e+03 2.4842e+03 1.1725e+03 4.5300e+02 2.2630e+02 4.2110e+02 8.7180e+02 + 3.2090e+02 6.6030e+02 2.3173e+03 2.6074e+03 6.2000e+02 9.6990e+02 4.6200e+02 + 4.3280e+02 4.6070e+02 3.3720e+02 5.0580e+02 7.8020e+02 8.0290e+02 1.2530e+03 + 3.2311e+03 2.3771e+03 1.9828e+03 3.9870e+02 6.9170e+02 5.9320e+02 3.5340e+02 + 1.4787e+03 2.4474e+03 2.6386e+03 4.5750e+02 5.6920e+02 3.8190e+02 4.7070e+02 + 5.7060e+02 2.0821e+03 2.4174e+03 2.4815e+03 1.5792e+03 5.0800e+02 1.7778e+03 + 3.8749e+03 1.9451e+03 4.8820e+02 4.4790e+02 5.7420e+02 5.1770e+02 1.0313e+03 + 2.8883e+03 3.9080e+03 1.9032e+03 5.4490e+02 8.8380e+02 2.3700e+02 5.2700e+02 + 7.3840e+02 4.3740e+02 3.4740e+02 6.8810e+02 3.3649e+03 2.6860e+03 1.1626e+03 + 4.4540e+02 4.1820e+02 5.9940e+02 9.1100e+02 8.9510e+02 2.9107e+03 2.6749e+03 + 2.1317e+03 4.4650e+02 8.0890e+02 3.2610e+02 6.6300e+02 3.9310e+02 5.6200e+01 + 3.0580e+02 6.3560e+02 4.2250e+02 8.9940e+02 2.0911e+03 3.0504e+03 2.1393e+03 + 1.0859e+03 8.5640e+02 4.2010e+02 4.0820e+02 8.8810e+02 1.7191e+03 3.8463e+03 + 7.2150e+02 3.8070e+02 1.3400e+02 5.4650e+02 5.2310e+02 1.7615e+03 1.6705e+03 + 4.2636e+03 1.2270e+03 8.8920e+02 1.1619e+03 3.5565e+03 1.0553e+03 1.1526e+03 + 3.4920e+02 4.5740e+02 8.9080e+02 9.3470e+02 1.9611e+03 2.3921e+03 1.7133e+03 + 1.0797e+03 7.1170e+02 1.3450e+02 3.9850e+02 6.7530e+02 8.3630e+02 5.8470e+02 + 1.8231e+03 4.2683e+03 3.3899e+03 1.2210e+03 6.1290e+02 8.1370e+02 5.0650e+02 + 8.5920e+02 6.8140e+02 1.8035e+03 2.7699e+03 2.2297e+03 1.0916e+03 8.8630e+02 + 3.8820e+02 9.3280e+02 5.7870e+02 1.1400e+02 4.4040e+02 4.7770e+02 4.1440e+02 + 1.1833e+03 1.6039e+03 2.3469e+03 3.2857e+03 1.6121e+03 6.8280e+02 2.1250e+02 + 3.8770e+02 1.2870e+03 3.5776e+03 2.6012e+03 8.4020e+02 3.1240e+02 3.9400e+02 + 3.2680e+02 7.4820e+02 4.5990e+02 1.6933e+03 2.7224e+03 2.9130e+03 8.9990e+02 + 1.3935e+03 4.2086e+03 1.9533e+03 5.8520e+02 3.8030e+02 6.8850e+02 9.6030e+02 + 6.6560e+02 1.0020e+03 2.3908e+03 2.8738e+03 1.1646e+03 6.0260e+02 3.2410e+02 + 5.0910e+02 7.0690e+02 1.0038e+03 7.9950e+02 7.7850e+02 2.6827e+03 4.2428e+03 + 1.3052e+03 5.3500e+02 7.6010e+02 8.9390e+02 1.2975e+03 1.3296e+03 2.5071e+03 + 1.9080e+03 1.4027e+03 5.4280e+02 3.8750e+02 4.2720e+02 9.6060e+02 5.3570e+02 + 6.3730e+02 7.3850e+02 3.9150e+02 6.0310e+02 6.2100e+02 1.2194e+03 3.1412e+03 + 3.8830e+03 1.2397e+03 7.4610e+02 1.6650e+02 3.3180e+02 9.3810e+02 2.6106e+03 + 3.2563e+03 7.6080e+02 4.0660e+02 3.7620e+02 4.9550e+02 5.1020e+02 6.4150e+02 + 5.3770e+02 3.2051e+03 3.7156e+03 1.3211e+03 1.7197e+03 2.3092e+03 1.7416e+03 + 6.5550e+02 6.2390e+02 4.7580e+02 7.6390e+02 4.9000e+02 2.5146e+03 3.9769e+03 + 2.8136e+03 1.2136e+03 6.2600e+02 3.1380e+02 3.2610e+02 6.9850e+02 5.4950e+02 + 7.8200e+02 7.2370e+02 2.3573e+03 2.7339e+03 2.5450e+03 8.6570e+02 1.9085e+03 + 1.8287e+03 1.4024e+03 2.2981e+03 2.3009e+03 1.1943e+03 7.9490e+02 4.7630e+02 + 3.5040e+02 5.9990e+02 7.0430e+02 5.4430e+02 6.7550e+02 9.3320e+02 6.1340e+02 + 5.4610e+02 4.4430e+02 3.1400e+02 2.3198e+03 2.7075e+03 2.9806e+03 1.1134e+03 + 2.3100e+02 1.8700e+02 4.6660e+02 2.6929e+03 2.8360e+03 1.8709e+03 4.7260e+02 + 8.7720e+02 1.0639e+03 7.1390e+02 4.7420e+02 5.7860e+02 1.9400e+03 3.8937e+03 + 3.3238e+03 2.2338e+03 2.7597e+03 1.4245e+03 7.4680e+02 5.8700e+02 4.7620e+02 + 3.3960e+02 5.7900e+02 1.7460e+03 3.5847e+03 2.8660e+03 7.5230e+02 6.5830e+02 + 5.6350e+02 3.4260e+02 1.0045e+03 1.0994e+03 1.2714e+03 2.4121e+03 3.5521e+03 + 2.8134e+03 2.6735e+03 1.7970e+03 1.5487e+03 2.2610e+03 2.6003e+03 2.5423e+03 + 1.6905e+03 1.2956e+03 4.1130e+02 4.3070e+02 4.4390e+02 4.1170e+02 4.0280e+02 + 3.9960e+02 4.1240e+02 9.6760e+02 5.2370e+02 1.9010e+02 3.8480e+02 5.3250e+02 + 1.1133e+03 2.5793e+03 2.6161e+03 8.6350e+02 3.4820e+02 4.3370e+02 5.0480e+02 + 1.6504e+03 2.5826e+03 1.2620e+03 7.1230e+02 4.6360e+02 1.1092e+03 6.9840e+02 + 3.4910e+02 4.5520e+02 1.2105e+03 2.9531e+03 2.4133e+03 2.3779e+03 4.4098e+03 + 5.9370e+02 7.5490e+02 8.0060e+02 3.2710e+02 3.4500e+02 4.9860e+02 1.6219e+03 + 3.0377e+03 2.2510e+03 3.4670e+02 5.8120e+02 6.8300e+02 4.6430e+02 2.8030e+02 + 1.2365e+03 1.8293e+03 2.2838e+03 4.9000e+03 3.6320e+03 1.2716e+03 1.7654e+03 + 2.3947e+03 2.4413e+03 2.7500e+03 1.5332e+03 5.3420e+02 3.6700e+02 4.0330e+02 + 5.4350e+02 3.5490e+02 5.0730e+02 9.6820e+02 7.0310e+02 7.1040e+02 6.6460e+02 + 5.9170e+02 2.1660e+02 2.4670e+02 3.1640e+02 9.8570e+02 1.6887e+03 2.8936e+03 + 3.1211e+03 5.4470e+02 3.7090e+02 5.4750e+02 2.8018e+03 3.0234e+03 2.6037e+03 + 4.2290e+02 4.5200e+02 6.3140e+02 6.9700e+02 7.9090e+02 4.1020e+02 5.8710e+02 + 1.8688e+03 4.9000e+03 4.3908e+03 3.3175e+03 1.0541e+03 6.2060e+02 4.9410e+02 + 2.2540e+02 2.0040e+02 4.1360e+02 1.5505e+03 1.7797e+03 2.3476e+03 6.1280e+02 + 3.3340e+02 8.9610e+02 4.5960e+02 1.6707e+03 1.0044e+03 1.8042e+03 2.7629e+03 + 4.2550e+03 3.3726e+03 2.4533e+03 1.9060e+03 1.6673e+03 2.0252e+03 2.1307e+03 + 8.6240e+02 3.6320e+02 6.3910e+02 4.8520e+02 4.2810e+02 3.1560e+02 3.9380e+02 + 6.1210e+02 4.3140e+02 4.5220e+02 5.7020e+02 4.0800e+02 1.8540e+02 5.5830e+02 + 4.0030e+02 4.1990e+02 6.8350e+02 2.6734e+03 3.0165e+03 4.9730e+02 7.3640e+02 + 7.2380e+02 1.5650e+03 1.2022e+03 3.5656e+03 9.0640e+02 8.0070e+02 5.7080e+02 + 4.7730e+02 5.6130e+02 6.3370e+02 7.9970e+02 1.1859e+03 4.1837e+03 4.9000e+03 + 2.4716e+03 6.7960e+02 7.0950e+02 4.5230e+02 2.0220e+02 2.4320e+02 4.6760e+02 + 1.3864e+03 1.2482e+03 1.0268e+03 1.0405e+03 7.5630e+02 6.2190e+02 2.3009e+03 + 1.7550e+03 1.9231e+03 1.0511e+03 2.3616e+03 3.4146e+03 4.4725e+03 1.0650e+03 + 7.8480e+02 4.5260e+02 1.0610e+03 1.8094e+03 5.6300e+02 5.2670e+02 5.3090e+02 + 4.0040e+02 6.3330e+02 4.8480e+02 5.6960e+02 5.4080e+02 3.3510e+02 3.9360e+02 + 5.6220e+02 2.4720e+02 2.8570e+02 2.0540e+02 3.7920e+02 4.7390e+02 1.2860e+03 + 2.6433e+03 1.8951e+03 5.4540e+02 7.1200e+02 4.9710e+02 6.2000e+02 1.7547e+03 + 3.1073e+03 6.6590e+02 4.1490e+02 5.8270e+02 4.0180e+02 4.7430e+02 7.6890e+02 + 8.3130e+02 4.7520e+02 2.4168e+03 4.9000e+03 1.9849e+03 9.3080e+02 5.8440e+02 + 4.9380e+02 2.5180e+02 3.3940e+02 3.6950e+02 1.4920e+03 3.0041e+03 2.4067e+03 + 6.2580e+02 8.6080e+02 1.4043e+03 2.1780e+03 3.0343e+03 2.1491e+03 1.4223e+03 + 1.4871e+03 2.7376e+03 2.4465e+03 1.2287e+03 6.8310e+02 6.9070e+02 8.3860e+02 + 1.2210e+03 8.6130e+02 7.6210e+02 4.6920e+02 3.0190e+02 3.7710e+02 3.9410e+02 + 6.9040e+02 4.8300e+02 4.3670e+02 2.3510e+02 1.4460e+02 2.2520e+02 2.3150e+02 + 6.3680e+02 4.6460e+02 7.0820e+02 9.8110e+02 1.8758e+03 2.9440e+03 6.7400e+02 + 3.8260e+02 8.2440e+02 1.1202e+03 1.7131e+03 2.1281e+03 1.7523e+03 6.1600e+02 + 4.0370e+02 4.9610e+02 6.1700e+02 5.9210e+02 9.2000e+02 4.4840e+02 1.6305e+03 + 4.9000e+03 3.3468e+03 1.1393e+03 4.9800e+02 4.7660e+02 4.5490e+02 5.1080e+02 + 8.6130e+02 1.1740e+03 3.6905e+03 1.4471e+03 8.5710e+02 5.1490e+02 1.3791e+03 + 2.3183e+03 2.0309e+03 1.9638e+03 2.5930e+02 7.8200e+02 2.4729e+03 3.2778e+03 + 1.6752e+03 3.5070e+02 3.9350e+02 5.4100e+02 6.9300e+02 7.7370e+02 8.9190e+02 + 4.9390e+02 7.3010e+02 4.5760e+02 7.5390e+02 7.0390e+02 9.7310e+02 5.8460e+02 + 4.4380e+02 4.5830e+02 2.0510e+02 3.9450e+02 2.3760e+02 3.0250e+02 8.5580e+02 + 5.3650e+02 8.4260e+02 1.7929e+03 4.0730e+02 4.1600e+02 1.4529e+03 1.2330e+03 + 2.9287e+03 1.3703e+03 1.5928e+03 1.1197e+03 3.1330e+02 5.5790e+02 4.4760e+02 + 4.9700e+02 3.4760e+02 4.1270e+02 2.4947e+03 4.1681e+03 4.1000e+03 1.2946e+03 + 5.8620e+02 2.7980e+02 4.0050e+02 8.3580e+02 8.4740e+02 1.7752e+03 2.9166e+03 + 1.8348e+03 4.3070e+02 8.5900e+02 2.8974e+03 4.6671e+03 1.2778e+03 1.0661e+03 + 4.4910e+02 1.5686e+03 1.7670e+03 3.6989e+03 2.0462e+03 7.6830e+02 2.5140e+02 + 3.8300e+02 6.3500e+02 6.8830e+02 6.6550e+02 4.4890e+02 5.9730e+02 4.7140e+02 + 5.7550e+02 9.3450e+02 5.3850e+02 2.9970e+02 3.3540e+02 6.8220e+02 7.7220e+02 + 5.7140e+02 4.5260e+02 5.1430e+02 5.2310e+02 5.5920e+02 7.1720e+02 5.8450e+02 + 4.1990e+02 5.5520e+02 7.7260e+02 8.0150e+02 9.8470e+02 2.2827e+03 1.4484e+03 + 7.4870e+02 4.8950e+02 2.5540e+02 6.2480e+02 2.7130e+02 2.7480e+02 3.8890e+02 + 1.3855e+03 4.9000e+03 4.1246e+03 1.8461e+03 6.3620e+02 2.7420e+02 4.4090e+02 + 7.9780e+02 4.3910e+02 2.9506e+03 2.7641e+03 2.3954e+03 2.4360e+02 8.2130e+02 + 1.7879e+03 2.7360e+03 1.4090e+03 3.6080e+02 8.6010e+02 1.2443e+03 2.8488e+03 + 3.6046e+03 3.1153e+03 9.6670e+02 2.3990e+02 4.1720e+02 7.0700e+02 7.3050e+02 + 8.9100e+02 1.0312e+03 5.7590e+02 4.2120e+02 5.1120e+02 8.5340e+02 4.8140e+02 + 3.6120e+02 3.2470e+02 1.2894e+03 7.8750e+02 8.6710e+02 4.5480e+02 5.3500e+02 + 5.1340e+02 3.9980e+02 3.0130e+02 4.9320e+02 4.6120e+02 4.7070e+02 5.3760e+02 + 8.7220e+02 5.8870e+02 3.1162e+03 2.9372e+03 1.1503e+03 1.2474e+03 7.9460e+02 + 5.6390e+02 2.3500e+02 4.0600e+02 5.6400e+02 2.2811e+03 3.9557e+03 3.4979e+03 + 2.9061e+03 6.4680e+02 1.7550e+02 2.9890e+02 6.5080e+02 9.0260e+02 1.6678e+03 + 2.4462e+03 1.8331e+03 2.3280e+02 6.4220e+02 3.8559e+03 3.3157e+03 6.4330e+02 + 3.4510e+02 3.4590e+02 8.3770e+02 1.7761e+03 3.1487e+03 3.4280e+03 9.8090e+02 + 2.8960e+02 4.1290e+02 6.5990e+02 7.5800e+02 5.7620e+02 4.9470e+02 9.2530e+02 + 3.8910e+02 3.0180e+02 5.4760e+02 6.5240e+02 2.7670e+02 4.4670e+02 6.5790e+02 + 9.2620e+02 7.3100e+02 5.3050e+02 4.2310e+02 4.2460e+02 6.1560e+02 6.7600e+02 + 5.3320e+02 5.4570e+02 4.5920e+02 6.9330e+02 2.9530e+02 1.0887e+03 2.6276e+03 + 3.4280e+03 4.5320e+02 4.5900e+02 2.8340e+02 4.4270e+02 2.5700e+02 6.9090e+02 + 2.7234e+03 2.2444e+03 3.7592e+03 4.0240e+03 2.6291e+03 1.1347e+03 3.9600e+02 + 2.0810e+02 3.3810e+02 1.3868e+03 1.7882e+03 3.6571e+03 1.7905e+03 7.3710e+02 + 6.7120e+02 1.6010e+03 2.7966e+03 1.1732e+03 7.6620e+02 5.0790e+02 6.3190e+02 + 8.0420e+02 1.8322e+03 3.8762e+03 9.7850e+02 1.6780e+02 1.8860e+02 5.1960e+02 + 7.6300e+02 7.2250e+02 5.3720e+02 7.6870e+02 4.1020e+02 1.8830e+02 1.0731e+03 + 8.3850e+02 3.2060e+02 3.4200e+02 6.4320e+02 6.2220e+02 5.8200e+02 6.7180e+02 + 3.7880e+02 3.2450e+02 4.3780e+02 1.8120e+02 5.9860e+02 2.5790e+02 4.5850e+02 + 2.1970e+02 3.7300e+02 9.0320e+02 2.3029e+03 3.8599e+03 8.2020e+02 5.1730e+02 + 6.0230e+02 3.7280e+02 5.9930e+02 1.0701e+03 1.6870e+03 2.4569e+03 2.2447e+03 + 2.4329e+03 2.3224e+03 1.5667e+03 3.6750e+02 4.8700e+02 2.6040e+02 4.1890e+02 + 1.3866e+03 3.1882e+03 1.8396e+03 8.9540e+02 9.1550e+02 2.7017e+03 3.5096e+03 + 2.6042e+03 1.0071e+03 3.1910e+02 6.4960e+02 1.0507e+03 2.9434e+03 2.8326e+03 + 1.1322e+03 4.8610e+02 1.6410e+02 6.2100e+02 6.5890e+02 4.4820e+02 5.1050e+02 + 7.0230e+02 4.3320e+02 4.6390e+02 7.1480e+02 6.0500e+02 6.6640e+02 9.8880e+02 + 7.1980e+02 2.6960e+02 3.2680e+02 6.2580e+02 3.5340e+02 3.1340e+02 3.8410e+02 + 3.3050e+02 8.1380e+02 4.7760e+02 4.8090e+02 6.6670e+02 1.8820e+02 2.5710e+02 + 2.0453e+03 1.4581e+03 1.1632e+03 5.0990e+02 3.8400e+02 1.8770e+02 5.5820e+02 + 1.7511e+03 3.8268e+03 3.1782e+03 2.0936e+03 9.5970e+02 2.5761e+03 1.4787e+03 + 5.4840e+02 3.9660e+02 2.9500e+02 3.5000e+02 1.4175e+03 2.9757e+03 1.4674e+03 + 6.6080e+02 4.5340e+02 1.3208e+03 4.3435e+03 2.3477e+03 1.1269e+03 7.8480e+02 + 8.3340e+02 4.8090e+02 1.8119e+03 2.6551e+03 1.6650e+03 6.8820e+02 5.6800e+02 + 1.2000e+03 6.7550e+02 3.2370e+02 3.2470e+02 5.4470e+02 4.5960e+02 3.2810e+02 + 3.3380e+02 4.3190e+02 1.0338e+03 9.9920e+02 1.0087e+03 4.6780e+02 1.9450e+02 + 2.8640e+02 6.7250e+02 4.0790e+02 2.3440e+02 4.1590e+02 4.2790e+02 2.2420e+02 + 5.5610e+02 3.7550e+02 2.4530e+02 7.9850e+02 1.3196e+03 5.6770e+02 4.1440e+02 + 3.4470e+02 2.1790e+02 5.3650e+02 6.9350e+02 2.1012e+03 3.9574e+03 2.3606e+03 + 1.0097e+03 1.3004e+03 2.4065e+03 3.3312e+03 1.2117e+03 8.3110e+02 3.7870e+02 + 4.2410e+02 9.9210e+02 3.8127e+03 1.5898e+03 4.2620e+02 7.7950e+02 8.4400e+02 + 2.7626e+03 1.9560e+03 7.9470e+02 8.0900e+02 6.1630e+02 2.3500e+02 2.1669e+03 + 3.1217e+03 1.8525e+03 4.3480e+02 8.7870e+02 9.9590e+02 7.6780e+02 3.0770e+02 + 3.9050e+02 3.7230e+02 6.8340e+02 5.6230e+02 8.2280e+02 5.5150e+02 5.6950e+02 + 1.0493e+03 7.8990e+02 3.0220e+02 3.0120e+02 3.2940e+02 6.3910e+02 4.1040e+02 + 9.4600e+01 3.1620e+02 3.1380e+02 7.4940e+02 3.2260e+02 5.8940e+02 4.7570e+02 + 1.7387e+03 2.3911e+03 2.9420e+03 1.1993e+03 4.2940e+02 3.0170e+02 2.2140e+02 + 8.9090e+02 3.4108e+03 2.9562e+03 1.6416e+03 4.4860e+02 7.0420e+02 2.6554e+03 + 2.3986e+03 2.0135e+03 7.3520e+02 3.7980e+02 7.5480e+02 1.1332e+03 4.1184e+03 + 1.8503e+03 3.3700e+02 5.7440e+02 1.3005e+03 2.9149e+03 3.2966e+03 2.0735e+03 + 1.7980e+03 5.6180e+02 5.2840e+02 8.0160e+02 2.3820e+03 2.4770e+03 6.9260e+02 + 7.2020e+02 4.2600e+02 6.0160e+02 1.8380e+02 3.8180e+02 3.3990e+02 5.5200e+02 + 5.7890e+02 7.8480e+02 7.2810e+02 2.3690e+02 4.4860e+02 2.2650e+02 2.7660e+02 + 2.5770e+02 7.5870e+02 6.4030e+02 5.5890e+02 6.2130e+02 7.1400e+02 4.3350e+02 + 3.6460e+02 3.7520e+02 5.1400e+02 8.1910e+02 2.0374e+03 2.5063e+03 1.7377e+03 + 8.2230e+02 5.4320e+02 3.1650e+02 4.5160e+02 1.9438e+03 3.0988e+03 2.8196e+03 + 1.5198e+03 2.8490e+02 6.2590e+02 2.0268e+03 2.3721e+03 2.2273e+03 4.8550e+02 + 3.5800e+02 7.1810e+02 2.5319e+03 2.4903e+03 2.2968e+03 5.2380e+02 2.6820e+02 + 9.1690e+02 1.7488e+03 1.2726e+03 2.0727e+03 2.4897e+03 2.4061e+03 7.9620e+02 + 1.4329e+03 2.1048e+03 2.9918e+03 2.7037e+03 4.2430e+02 7.6650e+02 9.4970e+02 + 5.5690e+02 3.7550e+02 3.8310e+02 3.7240e+02 8.8200e+02 9.3020e+02 7.1340e+02 + 4.7520e+02 4.0180e+02 2.9200e+02 2.7450e+02 4.0670e+02 7.9040e+02 4.8220e+02 + 5.7140e+02 9.6530e+02 5.3520e+02 5.3590e+02 5.3960e+02 4.8970e+02 6.4050e+02 + 6.5740e+02 2.4964e+03 3.5405e+03 9.1560e+02 5.6570e+02 7.8950e+02 2.9370e+02 + 5.0060e+02 3.0065e+03 2.8228e+03 1.8711e+03 3.5700e+02 4.5020e+02 4.9970e+02 + 1.8679e+03 1.4236e+03 3.3922e+03 8.2760e+02 3.1410e+02 2.2200e+02 1.3474e+03 + 2.2757e+03 2.6812e+03 1.1511e+03 5.2870e+02 6.8760e+02 1.0203e+03 1.4947e+03 + 1.7818e+03 2.5960e+03 1.3696e+03 2.3655e+03 2.0867e+03 1.9816e+03 2.3429e+03 + 3.2948e+03 1.8212e+03 5.7080e+02 5.7130e+02 4.7490e+02 5.9240e+02 3.5050e+02 + 3.2240e+02 5.2310e+02 6.1170e+02 6.6880e+02 6.1760e+02 3.2510e+02 1.7200e+02 + 3.4320e+02 3.9200e+02 7.3030e+02 7.4960e+02 6.5890e+02 9.1610e+02 7.8950e+02 + 4.7390e+02 4.3680e+02 5.3840e+02 6.2640e+02 1.6557e+03 1.5905e+03 3.0366e+03 + 7.0390e+02 5.2860e+02 6.4610e+02 4.1580e+02 3.5257e+03 3.6710e+03 2.0243e+03 + 3.8130e+02 2.7030e+02 5.5880e+02 4.0130e+02 4.9280e+02 2.1830e+03 2.4250e+03 + 9.6020e+02 3.9550e+02 3.4050e+02 1.4946e+03 1.4526e+03 2.8264e+03 1.0241e+03 + 9.0710e+02 2.6610e+02 5.9370e+02 1.0091e+03 2.4760e+03 2.0762e+03 2.1939e+03 + 2.4518e+03 3.6023e+03 1.9800e+03 1.9381e+03 2.5284e+03 2.0099e+03 5.6720e+02 + 5.4380e+02 2.7290e+02 3.0370e+02 5.2370e+02 3.0700e+02 6.5880e+02 5.5920e+02 + 2.5520e+02 1.6890e+02 1.9460e+02 3.7850e+02 4.2240e+02 5.6390e+02 6.9310e+02 + 4.5650e+02 6.4970e+02 4.0360e+02 7.7180e+02 6.4000e+02 3.5260e+02 7.6630e+02 + 1.1392e+03 5.9710e+02 2.8486e+03 1.4990e+03 5.6360e+02 3.8250e+02 3.8270e+02 + 3.8710e+02 2.0002e+03 3.8006e+03 1.9503e+03 2.8580e+02 3.7160e+02 2.8690e+02 + 4.6730e+02 7.2570e+02 1.9208e+03 3.9939e+03 2.6636e+03 5.1200e+02 2.2940e+02 + 8.9580e+02 1.6209e+03 2.7273e+03 2.3912e+03 5.6740e+02 1.1890e+02 3.5940e+02 + 3.7000e+02 8.3250e+02 4.9200e+02 1.1918e+03 2.4660e+03 2.9216e+03 1.4407e+03 + 3.8253e+03 4.9000e+03 3.0186e+03 1.0257e+03 5.6500e+02 2.0590e+02 7.0580e+02 + 7.7070e+02 3.3960e+02 3.5630e+02 5.8770e+02 6.1170e+02 4.0780e+02 5.0050e+02 + 6.7890e+02 7.3960e+02 4.5940e+02 3.4090e+02 5.4120e+02 5.5810e+02 1.5910e+02 + 5.8450e+02 6.4980e+02 4.0800e+02 8.7990e+02 6.9170e+02 3.0266e+03 1.8778e+03 + 1.7110e+03 4.7110e+02 4.1610e+02 5.3200e+02 1.8016e+03 3.3961e+03 1.8136e+03 + 1.2369e+03 6.6330e+02 2.1760e+02 4.3380e+02 4.0040e+02 3.6940e+02 1.0442e+03 + 4.0071e+03 3.1108e+03 6.8480e+02 6.3860e+02 7.5460e+02 1.1722e+03 1.8219e+03 + 2.9912e+03 2.1357e+03 5.6270e+02 4.5540e+02 4.2530e+02 7.2410e+02 5.7010e+02 + 5.6780e+02 1.0837e+03 1.6002e+03 2.8467e+03 4.3766e+03 4.3441e+03 3.9286e+03 + 1.4576e+03 1.0452e+03 3.3540e+02 5.9380e+02 7.8690e+02 3.5460e+02 1.8650e+02 + 6.8050e+02 4.1320e+02 3.0760e+02 3.5910e+02 5.2270e+02 7.8390e+02 6.4650e+02 + 2.9170e+02 3.2280e+02 6.1530e+02 4.9800e+02 4.7780e+02 1.1564e+03 7.4630e+02 + 7.2810e+02 1.7349e+03 2.3679e+03 2.2066e+03 1.1286e+03 6.7700e+02 3.8020e+02 + 3.6560e+02 2.3596e+03 2.1010e+03 1.2285e+03 1.0732e+03 6.8230e+02 7.5150e+02 + 4.2140e+02 5.6460e+02 3.8040e+02 1.0842e+03 2.1673e+03 3.7232e+03 1.1432e+03 + 4.5630e+02 3.6370e+02 5.8020e+02 1.5407e+03 4.3481e+03 3.0759e+03 3.1750e+02 + 6.5400e+02 5.7540e+02 5.0310e+02 5.9730e+02 4.1700e+02 3.4510e+02 9.4750e+02 + 1.6823e+03 2.8284e+03 2.7047e+03 4.9000e+03 3.0559e+03 5.4720e+02 3.9010e+02 + 6.7420e+02 6.3240e+02 2.7680e+02 3.2890e+02 3.2350e+02 4.2760e+02 3.9530e+02 + 6.3470e+02 5.8070e+02 8.8490e+02 5.0900e+02 2.1570e+02 4.9700e+02 6.0370e+02 + 3.3450e+02 3.4130e+02 6.8770e+02 3.6070e+02 7.4490e+02 1.9631e+03 3.0486e+03 + 2.0459e+03 7.8970e+02 6.0230e+02 3.0920e+02 7.2460e+02 3.3079e+03 3.4164e+03 + 1.5178e+03 3.1470e+02 7.7380e+02 7.4070e+02 4.8180e+02 3.3310e+02 4.1120e+02 + 5.2890e+02 1.5510e+03 3.7506e+03 2.2837e+03 3.9640e+02 4.3670e+02 6.1720e+02 + 1.6044e+03 3.7420e+03 2.6499e+03 2.2778e+03 1.7125e+03 4.9050e+02 5.8040e+02 + 3.4320e+02 4.9600e+02 6.6370e+02 3.7520e+02 3.9030e+02 1.0738e+03 2.4781e+03 + 3.3067e+03 3.7218e+03 1.1046e+03 6.8850e+02 6.9980e+02 4.3400e+02 2.7380e+02 + 1.1240e+02 4.6310e+02 5.2490e+02 5.6850e+02 3.5080e+02 7.7240e+02 6.9170e+02 + 6.3840e+02 3.6820e+02 5.1710e+02 9.0220e+02 6.0810e+02 4.5030e+02 1.2985e+03 + 3.3840e+02 5.5300e+02 3.4610e+03 2.4773e+03 1.4419e+03 5.6770e+02 6.9390e+02 + 3.3910e+02 5.5810e+02 1.7263e+03 3.7205e+03 8.1390e+02 1.2980e+02 4.7660e+02 + 8.8970e+02 1.0043e+03 2.4610e+02 3.9450e+02 7.5570e+02 9.0060e+02 3.0613e+03 + 2.5015e+03 5.7600e+02 2.4030e+02 3.5550e+02 9.6420e+02 2.8149e+03 3.1618e+03 + 3.0285e+03 1.1801e+03 8.0610e+02 4.8360e+02 3.5680e+02 7.2730e+02 7.0520e+02 + 5.0690e+02 4.0320e+02 5.2160e+02 1.8457e+03 4.8129e+03 4.9000e+03 2.5015e+03 + 9.6060e+02 6.4950e+02 8.8510e+02 3.5480e+02 1.4070e+02 3.1810e+02 6.3450e+02 + 6.9390e+02 3.3060e+02 5.6970e+02 1.1568e+03 4.6950e+02 6.0020e+02 7.4110e+02 + 6.9580e+02 1.8660e+02 4.0400e+02 6.1680e+02 5.9970e+02 9.4640e+02 3.2240e+03 + 1.2335e+03 1.6245e+03 7.6100e+02 6.4790e+02 2.8930e+02 6.7880e+02 3.4346e+03 + 3.2635e+03 2.3365e+03 2.0440e+02 3.8220e+02 7.8620e+02 4.5710e+02 2.5560e+02 + 5.2740e+02 4.6430e+02 1.4136e+03 3.0465e+03 3.4491e+03 6.9380e+02 4.9210e+02 + 4.7430e+02 3.7780e+02 1.8111e+03 1.8958e+03 2.5357e+03 2.1142e+03 1.3373e+03 + 4.1480e+02 2.6200e+02 4.9730e+02 7.5890e+02 4.0430e+02 3.5450e+02 5.7180e+02 + 1.5446e+03 3.8545e+03 3.1155e+03 4.4722e+03 1.7608e+03 1.4608e+03 6.3100e+02 + 4.3970e+02 1.7080e+02 6.0210e+02 4.9910e+02 4.7010e+02 6.0310e+02 9.8630e+02 + 6.0290e+02 7.0380e+02 3.9380e+02 4.4580e+02 3.4190e+02 5.3210e+02 7.6470e+02 + 1.7627e+03 1.3344e+03 2.7792e+03 2.5361e+03 1.8991e+03 8.4110e+02 5.4240e+02 + 6.0960e+02 4.4660e+02 2.2921e+03 2.9519e+03 2.3010e+03 1.7546e+03 6.0480e+02 + 1.7120e+02 6.1640e+02 3.8170e+02 2.9710e+02 5.8370e+02 4.3680e+02 4.6850e+02 + 2.1956e+03 2.8382e+03 1.2649e+03 4.6880e+02 3.9130e+02 5.4430e+02 3.9560e+02 + 1.5678e+03 2.0134e+03 2.1168e+03 2.4868e+03 5.6890e+02 1.8690e+02 7.8600e+02 + 9.7310e+02 3.6720e+02 5.2170e+02 5.1730e+02 7.1250e+02 2.6246e+03 2.7798e+03 + 2.5929e+03 3.1358e+03 4.5260e+02 5.1910e+02 4.8220e+02 2.5710e+02 5.9380e+02 + 6.8240e+02 5.2110e+02 6.7240e+02 1.0428e+03 3.8560e+02 9.3700e+02 5.1260e+02 + 2.0820e+02 4.6890e+02 5.7560e+02 1.0457e+03 2.3140e+03 1.3953e+03 2.1430e+03 + 2.6317e+03 1.0022e+03 6.4630e+02 6.9200e+02 3.3090e+02 4.2610e+02 1.1866e+03 + 2.6008e+03 3.2702e+03 1.1801e+03 9.4660e+02 1.7230e+02 3.3060e+02 4.1380e+02 + 4.5450e+02 4.5720e+02 6.0590e+02 2.1190e+02 9.1320e+02 2.7286e+03 2.8545e+03 + 1.4341e+03 9.5680e+02 3.2730e+02 5.9230e+02 7.8650e+02 1.6974e+03 2.1419e+03 + 3.1729e+03 1.4994e+03 4.9470e+02 7.3480e+02 9.4490e+02 7.9760e+02 2.5150e+02 + 2.4020e+02 2.7666e+03 1.8987e+03 3.5097e+03 2.1172e+03 3.3244e+03 1.0983e+03 + 7.7050e+02 6.3180e+02 6.3020e+02 5.6850e+02 7.2500e+02 4.9590e+02 1.2000e+03 + 6.0330e+02 3.1480e+02 5.9690e+02 7.2810e+02 5.8940e+02 3.5670e+02 6.1670e+02 + 9.3980e+02 1.7172e+03 1.4235e+03 2.6615e+03 2.8317e+03 5.5800e+02 3.1550e+02 + 4.0550e+02 7.3980e+02 3.6870e+02 2.6211e+03 3.9875e+03 3.1849e+03 1.4604e+03 + 1.1111e+03 4.3200e+02 9.1740e+02 4.6150e+02 5.3830e+02 4.8040e+02 2.8740e+02 + 3.0650e+02 8.5940e+02 2.5203e+03 2.9337e+03 2.2547e+03 8.9830e+02 3.7940e+02 + 1.0574e+03 6.9500e+02 1.0157e+03 3.1351e+03 2.7719e+03 1.7437e+03 5.7320e+02 + 8.2840e+02 1.0650e+03 5.6180e+02 2.8580e+02 2.8150e+02 1.8601e+03 2.6723e+03 + 2.4762e+03 3.3529e+03 3.3959e+03 2.2447e+03 8.7570e+02 6.3890e+02 7.6000e+02 + 5.7420e+02 8.2780e+02 2.8870e+02 5.8900e+02 5.2150e+02 3.3600e+02 7.2750e+02 + 1.0793e+03 5.5780e+02 5.2310e+02 7.7020e+02 2.1846e+03 3.4648e+03 3.2165e+03 + 2*2.8732e+03 3.6410e+02 1.7520e+02 6.4440e+02 4.7120e+02 5.8090e+02 + 2.3841e+03 2.2405e+03 2.0834e+03 1.6396e+03 6.5440e+02 3.2850e+02 6.9410e+02 + 9.2170e+02 4.0570e+02 2.3580e+02 1.9730e+02 4.9500e+02 6.7770e+02 2.3852e+03 + 2.9698e+03 2.2801e+03 1.1819e+03 5.9560e+02 3.3370e+02 5.2760e+02 6.7550e+02 + 1.6101e+03 3.0377e+03 2.7158e+03 1.6328e+03 1.3899e+03 8.7430e+02 2.6690e+02 + 1.3900e+02 2.8400e+02 1.3702e+03 2.2951e+03 2.3059e+03 2.7597e+03 2.6827e+03 + 2.6159e+03 8.5330e+02 6.3700e+02 5.0350e+02 3.3220e+02 6.7160e+02 1.2879e+03 + 6.3760e+02 4.2380e+02 6.3470e+02 3.6610e+02 6.5010e+02 3.0790e+02 7.7560e+02 + 5.8900e+02 2.3819e+03 2.3216e+03 3.5704e+03 3.0532e+03 2.2574e+03 1.7030e+02 + 2.7690e+02 3.6740e+02 8.0930e+02 5.4920e+02 1.1220e+03 3.1977e+03 1.3096e+03 + 1.7068e+03 6.5710e+02 5.2880e+02 7.8490e+02 4.7880e+02 3.5120e+02 2.3900e+02 + 2.5000e+02 5.0860e+02 8.7710e+02 2.5107e+03 3.2758e+03 1.5022e+03 1.1273e+03 + 4.7050e+02 4.7290e+02 4.5150e+02 8.3190e+02 1.1032e+03 2.3510e+03 2.2580e+03 + 2.2750e+03 1.9706e+03 6.9540e+02 1.5450e+02 1.2460e+02 2.4890e+02 2.3578e+03 + 2.5965e+03 1.6969e+03 2.3751e+03 2.7442e+03 2.3132e+03 1.0407e+03 8.3740e+02 + 7.7220e+02 5.1180e+02 7.4360e+02 7.0540e+02 2.2190e+02 3.6050e+02 9.9200e+02 + 8.5280e+02 1.5610e+02 1.7890e+02 1.0372e+03 1.2279e+03 1.9260e+03 3.3260e+03 + 3.5759e+03 3.9612e+03 6.2150e+02 3.1820e+02 5.9740e+02 4.7690e+02 7.2710e+02 + 8.6630e+02 9.5100e+02 3.1347e+03 1.9366e+03 1.0132e+03 5.6890e+02 8.3280e+02 + 1.1443e+03 4.0690e+02 3.9150e+02 4.9180e+02 2.7790e+02 3.7030e+02 7.1130e+02 + 1.3037e+03 3.2308e+03 1.8904e+03 7.8820e+02 2.9680e+02 1.9220e+02 4.3810e+02 + 1.0441e+03 4.9880e+02 5.2520e+02 1.7284e+03 2.7868e+03 1.7308e+03 9.0780e+02 + 1.5900e+02 3.3220e+02 8.3820e+02 8.3870e+02 2.5435e+03 9.8430e+02 2.7203e+03 + 2.8763e+03 1.5864e+03 5.0110e+02 3.4070e+02 3.9920e+02 4.2650e+02 5.4450e+02 + 3.0050e+02 3.2830e+02 3.6060e+02 6.2060e+02 2.8350e+02 2.5560e+02 2.1280e+02 + 6.0730e+02 1.0039e+03 2.0302e+03 2.8176e+03 2.9737e+03 2.9387e+03 1.0852e+03 + 7.1960e+02 7.1780e+02 2.9850e+02 6.8430e+02 7.8180e+02 1.2844e+03 2.5660e+03 + 2.6720e+03 8.3060e+02 7.1320e+02 6.4660e+02 9.1660e+02 5.0650e+02 1.7780e+02 + 2.3890e+02 3.0570e+02 2.4150e+02 7.0050e+02 1.6457e+03 2.6570e+03 1.5318e+03 + 8.2630e+02 5.5270e+02 2.2850e+02 3.7260e+02 7.3670e+02 5.5420e+02 3.0730e+02 + 5.0770e+02 2.4411e+03 2.9198e+03 2.4711e+03 4.1360e+02 3.6150e+02 7.6050e+02 + 2.7577e+03 2.5741e+03 1.9477e+03 1.1365e+03 3.7692e+03 1.9266e+03 7.8290e+02 + 2.8070e+02 2.6010e+02 4.4270e+02 5.9300e+02 2.5510e+02 1.4100e+02 5.0700e+02 + 4.4950e+02 7.2010e+02 4.0340e+02 3.7060e+02 3.5530e+02 5.8390e+02 2.3799e+03 + 2.9558e+03 1.9773e+03 3.2424e+03 1.1148e+03 6.8120e+02 6.2900e+02 3.0080e+02 + 3.1460e+02 4.7010e+02 7.9310e+02 1.4566e+03 1.5561e+03 2.2100e+02 5.1720e+02 + 8.9200e+02 1.4613e+03 3.3250e+02 1.8950e+02 4.6530e+02 6.8330e+02 4.3730e+02 + 1.0765e+03 1.8879e+03 3.5224e+03 2.1799e+03 6.1350e+02 7.7060e+02 8.6860e+02 + 5.5490e+02 8.8800e+02 5.1850e+02 4.0160e+02 4.2460e+02 2.5059e+03 4.2761e+03 + 2.5418e+03 3.7600e+02 1.5178e+03 1.5103e+03 4.1275e+03 2.4849e+03 1.8656e+03 + 2.1272e+03 2.9948e+03 1.8374e+03 8.9720e+02 7.8610e+02 3.2620e+02 3.4660e+02 + 4.2640e+02 2.5390e+02 5.7630e+02 4.5750e+02 4.8700e+02 4.7740e+02 6.7730e+02 + 5.5240e+02 3.5750e+02 9.8940e+02 2.4477e+03 2.2667e+03 3.1478e+03 2.8665e+03 + 1.4795e+03 4.9970e+02 4.8360e+02 2.2950e+02 1.9580e+02 2.2680e+02 4.8020e+02 + 1.9468e+03 2.4672e+03 3.8160e+02 6.6470e+02 9.0090e+02 6.7200e+02 4.0120e+02 + 3.2560e+02 7.3240e+02 4.7950e+02 5.0600e+02 4.4940e+02 2.7116e+03 3.0657e+03 + 1.5832e+03 9.1580e+02 8.9080e+02 6.4630e+02 6.5860e+02 9.4580e+02 3.5220e+02 + 2.9920e+02 4.6990e+02 1.1417e+03 4.1065e+03 3.1967e+03 1.3143e+03 1.0718e+03 + 1.5659e+03 3.0329e+03 2.2288e+03 1.1206e+03 3.6223e+03 1.8552e+03 5.3270e+02 + 6.5280e+02 8.1400e+02 4.4530e+02 5.9300e+02 5.8280e+02 4.2380e+02 5.8220e+02 + 4.8210e+02 1.0299e+03 7.3670e+02 4.6870e+02 5.0740e+02 4.2220e+02 4.5370e+02 + 3.0642e+03 1.8703e+03 2.8162e+03 4.6204e+03 5.1740e+02 6.1470e+02 3.4390e+02 + 4.1140e+02 3.6630e+02 2.7100e+02 2.0070e+02 1.3611e+03 2.6176e+03 1.5474e+03 + 4.1380e+02 5.6090e+02 7.1570e+02 3.6320e+02 4.2270e+02 8.4350e+02 8.8390e+02 + 5.2700e+02 8.3250e+02 9.3010e+02 2.0530e+03 1.4336e+03 5.6370e+02 7.5620e+02 + 8.1230e+02 6.7440e+02 6.6370e+02 4.6820e+02 6.8510e+02 2.7490e+02 6.7050e+02 + 2.2483e+03 2.4596e+03 2.4659e+03 1.6711e+03 2.8589e+03 2.3460e+03 2.0951e+03 + 1.1104e+03 3.7090e+03 2.9444e+03 9.8170e+02 7.1940e+02 6.0180e+02 4.3200e+02 + 3.3900e+02 5.5250e+02 6.1570e+02 6.2830e+02 4.4520e+02 9.4900e+02 5.8720e+02 + 3.4650e+02 5.7580e+02 5.7710e+02 1.3928e+03 2.7066e+03 1.8822e+03 2.2928e+03 + 4.2114e+03 1.1509e+03 3.8100e+02 3.3420e+02 1.3919e+03 6.1680e+02 2.5370e+02 + 2.5960e+02 1.4669e+03 3.5368e+03 2.1506e+03 3.2100e+02 5.8370e+02 7.6570e+02 + 4.7990e+02 4.6560e+02 7.8380e+02 4.7220e+02 3.9830e+02 1.1547e+03 1.8056e+03 + 3.4830e+03 1.6301e+03 4.8480e+02 5.9060e+02 4.5710e+02 5.7520e+02 6.5840e+02 + 3.1460e+02 5.0410e+02 3.8870e+02 6.7460e+02 2.0938e+03 3.1442e+03 1.6069e+03 + 3.3582e+03 2.7033e+03 2.6642e+03 1.0143e+03 1.6189e+03 2.0284e+03 2.3273e+03 + 4.2400e+02 4.3930e+02 1.7666e+03 4.2500e+02 3.2220e+02 7.2600e+02 7.4500e+02 + 4.1040e+02 8.3160e+02 5.7550e+02 7.8060e+02 3.5020e+02 4.9310e+02 4.8150e+02 + 7.3910e+02 3.0058e+03 1.7204e+03 1.9905e+03 2.8328e+03 2.4059e+03 2.6810e+02 + 2.6890e+02 6.5420e+02 1.2287e+03 8.7500e+02 3.2850e+02 7.6340e+02 3.6867e+03 + 3.1409e+03 2.5050e+02 3.9420e+02 6.5720e+02 1.9200e+02 3.7050e+02 5.3460e+02 + 9.1880e+02 3.9400e+02 8.5780e+02 2.9552e+03 3.5393e+03 6.9450e+02 5.5310e+02 + 7.1310e+02 5.8700e+02 4.5890e+02 7.0580e+02 2.3830e+02 5.5020e+02 1.0538e+03 + 6.0520e+02 7.3640e+02 1.2571e+03 3.5164e+03 1.8286e+03 2.5858e+03 1.9981e+03 + 8.5010e+02 1.4685e+03 3.2918e+03 3.6211e+03 3.2340e+02 4.1590e+02 8.8300e+02 + 6.6120e+02 3.2810e+02 2.5790e+02 2.7770e+02 3.8640e+02 5.8270e+02 5.6130e+02 + 4.2590e+02 8.7250e+02 6.0530e+02 3.2120e+02 2.0753e+03 2.4014e+03 1.9405e+03 + 1.3560e+03 3.5892e+03 1.0104e+03 5.0760e+02 2.4260e+02 5.2850e+02 8.2410e+02 + 5.2890e+02 5.9710e+02 6.9010e+02 2.0365e+03 1.7084e+03 9.7970e+02 4.6210e+02 + 6.4340e+02 4.5180e+02 4.0700e+02 8.1580e+02 4.6990e+02 3.1370e+02 1.8252e+03 + 3.9761e+03 2.4926e+03 1.6096e+03 4.4260e+02 6.4780e+02 7.1020e+02 5.8270e+02 + 3.9590e+02 5.4890e+02 5.9490e+02 9.2680e+02 5.7930e+02 1.1023e+03 2.4913e+03 + 4.6251e+03 3.1245e+03 2.7087e+03 1.7568e+03 5.6220e+02 5.0760e+02 3.5522e+03 + 2.1805e+03 4.6280e+02 2.9830e+02 4.0430e+02 2.0030e+02 4.0030e+02 5.6990e+02 + 3.6080e+02 3.9840e+02 3.6000e+02 7.0890e+02 4.7420e+02 8.4640e+02 8.0160e+02 + 5.0380e+02 1.3805e+03 3.7231e+03 2.2154e+03 2.7136e+03 3.7588e+03 8.8240e+02 + 3.7450e+02 2.1250e+02 3.6700e+02 6.8200e+02 8.3720e+02 1.0662e+03 8.4610e+02 + 1.1680e+03 2.8174e+03 3.8973e+03 1.4336e+03 4.9420e+02 6.7060e+02 6.6600e+02 + 4.2720e+02 4.3130e+02 4.8870e+02 1.5860e+03 2.6774e+03 2.6679e+03 1.4151e+03 + 6.4450e+02 5.8340e+02 8.1180e+02 4.9170e+02 4.3360e+02 2.7070e+02 6.2110e+02 + 4.8030e+02 5.0820e+02 3.3750e+02 3.2911e+03 4.1438e+03 4.9000e+03 1.6325e+03 + 6.8100e+02 4.2080e+02 1.2137e+03 3.5136e+03 1.5629e+03 1.0722e+03 5.0650e+02 + 4.4000e+02 5.0700e+02 6.0470e+02 4.4220e+02 4.3590e+02 2.8540e+02 4.4570e+02 + 6.1190e+02 5.5100e+02 4.5550e+02 5.4120e+02 5.4490e+02 7.6220e+02 2.8265e+03 + 3.8300e+03 1.1195e+03 3.8727e+03 1.9575e+03 3.5610e+02 2.3650e+02 2.7240e+02 + 5.2880e+02 7.2060e+02 5.5510e+02 8.5870e+02 1.1966e+03 2.0171e+03 4.6720e+03 + 2.1979e+03 4.7510e+02 6.2410e+02 6.2950e+02 6.8820e+02 3.6600e+02 9.6750e+02 + 1.5291e+03 4.5733e+03 3.0132e+03 9.4400e+02 5.4910e+02 4.5210e+02 4.6060e+02 + 9.4880e+02 5.0240e+02 3.6330e+02 7.3250e+02 9.8070e+02 2.0200e+02 4.8290e+02 + 8.2560e+02 4.9000e+03 3.8393e+03 1.1132e+03 4.8630e+02 6.7000e+02 1.4671e+03 + 2.3961e+03 2.3701e+03 9.1430e+02 4.0860e+02 4.2220e+02 3.2370e+02 5.9690e+02 + 4.2800e+02 1.8780e+02 1.8020e+02 5.2310e+02 5.7810e+02 6.6870e+02 3.1000e+02 + 2.7310e+02 5.0290e+02 4.5960e+02 1.5212e+03 2.7019e+03 2.2496e+03 3.7126e+03 + 2.8719e+03 6.3270e+02 1.7980e+02 3.1490e+02 4.7590e+02 8.3440e+02 6.2500e+02 + 4.4510e+02 4.0020e+02 1.6172e+03 3.6651e+03 2.9964e+03 7.4880e+02 6.0500e+02 + 6.8690e+02 2.9980e+02 3.6970e+02 6.2000e+02 2.7694e+03 3.1562e+03 1.8208e+03 + 7.2330e+02 7.1390e+02 4.4330e+02 6.4640e+02 7.5460e+02 4.8770e+02 1.9540e+02 + 3.6750e+02 6.3500e+02 6.9650e+02 5.9960e+02 3.0966e+03 4.5533e+03 4.9000e+03 + 6.6730e+02 5.1430e+02 4.6940e+02 1.2133e+03 2.5071e+03 3.6057e+03 1.6304e+03 + 8.9400e+02 4.3100e+02 2.4240e+02 5.5600e+02 4.7380e+02 3.9710e+02 7.5890e+02 + 6.9190e+02 3.9270e+02 4.6630e+02 6.5710e+02 4.0420e+02 5.0220e+02 5.2930e+02 + 1.1037e+03 1.5653e+03 1.1101e+03 3.9721e+03 1.9566e+03 6.9940e+02 4.9010e+02 + 5.9790e+02 5.9160e+02 4.4740e+02 4.8170e+02 5.4420e+02 4.0390e+02 1.2476e+03 + 3.0732e+03 2.6255e+03 1.1470e+03 5.2620e+02 3.7440e+02 4.3070e+02 4.7800e+02 + 1.1326e+03 3.6136e+03 3.1644e+03 2.5855e+03 7.3420e+02 5.3510e+02 1.0340e+03 + 4.1470e+02 3.5820e+02 2.0260e+02 1.6890e+02 4.1280e+02 5.3130e+02 5.3640e+02 + 9.3980e+02 3.5596e+03 4.2157e+03 4.4180e+03 4.6100e+02 4.7040e+02 4.0150e+02 + 7.7290e+02 2.0580e+03 2.9654e+03 1.9588e+03 1.0911e+03 4.4220e+02 1.0380e+02 + 4.1330e+02 4.2580e+02 6.8530e+02 4.2990e+02 6.2070e+02 5.3280e+02 4.6720e+02 + 7.4580e+02 2.4300e+02 3.9360e+02 3.2310e+02 1.3945e+03 2.8706e+03 1.3467e+03 + 2.6715e+03 3.5599e+03 7.7070e+02 4.5710e+02 4.8220e+02 5.5950e+02 8.8580e+02 + 1.0296e+03 4.0500e+02 3.7540e+02 6.5140e+02 1.0139e+03 2.9827e+03 1.3824e+03 + 2.7450e+02 3.1540e+02 3.0950e+02 7.7530e+02 2.0256e+03 4.0651e+03 3.1265e+03 + 1.6517e+03 7.3060e+02 6.9180e+02 7.7610e+02 3.7010e+02 6.9370e+02 4.3290e+02 + 4.1410e+02 4.1620e+02 2.9430e+02 5.3660e+02 1.9078e+03 3.9245e+03 4.2899e+03 + 3.2408e+03 8.8950e+02 5.2440e+02 4.7560e+02 3.7140e+02 1.4677e+03 3.9601e+03 + 2.2558e+03 8.4200e+02 5.0470e+02 2.8990e+02 4.1630e+02 6.4230e+02 6.5470e+02 + 4.3050e+02 3.2900e+02 5.1550e+02 6.9000e+02 5.0190e+02 5.0300e+02 5.7810e+02 + 4.5030e+02 5.5540e+02 2.8292e+03 9.1220e+02 2.5136e+03 2.7955e+03 1.1013e+03 + 5.3120e+02 4.7980e+02 8.0270e+02 8.0420e+02 5.1890e+02 4.2850e+02 4.7680e+02 + 8.2120e+02 9.7140e+02 2.5741e+03 3.3678e+03 9.9950e+02 4.3890e+02 7.2410e+02 + 8.0180e+02 2.8864e+03 2.7568e+03 1.3737e+03 1.0237e+03 8.3450e+02 7.8300e+02 + 6.4900e+02 4.9550e+02 3.3970e+02 4.1750e+02 2.9090e+02 3.6270e+02 3.1390e+02 + 4.4530e+02 3.1744e+03 4.4510e+03 3.5077e+03 1.9978e+03 3.8690e+02 2.9790e+02 + 6.1340e+02 2.4020e+02 9.6250e+02 2.5587e+03 2.5281e+03 8.4890e+02 8.5930e+02 + 3.3170e+02 7.7950e+02 1.0365e+03 6.2730e+02 4.3020e+02 3.6650e+02 5.0400e+02 + 5.5670e+02 9.9740e+02 3.2840e+02 4.0510e+02 4.9110e+02 5.7250e+02 2.3670e+03 + 6.8570e+02 3.3761e+03 2.6878e+03 1.1207e+03 7.3160e+02 4.8220e+02 5.6950e+02 + 8.8860e+02 1.0573e+03 6.7140e+02 3.1070e+02 7.5010e+02 5.4640e+02 1.4134e+03 + 2.6539e+03 1.8622e+03 4.8120e+02 6.1640e+02 1.8691e+03 2.3044e+03 2.1833e+03 + 3.6050e+02 7.2240e+02 4.3990e+02 2.8770e+02 4.3070e+02 5.1080e+02 4.1950e+02 + 4.0780e+02 5.5870e+02 6.4720e+02 3.8700e+02 1.0104e+03 2.3956e+03 4.9000e+03 + 3.8551e+03 2.0599e+03 5.4700e+02 3.6520e+02 5.0750e+02 4.7740e+02 7.8780e+02 + 2.5403e+03 2.2902e+03 2.4119e+03 1.4041e+03 6.8530e+02 8.1440e+02 7.4520e+02 + 7.4160e+02 4.9110e+02 3.1180e+02 2.3710e+02 3.1360e+02 8.5690e+02 2.9150e+02 + 2.8930e+02 5.1670e+02 3.7980e+02 2.7993e+03 1.3459e+03 2.5455e+03 4.7427e+03 + 2.0213e+03 7.0690e+02 5.9680e+02 2.4370e+02 7.1860e+02 7.2900e+02 7.0380e+02 + 3.7160e+02 7.2960e+02 4.3850e+02 1.2868e+03 4.3004e+03 2.4637e+03 1.8001e+03 + 1.0571e+03 1.8924e+03 2.6453e+03 1.1160e+03 3.6100e+02 2.4800e+02 7.6450e+02 + 3.4980e+02 4.8550e+02 5.2600e+02 6.4170e+02 3.3080e+02 5.2130e+02 5.3110e+02 + 4.6830e+02 9.1240e+02 2.2512e+03 3.3104e+03 3.7258e+03 2.2871e+03 4.5760e+02 + 2.5440e+02 6.7260e+02 4.2730e+02 4.4700e+02 1.4961e+03 2.9744e+03 1.9653e+03 + 1.9557e+03 2.3614e+03 1.4668e+03 3.4900e+02 8.2690e+02 6.7960e+02 5.4600e+02 + 4.4440e+02 8.0110e+02 7.9790e+02 4.2890e+02 6.4700e+01 2.8370e+02 9.5200e+02 + 2.4972e+03 8.7880e+02 2.3464e+03 4.1965e+03 1.5530e+03 7.9510e+02 6.2920e+02 + 5.8080e+02 4.0570e+02 6.6310e+02 6.0330e+02 7.2800e+02 4.1840e+02 2.5200e+02 + 9.9200e+02 1.7208e+03 2.5004e+03 1.5446e+03 3.5882e+03 1.8118e+03 2.5815e+03 + 5.3890e+02 3.0900e+02 4.7880e+02 4.5950e+02 4.8810e+02 3.4230e+02 4.6130e+02 + 5.0860e+02 2.8500e+02 1.6890e+02 3.8060e+02 1.2137e+03 1.7882e+03 2.9557e+03 + 2.9355e+03 4.2766e+03 1.0388e+03 5.8830e+02 3.0350e+02 6.9110e+02 5.1950e+02 + 5.6090e+02 7.8400e+02 2.3742e+03 2.1025e+03 1.6211e+03 3.3362e+03 2.5452e+03 + 4.9040e+02 1.9267e+03 1.0404e+03 4.9960e+02 9.6910e+02 7.0890e+02 9.2050e+02 + 2.2100e+02 1.2310e+02 2.5700e+02 1.0030e+03 2.7943e+03 7.2230e+02 9.8230e+02 + 3.1941e+03 3.3116e+03 1.3133e+03 1.3375e+03 2.7600e+02 4.3460e+02 5.8820e+02 + 5.4290e+02 4.1170e+02 2.6200e+02 4.2210e+02 7.7850e+02 1.5578e+03 2.5124e+03 + 4.7432e+03 3.4953e+03 2.0561e+03 1.7926e+03 4.9300e+02 9.6200e+01 4.7040e+02 + 2.0340e+02 4.3640e+02 1.6680e+02 5.8730e+02 5.9470e+02 5.5400e+01 5.0100e+01 + 4.6030e+02 1.2982e+03 2.2198e+03 3.8376e+03 4.3520e+03 2.8952e+03 9.7310e+02 + 2.6830e+02 8.3060e+02 4.5960e+02 7.1170e+02 5.6920e+02 7.3150e+02 6.1400e+02 + 7.8790e+02 1.1289e+03 2.8940e+03 1.5826e+03 1.1593e+03 1.9469e+03 1.8159e+03 + 1.2702e+03 1.7367e+03 1.1041e+03 1.1668e+03 5.7290e+02 2.2410e+02 5.3960e+02 + 2.4646e+03 2.4214e+03 5.5160e+02 8.1850e+02 2.5293e+03 2.7319e+03 2.5593e+03 + 1.2828e+03 5.9130e+02 3.2880e+02 5.2650e+02 3.9580e+02 5.4460e+02 3.2270e+02 + 5.6170e+02 8.6340e+02 1.2440e+03 3.1077e+03 4.9000e+03 3.6385e+03 2.2458e+03 + 4.8690e+02 3.4510e+02 3.2150e+02 3.8090e+02 8.8460e+02 3.8400e+02 6.1540e+02 + 5.8590e+02 4.4040e+02 2.3070e+02 2.2110e+02 5.2410e+02 9.9490e+02 2.0752e+03 + 2.5875e+03 3.8019e+03 2.7182e+03 6.2620e+02 4.5670e+02 9.4500e+02 4.6250e+02 + 5.6210e+02 4.9640e+02 1.2368e+03 6.7920e+02 3.9940e+02 9.1170e+02 1.4023e+03 + 2.1358e+03 1.8724e+03 1.9772e+03 1.9902e+03 2.1854e+03 2.2517e+03 1.6767e+03 + 8.2990e+02 9.3310e+02 3.9030e+02 1.0400e+03 2.3426e+03 2.4174e+03 6.2760e+02 + 8.7340e+02 7.7230e+02 1.9824e+03 3.2704e+03 1.3039e+03 6.1090e+02 4.0610e+02 + 6.0330e+02 6.9060e+02 5.0260e+02 2.6790e+02 4.9460e+02 3.9850e+02 9.8040e+02 + 2.9913e+03 4.9000e+03 1.5341e+03 1.8631e+03 4.7220e+02 4.1140e+02 5.6320e+02 + 4.6630e+02 7.8020e+02 6.4010e+02 8.0740e+02 5.2270e+02 4.8390e+02 3.8810e+02 + 5.3920e+02 3.6840e+02 1.2124e+03 3.7589e+03 3.3387e+03 4.9000e+03 2.9228e+03 + 6.8030e+02 4.3410e+02 1.1714e+03 2.8450e+02 5.0360e+02 3.6670e+02 8.2650e+02 + 6.7400e+02 4.1730e+02 5.5680e+02 7.3660e+02 9.4820e+02 6.1440e+02 2.1152e+03 + 2.0107e+03 2.7924e+03 3.1263e+03 1.9376e+03 1.6102e+03 1.1984e+03 5.2860e+02 + 9.4810e+02 2.7168e+03 2.3262e+03 7.9250e+02 6.9780e+02 1.1923e+03 2.3819e+03 + 2.2780e+03 2.2786e+03 9.2020e+02 5.1790e+02 3.4890e+02 4.6740e+02 6.7340e+02 + 5.7720e+02 3.0640e+02 1.6825e+03 1.8414e+03 3.0838e+03 4.9000e+03 2.4151e+03 + 8.4000e+02 3.4500e+02 5.8730e+02 6.3100e+02 4.5610e+02 1.0180e+03 8.1640e+02 + 5.2820e+02 5.5400e+02 2.8730e+02 5.3610e+02 6.8470e+02 4.0180e+02 1.5683e+03 + 3.3610e+03 2.5345e+03 2.9282e+03 2.6157e+03 8.6580e+02 2.2540e+02 5.6740e+02 + 5.0530e+02 6.1610e+02 3.2700e+02 4.1530e+02 6.4500e+02 5.3510e+02 1.7540e+02 + 1.1720e+03 1.0773e+03 1.2766e+03 6.2090e+02 2.6715e+03 2.1443e+03 2.6798e+03 + 2.7604e+03 2.4492e+03 2.1189e+03 1.8940e+03 2.5585e+03 2.1984e+03 2.2372e+03 + 9.0670e+02 5.8950e+02 7.1670e+02 2.1050e+03 2.8450e+03 1.8574e+03 1.6740e+03 + 2.3390e+02 1.9540e+02 3.4010e+02 4.2670e+02 7.1510e+02 1.1039e+03 2.3374e+03 + 1.8378e+03 1.3046e+03 3.0322e+03 2.4215e+03 7.0080e+02 4.8630e+02 4.5450e+02 + 8.8730e+02 1.0844e+03 9.4450e+02 7.3420e+02 6.2470e+02 4.3390e+02 3.9970e+02 + 1.5470e+02 4.4100e+02 1.3827e+03 1.5263e+03 2.7028e+03 1.9605e+03 2.2738e+03 + 9.9590e+02 6.6520e+02 2.9450e+02 2.1700e+02 1.9780e+02 3.5280e+02 1.6950e+02 + 2.3980e+02 3.3330e+02 3.2280e+02 3.8450e+02 8.8550e+02 8.6760e+02 8.9560e+02 + 6.9060e+02 7.7060e+02 1.3692e+03 9.8260e+02 2.1836e+03 2.4606e+03 1.2692e+03 + 3.1655e+03 2.1642e+03 3.2034e+03 2.4741e+03 9.7220e+02 1.5483e+03 2.7966e+03 + 2.8899e+03 2.2104e+03 7.1560e+02 3.1560e+02 6.5810e+02 1.1067e+03 3.7615e+03 + 3.2971e+03 1.5618e+03 7.8230e+02 5.7980e+02 6.3620e+02 1.8271e+03 3.0725e+03 + 6.1770e+02 3.0940e+02 3.5230e+02 2.6710e+02 6.4910e+02 3.0073e+03 2.6614e+03 + 1.5123e+03 1.2903e+03 4.8790e+02 5.3300e+02 3.7590e+02 3.2820e+02 6.0570e+02 + 5.0440e+02 3.5410e+02 6.9840e+02 8.9590e+02 2.0232e+03 2.1700e+03 2.0710e+03 + 9.3360e+02 6.2980e+02 2.1520e+02 3.7700e+02 5.4030e+02 3.2505e+03 3.1772e+03 + 1.8140e+03 1.8060e+02 6.2590e+02 6.4140e+02 5.9260e+02 5.5960e+02 5.9720e+02 + 5.8280e+02 4.8800e+02 1.6129e+03 2.9804e+03 4.0136e+03 2.4282e+03 8.9860e+02 + 3.8990e+02 1.2781e+03 9.6460e+02 2.0218e+03 3.2002e+03 2.3983e+03 6.1930e+02 + 7.4590e+02 5.8480e+02 6.5940e+02 3.3061e+03 5.4830e+03 1.9340e+03 5.2100e+02 + 4.0280e+02 7.3560e+02 2.6660e+03 3.8933e+03 9.7280e+02 4.1740e+02 2.4630e+02 + 1.3110e+02 9.8970e+02 2.1587e+03 3.5148e+03 3.3328e+03 9.5990e+02 4.1380e+02 + 6.2420e+02 4.7820e+02 3.7510e+02 3.3690e+02 6.7280e+02 4.3730e+02 5.7680e+02 + 2.0036e+03 2.5637e+03 2.8250e+03 1.1677e+03 3.8730e+02 6.3690e+02 8.3810e+02 + 5.8870e+02 6.4170e+02 1.9771e+03 4.9798e+03 1.1141e+03 3.0840e+02 5.0330e+02 + 3.0970e+02 5.4240e+02 7.5550e+02 4.6410e+02 6.6140e+02 8.7800e+02 9.9640e+02 + 2.8625e+03 4.1500e+03 9.6920e+02 3.6410e+02 5.4540e+02 7.2020e+02 1.4819e+03 + 1.2766e+03 2.6078e+03 2.4796e+03 6.6700e+02 5.5780e+02 5.8220e+02 1.0232e+03 + 2.7920e+03 3.4224e+03 3.0973e+03 6.0100e+02 2.8620e+02 3.4010e+02 3.1868e+03 + 4.8835e+03 1.2490e+03 2.7870e+02 3.2710e+02 7.1030e+02 4.6520e+02 2.0231e+03 + 3.0971e+03 3.2471e+03 1.0887e+03 3.6670e+02 8.6260e+02 6.5320e+02 4.2600e+02 + 7.6190e+02 5.2810e+02 3.3690e+02 6.1690e+02 2.9040e+03 4.1178e+03 1.8403e+03 + 4.9150e+02 2.5270e+02 6.6910e+02 9.7590e+02 5.4930e+02 7.9380e+02 2.3232e+03 + 5.3344e+03 2.3988e+03 4.5280e+02 1.8720e+02 3.7030e+02 7.3870e+02 1.2087e+03 + 5.7090e+02 4.9460e+02 7.3680e+02 1.3997e+03 2.2001e+03 3.0050e+03 1.0194e+03 + 4.6830e+02 6.9090e+02 6.1680e+02 9.8470e+02 2.4891e+03 2.8442e+03 3.1059e+03 + 7.4640e+02 6.6860e+02 3.3160e+02 3.4030e+02 1.8355e+03 4.4516e+03 3.6238e+03 + 9.8850e+02 2.9250e+02 1.1539e+03 1.9723e+03 5.6000e+03 1.9467e+03 2.2350e+02 + 5.3010e+02 7.6920e+02 5.5020e+02 4.1080e+02 3.8756e+03 3.4968e+03 9.3230e+02 + 2.6550e+02 7.3880e+02 3.9310e+02 8.3910e+02 7.6450e+02 7.5670e+02 4.3790e+02 + 4.7490e+02 2.3616e+03 4.1236e+03 2.2053e+03 2.3940e+02 1.9280e+02 4.7370e+02 + 5.9110e+02 8.4760e+02 7.6390e+02 1.9807e+03 3.5320e+03 9.4810e+02 4.2570e+02 + 3.4700e+02 2.9940e+02 2.8770e+02 8.0810e+02 8.4160e+02 8.2560e+02 6.9910e+02 + 1.2827e+03 2.6899e+03 2.3007e+03 5.8750e+02 6.5700e+02 9.4260e+02 6.5250e+02 + 3.0500e+02 2.2439e+03 3.2147e+03 2.4191e+03 9.4970e+02 1.1435e+03 5.2730e+02 + 6.6620e+02 9.1430e+02 2.1217e+03 2.9519e+03 1.4869e+03 7.6390e+02 2.7980e+02 + 1.8534e+03 5.0946e+03 2.6224e+03 4.2670e+02 4.3490e+02 1.1217e+03 1.0272e+03 + 5.4260e+02 3.0364e+03 3.7104e+03 1.7094e+03 4.3650e+02 2.2810e+02 5.5620e+02 + 9.1790e+02 5.2450e+02 4.5180e+02 2.6280e+02 1.0727e+03 2.0547e+03 4.0273e+03 + 1.2966e+03 2.6520e+02 2.7630e+02 4.9600e+02 1.1153e+03 8.6950e+02 4.1990e+02 + 2.9664e+03 2.8677e+03 9.7280e+02 9.9330e+02 4.4520e+02 3.9270e+02 2.9960e+02 + 3.4110e+02 4.8520e+02 2.9120e+02 7.1630e+02 1.1783e+03 2.6741e+03 3.2311e+03 + 9.6350e+02 3.4320e+02 7.9890e+02 6.4430e+02 5.2290e+02 1.6011e+03 3.3930e+03 + 3.1120e+03 1.3859e+03 4.6450e+02 5.4370e+02 7.0390e+02 3.1310e+02 1.7407e+03 + 3.2377e+03 2.0627e+03 9.0680e+02 7.4210e+02 1.9812e+03 5.4399e+03 2.1882e+03 + 4.4190e+02 6.8090e+02 1.1213e+03 8.6770e+02 1.5795e+03 2.0170e+03 3.4535e+03 + 2.4736e+03 3.1390e+02 6.1280e+02 4.0960e+02 3.8780e+02 6.2030e+02 5.0470e+02 + 4.0620e+02 1.7790e+03 3.7454e+03 2.8390e+03 1.3277e+03 3.8310e+02 2.5120e+02 + 4.4820e+02 8.7320e+02 6.2360e+02 6.6620e+02 2.3166e+03 2.9798e+03 4.1870e+02 + 9.5030e+02 4.2810e+02 4.9180e+02 3.1070e+02 3.8480e+02 3.5740e+02 7.7460e+02 + 9.3470e+02 1.1507e+03 3.6927e+03 2.7166e+03 2.1417e+03 4.3170e+02 5.5920e+02 + 5.1820e+02 5.9400e+02 1.2927e+03 2.7970e+03 3.0156e+03 4.9650e+02 5.3550e+02 + 5.5220e+02 4.7320e+02 4.9550e+02 2.2230e+03 2.3944e+03 2.5257e+03 1.6448e+03 + 7.5410e+02 2.1294e+03 4.4285e+03 2.0014e+03 5.2520e+02 3.4320e+02 6.3960e+02 + 6.7920e+02 9.8960e+02 2.5510e+03 4.4663e+03 1.8510e+03 9.3300e+02 5.7680e+02 + 2.1550e+02 5.4660e+02 6.2490e+02 3.1090e+02 6.5520e+02 8.6410e+02 3.8456e+03 + 3.0698e+03 1.1732e+03 3.6760e+02 4.8580e+02 6.2730e+02 8.2950e+02 9.6310e+02 + 2.3330e+03 2.3906e+03 2.5312e+03 4.2480e+02 6.8930e+02 1.8320e+02 8.1950e+02 + 4.1140e+02 6.3400e+01 2.9280e+02 6.8290e+02 5.3510e+02 9.2220e+02 2.3499e+03 + 3.4861e+03 2.0006e+03 1.0550e+03 6.5600e+02 4.5870e+02 4.3140e+02 6.4570e+02 + 2.2111e+03 4.3958e+03 6.0570e+02 3.2090e+02 1.8160e+02 6.4180e+02 1.0279e+03 + 1.8660e+03 2.2565e+03 4.8726e+03 2.2195e+03 7.2190e+02 1.9500e+03 4.0646e+03 + 9.1590e+02 8.4490e+02 5.9930e+02 4.9520e+02 8.1070e+02 7.8790e+02 2.0475e+03 + 2.7338e+03 1.9328e+03 1.2301e+03 4.2730e+02 8.2200e+01 5.1950e+02 7.6890e+02 + 5.2160e+02 7.3430e+02 1.6154e+03 4.8780e+03 3.8742e+03 1.5656e+03 6.0910e+02 + 6.1370e+02 4.7740e+02 7.5720e+02 5.8930e+02 2.2905e+03 2.2951e+03 2.1012e+03 + 9.2130e+02 7.7100e+02 4.1210e+02 1.0141e+03 6.3760e+02 2.1790e+02 5.4660e+02 + 4.1860e+02 6.4200e+02 8.4610e+02 1.8609e+03 2.6821e+03 3.7551e+03 2.0112e+03 + 6.1290e+02 1.9950e+02 3.4600e+02 1.2144e+03 4.0887e+03 2.9728e+03 1.4030e+03 + 3.7940e+02 2.6570e+02 3.1690e+02 8.7670e+02 6.9890e+02 1.5178e+03 2.5046e+03 + 3.3292e+03 9.2130e+02 1.7248e+03 4.8098e+03 1.9660e+03 5.7830e+02 4.4110e+02 + 7.1330e+02 7.2460e+02 7.1160e+02 1.9911e+03 2.7324e+03 3.2843e+03 1.2230e+03 + 9.0910e+02 2.9050e+02 5.3870e+02 7.1740e+02 1.0422e+03 5.6540e+02 8.8820e+02 + 3.0660e+03 4.8489e+03 1.0318e+03 4.9830e+02 5.6540e+02 9.5260e+02 1.3113e+03 + 9.4010e+02 2.8653e+03 2.2442e+03 1.4205e+03 6.7300e+02 6.0190e+02 6.4300e+02 + 1.1262e+03 7.2220e+02 7.6200e+02 3.8410e+02 7.0460e+02 5.1350e+02 4.4380e+02 + 1.1544e+03 3.5899e+03 4.4377e+03 1.4555e+03 5.9070e+02 2.0550e+02 2.5460e+02 + 9.1180e+02 2.9835e+03 3.7215e+03 9.1270e+02 4.1110e+02 2.8310e+02 5.6330e+02 + 8.9030e+02 3.7000e+02 7.6990e+02 3.6630e+03 4.2464e+03 1.1755e+03 1.9461e+03 + 2.6391e+03 1.9392e+03 7.5600e+02 5.3880e+02 4.4050e+02 9.5490e+02 5.6970e+02 + 1.8014e+03 4.5451e+03 3.2155e+03 1.1029e+03 4.6260e+02 2.6410e+02 3.6420e+02 + 5.5090e+02 8.6930e+02 6.4460e+02 8.6490e+02 2.6941e+03 3.1244e+03 2.2146e+03 + 1.0221e+03 1.8791e+03 1.6219e+03 1.4425e+03 2.4870e+03 2.6296e+03 1.7736e+03 + 1.0209e+03 3.3930e+02 3.9380e+02 4.5750e+02 5.9330e+02 6.4940e+02 5.0600e+02 + 8.7660e+02 7.0010e+02 3.7890e+02 3.7530e+02 5.0620e+02 2.4710e+03 3.0943e+03 + 3.4064e+03 9.1960e+02 1.4170e+02 1.7310e+02 5.5160e+02 2.5287e+03 3.2411e+03 + 1.9697e+03 4.4100e+02 5.8850e+02 8.1200e+02 7.5880e+02 3.9900e+02 3.6150e+02 + 2.2762e+03 4.4499e+03 3.7986e+03 2.0874e+03 3.1539e+03 1.3534e+03 7.1350e+02 + 4.4780e+02 4.0550e+02 4.7190e+02 5.2040e+02 2.1287e+03 4.0967e+03 3.2754e+03 + 7.0430e+02 3.2360e+02 5.7440e+02 6.1210e+02 1.2232e+03 9.6200e+02 1.1714e+03 + 2.0538e+03 4.0595e+03 3.2153e+03 3.0555e+03 1.8474e+03 2.3781e+03 2.5840e+03 + 2.9718e+03 2.9055e+03 1.8460e+03 1.1464e+03 5.5800e+02 3.6990e+02 4.7320e+02 + 4.4190e+02 4.1750e+02 4.4420e+02 3.4960e+02 9.5480e+02 2.7580e+02 2.0680e+02 + 2.6170e+02 5.2180e+02 1.1326e+03 2.9478e+03 2.9898e+03 1.2841e+03 3.4990e+02 + 4.7870e+02 4.7790e+02 1.5264e+03 2.9515e+03 1.3323e+03 3.6670e+02 7.0320e+02 + 8.5090e+02 7.9280e+02 3.1340e+02 2.9640e+02 1.1664e+03 3.3750e+03 2.7581e+03 + 2.7176e+03 5.0397e+03 7.6180e+02 4.7980e+02 8.7980e+02 2.8770e+02 4.2490e+02 + 5.8430e+02 1.0705e+03 3.4717e+03 2.5725e+03 5.6420e+02 3.5950e+02 4.3500e+02 + 4.7040e+02 3.8140e+02 1.5247e+03 1.5681e+03 2.6101e+03 5.6000e+03 4.1509e+03 + 2.0272e+03 2.4782e+03 2.0671e+03 2.7901e+03 3.1429e+03 1.2187e+03 8.5550e+02 + 6.9510e+02 7.1560e+02 3.2230e+02 5.1510e+02 4.0160e+02 6.6040e+02 4.7790e+02 + 8.4880e+02 7.2830e+02 5.9230e+02 2.4500e+02 2.5870e+02 3.3950e+02 8.6920e+02 + 1.6332e+03 3.3070e+03 3.5670e+03 5.3490e+02 5.0350e+02 6.1800e+02 2.2372e+03 + 3.4554e+03 2.9756e+03 7.7670e+02 6.5820e+02 8.5880e+02 5.8380e+02 6.4570e+02 + 6.5730e+02 7.7010e+02 2.0282e+03 5.6000e+03 5.0180e+03 3.7914e+03 1.1089e+03 + 6.0130e+02 2.9600e+02 3.1300e+02 2.5810e+02 4.9250e+02 2.3677e+03 2.0616e+03 + 2.6829e+03 7.8700e+02 5.9930e+02 5.3270e+02 5.4240e+02 2.2112e+03 1.4075e+03 + 2.3232e+03 2.3185e+03 4.8628e+03 3.8544e+03 2.8038e+03 2.5129e+03 2.2927e+03 + 2.4438e+03 1.7313e+03 9.9500e+02 5.2110e+02 6.3010e+02 5.1910e+02 5.2860e+02 + 4.0380e+02 4.9720e+02 6.6580e+02 3.3450e+02 6.2820e+02 6.8950e+02 4.6660e+02 + 1.3520e+02 3.9870e+02 3.6700e+02 3.4090e+02 8.9920e+02 3.0553e+03 3.4474e+03 + 4.3450e+02 7.7780e+02 6.9490e+02 1.7497e+03 2.5499e+03 4.0750e+03 9.9230e+02 + 7.2090e+02 7.2890e+02 5.1270e+02 5.8190e+02 4.4780e+02 8.3490e+02 1.5615e+03 + 4.7814e+03 5.6000e+03 2.8247e+03 7.1020e+02 6.4950e+02 5.9960e+02 2.3000e+02 + 4.4990e+02 3.4470e+02 1.9164e+03 2.1363e+03 1.8308e+03 1.5751e+03 1.2912e+03 + 8.0490e+02 2.4724e+03 2.0019e+03 1.8508e+03 1.8828e+03 1.8940e+03 3.9024e+03 + 5.1114e+03 9.7500e+02 1.0504e+03 4.4850e+02 6.7430e+02 8.3130e+02 4.5990e+02 + 4.7160e+02 4.9350e+02 4.4140e+02 9.3030e+02 5.1990e+02 4.6350e+02 6.1680e+02 + 4.4170e+02 3.4970e+02 8.1920e+02 2.3480e+02 3.7190e+02 2.3010e+02 3.8290e+02 + 5.4930e+02 1.0814e+03 3.0210e+03 2.1920e+03 6.5490e+02 6.6460e+02 6.9880e+02 + 1.1252e+03 2.0881e+03 3.5512e+03 7.7770e+02 5.4520e+02 6.4490e+02 4.9690e+02 + 8.4520e+02 6.3770e+02 9.7360e+02 4.9510e+02 2.2964e+03 5.6000e+03 2.5443e+03 + 8.6800e+02 5.8790e+02 3.2480e+02 2.5580e+02 5.5290e+02 5.8240e+02 1.2094e+03 + 3.4333e+03 2.1288e+03 9.4320e+02 6.5610e+02 1.2880e+03 2.1088e+03 3.4678e+03 + 1.9009e+03 1.0491e+03 1.4422e+03 3.1287e+03 2.7960e+03 1.3163e+03 6.4520e+02 + 8.7060e+02 1.0841e+03 6.8460e+02 6.5420e+02 4.1010e+02 5.8470e+02 3.1410e+02 + 5.0700e+02 5.3790e+02 8.2630e+02 5.4530e+02 4.7500e+02 2.1100e+02 1.1450e+02 + 1.8720e+02 3.7320e+02 4.9690e+02 4.1770e+02 5.0960e+02 6.7440e+02 1.2798e+03 + 3.3646e+03 7.6940e+02 4.1820e+02 8.2580e+02 1.1097e+03 2.1352e+03 2.3751e+03 + 2.1401e+03 7.4290e+02 5.3010e+02 5.6690e+02 5.4230e+02 5.7950e+02 8.2530e+02 + 3.4310e+02 1.4468e+03 5.6000e+03 3.8249e+03 1.3072e+03 4.5540e+02 3.3080e+02 + 4.0500e+02 8.3120e+02 1.2398e+03 1.9833e+03 4.2177e+03 1.4708e+03 9.6200e+02 + 5.6360e+02 1.6615e+03 2.6495e+03 2.3234e+03 1.8570e+03 3.5300e+02 8.5830e+02 + 2.8262e+03 3.7460e+03 1.4968e+03 6.4940e+02 4.9560e+02 8.8820e+02 7.5450e+02 + 6.4940e+02 8.7740e+02 6.2760e+02 3.2990e+02 5.5060e+02 8.0110e+02 7.7390e+02 + 8.1650e+02 3.6400e+02 4.5430e+02 3.3770e+02 2.9830e+02 2.6670e+02 3.7160e+02 + 4.6310e+02 9.2980e+02 7.1690e+02 9.9320e+02 2.0446e+03 3.9940e+02 4.6150e+02 + 8.5080e+02 1.2965e+03 2.2901e+03 1.9239e+03 2.3133e+03 4.8510e+02 7.4900e+02 + 4.9630e+02 3.6600e+02 5.9810e+02 4.4400e+02 4.5440e+02 2.8511e+03 4.7635e+03 + 4.6858e+03 2.1300e+03 3.1610e+02 2.9520e+02 3.5890e+02 7.3730e+02 8.8260e+02 + 2.1978e+03 3.3332e+03 1.9042e+03 3.6880e+02 6.3550e+02 3.3113e+03 5.3338e+03 + 1.2050e+03 1.0073e+03 4.1580e+02 1.7388e+03 1.9566e+03 4.2274e+03 2.3772e+03 + 9.1430e+02 3.3570e+02 4.9000e+02 6.8660e+02 6.1980e+02 6.0330e+02 5.4680e+02 + 4.6880e+02 5.4060e+02 6.4200e+02 7.9240e+02 5.5690e+02 4.2600e+02 3.4440e+02 + 9.9180e+02 2.7710e+02 5.9950e+02 6.7350e+02 2.4980e+02 4.8090e+02 3.3420e+02 + 8.7250e+02 7.1260e+02 5.3920e+02 3.7500e+02 6.5010e+02 1.0388e+03 1.7116e+03 + 2.4579e+03 2.2630e+03 8.9000e+02 5.1820e+02 3.3310e+02 4.9240e+02 4.2230e+02 + 3.2990e+02 5.2220e+02 2.1172e+03 5.6000e+03 4.7138e+03 1.8100e+03 8.8770e+02 + 2.3240e+02 6.4500e+02 9.0940e+02 5.0280e+02 3.3721e+03 3.1590e+03 2.3273e+03 + 2.2250e+02 4.7180e+02 2.3692e+03 3.1269e+03 9.9110e+02 4.4220e+02 7.7310e+02 + 7.6920e+02 2.2688e+03 4.1196e+03 3.5604e+03 1.1368e+03 3.8430e+02 4.6360e+02 + 8.4900e+02 6.0000e+02 5.3910e+02 8.2940e+02 6.1180e+02 5.3350e+02 4.6430e+02 + 9.2990e+02 5.6180e+02 3.6680e+02 3.0480e+02 1.2604e+03 8.0910e+02 7.3330e+02 + 3.7320e+02 5.2650e+02 4.8630e+02 3.8250e+02 4.0880e+02 3.3670e+02 6.8510e+02 + 4.3880e+02 4.4280e+02 4.0570e+02 5.4420e+02 3.5614e+03 2.4866e+03 1.0170e+03 + 5.7700e+02 6.9900e+02 7.0040e+02 3.0410e+02 4.5170e+02 7.4220e+02 2.4376e+03 + 4.5208e+03 3.9976e+03 3.3213e+03 6.3960e+02 2.9440e+02 4.5980e+02 4.8400e+02 + 4.7980e+02 2.0752e+03 2.7957e+03 1.9682e+03 3.8010e+02 5.0280e+02 4.4068e+03 + 3.7894e+03 8.1400e+02 8.8960e+02 9.4380e+02 8.4880e+02 1.8499e+03 3.5985e+03 + 3.9177e+03 1.5339e+03 1.8790e+02 3.9120e+02 3.7880e+02 4.9060e+02 6.3850e+02 + 3.5720e+02 8.5910e+02 4.7890e+02 1.9850e+02 5.6880e+02 5.0080e+02 1.8790e+02 + 3.6080e+02 8.5990e+02 9.4070e+02 8.4710e+02 4.6040e+02 5.0050e+02 4.4990e+02 + 7.5140e+02 4.6090e+02 5.0990e+02 4.7130e+02 8.5260e+02 4.6300e+02 3.0030e+02 + 5.9580e+02 2.2481e+03 3.9177e+03 7.5760e+02 2.8730e+02 5.2420e+02 7.2150e+02 + 3.2550e+02 1.0755e+03 3.1125e+03 2.5650e+03 4.2963e+03 4.5988e+03 3.0047e+03 + 1.6382e+03 3.5480e+02 1.7620e+02 3.6490e+02 7.9590e+02 2.1663e+03 4.1796e+03 + 2.2442e+03 6.2490e+02 6.1930e+02 1.8980e+03 3.1961e+03 1.0675e+03 1.0170e+03 + 6.1810e+02 6.8290e+02 6.0230e+02 2.3972e+03 4.4300e+03 1.0220e+03 2.9830e+02 + 3.3420e+02 4.8240e+02 4.4380e+02 5.3280e+02 5.3860e+02 7.7310e+02 4.6590e+02 + 2.4160e+02 8.1280e+02 7.0660e+02 4.9270e+02 3.8210e+02 7.9700e+02 8.8980e+02 + 5.2410e+02 7.1600e+02 3.9500e+02 3.8350e+02 3.2530e+02 3.7380e+02 5.0000e+02 + 4.8070e+02 5.8480e+02 3.3070e+02 4.4700e+02 8.4550e+02 2.6319e+03 4.4113e+03 + 8.7930e+02 5.7950e+02 6.6680e+02 4.6910e+02 3.9290e+02 8.3170e+02 2.0103e+03 + 2.8079e+03 2.5653e+03 2.7804e+03 2.6541e+03 1.6801e+03 7.1830e+02 2.7080e+02 + 2.5930e+02 6.5790e+02 1.2111e+03 3.6437e+03 1.8677e+03 4.9970e+02 7.4400e+02 + 2.3035e+03 4.0110e+03 2.9763e+03 9.3690e+02 3.5500e+02 6.5220e+02 9.9330e+02 + 3.3639e+03 3.2372e+03 7.9480e+02 5.0190e+02 3.5070e+02 6.2450e+02 5.9320e+02 + 3.9310e+02 3.8020e+02 4.7890e+02 5.4580e+02 3.8160e+02 8.9120e+02 5.6840e+02 + 4.9150e+02 7.0610e+02 8.0380e+02 2.5950e+02 2.3740e+02 5.0310e+02 2.3490e+02 + 2.5360e+02 3.3670e+02 3.2950e+02 9.8100e+02 3.4830e+02 4.8200e+02 7.4160e+02 + 1.9310e+02 4.8570e+02 1.9279e+03 2.4765e+03 1.5470e+03 6.1180e+02 4.1280e+02 + 2.4170e+02 4.9030e+02 1.4287e+03 4.3735e+03 3.6322e+03 2.0472e+03 1.5486e+03 + 2.9441e+03 1.4367e+03 2.6730e+02 3.7670e+02 2.2770e+02 4.7880e+02 1.7428e+03 + 3.4008e+03 1.7847e+03 7.1360e+02 6.7730e+02 1.6596e+03 4.9640e+03 2.6830e+03 + 1.0688e+03 6.2310e+02 6.5130e+02 7.2960e+02 2.4233e+03 3.0344e+03 1.9213e+03 + 5.3670e+02 7.2000e+02 6.5290e+02 7.4670e+02 3.3540e+02 4.3800e+02 6.0550e+02 + 6.3260e+02 5.0190e+02 5.0960e+02 6.1840e+02 9.6870e+02 1.0860e+03 9.5010e+02 + 3.4610e+02 1.4230e+02 2.9700e+02 5.2800e+02 2.9730e+02 2.9420e+02 5.3540e+02 + 4.9930e+02 2.6410e+02 4.1650e+02 4.0540e+02 2.5230e+02 7.1830e+02 2.3676e+03 + 2.1249e+03 3.1010e+02 4.0460e+02 1.6830e+02 1.7610e+02 6.2560e+02 2.3758e+03 + 4.5228e+03 2.1015e+03 1.1468e+03 1.6652e+03 2.4389e+03 3.8071e+03 1.2906e+03 + 8.6410e+02 2.3350e+02 4.8580e+02 1.0523e+03 4.3574e+03 2.1365e+03 6.4970e+02 + 5.6650e+02 1.3986e+03 3.1573e+03 2.1310e+03 9.0520e+02 1.0492e+03 5.8120e+02 + 4.1430e+02 1.8756e+03 3.5676e+03 2.1197e+03 4.4480e+02 6.2900e+02 9.8450e+02 + 7.0940e+02 4.3250e+02 1.8780e+02 3.5100e+02 7.5590e+02 2.6220e+02 7.8330e+02 + 4.7100e+02 7.1350e+02 1.1169e+03 6.8670e+02 3.1340e+02 2.2480e+02 4.5190e+02 + 7.3070e+02 3.2390e+02 1.6760e+02 4.3330e+02 3.8260e+02 4.3880e+02 3.8930e+02 + 3.9450e+02 5.9620e+02 1.9614e+03 2.7327e+03 3.3623e+03 1.0663e+03 3.9580e+02 + 2.6300e+02 3.2440e+02 8.0400e+02 3.8981e+03 3.3785e+03 1.6239e+03 5.3230e+02 + 8.0550e+02 3.0347e+03 2.7413e+03 2.0322e+03 6.2820e+02 3.6340e+02 7.5260e+02 + 1.3102e+03 4.7068e+03 2.4841e+03 3.5620e+02 3.4710e+02 1.4252e+03 3.3313e+03 + 3.7675e+03 2.0808e+03 1.8623e+03 4.7970e+02 5.0600e+02 1.2600e+03 2.7223e+03 + 2.8309e+03 1.3040e+03 4.2420e+02 6.6090e+02 8.1180e+02 1.9250e+02 4.2170e+02 + 2.7550e+02 4.0670e+02 5.2210e+02 5.8740e+02 5.2510e+02 4.1880e+02 4.5470e+02 + 2.4670e+02 4.2090e+02 4.2620e+02 5.3570e+02 4.8390e+02 7.2540e+02 6.5060e+02 + 5.2150e+02 4.8240e+02 2.8750e+02 4.9470e+02 4.0220e+02 6.8860e+02 1.4877e+03 + 2.8643e+03 2.1840e+03 4.2400e+02 5.5220e+02 3.1400e+02 3.1890e+02 2.3016e+03 + 3.5415e+03 3.2224e+03 1.2596e+03 2.7330e+02 5.7730e+02 2.0753e+03 2.7110e+03 + 2.3529e+03 5.4470e+02 1.8960e+02 5.4570e+02 2.1250e+03 2.8460e+03 2.0948e+03 + 6.3530e+02 5.1530e+02 9.5270e+02 1.9805e+03 1.9477e+03 2.2676e+03 2.5408e+03 + 1.5225e+03 7.6950e+02 2.1080e+03 1.9615e+03 3.4192e+03 3.0899e+03 5.3050e+02 + 5.5050e+02 4.8790e+02 2.7100e+02 3.9830e+02 4.1400e+02 2.0890e+02 7.4240e+02 + 9.0300e+02 6.7400e+02 4.8440e+02 3.1110e+02 2.2490e+02 2.9210e+02 4.8990e+02 + 9.8550e+02 7.3800e+02 3.2790e+02 8.2310e+02 4.8870e+02 5.4180e+02 4.7510e+02 + 4.4890e+02 4.2540e+02 8.6570e+02 2.5382e+03 4.0463e+03 1.0569e+03 4.8900e+02 + 8.0980e+02 3.1190e+02 5.0750e+02 3.4360e+03 3.2261e+03 9.7990e+02 2.9580e+02 + 4.5860e+02 4.9500e+02 1.6355e+03 2.3101e+03 3.8768e+03 9.1230e+02 2.8070e+02 + 6.1360e+02 1.4762e+03 2.3715e+03 3.0642e+03 1.0922e+03 4.9760e+02 6.2110e+02 + 1.0533e+03 1.7068e+03 2.2892e+03 2.9668e+03 2.1227e+03 2.1262e+03 2.3233e+03 + 2.0065e+03 2.6776e+03 3.7655e+03 1.8742e+03 5.8450e+02 4.0480e+02 4.3790e+02 + 3.3040e+02 3.4340e+02 2.9690e+02 5.4910e+02 6.6050e+02 7.6320e+02 5.6810e+02 + 3.6570e+02 1.7130e+02 3.1330e+02 4.4230e+02 7.9120e+02 2*6.2280e+02 + 7.5420e+02 8.2540e+02 4.6410e+02 3.6110e+02 7.6040e+02 8.8200e+02 1.3565e+03 + 2.4501e+03 3.4704e+03 8.2720e+02 6.3080e+02 7.5710e+02 3.8110e+02 2.3391e+03 + 4.1954e+03 2.0365e+03 4.8900e+02 3.1210e+02 3.6890e+02 3.8080e+02 3.7990e+02 + 2.0500e+03 2.7714e+03 7.3830e+02 4.1220e+02 4.4520e+02 1.1624e+03 2.0368e+03 + 3.2301e+03 1.4046e+03 1.4255e+03 2.7650e+02 9.0730e+02 1.0416e+03 1.9528e+03 + 2.2404e+03 2.3945e+03 2.3644e+03 2.2154e+03 2.1324e+03 2.4684e+03 2.8896e+03 + 1.9439e+03 5.6730e+02 4.1810e+02 3.7950e+02 2.9600e+02 4.3530e+02 2.2200e+02 + 5.3260e+02 5.6530e+02 5.3900e+02 1.6050e+02 1.3200e+02 3.9680e+02 4.1910e+02 + 3.0130e+02 4.7330e+02 1.1896e+03 4.6250e+02 4.5380e+02 5.6940e+02 4.7460e+02 + 4.3530e+02 6.4840e+02 1.5422e+03 1.1981e+03 3.2555e+03 1.9358e+03 7.2080e+02 + 4.4960e+02 4.8120e+02 4.8390e+02 2.3504e+03 4.3435e+03 2.2169e+03 2.4810e+02 + 4.6750e+02 4.8340e+02 4.0430e+02 6.7580e+02 1.9237e+03 4.5644e+03 3.0441e+03 + 5.9540e+02 3.3110e+02 1.0735e+03 1.9792e+03 3.1169e+03 2.7328e+03 4.0400e+02 + 9.6300e+01 4.1970e+02 7.6650e+02 6.6610e+02 6.7340e+02 8.3410e+02 2.8183e+03 + 3.3390e+03 2.1711e+03 4.3718e+03 5.6000e+03 3.4498e+03 8.0600e+02 3.6320e+02 + 2.1690e+02 4.7390e+02 8.7400e+02 2.0010e+02 3.3340e+02 6.3260e+02 5.5320e+02 + 2.5480e+02 7.2730e+02 4.8380e+02 8.0410e+02 4.5980e+02 3.4640e+02 4.7290e+02 + 5.7900e+02 2.4270e+02 6.3460e+02 5.8090e+02 4.5440e+02 8.1280e+02 1.5654e+03 + 3.4589e+03 2.2985e+03 1.8558e+03 5.4230e+02 3.6860e+02 4.3360e+02 1.7362e+03 + 3.8813e+03 2.2547e+03 1.9594e+03 6.0510e+02 2.2790e+02 3.9270e+02 3.4460e+02 + 2.8940e+02 1.2360e+03 4.5795e+03 3.5552e+03 5.8730e+02 4.8240e+02 6.4930e+02 + 1.1704e+03 2.0005e+03 3.4185e+03 2.0123e+03 4.8110e+02 5.7150e+02 6.8150e+02 + 5.6560e+02 6.6910e+02 5.2600e+02 1.2025e+03 1.9663e+03 3.2534e+03 5.0018e+03 + 4.9647e+03 4.4898e+03 1.6132e+03 2.7150e+02 5.3550e+02 6.3100e+02 4.9880e+02 + 3.6610e+02 4.0030e+02 5.5230e+02 5.0210e+02 3.1070e+02 3.8820e+02 4.7810e+02 + 8.2420e+02 5.1070e+02 1.4580e+02 4.6750e+02 4.2730e+02 4.9680e+02 5.0730e+02 + 1.7160e+03 7.8310e+02 5.2720e+02 2.5348e+03 2.7061e+03 2.2996e+03 7.8540e+02 + 5.0050e+02 3.3430e+02 3.5560e+02 2.2061e+03 2.4184e+03 1.7399e+03 9.6980e+02 + 4.5390e+02 7.0970e+02 3.8910e+02 4.0660e+02 3.0950e+02 9.6180e+02 2.2654e+03 + 4.2551e+03 1.0824e+03 4.2320e+02 5.6960e+02 5.9750e+02 1.6216e+03 4.9692e+03 + 3.5154e+03 2.9290e+02 6.5830e+02 5.0640e+02 7.3700e+02 2.5370e+02 2.5550e+02 + 2.9590e+02 7.0090e+02 1.6493e+03 3.2325e+03 3.0911e+03 5.6000e+03 3.4925e+03 + 5.2150e+02 5.1410e+02 6.1250e+02 5.3110e+02 3.8810e+02 3.2120e+02 3.6300e+02 + 6.7630e+02 4.3990e+02 5.1410e+02 5.6460e+02 1.0853e+03 5.4840e+02 3.3360e+02 + 6.8310e+02 8.1270e+02 3.7660e+02 4.4150e+02 7.5030e+02 6.3480e+02 5.5660e+02 + 2.1181e+03 3.4841e+03 1.8295e+03 1.0881e+03 4.9230e+02 3.0760e+02 5.5520e+02 + 3.7804e+03 3.9044e+03 1.3105e+03 3.0150e+02 7.9600e+02 1.3025e+03 4.5120e+02 + 3.1610e+02 3.2710e+02 5.4920e+02 1.2032e+03 4.2865e+03 2.3780e+03 4.1290e+02 + 2.6360e+02 8.7550e+02 1.1906e+03 4.2766e+03 3.0285e+03 2.6032e+03 1.5683e+03 + 7.2030e+02 4.4190e+02 4.3990e+02 5.7860e+02 6.7220e+02 2.6950e+02 5.8430e+02 + 1.5735e+03 2.8322e+03 3.7791e+03 4.2534e+03 2.1138e+03 6.3450e+02 1.0331e+03 + 4.7840e+02 2.4340e+02 1.9980e+02 3.8590e+02 4.4960e+02 6.8420e+02 5.7820e+02 + 3.4480e+02 5.3090e+02 5.2380e+02 3.9040e+02 4.5370e+02 8.8580e+02 4.4910e+02 + 4.3510e+02 1.2361e+03 4.3170e+02 7.1700e+02 3.9554e+03 2.8312e+03 1.5149e+03 + 8.6020e+02 6.4850e+02 3.6370e+02 7.4560e+02 1.9760e+03 4.2520e+03 5.8880e+02 + 1.8650e+02 4.3390e+02 8.6770e+02 1.1316e+03 2.3910e+02 2.3740e+02 9.3680e+02 + 7.6420e+02 3.4986e+03 2.8589e+03 9.2920e+02 3.1060e+02 3.1730e+02 6.1490e+02 + 2.2694e+03 3.6135e+03 3.4611e+03 1.8835e+03 8.8520e+02 5.4340e+02 2.8440e+02 + 8.1990e+02 7.2920e+02 4.9870e+02 6.9040e+02 8.0870e+02 1.7773e+03 5.5005e+03 + 5.6000e+03 2.8589e+03 9.0950e+02 8.4720e+02 9.5760e+02 4.2360e+02 1.8600e+02 + 3.9440e+02 5.6310e+02 3.9010e+02 6.0900e+02 6.2590e+02 8.6020e+02 3.8450e+02 + 7.2600e+02 7.9130e+02 7.3900e+02 3.4890e+02 3.6460e+02 7.9720e+02 4.1770e+02 + 1.8031e+03 3.6846e+03 1.9923e+03 1.2581e+03 6.0730e+02 7.2780e+02 3.2830e+02 + 4.4570e+02 3.9253e+03 3.7297e+03 2.1474e+03 1.9710e+02 4.1140e+02 1.0788e+03 + 5.1030e+02 3.8400e+02 4.2410e+02 4.5300e+02 1.1213e+03 2.3468e+03 3.9418e+03 + 4.6270e+02 6.1610e+02 6.9750e+02 3.9620e+02 1.8118e+03 2.1099e+03 2.8980e+03 + 2.1554e+03 1.3655e+03 2.2060e+02 2.1800e+02 5.3370e+02 7.0460e+02 5.1090e+02 + 3.9640e+02 4.9430e+02 1.9487e+03 4.4051e+03 3.5606e+03 5.1111e+03 2.0833e+03 + 1.5528e+03 7.8250e+02 2.5970e+02 1.1540e+02 3.9860e+02 6.4960e+02 5.8030e+02 + 8.5830e+02 7.5700e+02 4.3470e+02 4.3550e+02 4.9050e+02 4.3860e+02 5.9740e+02 + 4.8150e+02 6.6430e+02 1.9813e+03 1.3175e+03 3.1763e+03 2.8984e+03 1.9288e+03 + 4.3060e+02 5.2580e+02 6.6280e+02 6.1090e+02 1.9433e+03 3.3736e+03 2.3382e+03 + 1.6632e+03 6.2010e+02 3.8450e+02 5.4590e+02 4.6320e+02 2.2160e+02 9.6700e+02 + 4.2720e+02 5.3350e+02 2.4590e+03 3.2437e+03 1.9969e+03 3.5740e+02 2.7700e+02 + 7.2060e+02 3.6380e+02 1.8193e+03 2.5397e+03 2.3221e+03 2.3294e+03 3.6480e+02 + 2.5010e+02 8.0920e+02 7.3640e+02 5.5870e+02 4.5550e+02 6.3630e+02 9.2160e+02 + 2.9996e+03 3.1769e+03 2.9633e+03 3.5838e+03 5.4050e+02 6.6040e+02 6.0350e+02 + 3.1840e+02 7.0420e+02 7.5910e+02 5.3900e+02 6.2870e+02 7.1410e+02 3.3060e+02 + 7.5720e+02 3.9310e+02 4.1540e+02 5.3700e+02 4.0470e+02 7.8950e+02 2.3486e+03 + 2.1627e+03 2.3668e+03 3.0077e+03 1.3046e+03 2.2650e+02 5.5920e+02 3.9030e+02 + 4.1270e+02 2.1715e+03 2.9724e+03 3.7373e+03 9.9520e+02 9.8020e+02 2.5050e+02 + 3.8890e+02 4.6250e+02 5.4690e+02 5.0560e+02 4.6560e+02 2.8790e+02 1.1175e+03 + 3.1184e+03 3.2623e+03 1.2094e+03 5.6130e+02 4.4000e+02 5.1280e+02 1.1517e+03 + 1.5032e+03 2.1546e+03 3.6262e+03 1.3193e+03 4.7160e+02 5.5060e+02 9.0440e+02 + 6.0700e+02 4.0190e+02 4.3110e+02 2.3934e+03 1.9804e+03 4.0111e+03 2.1718e+03 + 3.7994e+03 1.3550e+03 7.2480e+02 6.7020e+02 8.1400e+02 4.8570e+02 5.6650e+02 + 3.7690e+02 6.8460e+02 4.4200e+02 4.0160e+02 3.9140e+02 9.4840e+02 5.1980e+02 + 5.1230e+02 4.5640e+02 1.7850e+03 1.9976e+03 1.4783e+03 3.0417e+03 3.2362e+03 + 4.2620e+02 3.9790e+02 4.1100e+02 7.8050e+02 3.4900e+02 2.9956e+03 4.5571e+03 + 3.6399e+03 1.0115e+03 8.5830e+02 5.6460e+02 7.2280e+02 6.3950e+02 3.9170e+02 + 5.3220e+02 2.2690e+02 4.2080e+02 7.2510e+02 2.8804e+03 3.3528e+03 2.1846e+03 + 7.9670e+02 5.5750e+02 9.6160e+02 7.0390e+02 1.4164e+03 2.2040e+03 3.1678e+03 + 2.1411e+03 8.6460e+02 7.9140e+02 9.1430e+02 4.0630e+02 3.1630e+02 3.7760e+02 + 1.9771e+03 3.0541e+03 2.8299e+03 3.8319e+03 3.8811e+03 2.4640e+03 6.5560e+02 + 7.7390e+02 6.0530e+02 5.4070e+02 4.1490e+02 3.2360e+02 6.1980e+02 4.5770e+02 + 2.4720e+02 5.1780e+02 8.6260e+02 5.1900e+02 4.5090e+02 7.5810e+02 2.0064e+03 + 3.9598e+03 3.6760e+03 3.2836e+03 2.3680e+03 3.2710e+02 2.9020e+02 7.0440e+02 + 5.1590e+02 6.3860e+02 2.4970e+03 2.5606e+03 2.5132e+03 1.9615e+03 5.7940e+02 + 2.9870e+02 7.1510e+02 8.3060e+02 4.3120e+02 2.6200e+02 1.4670e+02 4.3500e+02 + 6.8200e+02 2.0224e+03 3.3940e+03 2.2074e+03 9.6060e+02 5.4370e+02 3.3250e+02 + 5.9240e+02 9.9410e+02 1.9259e+03 3.4716e+03 2.5573e+03 2.0771e+03 1.4149e+03 + 8.1800e+02 3.2470e+02 1.4930e+02 4.0540e+02 9.6260e+02 2.6230e+03 2.1343e+03 + 3.1540e+03 3.0660e+03 2.4364e+03 6.5360e+02 7.2820e+02 6.0790e+02 4.8710e+02 + 7.7610e+02 7.4090e+02 6.6480e+02 5.0230e+02 2.7940e+02 3.8860e+02 4.3900e+02 + 8.9290e+02 6.8530e+02 4.7470e+02 2.2257e+03 2.6533e+03 4.0805e+03 3.4894e+03 + 2.2973e+03 2.1050e+02 3.5650e+02 3.0040e+02 7.8750e+02 7.1280e+02 1.8827e+03 + 3.6545e+03 1.9488e+03 1.2593e+03 5.7810e+02 4.9900e+02 6.6450e+02 4.7300e+02 + 2.5690e+02 3.9760e+02 3.4010e+02 4.4280e+02 8.3170e+02 2.8694e+03 3.7438e+03 + 1.3820e+03 5.7520e+02 5.3960e+02 5.1340e+02 4.2710e+02 5.4520e+02 9.0400e+02 + 2.3267e+03 2.5806e+03 2.6000e+03 2.1194e+03 7.9320e+02 1.4300e+02 8.7800e+01 + 3.7960e+02 2.6947e+03 2.9674e+03 2.1212e+03 2.7144e+03 3.1362e+03 2.6436e+03 + 1.0010e+03 7.6800e+02 7.8300e+02 5.9000e+02 7.1250e+02 3.9080e+02 1.9630e+02 + 2.8900e+02 1.0252e+03 5.9680e+02 1.4760e+02 2.9330e+02 6.1200e+02 1.1194e+03 + 1.9947e+03 3.8011e+03 4.0867e+03 4.5271e+03 9.0200e+02 3.5500e+02 5.2520e+02 + 3.8050e+02 7.3200e+02 6.9570e+02 5.5510e+02 3.5825e+03 2.4010e+03 1.0765e+03 + 3.7630e+02 8.3520e+02 1.4303e+03 4.4780e+02 2.4880e+02 4.0360e+02 1.4180e+02 + 3.9070e+02 8.2230e+02 2.1065e+03 3.6924e+03 1.9133e+03 8.9140e+02 3.7400e+02 + 1.2000e+02 4.5180e+02 1.2275e+03 6.7490e+02 5.8610e+02 1.3223e+03 3.1849e+03 + 2.4321e+03 1.3223e+03 2.2780e+02 2.4150e+02 7.2130e+02 2.4519e+03 2.9069e+03 + 1.2458e+03 3.1089e+03 3.2872e+03 1.9614e+03 6.2160e+02 4.0490e+02 4.9980e+02 + 3.5120e+02 5.1190e+02 4.3490e+02 2.8160e+02 5.4580e+02 6.2760e+02 3.6490e+02 + 1.8770e+02 4.0740e+02 7.4920e+02 9.5460e+02 1.8349e+03 3.2201e+03 3.3986e+03 + 3.3585e+03 9.7490e+02 5.2240e+02 4.5440e+02 2.5380e+02 4.5030e+02 8.0400e+02 + 8.6410e+02 2.9325e+03 1.9670e+03 4.4210e+02 4.5010e+02 7.2140e+02 1.2236e+03 + 4.6780e+02 1.5730e+02 3.0300e+02 2.0820e+02 3.9580e+02 6.6400e+02 1.9896e+03 + 2.3962e+03 1.5879e+03 7.8900e+02 5.4380e+02 2.1000e+02 3.8070e+02 6.6910e+02 + 5.2400e+02 5.5740e+02 5.8220e+02 2.7898e+03 3.3369e+03 2.3913e+03 4.8850e+02 + 4.0760e+02 1.4880e+03 3.1517e+03 2.9418e+03 1.8366e+03 2.0372e+03 4.3076e+03 + 2.1828e+03 6.1260e+02 3.4590e+02 2.1320e+02 7.1080e+02 3.2790e+02 2.0560e+02 + 1.0950e+02 3.7460e+02 4.0500e+02 6.7210e+02 4.1770e+02 2.7560e+02 5.5510e+02 + 8.6760e+02 1.9867e+03 3.3781e+03 2.1644e+03 3.7055e+03 1.1694e+03 9.4760e+02 + 7.1460e+02 3.3540e+02 1.9420e+02 4.3700e+02 5.5610e+02 2.3507e+03 2.0526e+03 + 2.5440e+02 4.4540e+02 8.0960e+02 1.3596e+03 2.3950e+02 1.8290e+02 7.4590e+02 + 7.5290e+02 3.3540e+02 1.2357e+03 1.7681e+03 4.0256e+03 2.2715e+03 5.6230e+02 + 5.7100e+02 6.0930e+02 5.9820e+02 8.6530e+02 7.1350e+02 2.6050e+02 4.7220e+02 + 2.0032e+03 4.8870e+03 2.9050e+03 3.5470e+02 1.2724e+03 1.0985e+03 4.7171e+03 + 2.3184e+03 1.8069e+03 2.3497e+03 3.4227e+03 1.9903e+03 8.4090e+02 6.7410e+02 + 2.7100e+02 4.1190e+02 4.2560e+02 3.0440e+02 5.2320e+02 5.6030e+02 6.0560e+02 + 5.0150e+02 4.7540e+02 3.3320e+02 4.2740e+02 1.1655e+03 2.3522e+03 2.5905e+03 + 3.5975e+03 3.2759e+03 1.3630e+03 5.4710e+02 6.0020e+02 3.3850e+02 2.0540e+02 + 2.9630e+02 5.1730e+02 1.4181e+03 2.8197e+03 4.1750e+02 6.5550e+02 6.6340e+02 + 8.1310e+02 4.6400e+02 2.7690e+02 9.1810e+02 6.1930e+02 6.9120e+02 5.1140e+02 + 2.1893e+03 3.5037e+03 2.0037e+03 7.3460e+02 7.2030e+02 4.9240e+02 6.5860e+02 + 7.5150e+02 4.4860e+02 2.3980e+02 3.5760e+02 9.1320e+02 4.6931e+03 3.6534e+03 + 1.1594e+03 9.1620e+02 2.1555e+03 3.4661e+03 2.0180e+03 1.0868e+03 4.1398e+03 + 2.4035e+03 5.8890e+02 9.0940e+02 7.0700e+02 3.9740e+02 6.6160e+02 4.9350e+02 + 4.6220e+02 5.5770e+02 5.1290e+02 8.1460e+02 6.7180e+02 4.0140e+02 5.2520e+02 + 4.2710e+02 5.4670e+02 3.5019e+03 2.3409e+03 2.5429e+03 5.2804e+03 7.0140e+02 + 8.7060e+02 7.3460e+02 5.1570e+02 4.0000e+02 3.7030e+02 1.9170e+02 1.5210e+03 + 2.9915e+03 1.8277e+03 4.6170e+02 5.2440e+02 4.8310e+02 2.8300e+02 3.8920e+02 + 7.9170e+02 5.9740e+02 6.4250e+02 9.9390e+02 1.3057e+03 2.3611e+03 1.8547e+03 + 6.2720e+02 5.7030e+02 8.5500e+02 6.4150e+02 5.7510e+02 6.4390e+02 3.5290e+02 + 1.2170e+02 9.7440e+02 2.5695e+03 2.8110e+03 2.8182e+03 1.8239e+03 3.2673e+03 + 2.4037e+03 2.0856e+03 1.2174e+03 4.2388e+03 3.3650e+03 1.2265e+03 7.7270e+02 + 8.3550e+02 5.4220e+02 2.4660e+02 5.3560e+02 6.2990e+02 6.2940e+02 6.5130e+02 + 6.2990e+02 5.7240e+02 3.4810e+02 4.0800e+02 7.0220e+02 9.8510e+02 3.0932e+03 + 2.0061e+03 2.6204e+03 4.8131e+03 7.6500e+02 4.3650e+02 3.1310e+02 7.9600e+02 + 7.1060e+02 3.3320e+02 1.7270e+02 8.3000e+02 4.0421e+03 2.3757e+03 3.5200e+02 + 4.4440e+02 6.8530e+02 2.8880e+02 6.0190e+02 6.4710e+02 6.5420e+02 3.6950e+02 + 1.1918e+03 2.0717e+03 3.9806e+03 1.6791e+03 4.5050e+02 8.1840e+02 4.3650e+02 + 5.3470e+02 5.3250e+02 5.5070e+02 3.6120e+02 4.2710e+02 4.1080e+02 2.2132e+03 + 3.5934e+03 2.5373e+03 2.3007e+03 3.0895e+03 1.9796e+03 7.8800e+02 1.3011e+03 + 2.1106e+03 2.6597e+03 5.3520e+02 6.7720e+02 1.0937e+03 4.2940e+02 3.1220e+02 + 6.2820e+02 5.4600e+02 2.7510e+02 4.5260e+02 5.8010e+02 9.0310e+02 6.7880e+02 + 6.3390e+02 5.6970e+02 1.2141e+03 3.4352e+03 2.0537e+03 2.2364e+03 3.2374e+03 + 2.3763e+03 3.6380e+02 2.7210e+02 7.2770e+02 1.0902e+03 9.3060e+02 3.4430e+02 + 1.0901e+03 4.2133e+03 3.5896e+03 2.9940e+02 6.4520e+02 3.8060e+02 2.8440e+02 + 5.5740e+02 4.4610e+02 7.9530e+02 4.6970e+02 5.1130e+02 3.3773e+03 4.0449e+03 + 6.9260e+02 5.9330e+02 5.2310e+02 6.1370e+02 3.3610e+02 4.9010e+02 4.2410e+02 + 5.1710e+02 7.6130e+02 6.1490e+02 4.6010e+02 2.0301e+03 4.0187e+03 2.3764e+03 + 2.9552e+03 1.6618e+03 9.3660e+02 1.4852e+03 3.7620e+03 4.1385e+03 3.1200e+02 + 3.7960e+02 5.2350e+02 4.7900e+02 3.5260e+02 4.8300e+02 3.5990e+02 2.8420e+02 + 7.6980e+02 4.9570e+02 4.1100e+02 9.0000e+02 6.1190e+02 4.7090e+02 1.8446e+03 + 2.7445e+03 2.3072e+03 2.1930e+03 4.1019e+03 1.1356e+03 4.9670e+02 2.4960e+02 + 3.6670e+02 8.9100e+02 9.3700e+02 5.5820e+02 6.6540e+02 2.4783e+03 2.3414e+03 + 1.6043e+03 4.6010e+02 5.9550e+02 1.7720e+02 3.1830e+02 8.0100e+02 3.0620e+02 + 3.7520e+02 2.0382e+03 4.5441e+03 2.8487e+03 1.6740e+03 8.7320e+02 9.2110e+02 + 7.8050e+02 6.6010e+02 2.9620e+02 6.6960e+02 6.0590e+02 8.5960e+02 5.8790e+02 + 9.7130e+02 2.8472e+03 5.2859e+03 3.5709e+03 3.0956e+03 1.2104e+03 3.8040e+02 + 1.0341e+03 4.0596e+03 2.2567e+03 6.2120e+02 3.6360e+02 5.2420e+02 4.3620e+02 + 5.2200e+02 4.6310e+02 2.4810e+02 4.5780e+02 4.9140e+02 6.2360e+02 6.6860e+02 + 7.6290e+02 1.0228e+03 5.7940e+02 1.4764e+03 4.2550e+03 2.3942e+03 3.1012e+03 + 4.2957e+03 2.0986e+03 5.7620e+02 1.8610e+02 3.3990e+02 4.3230e+02 8.0900e+02 + 9.1060e+02 1.0591e+03 1.5122e+03 3.2198e+03 4.4540e+03 1.4939e+03 4.6470e+02 + 4.6520e+02 5.5230e+02 3.6760e+02 3.8960e+02 7.9320e+02 2.3958e+03 3.0599e+03 + 3.0490e+03 8.8790e+02 6.4590e+02 4.8740e+02 5.6400e+02 4.2380e+02 5.4270e+02 + 4.2810e+02 7.9900e+02 6.1020e+02 6.7970e+02 3.6260e+02 3.7612e+03 4.7357e+03 + 5.6000e+03 1.8620e+03 5.8490e+02 6.2220e+02 1.5785e+03 4.0155e+03 2.2663e+03 + 9.0770e+02 8.5900e+02 5.3880e+02 4.4990e+02 5.1480e+02 4.4810e+02 2.7620e+02 + 3.1290e+02 7.0810e+02 7.2910e+02 3.1970e+02 5.0460e+02 5.6610e+02 5.1140e+02 + 9.2980e+02 3.2303e+03 4.3771e+03 1.3663e+03 4.4259e+03 2.0192e+03 3.7810e+02 + 2.3340e+02 3.1210e+02 3.2770e+02 7.5940e+02 5.2330e+02 4.6110e+02 1.0761e+03 + 1.9409e+03 5.3394e+03 1.8112e+03 3.7380e+02 6.1450e+02 7.5610e+02 5.4750e+02 + 4.6790e+02 6.7730e+02 1.8047e+03 5.2266e+03 3.4437e+03 7.2310e+02 5.6850e+02 + 5.0280e+02 4.3250e+02 6.7840e+02 4.7990e+02 3.1870e+02 9.1390e+02 1.0209e+03 + 3.8550e+02 5.7540e+02 1.8844e+03 5.6000e+03 4.3878e+03 8.1930e+02 7.2810e+02 + 6.3360e+02 1.1608e+03 2.7384e+03 2.7087e+03 1.3050e+03 8.4890e+02 4.1770e+02 + 3.1180e+02 5.4780e+02 2.2310e+02 2.5820e+02 2.6280e+02 4.3930e+02 6.8760e+02 + 7.8120e+02 3.1400e+02 3.2340e+02 4.7500e+02 8.0140e+02 1.9902e+03 3.0879e+03 + 2.5710e+03 4.2430e+03 3.2822e+03 6.8790e+02 2.3290e+02 2.0500e+02 6.4650e+02 + 6.7720e+02 7.0670e+02 5.4580e+02 5.0490e+02 1.3326e+03 4.1887e+03 3.4245e+03 + 7.6420e+02 5.5350e+02 7.4910e+02 4.1450e+02 3.2120e+02 6.1670e+02 3.1650e+03 + 3.6070e+03 2.2573e+03 6.3520e+02 6.0750e+02 4.4080e+02 5.4570e+02 5.0620e+02 + 4.6810e+02 3.2720e+02 3.3880e+02 6.3010e+02 5.9060e+02 6.0200e+02 3.5389e+03 + 5.2038e+03 5.6000e+03 6.6540e+02 5.7200e+02 5.4350e+02 1.2424e+03 2.8653e+03 + 4.1208e+03 2.1707e+03 6.6400e+02 5.3590e+02 2.3460e+02 3.9650e+02 6.8410e+02 + 4.5970e+02 6.9800e+02 5.1170e+02 5.7280e+02 5.5220e+02 7.5650e+02 4.9190e+02 + 5.5480e+02 3.4910e+02 9.1510e+02 2.4798e+03 1.2282e+03 4.5396e+03 2.1956e+03 + 8.9730e+02 3.5630e+02 4.8430e+02 4.2050e+02 5.5220e+02 5.2000e+02 3.4870e+02 + 3.4820e+02 1.2972e+03 2.2024e+03 3.0006e+03 6.8050e+02 4.9840e+02 2.7430e+02 + 3.7800e+02 4.6760e+02 1.1170e+03 4.1298e+03 3.6165e+03 2.2620e+03 9.6800e+02 + 4.3470e+02 3.7840e+02 3.5130e+02 3.8760e+02 2.0160e+02 1.8230e+02 4.5730e+02 + 5.9980e+02 3.5350e+02 6.0180e+02 4.0681e+03 4.8180e+03 5.0492e+03 6.4060e+02 + 5.3130e+02 3.9980e+02 7.0630e+02 1.9716e+03 3.3890e+03 2.0328e+03 8.8100e+02 + 5.0600e+02 1.5850e+02 3.5550e+02 7.1370e+02 9.3820e+02 3.7070e+02 6.8430e+02 + 4.8030e+02 4.4380e+02 5.0580e+02 5.7070e+02 3.4330e+02 4.7800e+02 1.7033e+03 + 3.2806e+03 1.7969e+03 3.0531e+03 4.0684e+03 1.2345e+03 4.7760e+02 5.8770e+02 + 5.5830e+02 6.5690e+02 6.5400e+02 5.1710e+02 3.2440e+02 6.0230e+02 1.5605e+03 + 3.4088e+03 2.1318e+03 2.1410e+02 2.7170e+02 3.6420e+02 5.4560e+02 1.9333e+03 + 4.6458e+03 2.3263e+03 1.5351e+03 1.0188e+03 3.7820e+02 6.0520e+02 3.0050e+02 + 3.1470e+02 4.1410e+02 4.4900e+02 3.9110e+02 3.7320e+02 6.4060e+02 2.3492e+03 + 4.4852e+03 4.9028e+03 2.3561e+03 8.8110e+02 7.0210e+02 5.4450e+02 2.1000e+02 + 1.7688e+03 4.5258e+03 2.5781e+03 1.0102e+03 5.9130e+02 1.5910e+02 3.9660e+02 + 7.2280e+02 7.2390e+02 3.8550e+02 4.5540e+02 5.4890e+02 1.0452e+03 8.8280e+02 + 3.9060e+02 6.2250e+02 6.2730e+02 5.1970e+02 3.2333e+03 6.3560e+02 2.8727e+03 + 3.1948e+03 5.0020e+02 5.6910e+02 5.2960e+02 6.1000e+02 6.0800e+02 6.6710e+02 + 4.7040e+02 4.7200e+02 9.5200e+02 1.4065e+03 2.3591e+03 3.8489e+03 1.0224e+03 + 4.5280e+02 6.1800e+02 4.6900e+02 3.2988e+03 3.1506e+03 2.0540e+03 9.7530e+02 + 6.2480e+02 6.9120e+02 5.0700e+02 4.5400e+02 4.4280e+02 4.0590e+02 4.6970e+02 + 3.9760e+02 2.2820e+02 4.0370e+02 3.6279e+03 5.0868e+03 4.0088e+03 2.3838e+03 + 5.3120e+02 4.9260e+02 4.5450e+02 2.8510e+02 1.6497e+03 2.9242e+03 2.0921e+03 + 1.1605e+03 4.8790e+02 5.4120e+02 7.4430e+02 1.0457e+03 8.3550e+02 4.0420e+02 + 3.4000e+02 5.2370e+02 6.1000e+02 7.9090e+02 2.8300e+02 6.1200e+02 5.5320e+02 + 6.7270e+02 2.7051e+03 4.2540e+02 3.8584e+03 3.0718e+03 9.8350e+02 7.9470e+02 + 3.9900e+02 5.0200e+02 5.5800e+02 1.1225e+03 8.0670e+02 4.6290e+02 1.0723e+03 + 4.5790e+02 1.9499e+03 3.0330e+03 2.3533e+03 7.2140e+02 7.4260e+02 1.8682e+03 + 2.6336e+03 2.3238e+03 4.3840e+02 4.0640e+02 6.0300e+02 2.7410e+02 3.0410e+02 + 4.4960e+02 7.4050e+02 5.3390e+02 4.6170e+02 5.4050e+02 4.8790e+02 1.3869e+03 + 2.0316e+03 5.6000e+03 4.4058e+03 1.5351e+03 4.7440e+02 2.3770e+02 4.2090e+02 + 4.6580e+02 6.9970e+02 2.9032e+03 2.6174e+03 2.0190e+03 2.0527e+03 6.8700e+02 + 7.8790e+02 8.5910e+02 8.2340e+02 6.2030e+02 2.8460e+02 4.4680e+02 4.6240e+02 + 9.9010e+02 2.8430e+02 1.6060e+02 4.9410e+02 5.7070e+02 3.1992e+03 1.3468e+03 + 2.9091e+03 5.4202e+03 1.9943e+03 7.8510e+02 4.5560e+02 3.6410e+02 5.3030e+02 + 1.1074e+03 3.7460e+02 4.1650e+02 4.8320e+02 3.8310e+02 1.0619e+03 4.9148e+03 + 2.1224e+03 1.9160e+03 1.5442e+03 2.3269e+03 3.0232e+03 8.5300e+02 5.5100e+02 + 2.4010e+02 4.7590e+02 3.0430e+02 5.0340e+02 3.2270e+02 4.5220e+02 2.9100e+02 + 3.8980e+02 3.9530e+02 6.0220e+02 7.9160e+02 2.5728e+03 3.7833e+03 4.2581e+03 + 2.3858e+03 5.4430e+02 3.3120e+02 4.2800e+02 3.7230e+02 4.3550e+02 2.0013e+03 + 2.0152e+03 2.2508e+03 2.2075e+03 2.2528e+03 1.1901e+03 5.5590e+02 8.1020e+02 + 4.7180e+02 4.2440e+02 3.5550e+02 7.2460e+02 8.9340e+02 4.2160e+02 4.6400e+01 + 2.4170e+02 1.0961e+03 2.8539e+03 8.5090e+02 2.1175e+03 4.7960e+03 2.1648e+03 + 8.6820e+02 9.2980e+02 4.4000e+02 3.0820e+02 8.1380e+02 6.3330e+02 4.0000e+02 + 3.7210e+02 3.6170e+02 9.7030e+02 2.0913e+03 2.8576e+03 2.1124e+03 4.1008e+03 + 2.5029e+03 2.9503e+03 7.0450e+02 4.0970e+02 4.7150e+02 4.5820e+02 3.1860e+02 + 4.6520e+02 3.2930e+02 4.3770e+02 2.6720e+02 1.8820e+02 5.0000e+02 1.2500e+03 + 2.2931e+03 3.3779e+03 3.3549e+03 4.8876e+03 8.6230e+02 3.6270e+02 2.0300e+02 + 5.6120e+02 7.7470e+02 6.7220e+02 1.0113e+03 1.9346e+03 1.9818e+03 1.9349e+03 + 3.8128e+03 2.9088e+03 1.0097e+03 1.6395e+03 1.1071e+03 3.1580e+02 8.2940e+02 + 7.4380e+02 1.2034e+03 4.0310e+02 1.6650e+02 4.0210e+02 9.9330e+02 3.1935e+03 + 1.0214e+03 1.6331e+03 3.6504e+03 3.7847e+03 1.3190e+03 1.6220e+03 2.5890e+02 + 4.6470e+02 4.0710e+02 6.6760e+02 2.2230e+02 3.0770e+02 6.2840e+02 7.6790e+02 + 1.8250e+03 2.8713e+03 5.4209e+03 3.9946e+03 2.2935e+03 2.1439e+03 8.1620e+02 + 1.3070e+02 5.7920e+02 2.5970e+02 3.2360e+02 3.4480e+02 4.0610e+02 6.7980e+02 + 4.0700e+01 6.9100e+01 5.0990e+02 9.4470e+02 2.3210e+03 4.3858e+03 4.9737e+03 + 3.3088e+03 5.5030e+02 5.0820e+02 7.8400e+02 4.5330e+02 8.5960e+02 4.3810e+02 + 6.2670e+02 6.9580e+02 9.5850e+02 2.2873e+03 3.3074e+03 2.1144e+03 1.6783e+03 + 2.4095e+03 2.3063e+03 1.7113e+03 1.2780e+03 6.9910e+02 1.0769e+03 7.9000e+02 + 3.6180e+02 4.0390e+02 2.2744e+03 2.7673e+03 4.5090e+02 7.9910e+02 2.3684e+03 + 3.1222e+03 2.4000e+03 9.9970e+02 6.1880e+02 3.9900e+02 6.8110e+02 4.2790e+02 + 7.1550e+02 3.5510e+02 3.9810e+02 8.4310e+02 6.1310e+02 3.5517e+03 5.6000e+03 + 4.1582e+03 2.5666e+03 6.3330e+02 2.4900e+02 2.8770e+02 4.6840e+02 8.0220e+02 + 3.1680e+02 5.2630e+02 5.7970e+02 4.6010e+02 2.0270e+02 2.1510e+02 3.8810e+02 + 8.2810e+02 2.2955e+03 2.9571e+03 4.3450e+03 3.1065e+03 8.5730e+02 4.5100e+02 + 8.8740e+02 6.9690e+02 4.7550e+02 6.2060e+02 1.0468e+03 6.0320e+02 3.1750e+02 + 8.1560e+02 1.9299e+03 2.2759e+03 1.8139e+03 1.4124e+03 1.9762e+03 2.1896e+03 + 2.0957e+03 1.6366e+03 7.5670e+02 7.6300e+02 5.0540e+02 1.0022e+03 2.6772e+03 + 2.7627e+03 5.0690e+02 8.1070e+02 1.2346e+03 2.2535e+03 3.7376e+03 1.6801e+03 + 4.3220e+02 5.1670e+02 7.9000e+02 3.1930e+02 8.5200e+02 3.1260e+02 4.4420e+02 + 3.0480e+02 9.7190e+02 3.4186e+03 5.6000e+03 2.1830e+03 2.1044e+03 8.1940e+02 + 4.1390e+02 4.7000e+02 6.1670e+02 4.2690e+02 4.2380e+02 7.1850e+02 4.9170e+02 + 3.9630e+02 4.6360e+02 4.1180e+02 4.0760e+02 1.2098e+03 4.2959e+03 3.8156e+03 + 5.6000e+03 3.3403e+03 5.9490e+02 5.8630e+02 1.0904e+03 5.1080e+02 4.7870e+02 + 3.3540e+02 1.0053e+03 5.3700e+02 2.3060e+02 6.4060e+02 1.3983e+03 8.7910e+02 + 8.4790e+02 1.9537e+03 2.3660e+03 3.1913e+03 2.3259e+03 1.9083e+03 2.2449e+03 + 1.3962e+03 4.5470e+02 1.0405e+03 3.1049e+03 2.6585e+03 6.2170e+02 6.2980e+02 + 1.1870e+03 2.2809e+03 2.6034e+03 2.6042e+03 7.4160e+02 4.7300e+02 3.5380e+02 + 5.7940e+02 6.4320e+02 3.8480e+02 1.6680e+02 1.7753e+03 1.6016e+03 3.5244e+03 + 5.6000e+03 2.7601e+03 9.2040e+02 3.6080e+02 3.1300e+02 5.0320e+02 5.6830e+02 + 1.2692e+03 8.2470e+02 8.6590e+02 4.2940e+02 1.2870e+02 8.3000e+02 9.7960e+02 + 5.4280e+02 1.5086e+03 3.8412e+03 2.8966e+03 3.3465e+03 2.9893e+03 8.2940e+02 + 2.4040e+02 7.1270e+02 4.4760e+02 4.2670e+02 3.0930e+02 3.7010e+02 6.5840e+02 + 4.6150e+02 4.3020e+02 1.0050e+03 1.2789e+03 1.2255e+03 4.4990e+02 1.8600e+03 + 2.0403e+03 3.0626e+03 3.1547e+03 2.2942e+03 2.2309e+03 2.0240e+03 1.6184e+03 + 2.1477e+03 2.4090e+03 8.6080e+02 6.7500e+02 8.2840e+02 1.7158e+03 3.2514e+03 + 2.4907e+03 1.8760e+03 2.4400e+02 1.6990e+02 4.1490e+02 3.9750e+02 4.9990e+02 + 7.1590e+02 2.2272e+03 2.2859e+03 2.5558e+03 3.4654e+03 2.7675e+03 8.5050e+02 + 5.3930e+02 2.4530e+02 7.0020e+02 1.0755e+03 7.1750e+02 9.0160e+02 8.1060e+02 + 5.5030e+02 3.4660e+02 2.0650e+02 5.0240e+02 2.0943e+03 2.3299e+03 3.0889e+03 + 2.3934e+03 2.5986e+03 1.4023e+03 7.1000e+02 2.8920e+02 2.5780e+02 2.6650e+02 + 2.3400e+02 2.2010e+02 1.7040e+02 4.0930e+02 4.5460e+02 4.4960e+02 4.7980e+02 + 9.7980e+02 7.2560e+02 4.8710e+02 9.9380e+02 1.5808e+03 1.2602e+03 2.1935e+03 + 2.8121e+03 2.2041e+03 3.6177e+03 2.0679e+03 3.6610e+03 2.8276e+03 7.6380e+02 + 1.6172e+03 3.4957e+03 3.6124e+03 2.7630e+03 3.7590e+02 1.9310e+02 7.6150e+02 + 1.2516e+03 4.7018e+03 4.1213e+03 1.3695e+03 3.8720e+02 4.9480e+02 6.7340e+02 + 1.5016e+03 3.8407e+03 6.5420e+02 3.8220e+02 2.2510e+02 2.4520e+02 5.5460e+02 + 3.7591e+03 3.3267e+03 1.6368e+03 8.4940e+02 5.6740e+02 5.6450e+02 2.2930e+02 + 5.4250e+02 3.5980e+02 5.6280e+02 3.3950e+02 8.6240e+02 9.7360e+02 2.5290e+03 + 2.7126e+03 2.5887e+03 5.7930e+02 7.5500e+02 2.8890e+02 3.3490e+02 4.7480e+02 + 4.0632e+03 3.9715e+03 2.4990e+03 2.1760e+02 6.1580e+02 5.6000e+02 3.4540e+02 + 5.7300e+02 5.4450e+02 9.5950e+02 4.8910e+02 7.5100e+02 3.7255e+03 5.0169e+03 + 3.0353e+03 8.1270e+02 5.3050e+02 1.0514e+03 1.0469e+03 2.5272e+03 4.0003e+03 + 2.9979e+03 6.1460e+02 6.5540e+02 6.0410e+02 8.0280e+02 4.1327e+03 6.8537e+03 + 2.0797e+03 6.3210e+02 4.7450e+02 5.6650e+02 3.3325e+03 4.8666e+03 1.5774e+03 + 4.8190e+02 2.8000e+02 2.4590e+02 8.8420e+02 2.1587e+03 4.3935e+03 4.1660e+03 + 9.3980e+02 5.1150e+02 8.5940e+02 5.3230e+02 4.3600e+02 4.9340e+02 5.3960e+02 + 3.6250e+02 4.5500e+02 2.0036e+03 3.2046e+03 3.5312e+03 1.2531e+03 5.5480e+02 + 7.8980e+02 4.1480e+02 4.6420e+02 5.5310e+02 2.4714e+03 6.2247e+03 1.0687e+03 + 3.8520e+02 4.2970e+02 2.9180e+02 7.0140e+02 6.7060e+02 4.8640e+02 6.4560e+02 + 7.8300e+02 1.6505e+03 3.5781e+03 5.1875e+03 1.2759e+03 2.7420e+02 3.1320e+02 + 5.5390e+02 1.1146e+03 8.9110e+02 3.2597e+03 3.0994e+03 6.5660e+02 4.1540e+02 + 7.5400e+02 8.6520e+02 3.4901e+03 4.2780e+03 3.8716e+03 6.7600e+02 1.4830e+02 + 5.8420e+02 3.9836e+03 6.1043e+03 7.1920e+02 2.5520e+02 4.4490e+02 5.6660e+02 + 7.8290e+02 2.0231e+03 3.8714e+03 4.0588e+03 9.5040e+02 5.9800e+02 4.5770e+02 + 3.5870e+02 7.3030e+02 6.6130e+02 4.4290e+02 5.3260e+02 4.3320e+02 3.6300e+03 + 5.1473e+03 1.8753e+03 4.6220e+02 2.5700e+02 5.5510e+02 1.1782e+03 5.0700e+02 + 6.9540e+02 2.9041e+03 6.6680e+03 2.3988e+03 3.1090e+02 2.2910e+02 2.2610e+02 + 4.3340e+02 7.6320e+02 4.8000e+02 4.8340e+02 5.1990e+02 1.5730e+03 2.7502e+03 + 3.7563e+03 9.8930e+02 3.7660e+02 5.0290e+02 7.9680e+02 1.0041e+03 3.1114e+03 + 3.5552e+03 3.8823e+03 8.0060e+02 8.8180e+02 5.5910e+02 6.0560e+02 1.2759e+03 + 5.5645e+03 4.5297e+03 1.1615e+03 3.2630e+02 9.1190e+02 2.1614e+03 7.0000e+03 + 1.3547e+03 2.4170e+02 3.1980e+02 5.9610e+02 7.2920e+02 7.2150e+02 4.8445e+03 + 4.3710e+03 1.3126e+03 2.2840e+02 6.4270e+02 4.3060e+02 6.9380e+02 5.6440e+02 + 4.5880e+02 3.8560e+02 7.6070e+02 2.3616e+03 5.1545e+03 2.7566e+03 4.0980e+02 + 1.5210e+02 3.9820e+02 8.2060e+02 8.0250e+02 7.9390e+02 2.3253e+03 4.4151e+03 + 1.0232e+03 6.5050e+02 2.3210e+02 3.4250e+02 3.6960e+02 7.1580e+02 8.3190e+02 + 4.0140e+02 6.4360e+02 1.1681e+03 3.3623e+03 2.3007e+03 6.5220e+02 7.1420e+02 + 7.6700e+02 1.2246e+03 5.0790e+02 2.2439e+03 4.0184e+03 3.0239e+03 1.2548e+03 + 1.3012e+03 7.1370e+02 5.4000e+02 5.6960e+02 2.1217e+03 3.6898e+03 8.1770e+02 + 5.2530e+02 5.1340e+02 1.8688e+03 6.3683e+03 3.2780e+03 3.4200e+02 5.0570e+02 + 1.2060e+03 8.5450e+02 6.4410e+02 3.7955e+03 4.6380e+03 2.1110e+03 2.5950e+02 + 3.6940e+02 6.3540e+02 1.0834e+03 6.0340e+02 3.3480e+02 4.2120e+02 6.7380e+02 + 2.5683e+03 5.0341e+03 1.2528e+03 2.4230e+02 2.5540e+02 6.0880e+02 9.1990e+02 + 5.4750e+02 5.3590e+02 3.7080e+03 3.5847e+03 1.0341e+03 6.6390e+02 4.3150e+02 + 5.3710e+02 2.9420e+02 2.7560e+02 5.3510e+02 2.6110e+02 9.0880e+02 2.0080e+03 + 3.3427e+03 4.0388e+03 8.8450e+02 4.8800e+02 1.1063e+03 9.2700e+02 5.0180e+02 + 1.3368e+03 4.2413e+03 3.8900e+03 9.0800e+02 5.6310e+02 7.5570e+02 5.0630e+02 + 4.1050e+02 1.5011e+03 4.0471e+03 2.0627e+03 8.4390e+02 6.3300e+02 2.9490e+03 + 6.7999e+03 2.1882e+03 3.8820e+02 6.1080e+02 8.0440e+02 1.0055e+03 1.4821e+03 + 2.5213e+03 4.3169e+03 3.0920e+03 4.3420e+02 5.2900e+02 2.1260e+02 6.3070e+02 + 6.2480e+02 3.6910e+02 3.4810e+02 1.5544e+03 4.6817e+03 3.5488e+03 9.2820e+02 + 2.9280e+02 2.2090e+02 3.3250e+02 8.7150e+02 4.0680e+02 9.9180e+02 2.3166e+03 + 3.7248e+03 7.7820e+02 1.0527e+03 3.7940e+02 3.1600e+02 4.0020e+02 2.3610e+02 + 4.0000e+02 6.5720e+02 6.8020e+02 7.1210e+02 4.6158e+03 3.3958e+03 2.6771e+03 + 6.4400e+02 6.3420e+02 7.0270e+02 3.4410e+02 9.0730e+02 3.4963e+03 3.7695e+03 + 6.9630e+02 6.8270e+02 5.9360e+02 3.4300e+02 6.3130e+02 2.7787e+03 2.9930e+03 + 3.1571e+03 2.1498e+03 6.2030e+02 2.6618e+03 5.5356e+03 2.0014e+03 4.1580e+02 + 3.2880e+02 7.4600e+02 5.2630e+02 9.9330e+02 3.1888e+03 5.5829e+03 1.6974e+03 + 8.9440e+02 6.8790e+02 2.4920e+02 5.3620e+02 6.8290e+02 2.3040e+02 6.0950e+02 + 1.1437e+03 4.8070e+03 3.8372e+03 1.5965e+03 4.3200e+02 4.8850e+02 6.8570e+02 + 8.1230e+02 1.0672e+03 2.3330e+03 2.3906e+03 3.1640e+03 5.8720e+02 1.0386e+03 + 2.4380e+02 8.1530e+02 3.4530e+02 6.4800e+01 2.8200e+02 5.0960e+02 5.5930e+02 + 1.1132e+03 2.3499e+03 4.3577e+03 2.0006e+03 1.1398e+03 8.6020e+02 3.2540e+02 + 4.0520e+02 6.2150e+02 2.7639e+03 5.4947e+03 8.6370e+02 1.7340e+02 2.1270e+02 + 6.4160e+02 7.4210e+02 1.9610e+03 2.8207e+03 6.0908e+03 1.7763e+03 7.8840e+02 + 1.2597e+03 5.0808e+03 7.5250e+02 9.5210e+02 6.5560e+02 5.2640e+02 5.8650e+02 + 7.5300e+02 2.5594e+03 3.4173e+03 2.4160e+03 1.0927e+03 5.2690e+02 1.1650e+02 + 3.8330e+02 4.7820e+02 7.6250e+02 7.4900e+02 1.6329e+03 6.0975e+03 4.8428e+03 + 1.5580e+03 7.2290e+02 5.3400e+02 5.6020e+02 6.8040e+02 1.0782e+03 2.8631e+03 + 2.8689e+03 2.1012e+03 7.2830e+02 4.0260e+02 2.7200e+02 6.7120e+02 4.3690e+02 + 2.3920e+02 5.3300e+02 5.3680e+02 3.7480e+02 1.1932e+03 1.6931e+03 3.3526e+03 + 4.6939e+03 2.0112e+03 1.0165e+03 2.4850e+02 3.8360e+02 9.0220e+02 5.1108e+03 + 3.7160e+03 1.2605e+03 4.6360e+02 3.0740e+02 3.2130e+02 6.9330e+02 5.5540e+02 + 1.7927e+03 3.1308e+03 4.1615e+03 6.1540e+02 1.0332e+03 6.0123e+03 1.8945e+03 + 7.8510e+02 3.7620e+02 4.7770e+02 1.0636e+03 7.1450e+02 2.4889e+03 3.4155e+03 + 4.1054e+03 1.2389e+03 5.5460e+02 4.4340e+02 5.0930e+02 8.6440e+02 9.1600e+02 + 1.0095e+03 7.9060e+02 3.8325e+03 6.0611e+03 1.1889e+03 5.9290e+02 5.1930e+02 + 9.9410e+02 1.2427e+03 1.0739e+03 3.5816e+03 2.2442e+03 1.3208e+03 7.2760e+02 + 6.5410e+02 4.7400e+02 7.8810e+02 5.0380e+02 5.5810e+02 5.6060e+02 5.8310e+02 + 4.5740e+02 7.2670e+02 8.4560e+02 4.4874e+03 5.5471e+03 1.5394e+03 8.7730e+02 + 2.0990e+02 3.5670e+02 7.8220e+02 3.7294e+03 4.6519e+03 7.8100e+02 6.6300e+02 + 2.7380e+02 7.2340e+02 8.2620e+02 4.8570e+02 6.4560e+02 4.5787e+03 5.3080e+03 + 1.0609e+03 1.3445e+03 3.2989e+03 1.8352e+03 3.7310e+02 7.0830e+02 3.3560e+02 + 1.0035e+03 4.8710e+02 1.4038e+03 5.6813e+03 4.0194e+03 1.3201e+03 9.6760e+02 + 2.4730e+02 4.6750e+02 1.0853e+03 8.2980e+02 6.2410e+02 7.2720e+02 3.3676e+03 + 3.9055e+03 2.2146e+03 1.3430e+03 1.8913e+03 1.6471e+03 1.4811e+03 3.1088e+03 + 3.2870e+03 1.4584e+03 5.6260e+02 3.2870e+02 3.0820e+02 5.4740e+02 6.1490e+02 + 6.2060e+02 7.8970e+02 6.8410e+02 6.9430e+02 3.2660e+02 4.9820e+02 6.3360e+02 + 3.0888e+03 3.8679e+03 4.2580e+03 9.8030e+02 3.0290e+02 2.3340e+02 2.2160e+02 + 3.1609e+03 4.0514e+03 2.4621e+03 6.8340e+02 9.2050e+02 9.2290e+02 5.4180e+02 + 3.6830e+02 5.1380e+02 2.8453e+03 5.5624e+03 4.7483e+03 2.0874e+03 3.9424e+03 + 5.2380e+02 7.0890e+02 7.7830e+02 3.7130e+02 5.1060e+02 2.9190e+02 2.6609e+03 + 5.1209e+03 4.0942e+03 1.0557e+03 5.8630e+02 7.8210e+02 5.7640e+02 7.3240e+02 + 9.6090e+02 7.8690e+02 2.0538e+03 5.0744e+03 4.0191e+03 3.8193e+03 2.3701e+03 + 2.3781e+03 3.2300e+03 3.7147e+03 3.6319e+03 1.9131e+03 1.0776e+03 3.8450e+02 + 5.3060e+02 4.4320e+02 4.5740e+02 4.7470e+02 5.0130e+02 3.0090e+02 6.3880e+02 + 3.5420e+02 2.4040e+02 4.6030e+02 5.2170e+02 1.0973e+03 3.6847e+03 3.7373e+03 + 7.6670e+02 3.0920e+02 6.2620e+02 9.6800e+02 1.7779e+03 3.6894e+03 1.6292e+03 + 7.6550e+02 8.0180e+02 1.0171e+03 8.1520e+02 2.5840e+02 2.2140e+02 1.7512e+03 + 4.2187e+03 3.4476e+03 3.3970e+03 6.2997e+03 7.2610e+02 6.1170e+02 7.3270e+02 + 3.0350e+02 3.6380e+02 4.2570e+02 1.6794e+03 4.3396e+03 3.2156e+03 2.5220e+02 + 6.8880e+02 4.6130e+02 3.8420e+02 4.7170e+02 9.5540e+02 1.4240e+03 3.2626e+03 + 7.0000e+03 5.1886e+03 2.5340e+03 3.0978e+03 2.0671e+03 3.4876e+03 3.9286e+03 + 1.0878e+03 6.6460e+02 5.1290e+02 5.3480e+02 6.7680e+02 4.6650e+02 2.7110e+02 + 7.9650e+02 6.0820e+02 9.0120e+02 6.6760e+02 2.6060e+02 2.9810e+02 1.9740e+02 + 2.9110e+02 1.0479e+03 1.1672e+03 4.1337e+03 4.4587e+03 6.8950e+02 3.9890e+02 + 2.0180e+02 2.2372e+03 4.3192e+03 3.7195e+03 5.1430e+02 5.0210e+02 8.6210e+02 + 5.3090e+02 5.7600e+02 3.4650e+02 6.3260e+02 2.0282e+03 7.0000e+03 6.2725e+03 + 4.7392e+03 6.3530e+02 5.4490e+02 4.2610e+02 3.0700e+02 2.7860e+02 3.8680e+02 + 2.3677e+03 2.5769e+03 3.3537e+03 9.5230e+02 5.3370e+02 3.5110e+02 4.0690e+02 + 2.7640e+03 1.3657e+03 2.9040e+03 2.3185e+03 6.0785e+03 4.8180e+03 3.5047e+03 + 3.1411e+03 2.2927e+03 3.0548e+03 1.7360e+03 9.8940e+02 4.2530e+02 5.4800e+02 + 4.3070e+02 5.2220e+02 5.1450e+02 5.6340e+02 6.7480e+02 3.9760e+02 5.4960e+02 + 6.3840e+02 5.0830e+02 1.8920e+02 3.5860e+02 2.3990e+02 5.0770e+02 8.3770e+02 + 3.8192e+03 4.3092e+03 7.0870e+02 6.1640e+02 6.5220e+02 1.4447e+03 3.1874e+03 + 5.0937e+03 6.7140e+02 4.5860e+02 7.6200e+02 5.6650e+02 5.1000e+02 7.3570e+02 + 8.1870e+02 1.6399e+03 5.9768e+03 7.0000e+03 3.5309e+03 4.9140e+02 6.9150e+02 + 8.1870e+02 3.2630e+02 4.6850e+02 4.3540e+02 1.7006e+03 2.6704e+03 1.4892e+03 + 1.4802e+03 8.0430e+02 8.6560e+02 3.0905e+03 2.5024e+03 2.2305e+03 1.7006e+03 + 2.2026e+03 4.8780e+03 6.3893e+03 1.1791e+03 9.6430e+02 5.4820e+02 1.2029e+03 + 1.3897e+03 3.5690e+02 4.8890e+02 5.4250e+02 3.0150e+02 6.2100e+02 4.1550e+02 + 4.7450e+02 4.3630e+02 4.9990e+02 3.9290e+02 5.2590e+02 1.5660e+02 3.4930e+02 + 1.7040e+02 4.1580e+02 6.5740e+02 8.2280e+02 3.7762e+03 2.7400e+03 6.5750e+02 + 6.6260e+02 5.5360e+02 1.0938e+03 2.0881e+03 4.4390e+03 7.2300e+02 7.7520e+02 + 5.6030e+02 3.0050e+02 6.4260e+02 5.1020e+02 5.9660e+02 5.5920e+02 2.2964e+03 + 7.0000e+03 3.1804e+03 1.2182e+03 5.1310e+02 5.3980e+02 3.3940e+02 3.1130e+02 + 6.3590e+02 1.2701e+03 4.2916e+03 2.1288e+03 9.0210e+02 7.7590e+02 1.5246e+03 + 2.6360e+03 4.3347e+03 2.4595e+03 1.5303e+03 1.0193e+03 3.9109e+03 3.4950e+03 + 1.4711e+03 7.2720e+02 6.6350e+02 1.1234e+03 9.9390e+02 6.0670e+02 8.8380e+02 + 4.8140e+02 3.4520e+02 5.2350e+02 6.5490e+02 7.7540e+02 6.5990e+02 4.5140e+02 + 3.1060e+02 2.1490e+02 1.4810e+02 3.9950e+02 6.9510e+02 3.0270e+02 5.6570e+02 + 6.6630e+02 1.5238e+03 4.2057e+03 6.2940e+02 4.8100e+02 7.0320e+02 1.5770e+03 + 2.1352e+03 2.9689e+03 2.6752e+03 6.2620e+02 3.8380e+02 7.1920e+02 5.0070e+02 + 6.5400e+02 7.7320e+02 2.9500e+02 1.9844e+03 7.0000e+03 4.7811e+03 1.1265e+03 + 6.2140e+02 4.2330e+02 3.8800e+02 6.5430e+02 9.8050e+02 2.4791e+03 5.2721e+03 + 1.4206e+03 7.7070e+02 5.4030e+02 1.2334e+03 3.3119e+03 2.3234e+03 2.1860e+03 + 3.9430e+02 7.0830e+02 3.5328e+03 4.6826e+03 9.9440e+02 7.8770e+02 4.3480e+02 + 5.5550e+02 6.0130e+02 5.0480e+02 6.1580e+02 5.3870e+02 3.8640e+02 4.7630e+02 + 7.2020e+02 8.1880e+02 8.1770e+02 4.1450e+02 4.5120e+02 4.1220e+02 2.2180e+02 + 3.7110e+02 4.8880e+02 4.1490e+02 6.1800e+02 9.2460e+02 8.8510e+02 2.5558e+03 + 3.0740e+02 2.4130e+02 1.0350e+03 9.9240e+02 2.2901e+03 2.4049e+03 2.3133e+03 + 5.4760e+02 5.8880e+02 4.8660e+02 4.1840e+02 4.9890e+02 5.3540e+02 3.8950e+02 + 3.5639e+03 5.9544e+03 5.8572e+03 2.1300e+03 5.9850e+02 3.0200e+02 5.8140e+02 + 6.8530e+02 8.6020e+02 2.7472e+03 4.1666e+03 1.6290e+03 3.6070e+02 5.9510e+02 + 4.1391e+03 6.6673e+03 1.2027e+03 9.7090e+02 4.0560e+02 1.6585e+03 2.4458e+03 + 5.2842e+03 2.9715e+03 6.4390e+02 4.1220e+02 3.8090e+02 8.2310e+02 6.1110e+02 + 8.2530e+02 6.4780e+02 6.9940e+02 5.6710e+02 5.5960e+02 8.0730e+02 5.1990e+02 + 3.5810e+02 4.2390e+02 7.4950e+02 1.0627e+03 6.0050e+02 6.4630e+02 4.8100e+02 + 3.6410e+02 5.0920e+02 7.2310e+02 9.3900e+02 4.9620e+02 6.3720e+02 7.3900e+02 + 5.7780e+02 1.6946e+03 3.0724e+03 2.8287e+03 9.9600e+02 5.5640e+02 2.3840e+02 + 5.7080e+02 3.9520e+02 3.4870e+02 4.1170e+02 2.6465e+03 7.0000e+03 5.8923e+03 + 1.6076e+03 7.8770e+02 3.0980e+02 5.8680e+02 8.4070e+02 8.3060e+02 4.2151e+03 + 3.9487e+03 2.3273e+03 3.5300e+02 5.1910e+02 2.9615e+03 3.9086e+03 8.8740e+02 + 3.8520e+02 7.3880e+02 1.3435e+03 2.2688e+03 5.1494e+03 4.4504e+03 1.3412e+03 + 1.9480e+02 5.3070e+02 5.1850e+02 9.1040e+02 6.9380e+02 1.0925e+03 7.3270e+02 + 3.6650e+02 5.3390e+02 6.1970e+02 5.0820e+02 3.3490e+02 2.5550e+02 1.1370e+03 + 6.7770e+02 4.6800e+02 4.2740e+02 4.6190e+02 3.5670e+02 4.0280e+02 2.8630e+02 + 2.9480e+02 5.8570e+02 4.9690e+02 6.1520e+02 7.6080e+02 8.5460e+02 4.4517e+03 + 3.1083e+03 1.1189e+03 7.3150e+02 7.1070e+02 4.4020e+02 3.5200e+02 4.4670e+02 + 5.7720e+02 3.0470e+03 5.6509e+03 4.9970e+03 4.1516e+03 7.9740e+02 2.6810e+02 + 3.9510e+02 4.9700e+02 7.8100e+02 2.0752e+03 3.4946e+03 2.4602e+03 2.6490e+02 + 6.7980e+02 5.5084e+03 4.7367e+03 7.4330e+02 8.0020e+02 8.2450e+02 1.3480e+03 + 1.6912e+03 4.4982e+03 4.8971e+03 9.2980e+02 2.3190e+02 3.8320e+02 6.6410e+02 + 3.4950e+02 5.9790e+02 3.8190e+02 7.9110e+02 6.4800e+02 1.8550e+02 5.8380e+02 + 4.3520e+02 2.0580e+02 3.6260e+02 7.6880e+02 9.3920e+02 8.1000e+02 5.4100e+02 + 4.9150e+02 4.5220e+02 6.3100e+02 6.1580e+02 4.0760e+02 5.0230e+02 5.9630e+02 + 6.1320e+02 4.5640e+02 9.2200e+02 2.8101e+03 4.8972e+03 6.0170e+02 3.4960e+02 + 4.3900e+02 7.1650e+02 4.1330e+02 7.4300e+02 3.8906e+03 3.2063e+03 5.3703e+03 + 5.7485e+03 3.7559e+03 1.3800e+03 3.0530e+02 2.7740e+02 3.0920e+02 1.1392e+03 + 2.7079e+03 5.2245e+03 2.8052e+03 6.0670e+02 4.4890e+02 1.4079e+03 3.9951e+03 + 1.7687e+03 1.2038e+03 5.1330e+02 8.6070e+02 6.8710e+02 2.9964e+03 5.5375e+03 + 8.7460e+02 3.3890e+02 3.0250e+02 4.0180e+02 5.4830e+02 5.2880e+02 6.0840e+02 + 7.2150e+02 5.0840e+02 2.7300e+02 6.4460e+02 7.0220e+02 2.4820e+02 4.4110e+02 + 1.1040e+03 5.4190e+02 4.4390e+02 6.0590e+02 3.9310e+02 5.0160e+02 3.5630e+02 + 2.4900e+02 4.3600e+02 3.0980e+02 4.0280e+02 2.8570e+02 3.4460e+02 9.4310e+02 + 3.2898e+03 5.5141e+03 6.8030e+02 5.6500e+02 4.2980e+02 3.8150e+02 3.9130e+02 + 7.6290e+02 2.5129e+03 3.5098e+03 3.2066e+03 3.4755e+03 3.3177e+03 1.2526e+03 + 5.7780e+02 4.0540e+02 2.0210e+02 5.0740e+02 1.1311e+03 4.5546e+03 2.5981e+03 + 5.1170e+02 9.9280e+02 2.3035e+03 5.0137e+03 3.7203e+03 8.0270e+02 2.8140e+02 + 9.1920e+02 5.1780e+02 4.2049e+03 4.0466e+03 1.1870e+03 4.0030e+02 3.1480e+02 + 6.4670e+02 7.0710e+02 5.6540e+02 5.4790e+02 3.9530e+02 4.0830e+02 3.9660e+02 + 8.4680e+02 4.7060e+02 3.3330e+02 7.9970e+02 9.4530e+02 2.4640e+02 3.2060e+02 + 4.1380e+02 3.4840e+02 1.7640e+02 3.2980e+02 2.7540e+02 7.6120e+02 3.5810e+02 + 6.1050e+02 8.4420e+02 1.8570e+02 4.3540e+02 2.4099e+03 3.0957e+03 1.2048e+03 + 6.9170e+02 4.6440e+02 3.0030e+02 6.1930e+02 1.2901e+03 5.4668e+03 4.5403e+03 + 2.5590e+03 1.1710e+03 3.6801e+03 1.3488e+03 3.6210e+02 3.8190e+02 1.9140e+02 + 3.5200e+02 1.5440e+03 4.2510e+03 1.7982e+03 5.4700e+02 4.9060e+02 1.9048e+03 + 6.2050e+03 3.3538e+03 9.0240e+02 7.2150e+02 5.6950e+02 5.7480e+02 3.0291e+03 + 3.7929e+03 1.4161e+03 5.6690e+02 5.5820e+02 7.3080e+02 7.0140e+02 2.8450e+02 + 3.3140e+02 3.9080e+02 6.2870e+02 2.9150e+02 4.5400e+02 5.9970e+02 5.1810e+02 + 1.4094e+03 8.8070e+02 3.0740e+02 1.6710e+02 3.7540e+02 4.3010e+02 4.5510e+02 + 1.5670e+02 2.4330e+02 2.3340e+02 2.0690e+02 4.4760e+02 5.1050e+02 4.6890e+02 + 7.0780e+02 2.9595e+03 2.6561e+03 5.5350e+02 4.6690e+02 2.9450e+02 3.2650e+02 + 8.1970e+02 2.9697e+03 5.6535e+03 2.1015e+03 1.2867e+03 1.2330e+03 3.0486e+03 + 4.7588e+03 1.3219e+03 7.7780e+02 3.2900e+02 4.6280e+02 1.0556e+03 5.4468e+03 + 2.6706e+03 5.4840e+02 5.5450e+02 9.9210e+02 3.9466e+03 2.6637e+03 8.2500e+02 + 9.8370e+02 4.4660e+02 3.5780e+02 1.9338e+03 4.4595e+03 2.6496e+03 4.6590e+02 + 5.7570e+02 6.4900e+02 6.8930e+02 3.8060e+02 4.3650e+02 3.5410e+02 4.7050e+02 + 5.2100e+02 7.2030e+02 4.0070e+02 5.5130e+02 8.8110e+02 5.4090e+02 3.5800e+02 + 2.2290e+02 3.2430e+02 7.6450e+02 2.8600e+02 1.3370e+02 4.0970e+02 4.7780e+02 + 7.7490e+02 2.6130e+02 6.0490e+02 5.8950e+02 2.4517e+03 3.4159e+03 4.2029e+03 + 9.6280e+02 3.1880e+02 3.1080e+02 2.7070e+02 1.3120e+03 4.8726e+03 4.2231e+03 + 2.2462e+03 3.4530e+02 8.8200e+02 3.7934e+03 3.4266e+03 2.5402e+03 7.7260e+02 + 2.4120e+02 6.5900e+02 1.1311e+03 5.8835e+03 3.1051e+03 4.9590e+02 5.3300e+02 + 1.4320e+03 4.1641e+03 4.7094e+03 2.0808e+03 1.3007e+03 6.0460e+02 3.1070e+02 + 8.8220e+02 3.4029e+03 3.5386e+03 1.1763e+03 6.2900e+02 6.7230e+02 5.4760e+02 + 2.5920e+02 5.0930e+02 3.7260e+02 3.9330e+02 6.8390e+02 7.1970e+02 7.0750e+02 + 3.2420e+02 4.3710e+02 1.9930e+02 3.4760e+02 2.4720e+02 5.6370e+02 4.3790e+02 + 7.7700e+02 6.7560e+02 5.8600e+02 5.4520e+02 3.1250e+02 5.7870e+02 1.6560e+02 + 4.7510e+02 2.1859e+03 3.5804e+03 2.1840e+03 7.6920e+02 5.3570e+02 2.9920e+02 + 4.5900e+02 2.3016e+03 4.4269e+03 4.0281e+03 1.2909e+03 3.0260e+02 4.0410e+02 + 2.5941e+03 3.3888e+03 2.9412e+03 3.8650e+02 3.8760e+02 5.6770e+02 2.1250e+03 + 3.5575e+03 2.6185e+03 5.1540e+02 4.9230e+02 9.9570e+02 2.4756e+03 2.4347e+03 + 2.8345e+03 3.1760e+03 1.8942e+03 7.5390e+02 1.8865e+03 2.5378e+03 4.2740e+03 + 3.8624e+03 6.4870e+02 6.7890e+02 5.4550e+02 5.6900e+02 4.5730e+02 4.1070e+02 + 3.5210e+02 4.2220e+02 6.8990e+02 4.6950e+02 4.3280e+02 2.7520e+02 2.0940e+02 + 3.3840e+02 3.4670e+02 7.4550e+02 4.9280e+02 5.4770e+02 9.5880e+02 6.5180e+02 + 5.2090e+02 5.2100e+02 4.1780e+02 6.7700e+02 6.0840e+02 3.1727e+03 5.0579e+03 + 1.1497e+03 6.3130e+02 6.9560e+02 2.4070e+02 4.8140e+02 4.2950e+03 4.0326e+03 + 1.4557e+03 3.0830e+02 5.4300e+02 5.8230e+02 1.2846e+03 2.8877e+03 4.8460e+03 + 9.0240e+02 2.7150e+02 3.7050e+02 8.5490e+02 2.3715e+03 3.8303e+03 1.0716e+03 + 5.0560e+02 8.0430e+02 9.5830e+02 1.2547e+03 2.8615e+03 3.7085e+03 2.6534e+03 + 2.6578e+03 2.3233e+03 2.0065e+03 3.3470e+03 4.7069e+03 1.2982e+03 6.4090e+02 + 4.6690e+02 3.6130e+02 5.6550e+02 2.6080e+02 3.6260e+02 5.7880e+02 8.4920e+02 + 4.5130e+02 6.3640e+02 2.7570e+02 1.9930e+02 4.1980e+02 3.6650e+02 6.7160e+02 + 5.3110e+02 5.4000e+02 7.0380e+02 8.7970e+02 4.7210e+02 3.3740e+02 5.4120e+02 + 6.5660e+02 1.5249e+03 3.0627e+03 4.3380e+03 5.0460e+02 7.3490e+02 8.0900e+02 + 3.9370e+02 2.3391e+03 5.2443e+03 2.5456e+03 6.5690e+02 2.7830e+02 4.2510e+02 + 3.9600e+02 3.6760e+02 2.5626e+03 3.4643e+03 7.6320e+02 5.3710e+02 5.0180e+02 + 8.4790e+02 1.8721e+03 4.0377e+03 1.1401e+03 1.4810e+03 2.4370e+02 7.1390e+02 + 1.0110e+03 2.3460e+03 2.2404e+03 2.9931e+03 2.9556e+03 2.2154e+03 2.1324e+03 + 3.0855e+03 3.6120e+03 2.4298e+03 7.9460e+02 4.4460e+02 2.5900e+02 2.7200e+02 + 5.0480e+02 2.9130e+02 4.8500e+02 8.8580e+02 3.9170e+02 2.3870e+02 1.9980e+02 + 3.5370e+02 3.9590e+02 5.8140e+02 6.3820e+02 6.4950e+02 4.0710e+02 4.5490e+02 + 6.1300e+02 3.7440e+02 4.4210e+02 7.5560e+02 1.2975e+03 8.0420e+02 4.0694e+03 + 2.1422e+03 8.1310e+02 3.9080e+02 4.8490e+02 6.0890e+02 2.9380e+03 5.4294e+03 + 2.7711e+03 3.5820e+02 3.9620e+02 4.9280e+02 3.9940e+02 8.6790e+02 2.4046e+03 + 5.7055e+03 3.8051e+03 4.7350e+02 1.9730e+02 1.2952e+03 2.4740e+03 3.8962e+03 + 3.4159e+03 3.9740e+02 1.5520e+02 3.4000e+02 7.0480e+02 7.9100e+02 4.7150e+02 + 1.1838e+03 3.5228e+03 4.1738e+03 2.7139e+03 5.4648e+03 7.0000e+03 4.3123e+03 + 6.6080e+02 4.5460e+02 2.7910e+02 6.4950e+02 6.5330e+02 2.6280e+02 3.8030e+02 + 5.1390e+02 5.6970e+02 2.0540e+02 5.4230e+02 7.0980e+02 9.7420e+02 3.5510e+02 + 3.9990e+02 5.7820e+02 4.7400e+02 2.0100e+02 4.9390e+02 4.9080e+02 4.3230e+02 + 5.9900e+02 1.4680e+03 4.3237e+03 2.8731e+03 1.5490e+03 5.0530e+02 6.1180e+02 + 3.9820e+02 1.2427e+03 4.8516e+03 2.8184e+03 1.2932e+03 5.9560e+02 3.2190e+02 + 2.3500e+02 4.5360e+02 3.4000e+02 1.4918e+03 5.7244e+03 4.4440e+03 7.7020e+02 + 5.7760e+02 7.6090e+02 1.0379e+03 2.5006e+03 4.2731e+03 2.0123e+03 5.7190e+02 + 3.0440e+02 5.5010e+02 6.3590e+02 6.0250e+02 5.0750e+02 6.4380e+02 2.2702e+03 + 4.0667e+03 6.2522e+03 6.2059e+03 5.6122e+03 1.6363e+03 8.4910e+02 4.6820e+02 + 5.4170e+02 6.4780e+02 3.6170e+02 3.3160e+02 4.9200e+02 6.8340e+02 3.5270e+02 + 4.5080e+02 6.5620e+02 1.0200e+03 3.6210e+02 3.9750e+02 4.4540e+02 8.8620e+02 + 2.9710e+02 6.0560e+02 1.2999e+03 6.9850e+02 6.2600e+02 3.1685e+03 3.3827e+03 + 2.8745e+03 9.2500e+02 7.2870e+02 3.0160e+02 4.8540e+02 2.7577e+03 3.0230e+03 + 1.6088e+03 6.9000e+02 6.9910e+02 5.8010e+02 3.5050e+02 1.0640e+02 2.5020e+02 + 9.8580e+02 2.8317e+03 5.3189e+03 1.3646e+03 3.2760e+02 5.7310e+02 7.4240e+02 + 1.4905e+03 6.2116e+03 4.3942e+03 2.3260e+02 8.2480e+02 5.0700e+02 4.6750e+02 + 5.9390e+02 4.7340e+02 4.2950e+02 7.2870e+02 1.3350e+03 4.0406e+03 3.8638e+03 + 7.0000e+03 4.3656e+03 4.4320e+02 3.8520e+02 5.3190e+02 4.1240e+02 3.2430e+02 + 3.7930e+02 3.5060e+02 8.2970e+02 4.8730e+02 6.4670e+02 6.3500e+02 8.8500e+02 + 6.8590e+02 4.0640e+02 6.2080e+02 9.8200e+02 2.7460e+02 4.3300e+02 6.2550e+02 + 3.5370e+02 7.1980e+02 2.1181e+03 4.3552e+03 2.6198e+03 6.5350e+02 4.7200e+02 + 3.8880e+02 5.2030e+02 4.7255e+03 4.8805e+03 7.5360e+02 2.4050e+02 5.7750e+02 + 9.4570e+02 7.0230e+02 2.6100e+02 3.4210e+02 5.9500e+02 1.4118e+03 5.3581e+03 + 2.9725e+03 3.6270e+02 3.0270e+02 6.0390e+02 1.8729e+03 5.3458e+03 3.7856e+03 + 3.2541e+03 9.2690e+02 5.9000e+02 2.5250e+02 4.0230e+02 5.3670e+02 4.9210e+02 + 4.7480e+02 2.6620e+02 1.6597e+03 3.5402e+03 4.7239e+03 5.3168e+03 2.6422e+03 + 6.9620e+02 1.0007e+03 4.2560e+02 2.2720e+02 1.8810e+02 4.1480e+02 6.3670e+02 + 4.5330e+02 4.7580e+02 8.9900e+02 7.3130e+02 4.6610e+02 4.3600e+02 9.3140e+02 + 8.0430e+02 6.4260e+02 4.7340e+02 1.3496e+03 4.8880e+02 7.1690e+02 4.9443e+03 + 3.5390e+03 1.1114e+03 4.3290e+02 5.8600e+02 4.0100e+02 7.5940e+02 2.4700e+03 + 5.3150e+03 6.0230e+02 2.2040e+02 5.2990e+02 9.2660e+02 6.6940e+02 3.1750e+02 + 4.4880e+02 6.8580e+02 8.3490e+02 4.3732e+03 3.5736e+03 9.3660e+02 2.8620e+02 + 4.2640e+02 5.0690e+02 2.2694e+03 4.5168e+03 4.3264e+03 1.4589e+03 5.6570e+02 + 4.6690e+02 3.5070e+02 3.3690e+02 4.4840e+02 4.3610e+02 3.8030e+02 7.3870e+02 + 1.8431e+03 6.8756e+03 7.0000e+03 3.5736e+03 7.9860e+02 7.4190e+02 6.8290e+02 + 3.4020e+02 1.4720e+02 3.9680e+02 6.8780e+02 6.2110e+02 1.7080e+02 4.8760e+02 + 9.8950e+02 5.2110e+02 5.2470e+02 7.3220e+02 8.4940e+02 3.6800e+02 3.0880e+02 + 5.1960e+02 6.8220e+02 1.3649e+03 4.6058e+03 1.3905e+03 1.1900e+03 4.4230e+02 + 4.3640e+02 4.6150e+02 7.3710e+02 4.9066e+03 4.6622e+03 2.1474e+03 2.6060e+02 + 3.0540e+02 6.5050e+02 5.1630e+02 2.1270e+02 4.7070e+02 3.3380e+02 1.3782e+03 + 2.3468e+03 4.9272e+03 7.1460e+02 4.4150e+02 4.8040e+02 4.4390e+02 1.2418e+03 + 2.1099e+03 3.6224e+03 2.1554e+03 1.9790e+03 3.6730e+02 2.5610e+02 6.3730e+02 + 5.2260e+02 4.5300e+02 2.2750e+02 5.4710e+02 1.8200e+03 5.5064e+03 4.4507e+03 + 6.3888e+03 2.6041e+03 1.6200e+03 7.1340e+02 2.9300e+02 1.3920e+02 3.0040e+02 + 5.1770e+02 4.2330e+02 9.8300e+02 9.8150e+02 5.2200e+02 6.1810e+02 4.4550e+02 + 4.2310e+02 7.3990e+02 6.1830e+02 8.1610e+02 2.4766e+03 8.4730e+02 3.9703e+03 + 3.6230e+03 1.6001e+03 7.5040e+02 4.0280e+02 5.8410e+02 6.2780e+02 2.0942e+03 + 4.2169e+03 2.9227e+03 1.6443e+03 5.2110e+02 3.6390e+02 6.4540e+02 3.7780e+02 + 3.6150e+02 6.5730e+02 4.1000e+02 5.8360e+02 3.0737e+03 4.0546e+03 2.4961e+03 + 4.2810e+02 4.6460e+02 6.2830e+02 3.8950e+02 1.6754e+03 3.1746e+03 2.9027e+03 + 2.3294e+03 4.3180e+02 1.8460e+02 4.9260e+02 6.2100e+02 4.3330e+02 5.0310e+02 + 4.7090e+02 9.6380e+02 3.7495e+03 3.9711e+03 3.7041e+03 4.4798e+03 4.5170e+02 + 6.5210e+02 5.3380e+02 2.9650e+02 6.1800e+02 8.4470e+02 5.0270e+02 6.9210e+02 + 9.5470e+02 3.0770e+02 8.9160e+02 8.2500e+02 4.5530e+02 3.2530e+02 6.1620e+02 + 8.4490e+02 2.3486e+03 2.1627e+03 2.9586e+03 3.7596e+03 1.4916e+03 4.6130e+02 + 5.4870e+02 4.3380e+02 4.4230e+02 2.7143e+03 3.7155e+03 4.6717e+03 1.3805e+03 + 9.0000e+02 2.8240e+02 4.4520e+02 3.8860e+02 4.3160e+02 6.0320e+02 5.6470e+02 + 1.9750e+02 1.5653e+03 3.8980e+03 4.0778e+03 1.0670e+03 6.4710e+02 4.7840e+02 + 3.9450e+02 1.3067e+03 1.5153e+03 2.1546e+03 4.5327e+03 1.1547e+03 5.5090e+02 + 5.5960e+02 7.0800e+02 8.8780e+02 2.9510e+02 4.4020e+02 2.3934e+03 2.4754e+03 + 5.0139e+03 2.1718e+03 4.7492e+03 1.4437e+03 7.7520e+02 6.9150e+02 8.2680e+02 + 4.2580e+02 7.0140e+02 4.0840e+02 1.1122e+03 5.1320e+02 2.8830e+02 5.9040e+02 + 5.6310e+02 5.8330e+02 4.4460e+02 9.2340e+02 1.1235e+03 1.4381e+03 1.6993e+03 + 3.8022e+03 4.0452e+03 5.6010e+02 3.4810e+02 4.9290e+02 3.9920e+02 5.4360e+02 + 3.7444e+03 5.6964e+03 4.5499e+03 1.2658e+03 1.2088e+03 3.5620e+02 3.5400e+02 + 6.1560e+02 4.6030e+02 4.9400e+02 3.1580e+02 4.0260e+02 6.2790e+02 3.6004e+03 + 4.1910e+03 2.7308e+03 9.4940e+02 6.0800e+02 1.2171e+03 5.4300e+02 1.2086e+03 + 2.2040e+03 3.9598e+03 2.6764e+03 9.1930e+02 7.9270e+02 8.0030e+02 3.0550e+02 + 2.8450e+02 2.3230e+02 2.4714e+03 3.8176e+03 3.5374e+03 4.7898e+03 4.8513e+03 + 3.0800e+03 7.5780e+02 1.0433e+03 8.0160e+02 7.9200e+02 5.6260e+02 3.9580e+02 + 4.5660e+02 4.0470e+02 1.5840e+02 6.1420e+02 4.4810e+02 5.4460e+02 4.0130e+02 + 5.6510e+02 2.5080e+03 4.9497e+03 4.5950e+03 4.1045e+03 2.3680e+03 4.3260e+02 + 2.1170e+02 5.8540e+02 5.6470e+02 6.1930e+02 3.1213e+03 3.2007e+03 3.1415e+03 + 1.9139e+03 7.5200e+02 4.4100e+02 8.0110e+02 9.1620e+02 3.2780e+02 2.1070e+02 + 1.8060e+02 4.8140e+02 5.6770e+02 2.0224e+03 4.2425e+03 2.2074e+03 7.4600e+02 + 4.8160e+02 1.8310e+02 5.8030e+02 7.8870e+02 2.4074e+03 4.3395e+03 3.1966e+03 + 2.5964e+03 1.3968e+03 7.3660e+02 2.6590e+02 6.6700e+01 3.0900e+02 1.7262e+03 + 3.2787e+03 2.6678e+03 3.9425e+03 3.8325e+03 3.0454e+03 6.1430e+02 7.0510e+02 + 3.3470e+02 5.3470e+02 8.9640e+02 9.7260e+02 3.3800e+02 3.8450e+02 8.0160e+02 + 5.0380e+02 4.9000e+02 3.9550e+02 7.9680e+02 8.6270e+02 2.7821e+03 3.3166e+03 + 5.1006e+03 4.3618e+03 2.2973e+03 1.0470e+02 2.3910e+02 2.7700e+02 5.7560e+02 + 7.6370e+02 2.2769e+03 4.5682e+03 2.4360e+03 1.3529e+03 9.1940e+02 4.3310e+02 + 6.2660e+02 6.6870e+02 3.4270e+02 3.6670e+02 1.8750e+02 5.4300e+02 9.9420e+02 + 3.5867e+03 4.6798e+03 1.2583e+03 7.1330e+02 5.8390e+02 2.7960e+02 2.7800e+02 + 7.6300e+02 1.0258e+03 2.3267e+03 3.2257e+03 3.2500e+03 2.6492e+03 8.0800e+02 + 2.1930e+02 1.1830e+02 2.8720e+02 3.3683e+03 3.7093e+03 2.6515e+03 3.3930e+03 + 3.9203e+03 3.3045e+03 1.2197e+03 7.9690e+02 5.7080e+02 5.4570e+02 7.1950e+02 + 4.8060e+02 2.9700e+02 2.4190e+02 1.2270e+03 6.4050e+02 1.2790e+02 1.6600e+02 + 9.4300e+02 8.4580e+02 2.4934e+03 4.7514e+03 5.1084e+03 5.6588e+03 1.2785e+03 + 3.7440e+02 2.4690e+02 4.7680e+02 7.0580e+02 6.1080e+02 8.4710e+02 4.4781e+03 + 3.0012e+03 8.2660e+02 3.1390e+02 1.0448e+03 8.2640e+02 5.2160e+02 2.2730e+02 + 2.9440e+02 1.8080e+02 3.0170e+02 6.7670e+02 2.1065e+03 4.6155e+03 2.1117e+03 + 1.0635e+03 3.8410e+02 2.6840e+02 5.8230e+02 1.0350e+03 3.4680e+02 3.8680e+02 + 1.6245e+03 3.9812e+03 3.0402e+03 1.0352e+03 2.5010e+02 2.5220e+02 8.6870e+02 + 3.0649e+03 3.6336e+03 1.3649e+03 3.8862e+03 4.1091e+03 1.6719e+03 5.2260e+02 + 4.8110e+02 4.8930e+02 4.5160e+02 6.3610e+02 3.2070e+02 2.3390e+02 6.0580e+02 + 7.0290e+02 3.6970e+02 2.3300e+02 2.1280e+02 6.4810e+02 7.6570e+02 1.7589e+03 + 4.0251e+03 4.2482e+03 4.1981e+03 9.0970e+02 3.9020e+02 5.7680e+02 3.3810e+02 + 4.4780e+02 7.1240e+02 1.2409e+03 3.6657e+03 2.2980e+03 5.3990e+02 5.1490e+02 + 6.5250e+02 1.1117e+03 5.5390e+02 1.0830e+02 2.6230e+02 1.6150e+02 2.9980e+02 + 5.9470e+02 2.4869e+03 2.9952e+03 1.3599e+03 8.8790e+02 7.0650e+02 2.3030e+02 + 3.3690e+02 6.9460e+02 7.0610e+02 6.0720e+02 5.1090e+02 3.4872e+03 4.1711e+03 + 2.9891e+03 5.5820e+02 3.6090e+02 1.1347e+03 3.9396e+03 3.6773e+03 1.6670e+03 + 2.5465e+03 5.3845e+03 2.7285e+03 4.9910e+02 4.1520e+02 3.1830e+02 4.1060e+02 + 3.4510e+02 2.2840e+02 1.4540e+02 2.7670e+02 3.1520e+02 5.8120e+02 4.7290e+02 + 3.5340e+02 5.1850e+02 6.7530e+02 2.4834e+03 4.2226e+03 2.7054e+03 4.6319e+03 + 1.7124e+03 3.8330e+02 6.5950e+02 2.6080e+02 3.0970e+02 4.3080e+02 6.5900e+02 + 2.9384e+03 2.5658e+03 2.2330e+02 5.8630e+02 1.0058e+03 1.0862e+03 3.8020e+02 + 1.7520e+02 4.7370e+02 6.0580e+02 4.1270e+02 1.0782e+03 1.9676e+03 5.0320e+03 + 2.2715e+03 4.3930e+02 7.4250e+02 5.9970e+02 7.9230e+02 6.4440e+02 4.8230e+02 + 3.4730e+02 4.1140e+02 2.0032e+03 6.1088e+03 3.6312e+03 4.3750e+02 9.3120e+02 + 1.5724e+03 5.8964e+03 2.8980e+03 1.5942e+03 2.9371e+03 4.2783e+03 1.0178e+03 + 6.5600e+02 7.8010e+02 4.1820e+02 3.8870e+02 4.5290e+02 2.5690e+02 3.7440e+02 + 4.2360e+02 7.7370e+02 7.6410e+02 6.4480e+02 3.9770e+02 2.7030e+02 8.2310e+02 + 2.3522e+03 3.2381e+03 4.4969e+03 4.0949e+03 1.2923e+03 4.9420e+02 3.1470e+02 + 2.4550e+02 1.9580e+02 2.0180e+02 4.7850e+02 1.5819e+03 3.5246e+03 5.1120e+02 + 7.5250e+02 8.6770e+02 5.3580e+02 4.6820e+02 4.3130e+02 6.3000e+02 7.8600e+02 + 6.0530e+02 5.3660e+02 2.1893e+03 4.3796e+03 2.5046e+03 7.9080e+02 5.7150e+02 + 4.3380e+02 4.4460e+02 8.4240e+02 3.7520e+02 3.0930e+02 2.3490e+02 1.0635e+03 + 5.8664e+03 4.5667e+03 1.1563e+03 1.0108e+03 2.6943e+03 4.3327e+03 2.0180e+03 + 1.0849e+03 5.1747e+03 3.0043e+03 5.1070e+02 5.6170e+02 7.2460e+02 3.9130e+02 + 6.8500e+02 4.4410e+02 2.7800e+02 4.3470e+02 3.7030e+02 7.8970e+02 9.8350e+02 + 3.2220e+02 5.2080e+02 4.6490e+02 5.0410e+02 4.3774e+03 2.9261e+03 3.1786e+03 + 6.6006e+03 8.8400e+02 1.0211e+03 5.4870e+02 4.1210e+02 3.4550e+02 2.9850e+02 + 1.8810e+02 1.0901e+03 3.7394e+03 2.0246e+03 4.1870e+02 3.3850e+02 9.1670e+02 + 3.8000e+02 4.7090e+02 7.6830e+02 8.4240e+02 4.0840e+02 8.2440e+02 1.7666e+03 + 2.9514e+03 2.4528e+03 7.4340e+02 8.3380e+02 1.0820e+03 5.0920e+02 5.3410e+02 + 5.6830e+02 6.3440e+02 2.3360e+02 4.6000e+02 3.2119e+03 3.5138e+03 3.5227e+03 + 1.5768e+03 4.0841e+03 3.0046e+03 2.0856e+03 1.4663e+03 5.2985e+03 4.2063e+03 + 1.2812e+03 7.4350e+02 8.8060e+02 6.1070e+02 3.2280e+02 7.0940e+02 6.4500e+02 + 5.2160e+02 4.7980e+02 8.4270e+02 4.9160e+02 4.2300e+02 4.2830e+02 5.9670e+02 + 1.2475e+03 3.8665e+03 2.0061e+03 3.2755e+03 6.0163e+03 1.1658e+03 3.6550e+02 + 3.0250e+02 1.0462e+03 6.1150e+02 2.9690e+02 2.6300e+02 1.0289e+03 5.0526e+03 + 2.9696e+03 3.0190e+02 5.8370e+02 4.6000e+02 4.7510e+02 3.9130e+02 6.1840e+02 + 5.8420e+02 5.1800e+02 8.0900e+02 2.5896e+03 4.9757e+03 1.7278e+03 2.6000e+02 + 5.1130e+02 2.8240e+02 4.0080e+02 4.4230e+02 4.1910e+02 4.8950e+02 4.6110e+02 + 6.2780e+02 2.2132e+03 4.4917e+03 3.1717e+03 2.3007e+03 3.8618e+03 2.4745e+03 + 1.2602e+03 1.1877e+03 2.6382e+03 3.3247e+03 2.7730e+02 4.7260e+02 1.4835e+03 + 6.3610e+02 2.9030e+02 7.1600e+02 7.8280e+02 4.7290e+02 8.2600e+02 5.1210e+02 + 5.0790e+02 6.0510e+02 5.9550e+02 8.1530e+02 1.2136e+03 4.2940e+03 2.5671e+03 + 2.7956e+03 4.0468e+03 2.9704e+03 3.5830e+02 2.2180e+02 9.5640e+02 1.3226e+03 + 5.1970e+02 5.1540e+02 1.0168e+03 5.2666e+03 4.4870e+03 3.0750e+02 4.9800e+02 + 3.6780e+02 2.3160e+02 2.7480e+02 7.0620e+02 9.8310e+02 4.9440e+02 4.8070e+02 + 4.2217e+03 5.0561e+03 1.1390e+03 5.5840e+02 5.0970e+02 5.5180e+02 6.1180e+02 + 4.8540e+02 3.3200e+02 6.0390e+02 6.6480e+02 4.6290e+02 9.9080e+02 2.0301e+03 + 5.0234e+03 2.9705e+03 3.6940e+03 1.9069e+03 8.9310e+02 9.8680e+02 4.7025e+03 + 5.1731e+03 2.8380e+02 3.2340e+02 5.5090e+02 4.2720e+02 3.0950e+02 5.6330e+02 + 3.1790e+02 4.5430e+02 9.3110e+02 5.8700e+02 3.7520e+02 9.9330e+02 7.7480e+02 + 3.7400e+02 2.0698e+03 3.4306e+03 2.8840e+03 2.7412e+03 5.1274e+03 1.2643e+03 + 4.7400e+02 2.3580e+02 4.2700e+02 6.4720e+02 6.9640e+02 5.2850e+02 8.4820e+02 + 3.0978e+03 2.9268e+03 1.1771e+03 5.2130e+02 5.5960e+02 3.0360e+02 3.6760e+02 + 7.1320e+02 4.4550e+02 4.2160e+02 2.5477e+03 5.6801e+03 3.5609e+03 1.7235e+03 + 6.9990e+02 7.4750e+02 9.5030e+02 6.7750e+02 4.4020e+02 2.9560e+02 4.6120e+02 + 8.9970e+02 6.6480e+02 1.3887e+03 3.5590e+03 6.6074e+03 4.4636e+03 3.8696e+03 + 1.1831e+03 5.2610e+02 9.4630e+02 5.0746e+03 2.8209e+03 7.6920e+02 3.4700e+02 + 2.4380e+02 5.0970e+02 4.9710e+02 5.1360e+02 3.0070e+02 4.3200e+02 3.5110e+02 + 4.1560e+02 3.9210e+02 7.8110e+02 6.9520e+02 5.0770e+02 1.0924e+03 5.3187e+03 + 2.9927e+03 3.8765e+03 5.3697e+03 2.6233e+03 5.2690e+02 2.0760e+02 4.5180e+02 + 6.1610e+02 8.0600e+02 6.4320e+02 1.2832e+03 2.3324e+03 4.0248e+03 5.5675e+03 + 1.0724e+03 7.1180e+02 4.7530e+02 5.9600e+02 5.0900e+02 7.3340e+02 6.7910e+02 + 2.3958e+03 3.8248e+03 3.8113e+03 1.0913e+03 7.8270e+02 4.9310e+02 8.0120e+02 + 5.9100e+02 2.5510e+02 5.3210e+02 8.5360e+02 4.9600e+02 5.6480e+02 2.5960e+02 + 4.7015e+03 5.9196e+03 7.0000e+03 2.4517e+03 6.4630e+02 6.1570e+02 1.0935e+03 + 5.0194e+03 2.8329e+03 8.7460e+02 5.6980e+02 3.5710e+02 3.2550e+02 4.8650e+02 + 3.9170e+02 5.3940e+02 2.7200e+02 6.9370e+02 7.6490e+02 6.6300e+02 5.5050e+02 + 8.1750e+02 4.5950e+02 4.7590e+02 4.0379e+03 5.4714e+03 1.3579e+03 5.5324e+03 + 2.5239e+03 4.4070e+02 3.5040e+02 3.4120e+02 4.6250e+02 5.7900e+02 6.9970e+02 + 8.7300e+02 1.0446e+03 2.4261e+03 6.6743e+03 1.9449e+03 5.7740e+02 5.8980e+02 + 7.3610e+02 7.9370e+02 4.5900e+02 6.3780e+02 2.7430e+03 6.5333e+03 4.3046e+03 + 1.2465e+03 5.8750e+02 5.4420e+02 3.6910e+02 5.8230e+02 7.6390e+02 3.8310e+02 + 7.4840e+02 1.0228e+03 2.7660e+02 5.8980e+02 1.5926e+03 7.0000e+03 5.4848e+03 + 9.3500e+02 4.6840e+02 4.1590e+02 1.6568e+03 3.4230e+03 3.3858e+03 1.1278e+03 + 6.0890e+02 5.6550e+02 1.7620e+02 3.4310e+02 2.6440e+02 1.7150e+02 1.9630e+02 + 4.7000e+02 5.0410e+02 9.0970e+02 2.6790e+02 3.8260e+02 5.2050e+02 7.4380e+02 + 2.4878e+03 3.8598e+03 3.2137e+03 5.3037e+03 4.1027e+03 6.4130e+02 2.8500e+02 + 1.7790e+02 4.9270e+02 6.8020e+02 6.4880e+02 4.6350e+02 4.1830e+02 1.8264e+03 + 5.2359e+03 4.2806e+03 7.0410e+02 6.1180e+02 4.9640e+02 2.2800e+02 4.0020e+02 + 7.1500e+02 3.9563e+03 4.5088e+03 2.8216e+03 6.7820e+02 7.7600e+02 3.6150e+02 + 4.7120e+02 5.3160e+02 5.0060e+02 3.1200e+02 4.6560e+02 4.1210e+02 6.1000e+02 + 4.8170e+02 4.4237e+03 6.5047e+03 7.0000e+03 8.8650e+02 5.8540e+02 3.4000e+02 + 1.2687e+03 3.5816e+03 5.1511e+03 2.7134e+03 5.1200e+02 3.3720e+02 2.5510e+02 + 5.4400e+02 1.1183e+03 3.0130e+02 5.9640e+02 4.4970e+02 5.0400e+02 8.3820e+02 + 6.0760e+02 5.1760e+02 8.9040e+02 5.8410e+02 9.9740e+02 3.0997e+03 1.7147e+03 + 5.6745e+03 2.7445e+03 9.6900e+02 3.7280e+02 4.7160e+02 5.4300e+02 7.1820e+02 + 6.3030e+02 4.6390e+02 3.0680e+02 1.2929e+03 2.7531e+03 3.7508e+03 1.1268e+03 + 4.7470e+02 4.7040e+02 2.7400e+02 4.8830e+02 1.2772e+03 5.1623e+03 4.5206e+03 + 2.2620e+03 8.2160e+02 3.9080e+02 6.6360e+02 3.6240e+02 4.5680e+02 3.0830e+02 + 2.6290e+02 4.9430e+02 6.0280e+02 4.0830e+02 8.8840e+02 5.0852e+03 6.0225e+03 + 6.3115e+03 5.0880e+02 5.7980e+02 3.4470e+02 7.4760e+02 2.4645e+03 4.2363e+03 + 1.3770e+03 1.0234e+03 5.2620e+02 1.8080e+02 4.4660e+02 7.1280e+02 8.4240e+02 + 4.1570e+02 5.4020e+02 5.5730e+02 4.8400e+02 8.5820e+02 4.7260e+02 3.5300e+02 + 4.2920e+02 1.1704e+03 4.1008e+03 1.8620e+03 3.8164e+03 5.0855e+03 8.4200e+02 + 5.2830e+02 4.9510e+02 6.2910e+02 8.1670e+02 1.0043e+03 4.5980e+02 3.8250e+02 + 9.7420e+02 1.5384e+03 4.2610e+03 2.6647e+03 4.2940e+02 3.8880e+02 3.6410e+02 + 5.6430e+02 2.0656e+03 5.8072e+03 2.9079e+03 1.6567e+03 7.1630e+02 5.3600e+02 + 5.5430e+02 2.1190e+02 4.3310e+02 5.4530e+02 5.4940e+02 5.4540e+02 4.4050e+02 + 8.8960e+02 2.3492e+03 5.6065e+03 6.1285e+03 2.3561e+03 8.3670e+02 4.0660e+02 + 4.7860e+02 5.3190e+02 1.8038e+03 5.6573e+03 3.2226e+03 1.3139e+03 3.9700e+02 + 2.2370e+02 6.4500e+02 8.5290e+02 6.2830e+02 3.4170e+02 3.2600e+02 5.9090e+02 + 3.9780e+02 7.4550e+02 2.6670e+02 7.3670e+02 3.3860e+02 6.4600e+02 4.0417e+03 + 8.5540e+02 3.5909e+03 3.9935e+03 9.4940e+02 7.2410e+02 5.4110e+02 6.4650e+02 + 5.5150e+02 4.2410e+02 3.4570e+02 6.6700e+02 7.1180e+02 8.0550e+02 2.9489e+03 + 4.8112e+03 9.9530e+02 4.9310e+02 5.5950e+02 5.0410e+02 4.1235e+03 3.9383e+03 + 1.6341e+03 1.0803e+03 9.4870e+02 7.1470e+02 7.2930e+02 5.3850e+02 2.3790e+02 + 3.8360e+02 4.1010e+02 3.5620e+02 2.0860e+02 4.3030e+02 4.5349e+03 6.3586e+03 + 5.0111e+03 2.9798e+03 6.0130e+02 2.3610e+02 4.0820e+02 1.7120e+02 1.2198e+03 + 3.6552e+03 2.0921e+03 7.7960e+02 7.7770e+02 4.8390e+02 7.1030e+02 1.2139e+03 + 7.6490e+02 4.0460e+02 4.2570e+02 6.4150e+02 8.2840e+02 7.1060e+02 4.5000e+02 + 5.0290e+02 5.9610e+02 5.9430e+02 3.3814e+03 7.8960e+02 4.8231e+03 3.8398e+03 + 7.5480e+02 3.8220e+02 4.2280e+02 3.9140e+02 7.0070e+02 7.7040e+02 6.9270e+02 + 3.2960e+02 9.6450e+02 5.0940e+02 2.4374e+03 3.7912e+03 2.3533e+03 5.2290e+02 + 4.6550e+02 1.9270e+03 3.2920e+03 2.3238e+03 5.5930e+02 4.4920e+02 5.9140e+02 + 3.9860e+02 3.3630e+02 3.3860e+02 7.0440e+02 3.2140e+02 6.0890e+02 4.1500e+02 + 4.7550e+02 1.2742e+03 2.5394e+03 7.0000e+03 5.5073e+03 1.3169e+03 5.3650e+02 + 3.7480e+02 3.2090e+02 6.1640e+02 7.7200e+02 3.6290e+03 3.2718e+03 2.5237e+03 + 1.7908e+03 9.5020e+02 4.9570e+02 1.0264e+03 6.1940e+02 5.5650e+02 3.0920e+02 + 3.2170e+02 7.1780e+02 8.1700e+02 2.5530e+02 1.8780e+02 4.5290e+02 6.4200e+02 + 3.9990e+03 7.6930e+02 3.6364e+03 6.7752e+03 2.4515e+03 6.3460e+02 6.0010e+02 + 3.4410e+02 3.0150e+02 1.2891e+03 6.7810e+02 5.0410e+02 7.1200e+02 3.3120e+02 + 1.1172e+03 6.1435e+03 2.1224e+03 8.5480e+02 1.1527e+03 2.9086e+03 3.7790e+03 + 1.1716e+03 4.9490e+02 3.2090e+02 4.8520e+02 2.8490e+02 4.4130e+02 4.6930e+02 + 7.9430e+02 3.3790e+02 4.6740e+02 7.8420e+02 7.3220e+02 1.0756e+03 3.2159e+03 + 4.7292e+03 5.3226e+03 2.9822e+03 5.6110e+02 3.0530e+02 5.3500e+02 5.5450e+02 + 3.5220e+02 2.5016e+03 2.0152e+03 2.2508e+03 2.2075e+03 2.2528e+03 1.2444e+03 + 3.8350e+02 5.3840e+02 4.5940e+02 7.3100e+02 4.7360e+02 5.6730e+02 1.3966e+03 + 4.4870e+02 4.4600e+01 3.5910e+02 9.2850e+02 3.5674e+03 7.4140e+02 2.1175e+03 + 5.9950e+03 2.7060e+03 6.9400e+02 7.7450e+02 4.2250e+02 3.2590e+02 8.1590e+02 + 6.2320e+02 5.6700e+02 2.7990e+02 4.2250e+02 7.9330e+02 2.6141e+03 3.5719e+03 + 2.6404e+03 5.1259e+03 3.1286e+03 3.6878e+03 6.3210e+02 3.0510e+02 4.1620e+02 + 4.9240e+02 4.0960e+02 3.4480e+02 6.9010e+02 5.6760e+02 1.9420e+02 1.7240e+02 + 5.6700e+02 1.0310e+03 2.2931e+03 4.2224e+03 4.1936e+03 6.1094e+03 1.0324e+03 + 5.6620e+02 2.7920e+02 6.2650e+02 8.4530e+02 5.1500e+02 7.4530e+02 1.7302e+03 + 1.5884e+03 2.4186e+03 4.7661e+03 3.6360e+03 7.2240e+02 1.8431e+03 1.0242e+03 + 5.3560e+02 1.0022e+03 6.3340e+02 1.2911e+03 4.7090e+02 1.8870e+02 3.5120e+02 + 9.1860e+02 3.9918e+03 5.9200e+02 1.1266e+03 4.5630e+03 4.7309e+03 1.8540e+03 + 1.3762e+03 2.8270e+02 5.9590e+02 3.8600e+02 6.3350e+02 4.5840e+02 4.1040e+02 + 5.0500e+02 8.6600e+02 1.2263e+03 3.5891e+03 6.7761e+03 4.9933e+03 2.8669e+03 + 2.1439e+03 6.0840e+02 1.4370e+02 5.8770e+02 3.2070e+02 2.3680e+02 4.1680e+02 + 3.9870e+02 4.2810e+02 5.1400e+01 4.6400e+01 5.2630e+02 1.3873e+03 2.3210e+03 + 5.4822e+03 6.2171e+03 4.1360e+03 8.7410e+02 5.1580e+02 6.6520e+02 6.4830e+02 + 6.7010e+02 5.3040e+02 7.0840e+02 5.5730e+02 1.1414e+03 2.2873e+03 4.1343e+03 + 2.6430e+03 1.3681e+03 3.0119e+03 2.8829e+03 1.8237e+03 1.5477e+03 8.4860e+02 + 1.2022e+03 7.8560e+02 2.4080e+02 4.5050e+02 2.2744e+03 3.4591e+03 4.4320e+02 + 7.4000e+02 2.3684e+03 3.9027e+03 2.4000e+03 1.1800e+03 6.0740e+02 2.9690e+02 + 6.1930e+02 3.6080e+02 6.8020e+02 3.6910e+02 3.7030e+02 6.4290e+02 1.1867e+03 + 4.4396e+03 7.0000e+03 5.1978e+03 3.2082e+03 7.5310e+02 3.2890e+02 3.3170e+02 + 5.4100e+02 8.8770e+02 2.8020e+02 5.5520e+02 6.8480e+02 3.4330e+02 2.5510e+02 + 1.9410e+02 5.3090e+02 9.2290e+02 2.8694e+03 3.6964e+03 5.4312e+03 3.8832e+03 + 7.6040e+02 5.4110e+02 1.2082e+03 6.3510e+02 3.0750e+02 6.6460e+02 7.7810e+02 + 6.3610e+02 3.5160e+02 5.2350e+02 2.4124e+03 2.2759e+03 1.7384e+03 1.8737e+03 + 2.4702e+03 2.7370e+03 2.6196e+03 1.3434e+03 8.0300e+02 6.8020e+02 5.2170e+02 + 5.7060e+02 3.3465e+03 3.4534e+03 4.7420e+02 9.0360e+02 1.1469e+03 2.8168e+03 + 4.6721e+03 1.3052e+03 5.9350e+02 3.9590e+02 7.4200e+02 5.7120e+02 5.0000e+02 + 2.7150e+02 4.3590e+02 4.7260e+02 1.7020e+03 4.2732e+03 7.0000e+03 2.7288e+03 + 2.6305e+03 6.5540e+02 4.3120e+02 5.5490e+02 5.5790e+02 1.0009e+03 4.7190e+02 + 7.8730e+02 5.1930e+02 2.1970e+02 3.7430e+02 5.3500e+02 4.2750e+02 1.0998e+03 + 5.3699e+03 4.7695e+03 7.0000e+03 4.1754e+03 6.8980e+02 3.1180e+02 1.2385e+03 + 3.4350e+02 5.9570e+02 3.7680e+02 8.6090e+02 5.2160e+02 3.4270e+02 5.6400e+02 + 1.4363e+03 9.5680e+02 6.2030e+02 1.5376e+03 2.9575e+03 3.9891e+03 2.3259e+03 + 1.9832e+03 2.8061e+03 9.4870e+02 5.4840e+02 1.0113e+03 3.8812e+03 3.3231e+03 + 8.0140e+02 6.4770e+02 1.4884e+03 2.8511e+03 3.2543e+03 3.2552e+03 8.9210e+02 + 4.0390e+02 3.9150e+02 5.9630e+02 6.1300e+02 6.4530e+02 2.5320e+02 1.3814e+03 + 1.8376e+03 4.4055e+03 7.0000e+03 3.4501e+03 7.8870e+02 2.7710e+02 4.5660e+02 + 5.8120e+02 7.7960e+02 1.1398e+03 4.6120e+02 8.4510e+02 5.9240e+02 1.9240e+02 + 5.1460e+02 8.7050e+02 6.2430e+02 1.6367e+03 4.8015e+03 3.6207e+03 4.1831e+03 + 3.7367e+03 7.3940e+02 2.3560e+02 4.3370e+02 3.9450e+02 5.1730e+02 3.2180e+02 + 5.7290e+02 7.0580e+02 5.2480e+02 5.5160e+02 1.1208e+03 1.2419e+03 1.0493e+03 + 6.7640e+02 2.0057e+03 2.0403e+03 3.8283e+03 3.9434e+03 2.2942e+03 2.7886e+03 + 2.0240e+03 1.5344e+03 2.6846e+03 3.0113e+03 1.0451e+03 7.6520e+02 6.9860e+02 + 1.4637e+03 4.0642e+03 3.1134e+03 2.0075e+03 3.4990e+02 2.1430e+02 3.6780e+02 + 4.5250e+02 7.0350e+02 8.1210e+02 2.7840e+03 2.8574e+03 3.1947e+03 4.3317e+03 + 3.4593e+03 9.5510e+02 3.1380e+02 3.6200e+02 8.5930e+02 1.1340e+03 6.1460e+02 + 5.1440e+02 7.4250e+02 5.0510e+02 4.3720e+02 2.4320e+02 3.7190e+02 2.0943e+03 + 2.3299e+03 3.8611e+03 2.3934e+03 3.2482e+03 1.5095e+03 8.3750e+02 2.9450e+02 + 2.3100e+02 3.0640e+02 3.9360e+02 2.7540e+02 1.6210e+02 3.5530e+02 3.1560e+02 + 4.8200e+02 9.0080e+02 9.1430e+02 7.3940e+02 3.1050e+02 9.1640e+02 1.4638e+03 + 1.2775e+03 2.1935e+03 3.5151e+03 2.2041e+03 4.5221e+03 2.0679e+03 4.5763e+03 + 3.5345e+03 1.1648e+03 1.4447e+03 2.7966e+03 2.8899e+03 2.2104e+03 6.5520e+02 + 4.8360e+02 7.8820e+02 1.6570e+03 3.7615e+03 3.2971e+03 1.5686e+03 6.0810e+02 + 3.9030e+02 5.6260e+02 1.8271e+03 3.0725e+03 4.2630e+02 5.8580e+02 3.8620e+02 + 2.7030e+02 9.7240e+02 3.0073e+03 2.6614e+03 1.7516e+03 1.0143e+03 3.3060e+02 + 4.7240e+02 3.7710e+02 4.3240e+02 6.2620e+02 4.9020e+02 5.4410e+02 7.7360e+02 + 7.7510e+02 2.0232e+03 2.1700e+03 2.0710e+03 6.3570e+02 5.1210e+02 2.8270e+02 + 4.1240e+02 4.4880e+02 3.2505e+03 3.1772e+03 1.8140e+03 2.7970e+02 6.2150e+02 + 4.1480e+02 3.1210e+02 4.9300e+02 4.9630e+02 1.0788e+03 4.4070e+02 8.5280e+02 + 2.9804e+03 4.0136e+03 2.4282e+03 7.2290e+02 3.1890e+02 8.5950e+02 9.0960e+02 + 2.0218e+03 3.2002e+03 2.3983e+03 6.2220e+02 7.6520e+02 4.4770e+02 7.7890e+02 + 3.3061e+03 5.4830e+03 1.9340e+03 6.9140e+02 3.7410e+02 8.4530e+02 2.6660e+03 + 3.8933e+03 1.4002e+03 3.7600e+02 2.1630e+02 2.6720e+02 6.1050e+02 2.1587e+03 + 3.5148e+03 3.3328e+03 7.7690e+02 4.5910e+02 7.7850e+02 5.7020e+02 4.6830e+02 + 5.5190e+02 5.8690e+02 3.8830e+02 7.3010e+02 2.0036e+03 2.5637e+03 2.8250e+03 + 1.2870e+03 4.3840e+02 7.9570e+02 8.6010e+02 5.6370e+02 6.1390e+02 1.9771e+03 + 4.9798e+03 1.0717e+03 3.3050e+02 3.6730e+02 3.8060e+02 4.1470e+02 7.9090e+02 + 5.0490e+02 7.8900e+02 6.7980e+02 1.2871e+03 2.8625e+03 4.1500e+03 1.5907e+03 + 4.2990e+02 4.9570e+02 8.6900e+02 1.4240e+03 8.5350e+02 2.6078e+03 2.4796e+03 + 7.9930e+02 3.7220e+02 4.1240e+02 1.0017e+03 2.7920e+03 3.4224e+03 3.0973e+03 + 9.6050e+02 2.0820e+02 3.0530e+02 3.1868e+03 4.8835e+03 7.9400e+02 3.4080e+02 + 2.5070e+02 3.9150e+02 3.9770e+02 2.0231e+03 3.0971e+03 3.2471e+03 9.0910e+02 + 5.0740e+02 8.4760e+02 8.3620e+02 7.2260e+02 1.1146e+03 3.5830e+02 4.8680e+02 + 5.9770e+02 2.9040e+03 4.1178e+03 1.8403e+03 6.9240e+02 2.7010e+02 5.2570e+02 + 1.1510e+03 5.4720e+02 5.8280e+02 2.3232e+03 5.3344e+03 2.3988e+03 2.9570e+02 + 1.4040e+02 5.0430e+02 6.0840e+02 6.7520e+02 4.8820e+02 5.9250e+02 8.3370e+02 + 1.5617e+03 2.2001e+03 3.0050e+03 1.2710e+03 4.2950e+02 3.0780e+02 6.1600e+02 + 7.9780e+02 2.4891e+03 2.8442e+03 3.1059e+03 6.0380e+02 5.0850e+02 5.0070e+02 + 6.1680e+02 1.5071e+03 4.4516e+03 3.6238e+03 1.1633e+03 3.7450e+02 8.0180e+02 + 1.9723e+03 5.6000e+03 1.9467e+03 1.8190e+02 4.2600e+02 6.6160e+02 6.6730e+02 + 6.6090e+02 3.8756e+03 3.4968e+03 1.0649e+03 2.3400e+02 7.3040e+02 4.1100e+02 + 7.4910e+02 6.0640e+02 5.7860e+02 3.2840e+02 8.6250e+02 2.3616e+03 4.1236e+03 + 2.2053e+03 4.0760e+02 1.7380e+02 3.6350e+02 1.2020e+03 9.2760e+02 7.7940e+02 + 1.9807e+03 3.5320e+03 8.9480e+02 5.6690e+02 2.4990e+02 3.2320e+02 4.3090e+02 + 7.2300e+02 5.0670e+02 4.8420e+02 6.5290e+02 1.7838e+03 2.6899e+03 2.3007e+03 + 7.1050e+02 6.5350e+02 9.3990e+02 9.1790e+02 7.5960e+02 2.2439e+03 3.2147e+03 + 2.4191e+03 1.6300e+03 1.2188e+03 6.6280e+02 5.3660e+02 9.3030e+02 2.1217e+03 + 2.9519e+03 1.1976e+03 8.0840e+02 3.5810e+02 1.8568e+03 5.0946e+03 2.6224e+03 + 2.5750e+02 6.0860e+02 1.1416e+03 7.8270e+02 5.4630e+02 3.0364e+03 3.7104e+03 + 2.0833e+03 4.0930e+02 3.1520e+02 4.7110e+02 8.6610e+02 5.4790e+02 5.3900e+02 + 4.2970e+02 9.5970e+02 2.0547e+03 4.0273e+03 8.2220e+02 3.9750e+02 1.5830e+02 + 3.2850e+02 5.9720e+02 8.6790e+02 6.6770e+02 2.9664e+03 2.8677e+03 6.6340e+02 + 7.8470e+02 4.3060e+02 5.2230e+02 3.4140e+02 2.8360e+02 3.9400e+02 2.7450e+02 + 5.1550e+02 1.3023e+03 2.6741e+03 3.2311e+03 8.3470e+02 5.1460e+02 6.6960e+02 + 9.7150e+02 5.2860e+02 1.2879e+03 3.3930e+03 3.1120e+03 1.1466e+03 4.4090e+02 + 7.6940e+02 6.4680e+02 4.1770e+02 1.6008e+03 3.2377e+03 2.0627e+03 4.7010e+02 + 9.3810e+02 1.9812e+03 5.4399e+03 2.1882e+03 4.1410e+02 6.5410e+02 1.0037e+03 + 8.4440e+02 9.8330e+02 2.0170e+03 3.4535e+03 2.4736e+03 4.8640e+02 8.3390e+02 + 2.9680e+02 6.8630e+02 4.8240e+02 3.1300e+02 4.9580e+02 1.2061e+03 3.7454e+03 + 2.8390e+03 9.3040e+02 3.9210e+02 1.5620e+02 3.7830e+02 8.3750e+02 5.6780e+02 + 8.1460e+02 2.3166e+03 2.9798e+03 6.3120e+02 8.4850e+02 6.8890e+02 4.4820e+02 + 4.7930e+02 2.4960e+02 5.2900e+02 8.7590e+02 8.3900e+02 8.0140e+02 3.6927e+03 + 2.7166e+03 2.1417e+03 3.1030e+02 8.1420e+02 5.0210e+02 6.0960e+02 1.3113e+03 + 2.7970e+03 3.0156e+03 5.8270e+02 6.5950e+02 4.4080e+02 2.2520e+02 6.6210e+02 + 2.2230e+03 2.3944e+03 2.5257e+03 1.4783e+03 8.1860e+02 2.1294e+03 4.4285e+03 + 2.0014e+03 5.9020e+02 3.9280e+02 6.3500e+02 5.5310e+02 1.1507e+03 2.5510e+03 + 4.4663e+03 1.8999e+03 8.9630e+02 6.9620e+02 2.2040e+02 6.2880e+02 5.9580e+02 + 3.8340e+02 5.8120e+02 4.2470e+02 3.8456e+03 3.0698e+03 1.5961e+03 3.7610e+02 + 6.6760e+02 6.0010e+02 6.7860e+02 7.7690e+02 2.3330e+03 2.3906e+03 2.5312e+03 + 6.9280e+02 6.1880e+02 2.8590e+02 5.2500e+02 3.5920e+02 5.4700e+01 2.9040e+02 + 3.4860e+02 4.4060e+02 8.0690e+02 2.3499e+03 3.4861e+03 2.0006e+03 9.2990e+02 + 9.0840e+02 2.9850e+02 4.1230e+02 1.0115e+03 2.2111e+03 4.3958e+03 9.0800e+02 + 4.5770e+02 1.9660e+02 7.9880e+02 7.9400e+02 1.5751e+03 2.2565e+03 4.8726e+03 + 1.5220e+03 6.1060e+02 1.8044e+03 4.0646e+03 9.8900e+02 6.5000e+02 6.8190e+02 + 6.2010e+02 7.2630e+02 8.7040e+02 2.0475e+03 2.7338e+03 1.9328e+03 8.9180e+02 + 5.9970e+02 1.4630e+02 3.4770e+02 7.9170e+02 7.6400e+02 7.7650e+02 1.9694e+03 + 4.8780e+03 3.8742e+03 7.7380e+02 6.1060e+02 5.4240e+02 4.9050e+02 8.0430e+02 + 8.7640e+02 2.2905e+03 2.2951e+03 2.1012e+03 9.4030e+02 8.2360e+02 3.0200e+02 + 6.8980e+02 6.2990e+02 1.7590e+02 3.1400e+02 4.9060e+02 5.1500e+02 8.3140e+02 + 1.8609e+03 2.6821e+03 3.7551e+03 2.0112e+03 6.0020e+02 2.5850e+02 3.6840e+02 + 8.8630e+02 4.0887e+03 2.9728e+03 8.4740e+02 3.3890e+02 2.9270e+02 4.2060e+02 + 6.3940e+02 7.1310e+02 1.6978e+03 2.5046e+03 3.3292e+03 9.3920e+02 1.8701e+03 + 4.8098e+03 1.9660e+03 3.9690e+02 3.1840e+02 5.1380e+02 7.0890e+02 7.5850e+02 + 1.9911e+03 2.7324e+03 3.2843e+03 1.4439e+03 5.7750e+02 3.2600e+02 3.5620e+02 + 8.7940e+02 9.8560e+02 8.3450e+02 1.0449e+03 3.0660e+03 4.8489e+03 1.0126e+03 + 4.5090e+02 5.9120e+02 6.7030e+02 1.6484e+03 1.2278e+03 2.8653e+03 2.2442e+03 + 1.5030e+03 5.7310e+02 5.9320e+02 3.3290e+02 6.8080e+02 5.2500e+02 6.5270e+02 + 4.8580e+02 9.1210e+02 5.3060e+02 6.3940e+02 1.0066e+03 3.5899e+03 4.4377e+03 + 1.4149e+03 6.0720e+02 2.3230e+02 2.4700e+02 9.8570e+02 2.9835e+03 3.7215e+03 + 8.4980e+02 8.0620e+02 3.7190e+02 6.9100e+02 8.4330e+02 3.3180e+02 7.3410e+02 + 3.6630e+03 4.2464e+03 1.2598e+03 1.7360e+03 2.6391e+03 1.9392e+03 6.0900e+02 + 5.1810e+02 4.6140e+02 7.8810e+02 4.1660e+02 1.8014e+03 4.5451e+03 3.2155e+03 + 1.3950e+03 5.6210e+02 2.6020e+02 4.8130e+02 6.1100e+02 7.4350e+02 8.3680e+02 + 9.0520e+02 2.6941e+03 3.1244e+03 2.2146e+03 6.9380e+02 1.2249e+03 1.5012e+03 + 1.3647e+03 2.4870e+03 2.6296e+03 1.7956e+03 7.1630e+02 3.3290e+02 3.1800e+02 + 3.9860e+02 3.8190e+02 5.4590e+02 5.6050e+02 5.9240e+02 6.6860e+02 3.3410e+02 + 4.9220e+02 3.9520e+02 2.4710e+03 3.0943e+03 3.4064e+03 1.0660e+03 2.2400e+02 + 2.2110e+02 6.7240e+02 2.5287e+03 3.2411e+03 1.9697e+03 5.0760e+02 9.0210e+02 + 1.0799e+03 6.1970e+02 5.4820e+02 6.3200e+02 2.2762e+03 4.4499e+03 3.7986e+03 + 2.0874e+03 3.1539e+03 1.3901e+03 7.9200e+02 5.7790e+02 3.3190e+02 4.6680e+02 + 7.2010e+02 2.1287e+03 4.0967e+03 3.2754e+03 7.0650e+02 6.7650e+02 7.1210e+02 + 4.3390e+02 5.5870e+02 1.0703e+03 1.7158e+03 2.0538e+03 4.0595e+03 3.2153e+03 + 3.0555e+03 1.8474e+03 2.3781e+03 2.5840e+03 2.9718e+03 2.9055e+03 1.8460e+03 + 9.3270e+02 5.0090e+02 4.9380e+02 5.0080e+02 5.1640e+02 3.9170e+02 4.1150e+02 + 2.2360e+02 7.4070e+02 3.5950e+02 3.1200e+02 3.4540e+02 4.2420e+02 1.5590e+03 + 2.9478e+03 2.9898e+03 9.1450e+02 2.6370e+02 5.0830e+02 8.0230e+02 1.6801e+03 + 2.9515e+03 1.5118e+03 6.1250e+02 7.4550e+02 8.9370e+02 7.9610e+02 3.5760e+02 + 2.7950e+02 1.5738e+03 3.3750e+03 2.7581e+03 2.7176e+03 5.0397e+03 5.1620e+02 + 6.4420e+02 5.6250e+02 3.6210e+02 4.4700e+02 5.8210e+02 1.2117e+03 3.4717e+03 + 2.5725e+03 5.5140e+02 5.2980e+02 5.0850e+02 4.9200e+02 4.0160e+02 1.1994e+03 + 1.6281e+03 2.6101e+03 5.6000e+03 4.1509e+03 2.0272e+03 2.4782e+03 2.0671e+03 + 2.7901e+03 3.1429e+03 1.2704e+03 9.3070e+02 5.3610e+02 8.1160e+02 6.5060e+02 + 5.6360e+02 4.1460e+02 5.1820e+02 5.6870e+02 3.2050e+02 7.3170e+02 4.4390e+02 + 2.9820e+02 3.0890e+02 3.2690e+02 9.3540e+02 1.2818e+03 3.3070e+03 3.5670e+03 + 7.4070e+02 5.9030e+02 6.8820e+02 2.2372e+03 3.4554e+03 2.9756e+03 4.3560e+02 + 5.9640e+02 6.8800e+02 5.0700e+02 6.2620e+02 4.8450e+02 6.3800e+02 2.0282e+03 + 5.6000e+03 5.0180e+03 3.7914e+03 8.3360e+02 5.0380e+02 6.3660e+02 2.6260e+02 + 2.0170e+02 3.1440e+02 2.3677e+03 2.0616e+03 2.6829e+03 9.9270e+02 4.8250e+02 + 8.0360e+02 3.8820e+02 2.2112e+03 1.5210e+03 2.3232e+03 2.3185e+03 4.8628e+03 + 3.8544e+03 2.8038e+03 2.5129e+03 2.2927e+03 2.4438e+03 1.4388e+03 9.1300e+02 + 5.6520e+02 5.9270e+02 6.6910e+02 8.4420e+02 3.6990e+02 5.9540e+02 4.2860e+02 + 3.5450e+02 3.4980e+02 8.2230e+02 3.4930e+02 2.0150e+02 4.6460e+02 2.9020e+02 + 5.2730e+02 1.0358e+03 3.0553e+03 3.4474e+03 4.0130e+02 8.8510e+02 7.2730e+02 + 1.6279e+03 2.5499e+03 4.0750e+03 8.9250e+02 9.1180e+02 5.6670e+02 6.3650e+02 + 5.3290e+02 5.2860e+02 7.4890e+02 1.5913e+03 4.7814e+03 5.6000e+03 2.8247e+03 + 4.2940e+02 9.7630e+02 7.8360e+02 1.9850e+02 3.1000e+02 3.7350e+02 1.2944e+03 + 2.1363e+03 1.8948e+03 1.4061e+03 7.8560e+02 5.4660e+02 2.4724e+03 2.0019e+03 + 1.8508e+03 1.5977e+03 1.8940e+03 3.9024e+03 5.1114e+03 1.1025e+03 1.0435e+03 + 8.1130e+02 1.3905e+03 1.3373e+03 3.9380e+02 4.0670e+02 4.6130e+02 3.1110e+02 + 6.0970e+02 4.7160e+02 5.0920e+02 4.6020e+02 2.9490e+02 3.0350e+02 4.9530e+02 + 2.3770e+02 3.5220e+02 1.7910e+02 4.3270e+02 4.6060e+02 9.6840e+02 3.0210e+03 + 2.1920e+03 5.5450e+02 7.9710e+02 5.4340e+02 1.1194e+03 2.0881e+03 3.5512e+03 + 8.2450e+02 8.2880e+02 4.8390e+02 2.9350e+02 7.0550e+02 8.1620e+02 8.8270e+02 + 6.0330e+02 2.2964e+03 5.6000e+03 2.5443e+03 9.3720e+02 5.1450e+02 4.2130e+02 + 3.5170e+02 5.9940e+02 6.7340e+02 1.5813e+03 3.4333e+03 2.1288e+03 5.9770e+02 + 9.2580e+02 1.3811e+03 2.1088e+03 3.4678e+03 1.9009e+03 1.2512e+03 1.4174e+03 + 3.1287e+03 2.7960e+03 1.2609e+03 8.0620e+02 4.6270e+02 1.0756e+03 8.8840e+02 + 5.9290e+02 4.8690e+02 5.7830e+02 3.3240e+02 3.3890e+02 5.8150e+02 7.8300e+02 + 8.1820e+02 4.3430e+02 1.9100e+02 1.7710e+02 1.8530e+02 3.7410e+02 7.2930e+02 + 3.9660e+02 3.6680e+02 9.1100e+02 1.4944e+03 3.3646e+03 9.0580e+02 4.9550e+02 + 9.3590e+02 1.3316e+03 2.1352e+03 2.3751e+03 2.1401e+03 8.0900e+02 4.4720e+02 + 4.1890e+02 5.6020e+02 7.1350e+02 8.9650e+02 4.5420e+02 1.7642e+03 5.6000e+03 + 3.8249e+03 1.4173e+03 4.3010e+02 3.3070e+02 6.7860e+02 4.0200e+02 1.1125e+03 + 1.9833e+03 4.2177e+03 1.6405e+03 1.5483e+03 5.4270e+02 1.2543e+03 2.6495e+03 + 2.3234e+03 1.8570e+03 2.0990e+02 7.8460e+02 2.8262e+03 3.7460e+03 2.0933e+03 + 4.9950e+02 3.1480e+02 6.8520e+02 8.4510e+02 6.1230e+02 7.8340e+02 7.4250e+02 + 4.5610e+02 4.2210e+02 9.0840e+02 5.6420e+02 5.4430e+02 4.7110e+02 3.4550e+02 + 2.9170e+02 1.8900e+02 4.0630e+02 5.1080e+02 3.5660e+02 9.7980e+02 7.4330e+02 + 7.7290e+02 2.0446e+03 6.5850e+02 3.8300e+02 9.0320e+02 1.0214e+03 2.2901e+03 + 1.9239e+03 2.3133e+03 1.0386e+03 5.3440e+02 4.7790e+02 4.6630e+02 6.0080e+02 + 4.1170e+02 3.5670e+02 2.8511e+03 4.7635e+03 4.6858e+03 2.1300e+03 5.1790e+02 + 3.7450e+02 4.1280e+02 7.7120e+02 8.6130e+02 2.1978e+03 3.3332e+03 1.9042e+03 + 3.6660e+02 8.4040e+02 3.3113e+03 5.3338e+03 1.2054e+03 9.6540e+02 3.7990e+02 + 1.7267e+03 1.9566e+03 4.2274e+03 2.3772e+03 1.1875e+03 3.9260e+02 6.4390e+02 + 4.8720e+02 6.1550e+02 5.3430e+02 2.7580e+02 6.1380e+02 5.3750e+02 3.3450e+02 + 5.5390e+02 5.5010e+02 2.3760e+02 3.4050e+02 7.2200e+02 7.4890e+02 4.5370e+02 + 6.1770e+02 3.8500e+02 4.2080e+02 4.6470e+02 7.5620e+02 1.0218e+03 3.8060e+02 + 7.9880e+02 6.1960e+02 8.7890e+02 1.0847e+03 2.4579e+03 2.2630e+03 4.8830e+02 + 4.8530e+02 2.6460e+02 5.8880e+02 3.6490e+02 3.5440e+02 5.2520e+02 2.1172e+03 + 5.6000e+03 4.7138e+03 1.8100e+03 7.2600e+02 2.2890e+02 5.3830e+02 8.8880e+02 + 7.9250e+02 3.3721e+03 3.1590e+03 2.3273e+03 2.5310e+02 6.2080e+02 2.3692e+03 + 3.1269e+03 9.9830e+02 4.4990e+02 6.4720e+02 6.2880e+02 2.2688e+03 4.1196e+03 + 3.5604e+03 1.1780e+03 1.7440e+02 4.3430e+02 6.4910e+02 6.4960e+02 8.4640e+02 + 9.9770e+02 6.6650e+02 4.3800e+02 5.2030e+02 6.8860e+02 4.7960e+02 2.4800e+02 + 3.1600e+02 1.0245e+03 6.7950e+02 4.8990e+02 4.4500e+02 6.3980e+02 5.5730e+02 + 3.4860e+02 4.0860e+02 3.3560e+02 5.2410e+02 5.0700e+02 8.2730e+02 9.4990e+02 + 6.7890e+02 3.5614e+03 2.4866e+03 1.0206e+03 9.2100e+02 5.5840e+02 6.1640e+02 + 2.6460e+02 3.6530e+02 6.0910e+02 2.4376e+03 4.5208e+03 3.9976e+03 3.3213e+03 + 6.7500e+02 2.2060e+02 4.6480e+02 3.8480e+02 7.4290e+02 2.0752e+03 2.7957e+03 + 1.9682e+03 2.7000e+02 5.9290e+02 4.4068e+03 3.7894e+03 5.8830e+02 1.0283e+03 + 6.1830e+02 9.0850e+02 1.8499e+03 3.5985e+03 3.9177e+03 1.4379e+03 3.3080e+02 + 3.9690e+02 5.4180e+02 6.3090e+02 5.6110e+02 4.8920e+02 8.1860e+02 4.4240e+02 + 1.9210e+02 6.8420e+02 6.9260e+02 2.6040e+02 3.7280e+02 8.2060e+02 6.4440e+02 + 5.4000e+02 2.8760e+02 6.4520e+02 3.0200e+02 7.5570e+02 6.4340e+02 4.6040e+02 + 4.7530e+02 6.4030e+02 6.5620e+02 4.0090e+02 9.6560e+02 2.2481e+03 3.9177e+03 + 8.0430e+02 4.3470e+02 3.9660e+02 5.4230e+02 1.5570e+02 6.7170e+02 3.1125e+03 + 2.5650e+03 4.2963e+03 4.5988e+03 3.0047e+03 1.4265e+03 3.2970e+02 1.8750e+02 + 3.1750e+02 1.2220e+03 2.1663e+03 4.1796e+03 2.2442e+03 8.0230e+02 8.5890e+02 + 1.4250e+03 3.1961e+03 1.5779e+03 1.2447e+03 5.2890e+02 4.5480e+02 5.5860e+02 + 2.3972e+03 4.4300e+03 7.5000e+02 2.8100e+02 2.7280e+02 6.8470e+02 4.4880e+02 + 6.6010e+02 5.3450e+02 9.1780e+02 4.3320e+02 2.4670e+02 5.5250e+02 6.0110e+02 + 3.7820e+02 2.1200e+02 7.5510e+02 7.0400e+02 6.5530e+02 6.1470e+02 6.6790e+02 + 2.1770e+02 3.8010e+02 2.3130e+02 5.8490e+02 2.5890e+02 5.3220e+02 3.9050e+02 + 4.9150e+02 6.9900e+02 2.6319e+03 4.4113e+03 5.5350e+02 3.8630e+02 4.8720e+02 + 4.1940e+02 6.2100e+02 7.3400e+02 2.0103e+03 2.8079e+03 2.5653e+03 2.7804e+03 + 2.6541e+03 1.4893e+03 5.1580e+02 3.7080e+02 1.8470e+02 5.5140e+02 1.1755e+03 + 3.6437e+03 1.8677e+03 7.9930e+02 8.4070e+02 2.3035e+03 4.0110e+03 2.9763e+03 + 6.2950e+02 3.5650e+02 5.1570e+02 7.0380e+02 3.3639e+03 3.2372e+03 1.2578e+03 + 3.1100e+02 2.6960e+02 6.6760e+02 7.5030e+02 5.6780e+02 3.1440e+02 4.3570e+02 + 4.5000e+02 5.7470e+02 4.6020e+02 4.1320e+02 6.1880e+02 7.2350e+02 7.6800e+02 + 3.3840e+02 1.9310e+02 3.6960e+02 4.6840e+02 3.8990e+02 3.3050e+02 2.9480e+02 + 1.3787e+03 4.3870e+02 6.4470e+02 1.1754e+03 1.8710e+02 3.2380e+02 1.9279e+03 + 2.4765e+03 1.7320e+03 5.4770e+02 4.0180e+02 2.8250e+02 4.8750e+02 1.0688e+03 + 4.3735e+03 3.6322e+03 2.0472e+03 7.5940e+02 2.9441e+03 1.2711e+03 7.6130e+02 + 2.4530e+02 2.1510e+02 3.9340e+02 1.3244e+03 3.4008e+03 1.8101e+03 5.3380e+02 + 7.0640e+02 1.8373e+03 4.9640e+03 2.6830e+03 8.3300e+02 9.5570e+02 5.2630e+02 + 5.2040e+02 2.4233e+03 3.0344e+03 1.5282e+03 5.7480e+02 6.0860e+02 6.0620e+02 + 7.8360e+02 4.1410e+02 3.4230e+02 5.8880e+02 6.3700e+02 3.3420e+02 3.7040e+02 + 6.7450e+02 9.9770e+02 1.4554e+03 6.6540e+02 2.7630e+02 2.9090e+02 3.2120e+02 + 4.9290e+02 4.2250e+02 2.3340e+02 5.4790e+02 3.3120e+02 2.5510e+02 5.0250e+02 + 3.7490e+02 2.5070e+02 5.6800e+02 2.3676e+03 2.1249e+03 4.4020e+02 3.6560e+02 + 2.7810e+02 3.7790e+02 9.3960e+02 2.3758e+03 4.5228e+03 2.1015e+03 1.3161e+03 + 1.4550e+03 2.4389e+03 3.8071e+03 1.7897e+03 9.0300e+02 3.0050e+02 4.0040e+02 + 1.0480e+03 4.3574e+03 2.1365e+03 4.8790e+02 6.4280e+02 1.0086e+03 3.1573e+03 + 2.1310e+03 8.4640e+02 5.9980e+02 4.3990e+02 3.9090e+02 1.8756e+03 3.5676e+03 + 2.1197e+03 4.9490e+02 7.7250e+02 9.8030e+02 6.5480e+02 2.4090e+02 2.9980e+02 + 4.8460e+02 6.1230e+02 4.1380e+02 5.5700e+02 5.0820e+02 7.4810e+02 6.1240e+02 + 8.8920e+02 3.0970e+02 3.1040e+02 4.7170e+02 8.5740e+02 3.9900e+02 1.1780e+02 + 6.0190e+02 4.0270e+02 5.9360e+02 2.6010e+02 4.7100e+02 4.1640e+02 1.9614e+03 + 2.7327e+03 3.3623e+03 1.1316e+03 4.7650e+02 3.3220e+02 3.0180e+02 1.0317e+03 + 3.8981e+03 3.3785e+03 1.9945e+03 2.5530e+02 9.6310e+02 3.0347e+03 2.7413e+03 + 2.0322e+03 6.5000e+02 3.3020e+02 7.8760e+02 8.5190e+02 4.7068e+03 2.4841e+03 + 3.9330e+02 5.4400e+02 1.2461e+03 3.3313e+03 3.7675e+03 2.0808e+03 1.5630e+03 + 8.0400e+02 5.0250e+02 8.8950e+02 2.7223e+03 2.8309e+03 8.6060e+02 6.2140e+02 + 6.6280e+02 6.8440e+02 2.9110e+02 3.8590e+02 3.6850e+02 5.2480e+02 8.2630e+02 + 5.4640e+02 5.5500e+02 2.5880e+02 5.1450e+02 2.3570e+02 4.5050e+02 3.6650e+02 + 6.7410e+02 6.4040e+02 8.4100e+02 6.3540e+02 7.5610e+02 5.3720e+02 4.5560e+02 + 3.5070e+02 4.3430e+02 7.2840e+02 1.7025e+03 2.8643e+03 2.1840e+03 5.4480e+02 + 6.2240e+02 2.5240e+02 3.3590e+02 2.3016e+03 3.5415e+03 3.2224e+03 1.3935e+03 + 2.2070e+02 5.1430e+02 2.0753e+03 2.7110e+03 2.3529e+03 4.4310e+02 2.3390e+02 + 5.5840e+02 2.1250e+03 2.8460e+03 2.0948e+03 3.0510e+02 2.6450e+02 8.5500e+02 + 1.9805e+03 1.9477e+03 2.2676e+03 2.5408e+03 1.7766e+03 9.0850e+02 1.7325e+03 + 1.9615e+03 3.4192e+03 3.0899e+03 6.0010e+02 3.6510e+02 5.5020e+02 4.0480e+02 + 3.5470e+02 4.0000e+02 3.8520e+02 7.5390e+02 9.2650e+02 5.4150e+02 4.7560e+02 + 2.8920e+02 2.0600e+02 2.5210e+02 3.7650e+02 1.0444e+03 7.6090e+02 5.2540e+02 + 7.4600e+02 5.4600e+02 5.3990e+02 5.9130e+02 4.9060e+02 5.9950e+02 5.0550e+02 + 2.5382e+03 4.0463e+03 1.3636e+03 4.4480e+02 7.2130e+02 2.3760e+02 2.9990e+02 + 3.4360e+03 3.2261e+03 1.3350e+03 3.8160e+02 4.0540e+02 5.1760e+02 1.5241e+03 + 2.3101e+03 3.8768e+03 8.8820e+02 3.0500e+02 3.2940e+02 1.5330e+03 2.3715e+03 + 3.0642e+03 1.3027e+03 3.8960e+02 5.5550e+02 7.4280e+02 8.6500e+02 2.2892e+03 + 2.9668e+03 2.1227e+03 2.1262e+03 2.3233e+03 2.0065e+03 2.6776e+03 3.7655e+03 + 1.8742e+03 9.2840e+02 5.8000e+02 3.3600e+02 3.2180e+02 4.6280e+02 3.5390e+02 + 4.7640e+02 8.8910e+02 5.9050e+02 5.1880e+02 4.0230e+02 1.5940e+02 3.9530e+02 + 5.1240e+02 6.2200e+02 5.8510e+02 4.2980e+02 1.1310e+03 1.1841e+03 3.9780e+02 + 2.9790e+02 8.1320e+02 5.4630e+02 1.3129e+03 2.4501e+03 3.4704e+03 9.5430e+02 + 5.9080e+02 6.3450e+02 5.7680e+02 2.3391e+03 4.1954e+03 2.0365e+03 4.2350e+02 + 3.6130e+02 3.0600e+02 3.2460e+02 3.6520e+02 2.0500e+03 2.7714e+03 8.2580e+02 + 4.6070e+02 2.9510e+02 1.3191e+03 1.8715e+03 3.2301e+03 8.1830e+02 1.5327e+03 + 2.3070e+02 7.2620e+02 1.4376e+03 1.9528e+03 2.2404e+03 2.3945e+03 2.3644e+03 + 2.2154e+03 2.1324e+03 2.4684e+03 2.8896e+03 1.9439e+03 7.0780e+02 5.2270e+02 + 3.9990e+02 9.5000e+01 3.7760e+02 2.1150e+02 6.4470e+02 7.2510e+02 4.6590e+02 + 2.0370e+02 2.1320e+02 3.8100e+02 5.7970e+02 4.3840e+02 5.6320e+02 6.5830e+02 + 5.3330e+02 3.6420e+02 7.0110e+02 5.2270e+02 4.4090e+02 1.0055e+03 1.5177e+03 + 9.8820e+02 3.2555e+03 1.9358e+03 7.1470e+02 3.4740e+02 3.1280e+02 4.0380e+02 + 2.3504e+03 4.3435e+03 2.2169e+03 2.7940e+02 2.8170e+02 3.6250e+02 4.8890e+02 + 1.0775e+03 1.9237e+03 4.5644e+03 3.0441e+03 6.1670e+02 3.7750e+02 9.1560e+02 + 1.9792e+03 3.1169e+03 2.7328e+03 5.5010e+02 9.3000e+01 3.9770e+02 3.6810e+02 + 7.6770e+02 8.2530e+02 1.4671e+03 2.8183e+03 3.3390e+03 2.1711e+03 4.3718e+03 + 5.6000e+03 3.4498e+03 7.0250e+02 3.7870e+02 2.4740e+02 5.2930e+02 5.3930e+02 + 2.5570e+02 2.9600e+02 5.6920e+02 2.8830e+02 2.7090e+02 5.6820e+02 6.6300e+02 + 4.7460e+02 4.0200e+02 4.6420e+02 5.2660e+02 4.2420e+02 2.1670e+02 4.5180e+02 + 5.9490e+02 6.2240e+02 6.7110e+02 1.2657e+03 3.4589e+03 2.2985e+03 1.7157e+03 + 3.0000e+02 3.7170e+02 3.4450e+02 1.6056e+03 3.8813e+03 2.2547e+03 1.1920e+03 + 6.6080e+02 2.3390e+02 2.9180e+02 4.6490e+02 3.2290e+02 7.7850e+02 4.5795e+03 + 3.5552e+03 6.0070e+02 6.1170e+02 6.1210e+02 1.1695e+03 2.0005e+03 3.4185e+03 + 2.0123e+03 3.5830e+02 4.7640e+02 4.6120e+02 7.0140e+02 5.6950e+02 4.9480e+02 + 9.8940e+02 1.9663e+03 3.2534e+03 5.0018e+03 4.9647e+03 4.4898e+03 1.1117e+03 + 9.3370e+02 3.7090e+02 5.5420e+02 8.0620e+02 4.4480e+02 3.2560e+02 3.7510e+02 + 6.9900e+02 3.1910e+02 4.9420e+02 4.5170e+02 7.2040e+02 6.9400e+02 2.6830e+02 + 4.6890e+02 9.7480e+02 4.2180e+02 6.4640e+02 9.1310e+02 6.5290e+02 6.5780e+02 + 2.5348e+03 2.7061e+03 2.2996e+03 5.8050e+02 7.1980e+02 3.9770e+02 2.3880e+02 + 2.2061e+03 2.4184e+03 1.5463e+03 1.3213e+03 4.4350e+02 4.7010e+02 4.0590e+02 + 4.2910e+02 4.6830e+02 8.7390e+02 2.2654e+03 4.2551e+03 1.1871e+03 5.5740e+02 + 5.1840e+02 6.4580e+02 1.8154e+03 4.9692e+03 3.5154e+03 1.9870e+02 7.7790e+02 + 4.6750e+02 5.5680e+02 6.2970e+02 3.0370e+02 4.6750e+02 7.6760e+02 1.7380e+03 + 3.2325e+03 3.0911e+03 5.6000e+03 3.4925e+03 6.1100e+02 4.5190e+02 8.3430e+02 + 8.1360e+02 4.4000e+02 4.1210e+02 3.4160e+02 5.7260e+02 5.8110e+02 6.0030e+02 + 5.8700e+02 1.0685e+03 7.7530e+02 3.2210e+02 5.8470e+02 5.0530e+02 2.5990e+02 + 3.6560e+02 6.4010e+02 5.1590e+02 7.5860e+02 2.1181e+03 3.4841e+03 1.8295e+03 + 8.1280e+02 5.6240e+02 4.1980e+02 5.6230e+02 3.7804e+03 3.9044e+03 1.5008e+03 + 2.2810e+02 7.4510e+02 7.3170e+02 6.1400e+02 2.7250e+02 3.1270e+02 6.6710e+02 + 1.4137e+03 4.2865e+03 2.3780e+03 3.8630e+02 5.0570e+02 3.9230e+02 1.3448e+03 + 4.2766e+03 3.0285e+03 2.6032e+03 1.3016e+03 4.7500e+02 4.6800e+02 4.0630e+02 + 6.1190e+02 5.5070e+02 3.6780e+02 6.2160e+02 1.7177e+03 2.8322e+03 3.7791e+03 + 4.2534e+03 2.1138e+03 5.7860e+02 7.6000e+02 5.3500e+02 3.2140e+02 2.0270e+02 + 3.7870e+02 7.1940e+02 7.4150e+02 3.9530e+02 6.2700e+02 5.8970e+02 4.5420e+02 + 4.7160e+02 6.5680e+02 1.0327e+03 4.9620e+02 3.9090e+02 1.0281e+03 6.2680e+02 + 6.4810e+02 3.9554e+03 2.8312e+03 6.9480e+02 5.0740e+02 4.0640e+02 2.0760e+02 + 5.0930e+02 1.9760e+03 4.2520e+03 8.5160e+02 2.5900e+02 6.2760e+02 8.0280e+02 + 5.5930e+02 2.2990e+02 5.9340e+02 6.0790e+02 7.6380e+02 3.4986e+03 2.8589e+03 + 7.8320e+02 2.6230e+02 5.1780e+02 7.2860e+02 2.2694e+03 3.6135e+03 3.4611e+03 + 1.6695e+03 8.3560e+02 5.0990e+02 3.5180e+02 6.9330e+02 6.0230e+02 5.1180e+02 + 5.6350e+02 1.0919e+03 1.8943e+03 5.5005e+03 5.6000e+03 2.8589e+03 9.7380e+02 + 9.1740e+02 6.3900e+02 3.4760e+02 1.8410e+02 3.2030e+02 7.2100e+02 6.5290e+02 + 3.5880e+02 5.7800e+02 9.7500e+02 4.8190e+02 6.9590e+02 9.0280e+02 9.3120e+02 + 3.3390e+02 4.5760e+02 5.1250e+02 6.7010e+02 1.4667e+03 3.6846e+03 1.4758e+03 + 1.6483e+03 5.8570e+02 5.6820e+02 3.6440e+02 5.1060e+02 3.9253e+03 3.7297e+03 + 2.1474e+03 3.3840e+02 4.8280e+02 3.1310e+02 5.7460e+02 2.7810e+02 3.8330e+02 + 3.5840e+02 1.0955e+03 2.3468e+03 3.9418e+03 4.0380e+02 3.2800e+02 5.3500e+02 + 5.6190e+02 1.8118e+03 2.1099e+03 2.8980e+03 2.1554e+03 1.5819e+03 4.4210e+02 + 2.0240e+02 6.2230e+02 5.0590e+02 4.1350e+02 2.9190e+02 6.5310e+02 1.9487e+03 + 4.4051e+03 3.5606e+03 5.1111e+03 2.0833e+03 7.2220e+02 6.0910e+02 3.1710e+02 + 1.4950e+02 3.6260e+02 5.2330e+02 6.4730e+02 7.3300e+02 8.2910e+02 4.6180e+02 + 5.8690e+02 4.9970e+02 3.9470e+02 4.8060e+02 4.1150e+02 6.2520e+02 1.9813e+03 + 1.6409e+03 3.1763e+03 2.8984e+03 1.9288e+03 9.1850e+02 4.6780e+02 5.0970e+02 + 3.5030e+02 1.9433e+03 3.3736e+03 2.3382e+03 1.7531e+03 6.9870e+02 3.0220e+02 + 2.2110e+02 4.1400e+02 2.9210e+02 6.7510e+02 4.0890e+02 5.0540e+02 2.4590e+03 + 3.2437e+03 1.9969e+03 5.5640e+02 4.1510e+02 5.6190e+02 3.1810e+02 1.4581e+03 + 2.5397e+03 2.3221e+03 2.3294e+03 5.3200e+02 2.6030e+02 7.2810e+02 4.3260e+02 + 3.4810e+02 5.8360e+02 5.9370e+02 1.1411e+03 2.9996e+03 3.1769e+03 2.9633e+03 + 3.5838e+03 6.5290e+02 4.5030e+02 6.1730e+02 3.5650e+02 9.5010e+02 9.2110e+02 + 3.2020e+02 5.3570e+02 7.7040e+02 2.4880e+02 9.3340e+02 3.6950e+02 1.9260e+02 + 3.8240e+02 6.6100e+02 5.2130e+02 2.3486e+03 2.1627e+03 2.3668e+03 3.0077e+03 + 1.7843e+03 5.7510e+02 4.0720e+02 5.2060e+02 5.4310e+02 2.1715e+03 2.9724e+03 + 3.7373e+03 1.2496e+03 9.6840e+02 1.4930e+02 2.9320e+02 4.3430e+02 3.7560e+02 + 6.4280e+02 3.9860e+02 2.7960e+02 1.4362e+03 3.1184e+03 3.2623e+03 8.5550e+02 + 6.1740e+02 4.2300e+02 5.6480e+02 1.1598e+03 1.3549e+03 2.1546e+03 3.6262e+03 + 1.1047e+03 4.0480e+02 6.7640e+02 8.0320e+02 5.7950e+02 3.9700e+02 4.7380e+02 + 2.3934e+03 1.9804e+03 4.0111e+03 2.1718e+03 3.7994e+03 1.2701e+03 4.7250e+02 + 9.6040e+02 7.2830e+02 5.2130e+02 4.6340e+02 4.5330e+02 5.9960e+02 6.1740e+02 + 4.3060e+02 4.8230e+02 5.0550e+02 4.2690e+02 4.4830e+02 2.6670e+02 1.0981e+03 + 1.9976e+03 1.4107e+03 3.0417e+03 3.2362e+03 4.2250e+02 4.0150e+02 4.1060e+02 + 6.0690e+02 7.8410e+02 2.9956e+03 4.5571e+03 3.6399e+03 1.6886e+03 1.1679e+03 + 4.1130e+02 7.1510e+02 4.1930e+02 2.9510e+02 4.4070e+02 4.0190e+02 2.6640e+02 + 8.3850e+02 2.8804e+03 3.3528e+03 2.1846e+03 9.4550e+02 3.9020e+02 7.9950e+02 + 4.6590e+02 1.3965e+03 2.2040e+03 3.1678e+03 2.1411e+03 6.9000e+02 9.7120e+02 + 1.0130e+03 5.3020e+02 3.6040e+02 3.2850e+02 1.9771e+03 3.0541e+03 2.8299e+03 + 3.8319e+03 3.8811e+03 2.4640e+03 7.3420e+02 1.0464e+03 4.9450e+02 4.4460e+02 + 6.0120e+02 3.7410e+02 4.7440e+02 3.9350e+02 2.2570e+02 6.1440e+02 7.1540e+02 + 3.9580e+02 4.9370e+02 9.0040e+02 2.0064e+03 3.9598e+03 3.6760e+03 3.2836e+03 + 2.3680e+03 3.4560e+02 2.6580e+02 5.9830e+02 4.7560e+02 5.5490e+02 2.4970e+03 + 2.5606e+03 2.5132e+03 1.9615e+03 1.1008e+03 3.7570e+02 7.9200e+02 7.6380e+02 + 4.9100e+02 2.8980e+02 1.3460e+02 4.3600e+02 8.0920e+02 2.0224e+03 3.3940e+03 + 2.2074e+03 8.4110e+02 4.8080e+02 2.9440e+02 4.4470e+02 1.2140e+03 1.9259e+03 + 3.4716e+03 2.5573e+03 2.0771e+03 1.5438e+03 5.8400e+02 3.0060e+02 1.9350e+02 + 3.8400e+02 2.0329e+03 2.6230e+03 2.1343e+03 3.1540e+03 3.0660e+03 2.4364e+03 + 7.7800e+02 6.3750e+02 4.6660e+02 5.5250e+02 8.7930e+02 9.6750e+02 8.0400e+02 + 5.5540e+02 8.8170e+02 3.2340e+02 2.9130e+02 6.4700e+02 5.9760e+02 6.7030e+02 + 2.2257e+03 2.6533e+03 4.0805e+03 3.4894e+03 2.2973e+03 2.1960e+02 4.0380e+02 + 4.0890e+02 7.8570e+02 6.5760e+02 1.8827e+03 3.6545e+03 1.9488e+03 9.6200e+02 + 6.4130e+02 4.3070e+02 4.7770e+02 6.7100e+02 2.6800e+02 3.9050e+02 3.3220e+02 + 4.6020e+02 7.2980e+02 2.8694e+03 3.7438e+03 1.8014e+03 9.1140e+02 7.5710e+02 + 3.8900e+02 4.5980e+02 9.6970e+02 8.1540e+02 2.3267e+03 2.5806e+03 2.6000e+03 + 2.1194e+03 7.2310e+02 1.0710e+02 1.4450e+02 2.9420e+02 2.6947e+03 2.9674e+03 + 2.1212e+03 2.7144e+03 3.1362e+03 2.6436e+03 8.8510e+02 6.4200e+02 5.5020e+02 + 5.4610e+02 6.9040e+02 4.4480e+02 2.1790e+02 2.7190e+02 9.8960e+02 6.9930e+02 + 1.5770e+02 1.9070e+02 1.2322e+03 1.0380e+03 1.9947e+03 3.8011e+03 4.0867e+03 + 4.5271e+03 7.7520e+02 4.1070e+02 3.9260e+02 4.9400e+02 7.7770e+02 8.3820e+02 + 9.1500e+02 3.5825e+03 2.4010e+03 7.4810e+02 5.4940e+02 9.5990e+02 1.2736e+03 + 5.2150e+02 3.6910e+02 4.6000e+02 2.3800e+02 3.2990e+02 5.8150e+02 2.1065e+03 + 3.6924e+03 1.9133e+03 9.4690e+02 2.5200e+02 9.4400e+01 6.3580e+02 8.2000e+02 + 6.3960e+02 6.3700e+02 1.3205e+03 3.1849e+03 2.4321e+03 1.2395e+03 2.3180e+02 + 2.8100e+02 8.3780e+02 2.4519e+03 2.9069e+03 1.1226e+03 3.1089e+03 3.2872e+03 + 1.5989e+03 6.6440e+02 4.1890e+02 3.5340e+02 5.1070e+02 5.9520e+02 4.4310e+02 + 2.4490e+02 6.3030e+02 6.8420e+02 4.3090e+02 1.8790e+02 2.5200e+02 5.8550e+02 + 1.1451e+03 1.8349e+03 3.2201e+03 3.3986e+03 3.3585e+03 1.3296e+03 7.3330e+02 + 5.8750e+02 2.2310e+02 5.4620e+02 8.3400e+02 1.0584e+03 2.9325e+03 1.9670e+03 + 6.4670e+02 6.6640e+02 8.0700e+02 8.7200e+02 3.1550e+02 2.2180e+02 3.4100e+02 + 3.1100e+02 3.1850e+02 1.1081e+03 1.9896e+03 2.3962e+03 1.4890e+03 4.2100e+02 + 5.0840e+02 2.2660e+02 3.8620e+02 5.3600e+02 4.1360e+02 6.6960e+02 6.6670e+02 + 2.7898e+03 3.3369e+03 2.3913e+03 3.2770e+02 4.0150e+02 1.5996e+03 3.1517e+03 + 2.9418e+03 1.8366e+03 2.0372e+03 4.3076e+03 2.1828e+03 6.2430e+02 2.6980e+02 + 2.2280e+02 5.5200e+02 4.0190e+02 1.2760e+02 8.7100e+01 4.8070e+02 2.7620e+02 + 6.8630e+02 4.0470e+02 3.3700e+02 4.0830e+02 6.1730e+02 1.9867e+03 3.3781e+03 + 2.1644e+03 3.7055e+03 8.4330e+02 7.5190e+02 6.0990e+02 2.4890e+02 2.1020e+02 + 4.8220e+02 4.5670e+02 2.3507e+03 2.0526e+03 2.9570e+02 4.9370e+02 6.2120e+02 + 1.2381e+03 3.7220e+02 2.5440e+02 4.7680e+02 6.2560e+02 4.2410e+02 1.1039e+03 + 1.5794e+03 4.0256e+03 2.2715e+03 8.2850e+02 8.4290e+02 5.9030e+02 4.5020e+02 + 8.4440e+02 5.8890e+02 3.7390e+02 2.9440e+02 2.0032e+03 4.8870e+03 2.9050e+03 + 4.3870e+02 7.7810e+02 6.3700e+02 4.7171e+03 2.3184e+03 1.2456e+03 2.3497e+03 + 3.4227e+03 1.4722e+03 5.0340e+02 8.4480e+02 4.0750e+02 6.0730e+02 4.8130e+02 + 4.1870e+02 5.7500e+02 6.2790e+02 7.2940e+02 4.7350e+02 4.6820e+02 4.2550e+02 + 2.8780e+02 1.0401e+03 2.3522e+03 2.5905e+03 3.5975e+03 3.2759e+03 2.0251e+03 + 6.2940e+02 3.9170e+02 2.7520e+02 2.4230e+02 1.5200e+02 5.5310e+02 1.7763e+03 + 2.8197e+03 4.9720e+02 3.2200e+02 9.7830e+02 2.0800e+02 5.4770e+02 3.9840e+02 + 5.7290e+02 5.4960e+02 3.6550e+02 5.2550e+02 2.1893e+03 3.5037e+03 2.0037e+03 + 7.4570e+02 6.2040e+02 4.1340e+02 4.6410e+02 8.9250e+02 2.9720e+02 2.4100e+02 + 3.1020e+02 7.6280e+02 4.6931e+03 3.6534e+03 1.2439e+03 1.0059e+03 2.1555e+03 + 3.4661e+03 2.0180e+03 8.9150e+02 4.1398e+03 2.4035e+03 4.8770e+02 8.9460e+02 + 5.7830e+02 3.9760e+02 5.6430e+02 5.0050e+02 2.8210e+02 4.8660e+02 3.4940e+02 + 1.0601e+03 4.1560e+02 4.1240e+02 4.1410e+02 3.2930e+02 4.1700e+02 3.5019e+03 + 2.3409e+03 2.5429e+03 5.2804e+03 7.1460e+02 7.3170e+02 6.5910e+02 4.3790e+02 + 3.6250e+02 2.1490e+02 2.0160e+02 9.3520e+02 2.9915e+03 1.6208e+03 3.8120e+02 + 4.3390e+02 5.3410e+02 1.7270e+02 4.7400e+02 6.6180e+02 7.1890e+02 4.6180e+02 + 6.7150e+02 1.7019e+03 2.3611e+03 1.8547e+03 5.4750e+02 7.6690e+02 7.2880e+02 + 8.1780e+02 5.6570e+02 4.1420e+02 9.2380e+02 2.5300e+02 8.1620e+02 2.5695e+03 + 2.8110e+03 2.8182e+03 1.8239e+03 3.2673e+03 2.4037e+03 2.0856e+03 1.3037e+03 + 4.2388e+03 3.3650e+03 1.2452e+03 7.1510e+02 6.2530e+02 4.9630e+02 4.4010e+02 + 4.8120e+02 7.1730e+02 8.0860e+02 4.8200e+02 7.3010e+02 4.5780e+02 2.9960e+02 + 5.4230e+02 6.3340e+02 1.5280e+03 3.0932e+03 2.0061e+03 2.6204e+03 4.8131e+03 + 8.3650e+02 3.4050e+02 3.0910e+02 8.4650e+02 1.0195e+03 3.7520e+02 2.5050e+02 + 1.7230e+03 4.0421e+03 2.3757e+03 2.6590e+02 6.9590e+02 7.3610e+02 2.9250e+02 + 5.1170e+02 7.0860e+02 7.1940e+02 4.1300e+02 1.1673e+03 2.0717e+03 3.9806e+03 + 1.7098e+03 4.9690e+02 4.6180e+02 2.8680e+02 6.9720e+02 4.9340e+02 4.3200e+02 + 3.5060e+02 3.5350e+02 7.5850e+02 2.2132e+03 3.5934e+03 2.5373e+03 2.3007e+03 + 3.0895e+03 1.9796e+03 1.5977e+03 1.6372e+03 2.1106e+03 2.6597e+03 3.9500e+02 + 4.5590e+02 8.9290e+02 5.0250e+02 3.4820e+02 7.2950e+02 6.2290e+02 4.4850e+02 + 7.5460e+02 8.1190e+02 9.0420e+02 7.0170e+02 5.0070e+02 6.4850e+02 1.2543e+03 + 3.4352e+03 2.0537e+03 2.2364e+03 3.2374e+03 2.3763e+03 2.7570e+02 2.4610e+02 + 8.5450e+02 8.7790e+02 9.7210e+02 3.0380e+02 8.0080e+02 4.2133e+03 3.5896e+03 + 2.6410e+02 7.2320e+02 4.4540e+02 2.7590e+02 3.1630e+02 6.2420e+02 1.2175e+03 + 4.5210e+02 4.5440e+02 3.3773e+03 4.0449e+03 9.6220e+02 3.7930e+02 6.7710e+02 + 5.9000e+02 4.8490e+02 4.0930e+02 2.9530e+02 7.0440e+02 7.3650e+02 4.7710e+02 + 7.0900e+02 2.0301e+03 4.0187e+03 2.3764e+03 2.9552e+03 1.8091e+03 7.5850e+02 + 1.9630e+03 3.7620e+03 4.1385e+03 3.5080e+02 4.3970e+02 6.5080e+02 5.9420e+02 + 3.2680e+02 6.1820e+02 2.6080e+02 3.5730e+02 7.6170e+02 5.3620e+02 3.6220e+02 + 1.4598e+03 7.7270e+02 4.7300e+02 1.8446e+03 2.7445e+03 2.3072e+03 2.1930e+03 + 4.1019e+03 1.0482e+03 4.7980e+02 1.6680e+02 4.4470e+02 7.8220e+02 7.4480e+02 + 6.7150e+02 9.3850e+02 2.4783e+03 2.3414e+03 1.3967e+03 4.9370e+02 5.0990e+02 + 3.5070e+02 4.3480e+02 5.2060e+02 4.0360e+02 3.9170e+02 2.0382e+03 4.5441e+03 + 2.8487e+03 8.3790e+02 7.4040e+02 8.4330e+02 5.7510e+02 8.0110e+02 3.9590e+02 + 5.5770e+02 5.9380e+02 7.8820e+02 6.6840e+02 1.5698e+03 2.8472e+03 5.2859e+03 + 3.5709e+03 3.0956e+03 1.0535e+03 6.0520e+02 1.0908e+03 4.0596e+03 2.2567e+03 + 4.8140e+02 4.1360e+02 4.4650e+02 3.5150e+02 5.6290e+02 3.4070e+02 3.5580e+02 + 4.2380e+02 4.9630e+02 6.3050e+02 5.6700e+02 9.5910e+02 9.3040e+02 4.5720e+02 + 1.4372e+03 4.2550e+03 2.3942e+03 3.1012e+03 4.2957e+03 2.0986e+03 4.2370e+02 + 2.4670e+02 3.1310e+02 5.5590e+02 6.2390e+02 8.2840e+02 7.8960e+02 1.8098e+03 + 3.2198e+03 4.4540e+03 1.4766e+03 3.7500e+02 3.1730e+02 7.7420e+02 5.6340e+02 + 4.6000e+02 7.5920e+02 2.3958e+03 3.0599e+03 3.0490e+03 9.0040e+02 7.2280e+02 + 4.6990e+02 6.3880e+02 5.1390e+02 3.9070e+02 3.8120e+02 4.4690e+02 6.1490e+02 + 6.9050e+02 2.8450e+02 3.7612e+03 4.7357e+03 5.6000e+03 1.8620e+03 5.9390e+02 + 6.4150e+02 1.2610e+03 4.0155e+03 2.2663e+03 1.0195e+03 4.6060e+02 4.5090e+02 + 3.3730e+02 5.5520e+02 4.6030e+02 3.1390e+02 2.7040e+02 4.4000e+02 8.1930e+02 + 4.8700e+02 4.4090e+02 5.5980e+02 4.8860e+02 9.6410e+02 3.2303e+03 4.3771e+03 + 9.4750e+02 4.4259e+03 2.0192e+03 2.9090e+02 2.8670e+02 3.3940e+02 6.7280e+02 + 5.6220e+02 9.0780e+02 8.7840e+02 1.6910e+03 1.9409e+03 5.3394e+03 1.8112e+03 + 4.4890e+02 6.8170e+02 5.4390e+02 9.1450e+02 3.5530e+02 4.0140e+02 1.8047e+03 + 5.2266e+03 3.4437e+03 1.0444e+03 4.8520e+02 3.2730e+02 5.0990e+02 7.4970e+02 + 4.7400e+02 3.9600e+02 7.6860e+02 8.6360e+02 3.1840e+02 5.6200e+02 1.8844e+03 + 5.6000e+03 4.3878e+03 1.2659e+03 3.9340e+02 8.4090e+02 2.6937e+03 2.7384e+03 + 2.7087e+03 1.5134e+03 5.1940e+02 4.6820e+02 2.9280e+02 3.5960e+02 2.5570e+02 + 2.0980e+02 2.1030e+02 4.3880e+02 8.2450e+02 3.5760e+02 2.8160e+02 3.7910e+02 + 4.9280e+02 7.1430e+02 1.9902e+03 3.0879e+03 2.5710e+03 4.2430e+03 3.2822e+03 + 3.3370e+02 2.4910e+02 1.6910e+02 3.3730e+02 7.0260e+02 5.9350e+02 5.9170e+02 + 4.3060e+02 1.6567e+03 4.1887e+03 3.4245e+03 8.7540e+02 5.6440e+02 5.8420e+02 + 3.6670e+02 2.2520e+02 4.8680e+02 3.1650e+03 3.6070e+03 2.2573e+03 8.6790e+02 + 3.4380e+02 4.9000e+02 5.9290e+02 8.0780e+02 6.9060e+02 2.6540e+02 4.9640e+02 + 9.8880e+02 9.2940e+02 4.5150e+02 3.5389e+03 5.2038e+03 5.6000e+03 1.1619e+03 + 6.3710e+02 4.5800e+02 1.3219e+03 2.8653e+03 4.1208e+03 2.1707e+03 8.5730e+02 + 4.9990e+02 2.9180e+02 7.3230e+02 9.9880e+02 5.1840e+02 7.6580e+02 5.2480e+02 + 4.5150e+02 5.2530e+02 7.6580e+02 4.9460e+02 3.2570e+02 5.6250e+02 1.2405e+03 + 2.4798e+03 1.1868e+03 4.5396e+03 2.1956e+03 6.1140e+02 4.1890e+02 4.7220e+02 + 5.8750e+02 5.3990e+02 5.2020e+02 5.2410e+02 2.2530e+02 1.5328e+03 2.2024e+03 + 3.0006e+03 1.1296e+03 5.8670e+02 4.2440e+02 3.1410e+02 3.5100e+02 1.2980e+03 + 4.1298e+03 3.6165e+03 2.2620e+03 7.6570e+02 5.0600e+02 5.6080e+02 5.4160e+02 + 4.4250e+02 1.6300e+02 1.6240e+02 5.8960e+02 4.8640e+02 4.4570e+02 8.3630e+02 + 4.0681e+03 4.8180e+03 5.0492e+03 7.4650e+02 4.3580e+02 3.3190e+02 9.8370e+02 + 1.9716e+03 3.3890e+03 1.4115e+03 8.2550e+02 6.0880e+02 1.3200e+02 5.4550e+02 + 7.3140e+02 1.0139e+03 3.0680e+02 7.1830e+02 4.5500e+02 5.1220e+02 9.8350e+02 + 4.4360e+02 3.7920e+02 3.5900e+02 1.2509e+03 3.2806e+03 1.5594e+03 3.0531e+03 + 4.0684e+03 1.1586e+03 5.0890e+02 6.7370e+02 4.5270e+02 6.1230e+02 7.2960e+02 + 3.5720e+02 5.0880e+02 7.4640e+02 1.0727e+03 3.4088e+03 2.1318e+03 3.8240e+02 + 4.4880e+02 3.1820e+02 6.1890e+02 1.9333e+03 4.6458e+03 2.3263e+03 1.3788e+03 + 1.0515e+03 5.4330e+02 2.7900e+02 2.4220e+02 4.2230e+02 5.3360e+02 4.2440e+02 + 5.0400e+02 3.9460e+02 2.7980e+02 2.3492e+03 4.4852e+03 4.9028e+03 2.3561e+03 + 1.0851e+03 3.7820e+02 4.0920e+02 3.2020e+02 1.8904e+03 4.5258e+03 2.5781e+03 + 1.0132e+03 5.4380e+02 2.5670e+02 5.9720e+02 5.7430e+02 5.9460e+02 4.1920e+02 + 3.3050e+02 3.7820e+02 7.4810e+02 7.8160e+02 5.4670e+02 6.5740e+02 4.5190e+02 + 6.3590e+02 3.2333e+03 1.1291e+03 2.8727e+03 3.1948e+03 1.0059e+03 3.7550e+02 + 4.9420e+02 1.0182e+03 6.7580e+02 6.4510e+02 4.1950e+02 4.4940e+02 4.5790e+02 + 1.1331e+03 2.3591e+03 3.8489e+03 8.3480e+02 5.1160e+02 4.6730e+02 6.7440e+02 + 3.2988e+03 3.1506e+03 1.8820e+03 1.0997e+03 5.9430e+02 6.9500e+02 4.9970e+02 + 2.9050e+02 4.0220e+02 3.3680e+02 3.4420e+02 2.9440e+02 2.7440e+02 3.0740e+02 + 3.6279e+03 5.0868e+03 4.0088e+03 2.3838e+03 5.6240e+02 5.0750e+02 4.1260e+02 + 3.9850e+02 1.5116e+03 2.9242e+03 2.0921e+03 1.0997e+03 5.8000e+02 5.6170e+02 + 7.2110e+02 1.2426e+03 7.7340e+02 4.8180e+02 3.1690e+02 4.1510e+02 8.5020e+02 + 4.6850e+02 3.1690e+02 4.8530e+02 4.0500e+02 7.7170e+02 2.7051e+03 7.1440e+02 + 3.8584e+03 3.0718e+03 8.4480e+02 8.5570e+02 3.4780e+02 6.5880e+02 7.5110e+02 + 6.8430e+02 5.5450e+02 4.9720e+02 7.9040e+02 4.7620e+02 1.9499e+03 3.0330e+03 + 2.3533e+03 7.8450e+02 7.2100e+02 1.8682e+03 2.6336e+03 2.3238e+03 4.1180e+02 + 4.1360e+02 6.2160e+02 4.4200e+02 5.1430e+02 4.3180e+02 4.5320e+02 4.5370e+02 + 4.9380e+02 8.0810e+02 3.6370e+02 1.4085e+03 2.0316e+03 5.6000e+03 4.4058e+03 + 1.6719e+03 5.2350e+02 3.8170e+02 4.0050e+02 3.6910e+02 8.3610e+02 2.9032e+03 + 2.6174e+03 2.0190e+03 1.5493e+03 6.9730e+02 6.0020e+02 1.2036e+03 5.9650e+02 + 4.6610e+02 3.4710e+02 3.5180e+02 6.7570e+02 1.2395e+03 2.4350e+02 2.1400e+02 + 3.8250e+02 4.6670e+02 3.1992e+03 1.0236e+03 2.9091e+03 5.4202e+03 1.9943e+03 + 5.4880e+02 3.3460e+02 3.8630e+02 5.8030e+02 8.0620e+02 4.4620e+02 4.2050e+02 + 5.0170e+02 4.2710e+02 8.5220e+02 4.9148e+03 2.1224e+03 1.9160e+03 2.0162e+03 + 2.3269e+03 3.0232e+03 8.4300e+02 5.4100e+02 1.9890e+02 7.2040e+02 3.2200e+02 + 4.7630e+02 7.0560e+02 6.8940e+02 4.0960e+02 5.1880e+02 6.5260e+02 5.0050e+02 + 9.0290e+02 2.5728e+03 3.7833e+03 4.2581e+03 2.3858e+03 4.3010e+02 4.0440e+02 + 4.5940e+02 5.3530e+02 5.7800e+02 2.0013e+03 2.0152e+03 2.2508e+03 2.2075e+03 + 2.2528e+03 1.3157e+03 4.7550e+02 6.0720e+02 6.3460e+02 6.1380e+02 3.8390e+02 + 7.2250e+02 7.5710e+02 2.8130e+02 4.0100e+01 2.6650e+02 1.1008e+03 2.8539e+03 + 6.7400e+02 2.1175e+03 4.7960e+03 2.1648e+03 9.3700e+02 7.8070e+02 4.9390e+02 + 4.5190e+02 6.4170e+02 4.7400e+02 4.9290e+02 4.2530e+02 3.3970e+02 1.1283e+03 + 2.0913e+03 2.8576e+03 2.1124e+03 4.1008e+03 2.5029e+03 2.9503e+03 3.5590e+02 + 4.4800e+02 5.7360e+02 4.7920e+02 3.8240e+02 4.1970e+02 4.7180e+02 4.3300e+02 + 2.1390e+02 1.7380e+02 5.1860e+02 1.3057e+03 2.2931e+03 3.3779e+03 3.3549e+03 + 4.8876e+03 6.4210e+02 5.2810e+02 3.8850e+02 6.4750e+02 4.5950e+02 9.6430e+02 + 9.0680e+02 1.9346e+03 1.5636e+03 1.9349e+03 3.8128e+03 2.9088e+03 8.6720e+02 + 1.5688e+03 8.1330e+02 4.2310e+02 9.2310e+02 7.4450e+02 1.1864e+03 4.4390e+02 + 1.6950e+02 4.0360e+02 1.1480e+03 3.1935e+03 5.7140e+02 1.5377e+03 3.6504e+03 + 3.7847e+03 6.6870e+02 1.5097e+03 3.2800e+02 4.3620e+02 7.3850e+02 7.1110e+02 + 3.5360e+02 2.9330e+02 5.1810e+02 7.1910e+02 1.5862e+03 2.8713e+03 5.4209e+03 + 3.9946e+03 2.2935e+03 2.1439e+03 6.0360e+02 1.3940e+02 4.5190e+02 4.0420e+02 + 2.5700e+02 3.4260e+02 4.0230e+02 5.2380e+02 5.6000e+01 7.7700e+01 3.7030e+02 + 1.1717e+03 2.3210e+03 4.3858e+03 4.9737e+03 3.3088e+03 6.8890e+02 5.1260e+02 + 7.0280e+02 7.0140e+02 7.0950e+02 6.6360e+02 8.8240e+02 5.8860e+02 1.0372e+03 + 2.2873e+03 3.3074e+03 2.1144e+03 1.0657e+03 2.4095e+03 2.3063e+03 1.4054e+03 + 1.4557e+03 7.4200e+02 1.2536e+03 8.9710e+02 3.2520e+02 5.0970e+02 2.2744e+03 + 2.7673e+03 4.9710e+02 6.6660e+02 2.3684e+03 3.1222e+03 2.4000e+03 6.9700e+02 + 4.9660e+02 3.4660e+02 5.8160e+02 4.6140e+02 4.2970e+02 2.3110e+02 4.9980e+02 + 6.3160e+02 1.0609e+03 3.5517e+03 5.6000e+03 4.1582e+03 2.5666e+03 5.3300e+02 + 3.7390e+02 2.2870e+02 4.9440e+02 6.7030e+02 3.7990e+02 4.6440e+02 4.3310e+02 + 4.4490e+02 2.8520e+02 3.1560e+02 5.4370e+02 1.1412e+03 2.2955e+03 2.9571e+03 + 4.3450e+03 3.1065e+03 7.3670e+02 4.6430e+02 1.0303e+03 7.2820e+02 6.1400e+02 + 7.7150e+02 1.1375e+03 8.5020e+02 3.2290e+02 8.6820e+02 1.9299e+03 2.2759e+03 + 1.9577e+03 1.4802e+03 1.9762e+03 2.1896e+03 2.0957e+03 1.6688e+03 1.2023e+03 + 5.3010e+02 3.3010e+02 6.1420e+02 2.6772e+03 2.7627e+03 5.4140e+02 8.2820e+02 + 8.9100e+02 2.2535e+03 3.7376e+03 1.4679e+03 7.8320e+02 4.6730e+02 8.3820e+02 + 4.3630e+02 6.6880e+02 2.7870e+02 5.3900e+02 5.4860e+02 1.6108e+03 3.4186e+03 + 5.6000e+03 2.1830e+03 2.1044e+03 5.8170e+02 5.8570e+02 5.1910e+02 4.8300e+02 + 9.5640e+02 6.0500e+02 5.0730e+02 4.3750e+02 2.3820e+02 2.7190e+02 4.0890e+02 + 4.3230e+02 1.1560e+03 4.2959e+03 3.8156e+03 5.6000e+03 3.3403e+03 5.2600e+02 + 5.6420e+02 1.5261e+03 7.1900e+02 3.1700e+02 3.3000e+02 9.6000e+02 6.3020e+02 + 3.4210e+02 5.9440e+02 1.1979e+03 7.2960e+02 1.0505e+03 1.9537e+03 2.3660e+03 + 3.1913e+03 2.3259e+03 1.9083e+03 2.2449e+03 1.2454e+03 6.1730e+02 7.8970e+02 + 3.1049e+03 2.6585e+03 5.0350e+02 6.0610e+02 1.4268e+03 2.2809e+03 2.6034e+03 + 2.6042e+03 1.1502e+03 5.2550e+02 4.5940e+02 4.7890e+02 3.6450e+02 6.6800e+02 + 2.2140e+02 1.3052e+03 1.9520e+03 3.5244e+03 5.6000e+03 2.7601e+03 1.1449e+03 + 3.3870e+02 5.3700e+02 7.0830e+02 5.3970e+02 8.3420e+02 8.1920e+02 8.0350e+02 + 4.9960e+02 1.4960e+02 6.4020e+02 6.7300e+02 6.6470e+02 1.2326e+03 3.8412e+03 + 2.8966e+03 3.3465e+03 2.9893e+03 6.1400e+02 1.4020e+02 7.2140e+02 4.4540e+02 + 4.7640e+02 2.9800e+02 5.3920e+02 6.6080e+02 5.5550e+02 4.2190e+02 1.0641e+03 + 6.2460e+02 1.1038e+03 6.2940e+02 1.8600e+03 2.0403e+03 3.0626e+03 3.1547e+03 + 2.2942e+03 2.2309e+03 2.0240e+03 2.0415e+03 2.1477e+03 2.4090e+03 6.9860e+02 + 6.9420e+02 7.9930e+02 1.8835e+03 3.2514e+03 2.4907e+03 1.8760e+03 2.8110e+02 + 1.8700e+02 5.3660e+02 3.6560e+02 7.1340e+02 9.4290e+02 2.2272e+03 2.2859e+03 + 2.5558e+03 3.4654e+03 2.7675e+03 7.2370e+02 4.5640e+02 4.2730e+02 9.0580e+02 + 9.5540e+02 6.0360e+02 7.8090e+02 9.1410e+02 5.8220e+02 3.8050e+02 2.0110e+02 + 3.8160e+02 2.0943e+03 2.3299e+03 3.0889e+03 2.3934e+03 2.5986e+03 9.9860e+02 + 4.5250e+02 2.6940e+02 2.0810e+02 3.0200e+02 3.9390e+02 2.5780e+02 1.8430e+02 + 3.5080e+02 4.0060e+02 5.7720e+02 8.1590e+02 9.7270e+02 1.2120e+03 5.6340e+02 + 7.4970e+02 1.5220e+03 8.7760e+02 2.1935e+03 2.8121e+03 2.2041e+03 3.6177e+03 + 2.0679e+03 3.6610e+03 2.8276e+03 1.0472e+03 1.1136e+03 2.4470e+03 2.5287e+03 + 1.8777e+03 6.8970e+02 4.8320e+02 7.5170e+02 1.0025e+03 3.2913e+03 2.8849e+03 + 1.8064e+03 5.5340e+02 6.3090e+02 5.8620e+02 1.6669e+03 2.6885e+03 5.5630e+02 + 3.2210e+02 4.3040e+02 3.0580e+02 7.6730e+02 2.6314e+03 2.3287e+03 1.3799e+03 + 7.6750e+02 9.5070e+02 5.5670e+02 4.2920e+02 2.2080e+02 4.2960e+02 5.5570e+02 + 5.1060e+02 5.3720e+02 9.5010e+02 1.4931e+03 1.9587e+03 1.9492e+03 6.9500e+02 + 8.1440e+02 4.5400e+02 4.5690e+02 5.0260e+02 2.8442e+03 2.7800e+03 2.0668e+03 + 1.9860e+02 6.5820e+02 6.2090e+02 5.5930e+02 8.2620e+02 5.7350e+02 5.7480e+02 + 4.8000e+02 9.2240e+02 2.6078e+03 3.5119e+03 2.3310e+03 7.5570e+02 4.7950e+02 + 9.5400e+02 8.7280e+02 2.2662e+03 2.8002e+03 2.2111e+03 3.8540e+02 7.1020e+02 + 5.6860e+02 9.7520e+02 2.8929e+03 4.7976e+03 1.8191e+03 6.2130e+02 3.5850e+02 + 7.2960e+02 2.3327e+03 3.4066e+03 1.6516e+03 5.5770e+02 1.9870e+02 1.7170e+02 + 8.5740e+02 2.5872e+03 3.0755e+03 2.9162e+03 7.9160e+02 4.8240e+02 9.8880e+02 + 5.9870e+02 3.6620e+02 5.5340e+02 6.4090e+02 3.2100e+02 4.0060e+02 1.7113e+03 + 2.2432e+03 2.4719e+03 1.1808e+03 5.8070e+02 5.5340e+02 9.4070e+02 6.2610e+02 + 4.9240e+02 1.4888e+03 4.3573e+03 1.1449e+03 3.4250e+02 3.6530e+02 3.8180e+02 + 4.2800e+02 4.6660e+02 4.9910e+02 5.2200e+02 9.3390e+02 8.4150e+02 2.5047e+03 + 3.6312e+03 1.1850e+03 3.2940e+02 5.0360e+02 7.7460e+02 1.2237e+03 1.3591e+03 + 2.2818e+03 2.3155e+03 9.2670e+02 4.7500e+02 3.7450e+02 6.2570e+02 2.4430e+03 + 2.9946e+03 2.7101e+03 5.8580e+02 2.0460e+02 5.8370e+02 2.7885e+03 4.2730e+03 + 1.2295e+03 3.9250e+02 4.3160e+02 6.4150e+02 7.4110e+02 2.2802e+03 2.7100e+03 + 2.8412e+03 1.0468e+03 6.1010e+02 6.5840e+02 5.1700e+02 7.1070e+02 5.4000e+02 + 4.4520e+02 3.3640e+02 4.7040e+02 2.5410e+03 3.6031e+03 1.7538e+03 6.1230e+02 + 2.4510e+02 3.2080e+02 1.1142e+03 7.0230e+02 5.9070e+02 1.4151e+03 4.6676e+03 + 2.6024e+03 3.4720e+02 2.5520e+02 3.5090e+02 5.9150e+02 9.7510e+02 6.0910e+02 + 7.2100e+02 8.6380e+02 1.2777e+03 1.8037e+03 2.6294e+03 7.5730e+02 6.9860e+02 + 8.4510e+02 8.8320e+02 5.7220e+02 1.3895e+03 2.4887e+03 2.7176e+03 8.3540e+02 + 6.3310e+02 5.3690e+02 6.9130e+02 1.7022e+03 3.8951e+03 3.1708e+03 1.5776e+03 + 4.1420e+02 9.6120e+02 1.9413e+03 4.9000e+03 1.5260e+03 2.3240e+02 4.3190e+02 + 3.7530e+02 6.4710e+02 7.1950e+02 3.3912e+03 3.0597e+03 6.1210e+02 1.9780e+02 + 7.9680e+02 5.4080e+02 9.6070e+02 6.8430e+02 7.4630e+02 2.4290e+02 4.5680e+02 + 2.3181e+03 3.6082e+03 2.3836e+03 3.2010e+02 2.2830e+02 4.3940e+02 9.2180e+02 + 5.7890e+02 9.7990e+02 1.8215e+03 3.0905e+03 1.0464e+03 5.2680e+02 2.4550e+02 + 2.8300e+02 3.7540e+02 5.8760e+02 9.1070e+02 4.5750e+02 9.6250e+02 1.4280e+03 + 2.3536e+03 2.7039e+03 7.4300e+02 3.7170e+02 5.6700e+02 8.7190e+02 6.7720e+02 + 2.8002e+03 2.8129e+03 1.6876e+03 1.1071e+03 9.6160e+02 5.5950e+02 6.2690e+02 + 7.6190e+02 2.0111e+03 2.5829e+03 1.2478e+03 7.9000e+02 3.1970e+02 1.9717e+03 + 4.4578e+03 2.2946e+03 3.5690e+02 4.8670e+02 5.9950e+02 8.7630e+02 5.1240e+02 + 2.6568e+03 3.2466e+03 1.7355e+03 3.6550e+02 2.7010e+02 4.5210e+02 6.4750e+02 + 6.6530e+02 3.7160e+02 2.4180e+02 1.0952e+03 1.3183e+03 3.5239e+03 1.0806e+03 + 1.7680e+02 1.1570e+02 5.9580e+02 5.1990e+02 6.2120e+02 5.5280e+02 2.5956e+03 + 2.5093e+03 8.9440e+02 9.5550e+02 5.3450e+02 2.3520e+02 2.9400e+02 4.5750e+02 + 4.5920e+02 3.7340e+02 8.5250e+02 1.2503e+03 2.3399e+03 2.8272e+03 8.0480e+02 + 5.9570e+02 6.1270e+02 9.8640e+02 5.8460e+02 1.7179e+03 2.9689e+03 2.7230e+03 + 1.0413e+03 5.1900e+02 9.4810e+02 6.9310e+02 4.5260e+02 2.0670e+03 2.8330e+03 + 3.1945e+03 5.1410e+02 6.2610e+02 2.1463e+03 4.7599e+03 2.4943e+03 4.4220e+02 + 7.2790e+02 6.9250e+02 1.0136e+03 8.0090e+02 1.3653e+03 3.0218e+03 1.5557e+03 + 5.4500e+02 9.1680e+02 3.7730e+02 7.2120e+02 5.0270e+02 3.9520e+02 3.4150e+02 + 1.4497e+03 3.2772e+03 2.4842e+03 8.9360e+02 3.1160e+02 2.0830e+02 4.3110e+02 + 1.1340e+03 4.9890e+02 7.8730e+02 1.6621e+03 2.6074e+03 6.2190e+02 7.9460e+02 + 5.5410e+02 5.2000e+02 3.8050e+02 2.7460e+02 4.8830e+02 7.0230e+02 5.2170e+02 + 1.0338e+03 3.2311e+03 2.3771e+03 1.9302e+03 4.4700e+02 9.0360e+02 6.8750e+02 + 5.1450e+02 1.0066e+03 2.4474e+03 2.6386e+03 4.8360e+02 4.5780e+02 3.9280e+02 + 4.7410e+02 5.1770e+02 1.5547e+03 2.1596e+03 1.7643e+03 1.4438e+03 9.1390e+02 + 1.7291e+03 3.8749e+03 1.5202e+03 4.6880e+02 3.6130e+02 6.4940e+02 6.6510e+02 + 8.6130e+02 2.2332e+03 3.9080e+03 1.6255e+03 8.4320e+02 7.3460e+02 3.4490e+02 + 4.5890e+02 6.9550e+02 4.9220e+02 5.7500e+02 7.9250e+02 3.3649e+03 2.6860e+03 + 1.6774e+03 4.2820e+02 6.8020e+02 6.8810e+02 8.7090e+02 9.6010e+02 1.4199e+03 + 1.7325e+03 2.2241e+03 6.2290e+02 9.5080e+02 2.2850e+02 7.6990e+02 3.9390e+02 + 7.2800e+01 1.6470e+02 3.9500e+02 4.5980e+02 7.0250e+02 2.9639e+03 3.0504e+03 + 2.0394e+03 7.8440e+02 9.1860e+02 3.3920e+02 3.2080e+02 7.7530e+02 2.1617e+03 + 3.8463e+03 7.6660e+02 3.9940e+02 1.9430e+02 7.7150e+02 8.0430e+02 1.6357e+03 + 2.5167e+03 4.2636e+03 1.3347e+03 1.1315e+03 1.5583e+03 3.5565e+03 1.2545e+03 + 8.7950e+02 6.3360e+02 4.0640e+02 7.4300e+02 9.2640e+02 2.0394e+03 2.3921e+03 + 1.7139e+03 1.1287e+03 5.4520e+02 1.2040e+02 4.5740e+02 5.7820e+02 7.5210e+02 + 5.8100e+02 1.5115e+03 4.2683e+03 3.3899e+03 1.3272e+03 7.1760e+02 3.7650e+02 + 6.1410e+02 5.7000e+02 6.5260e+02 1.8514e+03 1.9307e+03 1.6658e+03 7.7120e+02 + 5.5450e+02 4.2040e+02 5.9360e+02 4.9640e+02 1.5490e+02 3.4740e+02 4.4530e+02 + 5.4930e+02 9.6200e+02 1.6374e+03 2.3469e+03 3.2857e+03 2.2149e+03 6.3440e+02 + 1.5920e+02 3.9080e+02 1.0797e+03 3.5776e+03 2.6012e+03 1.9531e+03 5.9030e+02 + 3.5380e+02 3.2210e+02 6.5290e+02 5.1680e+02 1.8493e+03 2.9300e+03 2.9130e+03 + 5.3380e+02 1.0920e+03 4.2086e+03 1.2768e+03 4.7700e+02 3.6790e+02 5.8280e+02 + 7.4000e+02 1.0275e+03 1.5785e+03 2.3908e+03 2.8738e+03 1.1598e+03 7.9840e+02 + 4.0600e+02 4.2590e+02 8.9060e+02 7.5650e+02 7.7530e+02 7.3240e+02 2.6827e+03 + 4.2428e+03 1.2224e+03 1.3040e+02 7.6180e+02 1.0576e+03 1.4778e+03 1.0712e+03 + 2.5071e+03 2.2351e+03 1.3769e+03 5.3620e+02 6.5830e+02 4.2490e+02 5.8860e+02 + 5.3880e+02 6.8310e+02 6.1900e+02 6.2730e+02 3.4640e+02 5.6990e+02 8.7050e+02 + 3.1412e+03 3.8830e+03 1.7979e+03 8.3160e+02 2.1780e+02 3.3080e+02 5.7310e+02 + 2.6106e+03 3.2563e+03 8.5190e+02 6.6520e+02 4.3940e+02 6.1460e+02 9.1160e+02 + 4.8290e+02 8.3820e+02 3.2051e+03 3.7156e+03 1.2369e+03 1.4977e+03 2.3092e+03 + 2.0642e+03 5.1400e+02 5.6520e+02 2.6770e+02 1.1933e+03 4.7920e+02 1.9890e+03 + 3.9769e+03 2.8136e+03 1.2443e+03 8.6830e+02 2.2170e+02 4.2360e+02 8.2370e+02 + 1.0615e+03 8.0430e+02 9.6820e+02 2.3573e+03 2.7339e+03 3.0240e+03 9.0560e+02 + 1.0634e+03 1.6685e+03 1.5064e+03 2.2658e+03 2.3009e+03 1.6447e+03 6.6500e+02 + 2.1050e+02 2.5240e+02 4.6930e+02 4.5400e+02 4.8230e+02 5.5650e+02 5.7050e+02 + 6.3470e+02 3.4920e+02 6.4710e+02 6.3420e+02 2.2333e+03 2.7075e+03 2.9806e+03 + 1.0081e+03 2.5960e+02 1.9820e+02 4.6160e+02 1.8895e+03 2.8360e+03 1.8454e+03 + 7.0610e+02 5.6600e+02 8.0860e+02 7.4800e+02 4.3960e+02 3.3070e+02 1.6556e+03 + 3.8937e+03 3.3238e+03 1.8543e+03 2.7597e+03 9.0360e+02 6.5290e+02 4.9890e+02 + 4.5370e+02 6.0910e+02 3.8640e+02 2.0072e+03 3.5847e+03 2.8660e+03 1.0248e+03 + 6.7450e+02 3.3620e+02 5.4920e+02 1.0141e+03 8.4600e+02 1.4785e+03 1.1473e+03 + 3.5521e+03 2.8134e+03 2.6735e+03 1.6041e+03 2.2641e+03 2.2610e+03 2.6003e+03 + 2.5423e+03 2.2533e+03 1.0314e+03 5.3430e+02 6.4910e+02 6.3390e+02 3.7680e+02 + 4.8500e+02 4.5710e+02 3.1040e+02 6.8740e+02 4.0400e+02 1.9880e+02 3.6190e+02 + 6.4620e+02 8.8200e+02 2.5793e+03 2.6161e+03 6.6110e+02 2.9840e+02 3.0980e+02 + 9.7140e+02 1.7566e+03 2.5826e+03 1.1046e+03 5.0110e+02 7.4000e+02 7.7380e+02 + 5.5870e+02 3.2900e+02 3.1830e+02 1.4976e+03 2.9531e+03 2.4133e+03 2.3779e+03 + 4.4098e+03 8.6390e+02 5.6440e+02 8.5790e+02 2.6520e+02 4.2320e+02 3.5490e+02 + 1.6683e+03 3.0377e+03 2.2510e+03 5.9390e+02 4.6350e+02 6.9480e+02 4.4310e+02 + 3.2480e+02 7.7030e+02 1.6116e+03 2.2838e+03 4.9000e+03 3.6320e+03 1.6477e+03 + 2.7702e+03 1.5631e+03 2.4413e+03 2.7500e+03 9.5880e+02 6.5290e+02 6.4210e+02 + 4.6760e+02 5.0810e+02 3.0610e+02 4.5710e+02 8.4040e+02 4.4760e+02 4.6560e+02 + 5.9120e+02 2.7880e+02 2.3340e+02 2.3940e+02 3.3960e+02 9.0760e+02 1.3676e+03 + 2.8936e+03 3.1211e+03 5.1110e+02 5.4530e+02 5.4590e+02 2.8694e+03 3.0234e+03 + 2.6037e+03 4.2740e+02 6.8660e+02 9.9150e+02 3.6710e+02 7.2590e+02 4.3080e+02 + 9.7980e+02 1.9379e+03 4.9000e+03 4.3908e+03 3.3175e+03 1.1264e+03 6.0380e+02 + 5.0330e+02 2.1280e+02 3.3450e+02 5.1470e+02 2.2466e+03 1.7377e+03 2.3476e+03 + 8.8270e+02 3.7700e+02 8.5590e+02 3.0840e+02 2.1943e+03 1.7656e+03 2.3115e+03 + 2.6516e+03 4.2550e+03 3.3726e+03 2.4533e+03 2.3267e+03 1.8853e+03 1.8490e+03 + 1.6018e+03 9.0890e+02 3.1190e+02 8.3430e+02 4.9470e+02 4.5640e+02 4.1040e+02 + 5.4960e+02 6.8810e+02 3.9000e+02 6.3970e+02 5.7190e+02 4.7130e+02 1.8400e+02 + 4.3590e+02 4.3060e+02 3.1900e+02 9.7670e+02 2.6734e+03 3.0165e+03 4.5300e+02 + 5.7520e+02 7.6820e+02 1.5290e+03 2.3387e+03 3.5656e+03 8.6180e+02 7.0750e+02 + 6.0180e+02 6.8790e+02 5.0670e+02 6.5560e+02 6.9910e+02 1.3825e+03 4.1837e+03 + 4.9000e+03 2.4716e+03 7.3080e+02 7.8850e+02 6.3360e+02 2.3840e+02 4.2630e+02 + 4.4490e+02 1.2367e+03 1.8392e+03 1.8786e+03 1.4004e+03 1.0605e+03 5.8070e+02 + 2.4120e+03 2.1258e+03 1.9075e+03 1.5231e+03 1.6499e+03 3.4146e+03 4.4725e+03 + 1.5199e+03 7.6120e+02 5.1140e+02 1.2740e+03 9.2970e+02 6.2470e+02 6.1480e+02 + 4.7640e+02 3.7870e+02 4.9450e+02 5.2310e+02 5.3380e+02 3.6840e+02 2.8050e+02 + 3.5570e+02 6.4130e+02 2.7290e+02 3.3360e+02 1.8610e+02 4.7450e+02 3.6940e+02 + 4.6470e+02 2.6433e+03 2.6541e+03 3.4150e+02 6.9820e+02 5.2110e+02 1.1485e+03 + 1.9860e+03 3.1073e+03 7.1210e+02 7.4820e+02 7.6360e+02 4.0110e+02 6.8380e+02 + 8.7710e+02 1.0567e+03 6.7410e+02 2.1991e+03 4.9000e+03 1.5911e+03 8.5140e+02 + 5.1820e+02 5.5680e+02 2.3890e+02 4.7910e+02 4.7500e+02 1.1516e+03 3.0041e+03 + 2.3263e+03 9.3130e+02 7.3820e+02 1.1376e+03 2.2180e+03 3.0343e+03 1.4811e+03 + 1.3580e+03 1.3037e+03 2.7376e+03 2.4465e+03 1.0731e+03 6.3870e+02 5.9700e+02 + 7.8740e+02 9.2520e+02 6.1930e+02 6.7510e+02 3.7620e+02 2.7430e+02 3.8540e+02 + 5.7440e+02 5.1820e+02 5.0610e+02 4.1700e+02 2.5550e+02 1.9840e+02 1.5110e+02 + 2.5190e+02 5.4010e+02 3.0780e+02 8.0000e+02 1.0498e+03 1.0829e+03 2.9440e+03 + 6.7700e+02 4.6910e+02 6.7830e+02 1.1763e+03 2.2437e+03 1.9446e+03 1.4653e+03 + 5.9960e+02 4.0160e+02 5.5430e+02 4.9090e+02 6.1580e+02 6.9610e+02 5.8470e+02 + 1.5760e+03 4.9000e+03 3.3468e+03 1.2591e+03 3.8830e+02 4.9610e+02 4.8830e+02 + 4.9930e+02 8.4250e+02 1.2307e+03 3.6905e+03 1.8139e+03 1.0795e+03 6.3450e+02 + 1.4500e+03 2.3183e+03 2.0556e+03 1.8711e+03 3.7870e+02 8.7780e+02 2.4729e+03 + 3.2778e+03 2.0727e+03 7.0490e+02 3.2150e+02 6.8000e+02 5.9400e+02 7.6020e+02 + 1.0649e+03 4.9170e+02 6.0630e+02 4.3620e+02 7.3860e+02 9.4840e+02 6.7920e+02 + 3.3150e+02 4.9360e+02 4.3950e+02 2.9750e+02 3.9690e+02 4.3630e+02 3.4930e+02 + 8.6480e+02 7.5230e+02 7.1090e+02 1.6257e+03 3.3250e+02 4.0370e+02 8.7480e+02 + 7.5030e+02 1.9008e+03 1.9307e+03 2.0312e+03 5.6200e+02 5.9880e+02 3.7070e+02 + 6.4700e+02 5.2940e+02 4.9540e+02 5.5670e+02 2.4947e+03 4.1681e+03 4.1000e+03 + 1.7167e+03 5.4360e+02 3.9690e+02 5.2260e+02 5.0070e+02 7.1640e+02 2.1508e+03 + 2.9166e+03 7.4970e+02 4.1690e+02 7.0120e+02 2.8974e+03 4.6671e+03 1.4977e+03 + 7.5390e+02 3.3480e+02 1.0274e+03 1.8806e+03 3.6989e+03 1.3613e+03 1.2920e+03 + 4.5320e+02 4.1160e+02 5.9050e+02 8.3930e+02 6.7060e+02 5.9010e+02 5.4480e+02 + 8.5200e+02 7.5790e+02 5.6600e+02 4.7040e+02 3.5270e+02 3.8140e+02 7.2120e+02 + 8.0180e+02 5.5580e+02 4.2920e+02 3.0270e+02 5.2150e+02 3.7600e+02 4.7890e+02 + 6.7880e+02 3.0060e+02 6.6490e+02 5.8520e+02 1.0245e+03 1.1277e+03 3.7567e+03 + 1.7792e+03 6.9710e+02 7.0680e+02 4.1710e+02 6.3500e+02 3.2510e+02 2.8720e+02 + 6.0430e+02 1.7789e+03 4.9000e+03 4.1246e+03 1.6238e+03 3.3850e+02 2.6410e+02 + 3.2580e+02 7.1990e+02 6.8160e+02 2.9506e+03 2.7641e+03 2.1369e+03 3.0330e+02 + 7.0460e+02 2.0583e+03 2.7360e+03 9.6380e+02 3.5200e+02 6.8310e+02 9.3170e+02 + 1.9856e+03 3.6046e+03 3.1153e+03 8.9120e+02 3.5590e+02 7.4000e+01 9.2140e+02 + 7.4930e+02 7.0040e+02 6.7170e+02 6.9170e+02 5.5620e+02 5.2910e+02 6.7750e+02 + 5.0410e+02 2.8210e+02 3.5260e+02 9.6260e+02 7.6370e+02 4.6260e+02 3.8940e+02 + 4.5760e+02 3.5940e+02 3.3950e+02 3.1180e+02 3.3960e+02 5.8590e+02 5.0570e+02 + 5.6580e+02 7.4110e+02 7.1310e+02 3.1162e+03 1.6383e+03 9.2150e+02 8.3340e+02 + 5.3980e+02 5.3920e+02 2.9450e+02 3.6790e+02 7.2340e+02 2.0988e+03 3.9557e+03 + 3.4979e+03 2.9061e+03 4.4640e+02 2.2670e+02 5.6370e+02 5.5170e+02 7.5290e+02 + 2.3954e+03 2.4462e+03 2.3690e+03 2.3920e+02 4.2970e+02 3.8559e+03 3.3157e+03 + 7.7360e+02 7.0830e+02 5.8990e+02 8.6510e+02 1.9054e+03 3.1487e+03 3.4280e+03 + 1.0658e+03 2.9700e+02 4.6570e+02 7.2690e+02 6.3150e+02 4.1420e+02 3.5000e+02 + 6.5500e+02 5.4920e+02 1.7650e+02 7.0320e+02 6.1230e+02 2.0450e+02 1.9910e+02 + 7.2660e+02 7.2800e+02 5.0780e+02 4.4410e+02 3.3460e+02 5.1710e+02 8.0220e+02 + 4.9860e+02 5.8570e+02 4.8850e+02 7.4600e+02 5.6270e+02 3.0710e+02 9.3340e+02 + 2.2112e+03 3.4280e+03 7.7620e+02 3.2430e+02 2.8010e+02 7.1420e+02 2.8000e+02 + 8.7900e+02 2.7234e+03 2.2444e+03 3.7592e+03 4.0240e+03 2.6291e+03 1.4776e+03 + 3.5560e+02 2.2100e+02 3.5140e+02 9.9970e+02 2.0858e+03 3.6571e+03 1.4244e+03 + 5.1620e+02 5.4710e+02 1.5350e+03 2.7966e+03 1.8257e+03 1.0538e+03 6.8100e+02 + 6.1780e+02 7.2840e+02 1.6237e+03 3.8762e+03 5.2510e+02 3.4320e+02 1.7150e+02 + 4.4250e+02 4.4400e+02 5.5600e+02 5.5390e+02 6.2730e+02 4.6440e+02 3.0070e+02 + 6.3890e+02 7.2680e+02 3.5660e+02 3.7500e+02 8.8750e+02 9.7380e+02 4.3560e+02 + 6.3470e+02 6.5380e+02 2.8230e+02 4.2880e+02 2.9270e+02 4.6100e+02 2.9640e+02 + 3.4810e+02 2.8410e+02 3.2180e+02 4.7640e+02 2.3029e+03 3.8599e+03 6.7040e+02 + 4.7190e+02 4.1770e+02 3.8140e+02 5.1190e+02 7.4100e+02 1.4688e+03 2.4569e+03 + 2.2447e+03 2.4329e+03 2.3224e+03 1.4168e+03 5.2820e+02 2.8170e+02 2.0610e+02 + 4.9270e+02 1.6682e+03 3.1882e+03 1.2163e+03 5.1800e+02 6.3770e+02 2.4254e+03 + 3.5096e+03 2.6042e+03 9.0020e+02 4.9270e+02 6.6980e+02 1.0688e+03 2.9434e+03 + 2.8326e+03 8.8520e+02 3.9640e+02 3.7760e+02 4.6770e+02 4.6270e+02 5.4590e+02 + 3.8150e+02 5.3940e+02 6.8710e+02 6.1150e+02 7.9100e+02 6.3320e+02 3.2230e+02 + 6.9560e+02 6.9880e+02 3.6050e+02 3.3470e+02 4.9470e+02 4.3270e+02 3.3840e+02 + 2.8120e+02 2.6650e+02 9.2790e+02 4.1120e+02 4.5390e+02 6.9500e+02 1.5730e+02 + 2.9200e+02 2.0345e+03 2.0257e+03 1.0983e+03 6.1230e+02 4.1160e+02 2.0510e+02 + 4.6770e+02 1.3392e+03 3.8268e+03 3.1782e+03 1.5507e+03 1.1829e+03 2.5761e+03 + 1.7442e+03 6.7210e+02 3.9440e+02 2.7230e+02 3.7080e+02 1.0490e+03 2.9757e+03 + 1.9350e+03 9.0170e+02 7.5460e+02 1.7826e+03 4.3435e+03 2.3477e+03 1.0724e+03 + 6.6910e+02 5.5820e+02 5.9080e+02 1.7619e+03 2.6551e+03 2.2659e+03 4.6400e+02 + 3.7170e+02 9.7820e+02 6.8060e+02 3.3970e+02 5.6410e+02 6.5420e+02 5.0800e+02 + 3.5530e+02 3.9310e+02 4.8690e+02 8.1280e+02 7.4990e+02 1.5349e+03 3.0560e+02 + 1.4090e+02 4.2030e+02 4.4190e+02 4.3870e+02 2.3600e+02 5.9280e+02 3.9420e+02 + 2.7490e+02 4.7010e+02 3.8610e+02 3.5750e+02 5.3210e+02 2.1518e+03 1.5796e+03 + 4.3360e+02 3.7670e+02 2.3900e+02 4.3520e+02 5.3310e+02 1.5860e+03 3.9574e+03 + 1.9364e+03 1.2978e+03 1.4269e+03 2.2648e+03 3.3312e+03 1.9235e+03 5.9890e+02 + 3.4380e+02 4.2960e+02 1.0442e+03 3.8127e+03 1.4503e+03 5.5990e+02 5.2630e+02 + 1.5292e+03 2.7626e+03 2.5637e+03 9.9830e+02 9.0730e+02 6.0460e+02 4.9150e+02 + 1.9302e+03 3.1217e+03 1.6958e+03 5.3540e+02 9.7730e+02 8.4500e+02 7.6220e+02 + 3.0120e+02 3.0720e+02 3.2520e+02 5.0160e+02 6.1170e+02 6.1780e+02 3.9440e+02 + 6.9710e+02 6.7720e+02 6.7520e+02 3.2930e+02 2.8550e+02 3.7410e+02 9.1840e+02 + 3.3450e+02 2.1920e+02 2.7780e+02 4.2260e+02 6.2520e+02 3.1920e+02 5.1740e+02 + 4.2260e+02 1.5140e+03 2.3911e+03 2.9420e+03 7.2490e+02 3.8820e+02 2.6580e+02 + 2.1070e+02 7.2810e+02 3.4108e+03 2.9562e+03 1.3711e+03 3.4570e+02 5.3970e+02 + 2.6554e+03 2.3986e+03 1.7982e+03 6.9030e+02 2.8410e+02 6.1930e+02 7.4360e+02 + 4.1184e+03 2.1627e+03 4.5700e+02 5.5020e+02 1.0982e+03 2.9149e+03 3.2966e+03 + 2.0243e+03 1.8858e+03 8.2510e+02 5.3760e+02 8.0380e+02 2.3820e+03 2.4770e+03 + 8.7480e+02 5.8010e+02 4.6790e+02 6.8460e+02 3.9960e+02 3.9230e+02 3.8590e+02 + 5.8590e+02 6.3310e+02 9.5120e+02 6.9510e+02 2.9330e+02 2.8930e+02 2.8630e+02 + 3.0080e+02 3.4110e+02 6.7710e+02 6.4130e+02 7.4670e+02 7.9690e+02 5.4900e+02 + 5.3340e+02 3.9640e+02 4.4560e+02 4.5040e+02 5.4830e+02 1.8324e+03 2.5063e+03 + 1.9435e+03 7.8390e+02 3.7390e+02 2.1200e+02 5.9670e+02 2.1952e+03 3.0988e+03 + 2.8196e+03 8.7570e+02 3.2520e+02 5.2230e+02 1.5109e+03 2.3721e+03 2.7792e+03 + 5.4810e+02 3.6010e+02 4.3780e+02 2.3802e+03 2.4903e+03 2.4586e+03 3.9220e+02 + 5.9780e+02 1.0495e+03 2.0538e+03 1.9169e+03 2.4617e+03 2.1834e+03 2.0078e+03 + 1.0340e+03 1.0674e+03 1.8229e+03 2.9918e+03 2.7037e+03 5.9680e+02 7.0040e+02 + 4.6190e+02 5.2870e+02 3.7370e+02 3.5110e+02 2.1130e+02 7.0010e+02 1.0817e+03 + 7.5580e+02 4.8040e+02 2.9530e+02 2.4030e+02 2.1240e+02 3.3200e+02 7.1480e+02 + 5.9450e+02 4.5380e+02 7.3210e+02 5.5170e+02 4.3020e+02 4.1450e+02 4.6480e+02 + 4.7240e+02 7.9850e+02 2.9029e+03 3.5405e+03 9.7900e+02 3.6420e+02 5.3800e+02 + 3.3740e+02 2.9800e+02 3.0065e+03 2.8228e+03 9.9000e+02 3.2150e+02 5.5100e+02 + 6.1270e+02 1.5418e+03 1.6727e+03 3.3922e+03 9.1030e+02 2.6970e+02 3.9910e+02 + 1.2177e+03 2.7883e+03 2.6812e+03 1.1053e+03 4.5840e+02 5.9760e+02 8.0980e+02 + 1.3646e+03 2.1406e+03 2.5960e+03 1.4179e+03 1.4537e+03 2.3529e+03 2.1460e+03 + 2.3429e+03 3.2948e+03 2.3129e+03 7.4830e+02 5.0810e+02 3.8370e+02 4.1260e+02 + 4.0330e+02 3.4440e+02 5.7490e+02 6.2560e+02 5.1500e+02 4.1710e+02 2.8650e+02 + 1.4320e+02 3.8590e+02 4.3540e+02 4.5970e+02 5.5340e+02 4.4790e+02 8.4380e+02 + 9.3430e+02 5.0490e+02 2.7360e+02 6.0740e+02 5.7150e+02 1.2146e+03 2.8930e+03 + 3.0366e+03 9.8200e+02 6.6570e+02 7.8970e+02 3.9120e+02 2.7133e+03 3.6710e+03 + 1.8271e+03 3.8730e+02 3.7750e+02 3.9620e+02 3.7840e+02 4.2510e+02 2.7398e+03 + 2.4250e+03 1.1984e+03 3.8570e+02 3.1730e+02 9.3520e+02 1.3003e+03 2.8264e+03 + 6.8260e+02 1.2511e+03 2.6440e+02 1.0708e+03 1.1738e+03 1.9705e+03 2.2586e+03 + 2.2344e+03 1.9572e+03 2.3872e+03 1.5016e+03 3.2748e+03 2.5284e+03 1.3062e+03 + 7.8350e+02 5.5300e+02 2.7650e+02 3.5280e+02 4.4870e+02 2.8510e+02 4.6090e+02 + 8.1820e+02 4.0440e+02 2.7750e+02 1.8140e+02 3.9200e+02 3.9800e+02 5.2920e+02 + 5.7690e+02 6.7750e+02 5.0150e+02 4.4330e+02 7.6450e+02 5.4030e+02 4.5030e+02 + 1.0446e+03 1.6367e+03 8.5640e+02 2.8486e+03 2.2006e+03 5.9560e+02 4.8050e+02 + 3.9420e+02 4.6150e+02 2.1476e+03 3.8006e+03 2.2702e+03 1.7350e+02 3.2290e+02 + 4.4240e+02 3.4960e+02 8.3700e+02 1.2378e+03 3.9939e+03 2.6636e+03 4.2080e+02 + 3.3610e+02 1.1931e+03 1.4211e+03 2.7273e+03 2.3912e+03 4.5970e+02 1.1120e+02 + 3.6850e+02 9.5250e+02 6.7890e+02 3.7080e+02 8.5580e+02 2.4660e+03 2.9216e+03 + 2.1237e+03 3.8253e+03 4.9000e+03 3.0186e+03 7.8460e+02 3.4600e+02 3.2190e+02 + 7.6090e+02 7.4470e+02 2.5660e+02 3.3840e+02 6.6410e+02 4.3700e+02 1.7620e+02 + 7.0700e+02 3.3500e+02 1.0075e+03 3.7370e+02 3.6210e+02 6.6200e+02 3.2680e+02 + 3.4500e+02 5.1140e+02 7.7410e+02 4.3970e+02 5.3320e+02 1.6595e+03 3.0266e+03 + 1.6936e+03 1.7382e+03 5.8670e+02 5.1990e+02 3.0580e+02 1.6588e+03 3.3961e+03 + 1.8297e+03 1.2421e+03 6.9470e+02 3.1220e+02 3.5410e+02 5.9190e+02 3.2950e+02 + 1.3946e+03 4.0071e+03 3.1108e+03 4.5840e+02 6.6750e+02 7.7440e+02 1.0621e+03 + 1.9558e+03 2.9912e+03 1.8395e+03 4.0130e+02 3.4410e+02 5.7770e+02 4.1020e+02 + 6.4710e+02 2.8370e+02 1.1849e+03 1.8742e+03 2.8467e+03 4.3766e+03 4.3441e+03 + 3.9286e+03 1.8813e+03 6.8120e+02 2.9170e+02 8.3270e+02 7.7800e+02 3.5290e+02 + 3.3750e+02 6.0170e+02 4.5750e+02 2.1550e+02 4.9300e+02 4.1630e+02 7.3610e+02 + 5.1050e+02 3.3190e+02 4.0380e+02 7.2890e+02 4.6660e+02 5.8660e+02 1.2428e+03 + 6.9620e+02 4.3310e+02 1.1874e+03 2.3679e+03 1.1762e+03 6.7810e+02 6.5870e+02 + 3.6150e+02 5.1790e+02 1.9271e+03 2.0171e+03 1.7252e+03 9.6120e+02 4.6520e+02 + 6.1690e+02 3.6320e+02 4.3980e+02 3.4290e+02 1.1830e+03 2.4498e+03 3.7232e+03 + 1.3382e+03 3.3990e+02 5.1500e+02 7.0430e+02 1.7930e+03 4.3481e+03 3.0759e+03 + 2.5580e+02 7.5520e+02 5.0490e+02 5.9930e+02 7.3360e+02 3.1390e+02 2.5970e+02 + 6.9420e+02 7.8260e+02 2.8284e+03 2.7047e+03 4.9000e+03 3.0559e+03 6.2850e+02 + 5.0290e+02 5.3520e+02 2.8860e+02 2.9900e+02 3.6660e+02 2.8370e+02 4.2320e+02 + 5.4840e+02 4.8890e+02 4.7570e+02 1.3874e+03 6.3750e+02 2.7480e+02 4.8690e+02 + 8.8740e+02 3.3250e+02 4.1460e+02 8.1800e+02 7.5150e+02 4.9250e+02 2.3593e+03 + 3.0486e+03 1.2711e+03 1.1079e+03 5.6150e+02 4.0770e+02 7.4770e+02 3.3079e+03 + 3.4164e+03 1.3101e+03 2.9090e+02 5.2020e+02 9.1350e+02 4.4320e+02 3.0780e+02 + 2.1730e+02 4.2850e+02 1.4439e+03 3.7506e+03 1.8414e+03 4.4730e+02 4.7410e+02 + 5.3250e+02 1.4376e+03 3.7420e+03 2.6499e+03 2.2778e+03 1.7110e+03 5.2750e+02 + 4.9620e+02 4.3790e+02 7.3030e+02 4.7030e+02 4.8000e+02 3.9630e+02 1.7709e+03 + 2.4781e+03 3.3067e+03 3.7218e+03 2.0261e+03 8.6810e+02 1.1197e+03 5.8160e+02 + 2.9590e+02 1.9360e+02 4.1260e+02 6.0300e+02 6.4200e+02 5.3570e+02 5.3960e+02 + 5.5790e+02 4.2890e+02 5.9150e+02 6.1340e+02 9.1570e+02 6.9840e+02 4.0640e+02 + 1.4317e+03 5.0500e+02 5.6600e+02 3.4610e+03 2.4773e+03 1.4356e+03 6.3020e+02 + 5.6990e+02 3.9430e+02 6.8300e+02 1.3455e+03 3.7205e+03 6.3450e+02 1.4280e+02 + 5.0180e+02 1.1859e+03 1.0013e+03 1.8680e+02 3.4100e+02 7.6610e+02 6.4800e+02 + 3.0613e+03 2.5015e+03 1.1098e+03 2.4420e+02 4.4240e+02 6.6810e+02 2.6423e+03 + 3.1618e+03 3.0285e+03 1.0564e+03 8.2000e+02 5.6820e+02 2.8760e+02 5.8790e+02 + 5.1300e+02 4.2170e+02 7.1860e+02 1.1251e+03 1.8552e+03 4.8129e+03 4.9000e+03 + 2.5015e+03 8.5810e+02 9.3620e+02 7.2690e+02 3.8670e+02 1.7870e+02 3.7620e+02 + 6.0490e+02 6.0940e+02 5.1570e+02 3.9120e+02 9.9930e+02 3.9940e+02 5.9150e+02 + 7.9520e+02 9.9640e+02 3.4360e+02 3.7210e+02 5.1050e+02 6.3960e+02 2.2161e+03 + 3.2240e+03 1.6547e+03 1.3333e+03 7.5400e+02 5.0750e+02 3.4270e+02 5.2350e+02 + 3.4346e+03 3.2635e+03 2.6390e+03 2.4920e+02 3.0650e+02 9.3550e+02 3.7660e+02 + 2.9370e+02 3.2330e+02 6.4300e+02 1.3475e+03 2.0665e+03 3.4491e+03 5.8510e+02 + 3.7620e+02 6.5900e+02 4.0380e+02 2.1566e+03 1.1549e+03 2.5357e+03 2.1465e+03 + 1.6019e+03 2.4360e+02 2.0160e+02 4.7310e+02 5.3810e+02 4.3050e+02 3.3840e+02 + 4.2510e+02 2.2261e+03 3.8545e+03 3.1155e+03 4.4722e+03 1.6723e+03 9.7540e+02 + 6.1800e+02 3.5410e+02 1.7110e+02 4.4580e+02 5.5410e+02 7.6140e+02 8.3300e+02 + 1.0155e+03 4.0300e+02 4.6400e+02 5.1520e+02 4.5070e+02 5.5900e+02 4.4560e+02 + 5.4530e+02 2.0643e+03 1.3341e+03 2.7792e+03 2.5361e+03 1.5753e+03 8.0450e+02 + 6.5260e+02 6.5360e+02 6.1150e+02 2.0613e+03 2.9519e+03 1.4209e+03 1.5375e+03 + 4.6630e+02 3.6330e+02 4.9650e+02 4.7830e+02 3.3330e+02 4.8080e+02 3.8890e+02 + 5.2210e+02 1.3701e+03 2.8382e+03 1.7528e+03 4.2060e+02 2.4530e+02 5.5170e+02 + 3.5410e+02 1.6237e+03 2.5445e+03 2.0479e+03 2.6797e+03 4.8430e+02 2.0330e+02 + 3.6120e+02 8.0220e+02 4.8710e+02 4.7620e+02 5.6370e+02 8.5980e+02 2.6246e+03 + 2.7798e+03 2.5929e+03 3.1358e+03 6.1720e+02 5.2670e+02 6.0420e+02 2.3340e+02 + 7.3630e+02 5.1770e+02 3.7810e+02 7.0640e+02 1.2538e+03 2.2100e+02 7.0980e+02 + 5.1890e+02 3.3140e+02 3.3950e+02 4.0760e+02 7.2480e+02 1.0242e+03 2.0870e+03 + 1.5740e+03 2.6317e+03 1.6028e+03 6.3830e+02 5.6940e+02 4.9240e+02 5.3780e+02 + 1.8775e+03 2.6008e+03 3.2702e+03 1.6286e+03 9.8960e+02 2.0420e+02 3.3540e+02 + 4.1300e+02 5.3190e+02 6.6380e+02 5.3230e+02 2.6130e+02 1.3681e+03 2.7286e+03 + 2.8545e+03 1.4880e+03 5.0130e+02 4.8670e+02 4.2920e+02 7.4200e+02 1.5934e+03 + 2.2653e+03 3.1729e+03 1.5774e+03 3.7040e+02 4.1160e+02 5.9940e+02 8.0470e+02 + 4.6180e+02 5.6570e+02 2.2435e+03 2.3204e+03 3.5097e+03 2.4225e+03 3.3244e+03 + 1.2095e+03 4.5890e+02 6.9130e+02 7.0730e+02 4.4900e+02 6.6310e+02 3.9730e+02 + 8.1840e+02 4.7270e+02 2.3100e+02 4.4930e+02 7.1000e+02 3.5720e+02 4.8050e+02 + 7.3060e+02 1.4585e+03 1.7593e+03 1.7143e+03 2.6615e+03 2.8317e+03 4.4590e+02 + 3.8160e+02 5.1300e+02 5.2480e+02 8.6940e+02 2.6211e+03 3.9875e+03 3.1849e+03 + 1.3417e+03 4.4740e+02 6.0380e+02 6.6720e+02 6.8140e+02 2.7650e+02 3.7550e+02 + 2.4780e+02 2.5440e+02 9.4450e+02 2.5203e+03 2.9337e+03 1.6878e+03 8.3600e+02 + 3.0180e+02 9.0310e+02 6.2210e+02 1.1834e+03 3.2455e+03 2.7719e+03 2.4166e+03 + 1.2369e+03 6.2040e+02 1.1708e+03 5.6790e+02 3.0740e+02 3.6830e+02 1.9668e+03 + 2.6723e+03 2.4762e+03 3.3529e+03 3.3959e+03 2.1654e+03 4.7340e+02 6.5260e+02 + 6.0730e+02 6.2740e+02 5.9070e+02 4.7620e+02 4.3830e+02 5.1270e+02 3.0910e+02 + 8.9660e+02 9.7020e+02 5.4120e+02 2.8720e+02 6.7920e+02 1.6332e+03 3.4648e+03 + 3.2165e+03 2.8732e+03 2.7002e+03 3.8670e+02 2.1940e+02 7.8780e+02 4.5310e+02 + 4.2360e+02 2.7170e+03 2.2405e+03 1.9519e+03 2.6449e+03 5.1700e+02 3.9540e+02 + 6.7620e+02 1.1057e+03 3.3730e+02 1.7540e+02 1.1000e+02 4.9380e+02 9.3850e+02 + 2.5050e+03 2.9698e+03 2.2261e+03 7.6850e+02 3.5990e+02 3.0760e+02 4.6440e+02 + 8.5750e+02 1.7210e+03 3.0377e+03 2.8156e+03 1.3519e+03 1.4139e+03 5.7230e+02 + 3.7030e+02 1.0580e+02 3.9650e+02 1.2163e+03 2.2951e+03 1.8003e+03 2.7597e+03 + 2.6827e+03 2.3450e+03 8.6020e+02 6.4790e+02 6.5590e+02 5.0800e+02 6.9800e+02 + 8.3800e+02 5.2560e+02 4.0110e+02 7.4520e+02 4.2490e+02 5.7720e+02 4.8390e+02 + 7.7440e+02 8.1950e+02 1.6694e+03 2.3216e+03 3.5704e+03 3.0532e+03 3.2206e+03 + 1.7650e+02 4.2460e+02 3.2920e+02 8.9130e+02 7.7000e+02 2.3059e+03 3.1977e+03 + 1.7617e+03 1.3882e+03 9.0630e+02 3.7680e+02 1.1736e+03 7.2370e+02 3.0810e+02 + 3.1170e+02 3.1370e+02 5.1710e+02 1.3266e+03 2.5107e+03 3.2758e+03 1.9999e+03 + 6.8510e+02 3.8960e+02 3.2680e+02 4.5970e+02 5.7580e+02 1.2177e+03 1.4667e+03 + 2.2580e+03 2.2750e+03 1.5219e+03 4.0590e+02 1.8880e+02 1.1330e+02 2.9560e+02 + 2.3578e+03 2.5965e+03 1.4588e+03 2.3751e+03 2.7442e+03 2.3132e+03 7.3240e+02 + 7.9470e+02 5.9470e+02 5.0260e+02 7.4790e+02 7.3680e+02 2.9420e+02 2.8230e+02 + 9.1340e+02 6.1680e+02 1.4530e+02 2.4690e+02 9.2770e+02 8.9420e+02 1.4982e+03 + 3.3260e+03 3.5759e+03 3.9612e+03 8.0660e+02 4.0730e+02 3.6440e+02 3.3630e+02 + 8.8450e+02 7.5950e+02 1.3148e+03 3.1347e+03 2.7606e+03 8.2950e+02 4.7420e+02 + 8.5380e+02 1.1176e+03 4.6520e+02 3.2130e+02 5.4990e+02 2.8270e+02 4.3800e+02 + 9.7780e+02 2.9921e+03 3.2308e+03 2.0041e+03 1.0646e+03 2.4980e+02 1.7170e+02 + 7.5830e+02 6.4330e+02 6.7660e+02 6.1550e+02 1.6336e+03 2.7868e+03 2.8170e+03 + 1.3324e+03 1.4700e+02 2.9010e+02 8.0880e+02 2.7698e+03 2.5435e+03 1.7520e+03 + 2.7203e+03 2.8763e+03 1.7705e+03 5.9790e+02 5.2470e+02 4.7990e+02 4.4300e+02 + 6.4850e+02 3.1390e+02 2.7720e+02 3.8570e+02 4.0470e+02 4.5370e+02 3.1010e+02 + 3.1600e+02 8.0540e+02 1.3090e+03 2.7373e+03 2.8176e+03 2.9737e+03 2.9387e+03 + 1.0469e+03 5.7770e+02 7.5120e+02 2.7900e+02 7.5220e+02 5.4160e+02 1.1946e+03 + 2.5660e+03 1.8181e+03 5.4680e+02 5.4230e+02 8.5170e+02 1.4263e+03 5.5990e+02 + 1.9750e+02 2.9780e+02 3.1700e+02 3.1800e+02 4.4550e+02 1.3511e+03 2.1099e+03 + 1.6128e+03 6.6320e+02 7.3330e+02 2.8620e+02 3.8230e+02 6.3270e+02 4.8140e+02 + 4.6870e+02 8.7440e+02 2.4411e+03 2.9198e+03 1.9718e+03 2.4640e+02 3.7960e+02 + 1.5549e+03 2.7577e+03 2.5741e+03 1.4790e+03 2.2425e+03 3.7692e+03 1.9346e+03 + 5.8780e+02 4.9110e+02 3.4670e+02 6.7340e+02 3.4670e+02 2.3130e+02 9.5500e+01 + 4.3970e+02 3.8410e+02 4.2520e+02 4.9540e+02 2.7450e+02 4.8970e+02 7.0440e+02 + 1.7005e+03 2.9558e+03 1.0129e+03 3.2424e+03 8.1560e+02 8.8110e+02 6.0810e+02 + 3.0310e+02 3.4950e+02 5.0050e+02 6.7240e+02 2.0832e+03 1.6892e+03 3.0180e+02 + 5.5200e+02 8.6230e+02 1.0777e+03 4.0950e+02 1.8640e+02 6.5340e+02 8.5720e+02 + 3.8620e+02 1.2346e+03 1.6473e+03 3.5224e+03 2.2887e+03 6.7360e+02 6.0050e+02 + 4.7830e+02 5.4330e+02 9.0890e+02 5.4710e+02 2.3060e+02 4.3040e+02 1.4526e+03 + 4.2761e+03 2.5418e+03 6.4450e+02 1.0440e+03 1.1607e+03 4.1275e+03 2.3601e+03 + 1.6858e+03 1.6137e+03 2.9948e+03 1.7968e+03 4.0100e+02 5.7000e+02 4.1480e+02 + 5.8740e+02 4.1770e+02 2.4010e+02 5.5980e+02 6.5480e+02 4.7660e+02 5.8530e+02 + 5.3040e+02 3.3390e+02 4.6620e+02 1.3143e+03 1.8156e+03 2.2667e+03 3.1478e+03 + 2.8665e+03 1.5407e+03 6.6200e+02 4.4320e+02 4.1060e+02 2.4460e+02 1.8920e+02 + 4.1400e+02 1.2897e+03 2.4672e+03 4.5350e+02 4.8930e+02 6.4860e+02 8.3090e+02 + 3.2690e+02 5.6650e+02 7.1520e+02 7.9930e+02 7.8270e+02 4.0130e+02 2.3076e+03 + 3.0657e+03 1.7287e+03 6.5750e+02 7.8210e+02 6.4200e+02 4.2050e+02 8.9960e+02 + 4.0180e+02 1.7530e+02 3.4960e+02 1.0462e+03 4.1065e+03 3.1967e+03 1.1372e+03 + 1.2535e+03 2.3133e+03 3.0329e+03 2.1897e+03 1.1148e+03 3.6223e+03 1.5132e+03 + 5.2600e+02 7.4030e+02 5.2270e+02 4.3450e+02 6.7890e+02 5.4870e+02 2.9080e+02 + 5.0390e+02 5.0600e+02 1.0462e+03 8.1630e+02 3.9910e+02 4.3170e+02 4.1000e+02 + 4.3010e+02 3.0642e+03 1.7103e+03 2.1172e+03 4.6204e+03 5.4870e+02 7.2450e+02 + 4.5840e+02 6.0420e+02 2.6580e+02 2.8910e+02 1.5360e+02 1.3933e+03 2.6176e+03 + 1.8472e+03 3.5280e+02 5.9000e+02 7.4880e+02 3.0630e+02 3.8540e+02 7.2760e+02 + 6.3130e+02 7.1390e+02 8.5050e+02 1.1377e+03 1.7299e+03 1.4140e+03 6.2650e+02 + 6.8420e+02 1.0162e+03 6.5350e+02 4.3670e+02 5.7320e+02 6.2640e+02 1.8470e+02 + 7.0360e+02 2.2483e+03 2.4596e+03 2.4659e+03 1.5448e+03 2.8589e+03 2.3367e+03 + 2.5748e+03 1.9325e+03 3.7090e+03 2.9444e+03 1.0574e+03 7.8270e+02 6.6540e+02 + 4.5790e+02 4.3860e+02 6.2430e+02 6.8080e+02 4.4610e+02 6.1290e+02 7.2870e+02 + 4.0790e+02 3.3410e+02 3.5700e+02 7.0050e+02 1.0623e+03 2.7066e+03 1.5827e+03 + 2.2928e+03 4.2114e+03 1.1463e+03 3.5390e+02 3.3220e+02 8.0700e+02 9.2000e+02 + 1.2500e+02 2.5820e+02 1.2208e+03 3.5368e+03 2.4453e+03 3.7270e+02 6.0440e+02 + 6.9340e+02 4.1980e+02 4.5210e+02 8.4560e+02 4.0070e+02 4.1550e+02 8.7590e+02 + 1.2352e+03 3.4830e+03 1.5563e+03 5.5420e+02 5.3830e+02 3.5610e+02 6.2730e+02 + 2.5100e+02 4.0680e+02 4.7460e+02 3.7220e+02 4.6910e+02 2.2325e+03 3.1442e+03 + 2.3739e+03 1.6740e+03 2.7033e+03 1.6070e+03 5.1650e+02 1.5911e+03 2.1541e+03 + 2.3273e+03 4.7330e+02 6.2880e+02 1.0269e+03 3.6780e+02 3.7870e+02 5.6530e+02 + 8.3530e+02 3.9170e+02 7.5730e+02 4.3380e+02 6.0930e+02 6.4590e+02 7.5460e+02 + 6.6680e+02 1.2845e+03 3.0058e+03 1.8331e+03 1.8334e+03 2.8328e+03 2.7262e+03 + 2.7420e+02 3.4800e+02 9.0030e+02 8.2260e+02 8.6130e+02 3.9350e+02 1.0763e+03 + 3.6867e+03 3.1409e+03 4.0620e+02 5.8990e+02 4.9390e+02 2.4110e+02 3.9240e+02 + 6.9920e+02 6.8620e+02 5.1130e+02 7.2620e+02 2.9552e+03 3.5393e+03 8.0250e+02 + 8.6820e+02 6.3580e+02 4.5100e+02 3.5790e+02 4.7950e+02 3.2320e+02 4.1190e+02 + 7.4410e+02 5.6310e+02 7.7760e+02 2.3064e+03 3.5164e+03 1.4146e+03 2.5858e+03 + 1.4258e+03 1.0083e+03 1.7496e+03 3.2918e+03 3.6211e+03 2.8310e+02 3.4890e+02 + 7.1340e+02 4.8460e+02 3.8000e+02 5.7170e+02 4.0200e+02 4.5020e+02 5.9980e+02 + 3.5930e+02 2.8630e+02 9.4820e+02 8.4630e+02 5.5790e+02 2.1782e+03 2.4014e+03 + 2.0022e+03 1.3299e+03 3.5892e+03 1.3084e+03 6.3980e+02 1.5260e+02 4.2060e+02 + 8.6090e+02 5.8460e+02 5.1500e+02 1.0853e+03 2.9431e+03 2.1587e+03 1.8176e+03 + 3.9110e+02 5.0320e+02 4.9550e+02 4.5130e+02 8.5950e+02 3.5670e+02 3.2170e+02 + 1.8795e+03 3.9761e+03 2.4926e+03 1.2992e+03 6.6120e+02 6.7880e+02 8.8190e+02 + 6.4020e+02 3.6450e+02 7.4840e+02 5.5500e+02 7.8580e+02 4.9940e+02 1.0769e+03 + 2.4913e+03 4.6251e+03 3.1245e+03 2.7087e+03 1.5085e+03 7.3320e+02 1.0507e+03 + 3.5522e+03 1.8225e+03 4.7920e+02 4.1660e+02 4.2450e+02 5.0780e+02 5.1510e+02 + 4.6700e+02 2.8080e+02 5.0040e+02 4.2780e+02 6.1940e+02 4.7890e+02 8.4650e+02 + 4.8170e+02 5.8970e+02 1.0101e+03 3.7231e+03 2.0712e+03 2.7136e+03 3.7588e+03 + 2.3513e+03 5.6620e+02 2.5630e+02 3.7380e+02 4.2840e+02 8.7080e+02 9.9580e+02 + 1.0724e+03 1.3954e+03 2.8174e+03 3.8973e+03 1.3789e+03 5.3670e+02 4.9720e+02 + 6.4130e+02 2.9190e+02 7.4410e+02 8.2120e+02 2.2326e+03 2.6774e+03 2.6679e+03 + 1.3330e+03 8.5000e+02 5.2610e+02 5.1580e+02 6.9590e+02 5.7080e+02 5.0240e+02 + 8.7480e+02 5.6030e+02 7.1300e+02 2.6210e+02 3.2911e+03 4.1438e+03 4.9000e+03 + 1.7175e+03 7.0140e+02 4.1100e+02 1.0621e+03 3.5136e+03 2.2001e+03 1.0664e+03 + 4.6740e+02 2.9290e+02 3.1150e+02 7.2260e+02 3.8670e+02 5.9030e+02 2.5580e+02 + 5.5700e+02 8.1140e+02 4.9550e+02 6.2480e+02 5.7330e+02 6.0430e+02 7.0980e+02 + 2.8265e+03 3.8300e+03 1.2941e+03 3.8727e+03 2.1355e+03 4.9850e+02 3.2940e+02 + 2.0430e+02 4.7030e+02 5.0460e+02 6.2670e+02 8.3470e+02 1.4903e+03 1.8402e+03 + 4.6720e+03 9.7470e+02 3.7290e+02 7.5960e+02 7.6260e+02 4.5700e+02 4.8600e+02 + 1.1008e+03 1.5747e+03 4.5733e+03 3.0132e+03 4.4250e+02 5.1340e+02 4.8200e+02 + 4.0050e+02 5.3420e+02 6.4500e+02 2.7280e+02 1.0746e+03 9.5010e+02 2.7630e+02 + 4.7370e+02 1.8807e+03 4.9000e+03 3.8393e+03 6.0200e+02 5.9810e+02 4.3610e+02 + 1.2900e+03 2.3961e+03 2.3701e+03 6.4230e+02 6.8640e+02 5.5170e+02 2.1580e+02 + 3.9270e+02 3.1870e+02 1.7970e+02 1.2380e+02 3.1000e+02 5.7560e+02 5.4120e+02 + 2.8550e+02 2.6900e+02 4.3330e+02 7.6760e+02 1.9630e+03 2.7019e+03 2.2496e+03 + 3.7126e+03 2.8719e+03 8.3870e+02 2.6010e+02 2.7340e+02 4.9430e+02 6.2990e+02 + 6.4730e+02 5.5170e+02 4.4940e+02 1.7012e+03 3.6651e+03 2.9964e+03 6.2620e+02 + 6.4110e+02 7.8950e+02 1.6310e+02 4.2720e+02 6.8210e+02 2.7694e+03 3.1562e+03 + 2.2825e+03 8.4590e+02 6.7910e+02 4.1030e+02 5.2390e+02 7.6160e+02 4.9590e+02 + 2.4580e+02 2.8740e+02 1.0047e+03 5.6310e+02 7.7910e+02 3.0966e+03 4.5533e+03 + 4.9000e+03 7.4430e+02 4.7190e+02 4.5730e+02 1.5842e+03 2.5071e+03 3.6057e+03 + 1.6914e+03 8.2130e+02 3.5870e+02 3.1090e+02 6.2460e+02 1.1538e+03 4.0490e+02 + 8.0810e+02 5.0310e+02 3.8640e+02 7.2600e+02 5.8090e+02 3.6340e+02 6.3330e+02 + 6.9550e+02 1.1842e+03 1.6349e+03 1.6303e+03 3.9721e+03 2.4498e+03 4.5740e+02 + 3.9170e+02 3.8910e+02 6.7400e+02 6.7160e+02 4.9850e+02 4.5950e+02 3.3420e+02 + 1.1102e+03 1.9771e+03 2.6255e+03 1.1814e+03 4.4860e+02 3.9140e+02 3.2060e+02 + 5.4860e+02 1.9828e+03 3.6136e+03 3.1644e+03 2.8626e+03 6.9280e+02 4.9030e+02 + 7.0630e+02 3.4150e+02 3.5800e+02 2.6850e+02 2.7570e+02 5.5490e+02 4.8820e+02 + 5.1980e+02 5.0480e+02 3.5596e+03 4.2157e+03 4.4180e+03 5.4170e+02 5.3770e+02 + 2.6620e+02 9.2440e+02 2.3146e+03 2.9654e+03 1.8904e+03 5.4020e+02 6.3310e+02 + 2.0810e+02 4.2560e+02 5.0350e+02 6.5550e+02 3.2090e+02 4.7970e+02 6.6690e+02 + 5.3020e+02 1.0273e+03 4.3200e+02 3.0040e+02 3.3660e+02 1.0147e+03 2.8706e+03 + 2.0304e+03 2.6715e+03 3.5599e+03 1.0329e+03 4.1560e+02 4.8540e+02 5.5960e+02 + 6.3390e+02 8.1500e+02 3.5040e+02 4.4320e+02 5.9670e+02 1.2065e+03 2.9827e+03 + 2.0463e+03 3.5150e+02 3.5500e+02 3.2280e+02 6.0130e+02 1.7881e+03 4.0651e+03 + 2.1538e+03 1.0910e+03 9.9040e+02 4.9920e+02 4.0910e+02 2.2930e+02 4.8950e+02 + 3.2860e+02 3.0130e+02 4.0770e+02 4.1880e+02 4.6100e+02 2.6378e+03 3.9245e+03 + 4.2899e+03 2.5525e+03 7.1500e+02 5.0300e+02 5.3520e+02 5.1490e+02 2.0607e+03 + 3.9601e+03 2.2558e+03 9.1810e+02 7.4220e+02 3.2060e+02 4.7080e+02 4.6090e+02 + 5.9150e+02 4.0570e+02 4.6470e+02 6.1220e+02 8.4230e+02 7.1410e+02 5.9370e+02 + 6.7020e+02 4.5210e+02 4.7240e+02 2.8292e+03 9.3920e+02 2.5136e+03 2.7955e+03 + 7.4750e+02 7.2680e+02 5.0780e+02 5.5790e+02 7.5220e+02 7.4410e+02 5.1230e+02 + 5.6650e+02 7.4290e+02 1.8821e+03 2.2645e+03 3.3678e+03 9.0640e+02 3.8730e+02 + 2.2900e+02 6.3570e+02 2.8864e+03 2.7568e+03 1.0381e+03 1.1438e+03 7.0010e+02 + 6.8660e+02 4.7240e+02 5.7770e+02 3.7480e+02 4.5600e+02 6.6880e+02 3.5690e+02 + 2.6570e+02 5.1760e+02 3.1744e+03 4.4510e+03 3.5077e+03 1.4592e+03 7.5070e+02 + 3.6210e+02 5.0200e+02 3.8590e+02 1.1723e+03 2.5587e+03 1.6682e+03 1.2200e+03 + 7.4300e+02 4.6340e+02 6.8210e+02 8.6770e+02 7.3080e+02 4.8690e+02 3.1310e+02 + 5.2480e+02 7.9560e+02 9.2750e+02 3.3280e+02 3.8020e+02 5.4500e+02 7.4060e+02 + 2.3670e+03 8.5120e+02 3.3761e+03 2.6878e+03 8.6490e+02 6.8990e+02 3.5250e+02 + 6.0680e+02 9.0910e+02 1.1424e+03 7.6420e+02 4.8580e+02 1.0584e+03 6.1270e+02 + 2.1056e+03 2.6539e+03 2.2707e+03 7.9590e+02 6.5180e+02 2.3253e+03 2.3044e+03 + 2.1883e+03 5.2540e+02 8.0060e+02 5.5280e+02 5.3420e+02 4.2040e+02 3.7690e+02 + 4.7510e+02 3.1380e+02 6.6010e+02 6.2490e+02 2.3930e+02 1.4160e+03 1.9281e+03 + 4.9000e+03 3.8551e+03 1.6562e+03 3.1920e+02 4.9180e+02 4.8330e+02 6.1860e+02 + 1.0605e+03 2.5403e+03 2.2902e+03 9.0670e+02 1.9851e+03 8.5980e+02 7.1330e+02 + 7.5850e+02 5.9520e+02 7.6560e+02 4.1330e+02 3.7660e+02 5.3850e+02 1.2038e+03 + 2.6700e+02 2.2710e+02 5.2520e+02 5.6290e+02 2.7993e+03 7.6980e+02 2.5455e+03 + 4.7427e+03 1.4806e+03 6.6720e+02 7.3170e+02 3.7140e+02 7.5760e+02 1.1192e+03 + 3.4940e+02 4.2210e+02 4.8640e+02 4.3140e+02 1.6089e+03 4.3004e+03 1.6350e+03 + 1.9779e+03 1.5085e+03 2.2318e+03 2.6453e+03 8.8870e+02 5.8080e+02 2.2240e+02 + 5.5920e+02 2.8600e+02 3.5940e+02 5.5480e+02 6.2190e+02 3.0440e+02 4.3560e+02 + 5.7600e+02 7.5720e+02 6.9930e+02 2.2512e+03 3.3104e+03 3.7258e+03 2.4281e+03 + 4.5960e+02 3.2300e+02 6.6640e+02 3.4660e+02 4.1480e+02 1.6861e+03 2.5768e+03 + 2.5069e+03 2.7966e+03 1.8934e+03 7.3760e+02 4.2380e+02 6.1990e+02 3.6910e+02 + 7.4310e+02 5.1510e+02 8.2330e+02 1.1969e+03 5.0120e+02 6.7000e+01 2.7520e+02 + 8.6240e+02 2.4972e+03 7.8170e+02 2.4367e+03 4.1965e+03 2.0098e+03 6.2700e+02 + 7.1250e+02 6.5570e+02 4.2480e+02 9.0330e+02 6.8760e+02 4.7280e+02 4.3980e+02 + 4.2530e+02 5.9010e+02 2.5013e+03 2.5004e+03 1.6450e+03 3.5882e+03 2.7183e+03 + 2.5815e+03 6.7960e+02 3.7130e+02 4.4240e+02 5.8680e+02 5.8440e+02 4.7910e+02 + 6.9240e+02 3.3630e+02 1.5250e+02 1.2590e+02 6.1170e+02 1.2497e+03 2.5078e+03 + 2.9557e+03 2.9355e+03 4.2766e+03 8.7180e+02 6.2340e+02 3.5040e+02 6.3710e+02 + 7.7290e+02 7.1240e+02 9.0660e+02 1.7651e+03 1.7445e+03 1.5795e+03 3.3362e+03 + 2.5452e+03 1.0694e+03 1.4496e+03 8.9130e+02 5.7520e+02 1.2543e+03 7.1900e+02 + 7.8330e+02 4.9450e+02 1.8870e+02 3.2590e+02 8.3730e+02 2.7943e+03 7.3570e+02 + 1.4374e+03 3.1941e+03 3.3116e+03 1.7465e+03 9.2100e+02 3.9530e+02 4.0800e+02 + 2.5320e+02 7.0290e+02 3.6670e+02 4.2130e+02 5.7640e+02 6.7090e+02 1.7053e+03 + 2.5124e+03 4.7432e+03 3.4953e+03 1.3513e+03 1.9033e+03 6.6160e+02 1.3980e+02 + 4.0920e+02 4.2480e+02 3.5500e+02 3.0850e+02 6.4140e+02 3.0790e+02 4.4500e+01 + 5.9000e+01 5.1320e+02 1.2069e+03 2.5641e+03 3.8376e+03 4.3520e+03 2.8952e+03 + 9.6800e+02 4.1510e+02 6.6420e+02 5.5870e+02 6.9100e+02 3.7560e+02 8.3960e+02 + 6.5770e+02 1.5084e+03 2.7837e+03 2.8940e+03 2.3247e+03 1.5908e+03 2.8640e+03 + 1.7221e+03 1.7777e+03 1.2514e+03 8.6000e+02 1.0492e+03 5.2140e+02 4.0340e+02 + 4.5640e+02 2.6937e+03 2.4214e+03 5.0150e+02 5.4270e+02 2.0778e+03 2.7319e+03 + 1.4382e+03 1.3952e+03 6.1820e+02 3.5030e+02 6.6750e+02 5.4810e+02 6.4070e+02 + 4.0030e+02 2.5500e+02 6.3750e+02 1.0947e+03 3.1077e+03 4.9000e+03 3.6385e+03 + 2.2458e+03 6.1000e+02 3.0840e+02 3.8200e+02 8.2680e+02 7.8030e+02 5.1060e+02 + 4.6340e+02 6.1700e+02 5.5480e+02 1.6780e+02 2.8350e+02 6.6430e+02 8.2290e+02 + 1.5940e+03 2.5875e+03 3.8019e+03 2.7182e+03 5.3370e+02 4.5690e+02 1.1342e+03 + 6.2890e+02 5.3870e+02 6.0230e+02 6.9990e+02 5.9990e+02 2.8850e+02 8.5120e+02 + 2.0914e+03 2.7373e+03 1.7769e+03 2.2817e+03 2.2597e+03 1.5037e+03 2.4597e+03 + 1.4713e+03 1.0394e+03 4.9800e+02 5.4130e+02 7.5210e+02 2.3426e+03 2.4174e+03 + 5.2860e+02 6.1390e+02 1.4627e+03 1.2996e+03 3.2704e+03 1.7461e+03 4.2620e+02 + 4.7120e+02 6.4820e+02 3.8670e+02 8.0670e+02 4.1920e+02 2.7890e+02 5.7080e+02 + 9.8650e+02 2.9913e+03 4.9000e+03 1.7040e+03 2.8008e+03 7.9560e+02 4.3650e+02 + 2.3690e+02 4.2670e+02 6.8820e+02 6.0530e+02 6.9130e+02 5.3480e+02 3.4820e+02 + 5.3810e+02 4.1620e+02 7.8220e+02 1.0074e+03 3.7589e+03 3.3387e+03 4.9000e+03 + 2.9228e+03 7.2590e+02 4.9320e+02 1.3395e+03 6.2850e+02 3.8240e+02 3.4050e+02 + 1.2385e+03 5.7030e+02 3.5790e+02 5.7010e+02 9.7270e+02 8.5720e+02 6.9190e+02 + 2.1235e+03 1.4201e+03 2.7924e+03 2.2638e+03 1.8650e+03 2.1726e+03 1.3922e+03 + 8.2070e+02 8.5330e+02 2.7168e+03 2.3262e+03 8.6180e+02 7.7530e+02 1.5580e+03 + 1.7296e+03 2.2780e+03 2.2786e+03 6.5750e+02 4.1790e+02 3.1850e+02 4.8450e+02 + 5.1120e+02 6.5120e+02 1.8990e+02 1.6061e+03 1.2733e+03 3.0838e+03 4.9000e+03 + 2.4151e+03 6.1650e+02 3.1480e+02 5.1330e+02 6.4580e+02 4.0580e+02 1.1983e+03 + 9.0810e+02 6.8220e+02 5.3160e+02 2.6320e+02 7.0210e+02 5.6100e+02 5.4920e+02 + 1.5758e+03 3.3610e+03 2.5345e+03 2.9282e+03 2.6157e+03 8.1120e+02 2.1290e+02 + 3.6570e+02 3.5560e+02 4.8460e+02 2.8520e+02 4.0630e+02 7.1120e+02 4.6010e+02 + 2.8830e+02 1.2583e+03 1.3372e+03 1.2356e+03 3.5490e+02 2.1668e+03 1.6981e+03 + 2.6798e+03 2.7604e+03 2.1758e+03 1.6287e+03 1.4849e+03 1.8207e+03 1.7496e+03 + 2.3760e+03 6.1180e+02 7.6810e+02 5.1210e+02 2.1231e+03 2.8450e+03 2.3107e+03 + 2.0570e+03 3.3800e+02 1.9450e+02 3.8510e+02 5.2100e+02 7.8510e+02 9.7570e+02 + 3.1051e+03 1.9334e+03 2.3751e+03 3.0322e+03 2.4215e+03 1.1717e+03 4.8010e+02 + 4.2910e+02 8.4460e+02 1.1605e+03 6.3440e+02 5.0710e+02 8.7810e+02 2.4490e+02 + 5.1850e+02 3.2830e+02 3.5940e+02 3.0102e+03 2.2136e+03 2.7028e+03 1.8643e+03 + 2.2738e+03 1.4915e+03 6.2460e+02 1.9520e+02 2.0590e+02 2.7250e+02 2.3510e+02 + 3.5440e+02 2.0020e+02 3.7310e+02 2.4530e+02 4.4180e+02 6.4320e+02 1.3116e+03 + 6.5460e+02 3.9180e+02 7.8110e+02 2.0369e+03 1.4631e+03 2.8558e+03 2.4606e+03 + 1.8092e+03 3.1655e+03 2.3101e+03 3.2034e+03 2.4741e+03 6.5120e+02 9.8210e+02 + 1.7479e+03 1.8062e+03 1.4886e+03 3.8230e+02 4.8140e+02 7.7320e+02 1.0006e+03 + 2.3509e+03 2.0607e+03 1.1494e+03 5.3120e+02 5.4170e+02 6.3830e+02 1.0865e+03 + 1.9203e+03 7.5770e+02 4.0830e+02 3.5980e+02 2.9800e+02 6.0520e+02 1.8796e+03 + 1.6634e+03 1.0696e+03 8.2790e+02 4.5680e+02 6.9050e+02 3.0220e+02 6.0310e+02 + 6.4630e+02 4.1640e+02 4.2910e+02 4.9710e+02 6.4600e+02 1.3155e+03 9.9060e+02 + 1.1364e+03 9.8420e+02 6.1530e+02 4.1000e+02 4.6300e+02 5.7640e+02 2.0316e+03 + 1.9857e+03 6.5670e+02 1.9690e+02 6.6350e+02 5.3660e+02 5.0150e+02 5.8140e+02 + 7.3860e+02 7.0690e+02 3.9470e+02 1.0282e+03 1.8627e+03 2.5085e+03 1.5177e+03 + 1.0334e+03 2.2370e+02 1.0246e+03 6.1710e+02 1.4110e+03 2.0001e+03 1.5587e+03 + 4.9550e+02 7.8150e+02 4.7310e+02 7.2630e+02 2.0663e+03 3.4269e+03 8.7650e+02 + 5.0100e+02 3.6840e+02 8.7920e+02 1.6662e+03 2.4333e+03 1.8626e+03 4.4210e+02 + 3.5810e+02 2.6040e+02 8.8100e+02 1.0128e+03 2.1968e+03 2.0830e+03 1.0744e+03 + 5.5650e+02 8.9020e+02 3.5050e+02 4.8120e+02 5.4500e+02 5.4650e+02 3.6740e+02 + 6.5010e+02 9.0310e+02 1.6023e+03 1.7656e+03 8.3150e+02 6.6710e+02 5.9340e+02 + 4.6870e+02 5.0020e+02 3.4940e+02 1.2787e+03 3.1124e+03 1.3468e+03 3.2080e+02 + 3.6520e+02 4.3380e+02 5.0520e+02 7.3950e+02 5.8300e+02 5.5810e+02 9.4120e+02 + 1.1628e+03 1.7890e+03 2.5937e+03 7.9150e+02 4.0410e+02 6.2980e+02 9.2250e+02 + 8.4280e+02 1.4391e+03 1.6299e+03 1.5497e+03 7.9430e+02 3.7680e+02 6.6880e+02 + 9.2770e+02 1.7450e+03 2.1390e+03 1.9358e+03 9.6010e+02 2.9130e+02 6.6770e+02 + 1.9918e+03 3.0522e+03 5.5890e+02 2.9000e+02 4.3470e+02 4.9650e+02 4.9210e+02 + 1.0977e+03 1.9357e+03 2.0294e+03 9.2240e+02 5.2100e+02 5.3420e+02 5.4480e+02 + 6.4810e+02 9.2880e+02 4.0720e+02 5.4860e+02 4.1150e+02 1.8150e+03 2.5736e+03 + 8.9190e+02 5.9090e+02 2.8700e+02 5.1540e+02 7.9630e+02 7.4870e+02 6.4010e+02 + 1.2011e+03 3.3340e+03 9.8010e+02 2.5700e+02 1.4530e+02 3.1640e+02 5.8940e+02 + 9.7130e+02 5.7220e+02 5.8050e+02 7.6200e+02 1.5170e+03 1.2506e+03 1.8781e+03 + 9.1910e+02 4.6740e+02 9.4760e+02 9.1970e+02 9.6950e+02 1.5557e+03 1.7776e+03 + 1.9412e+03 8.0470e+02 5.1200e+02 3.6610e+02 6.5060e+02 1.3448e+03 2.7822e+03 + 2.2649e+03 1.1700e+03 3.3390e+02 9.1240e+02 1.0086e+03 3.5000e+03 9.6790e+02 + 1.7560e+02 6.7660e+02 6.2840e+02 7.4310e+02 6.1020e+02 2.4223e+03 2.1855e+03 + 7.3240e+02 2.1620e+02 9.4330e+02 4.6490e+02 8.8950e+02 6.9090e+02 6.1780e+02 + 4.1150e+02 4.6260e+02 1.5753e+03 2.5773e+03 1.3498e+03 3.5530e+02 1.9590e+02 + 4.8480e+02 8.2400e+02 9.8470e+02 7.8100e+02 9.1410e+02 2.2075e+03 1.0865e+03 + 6.6990e+02 1.7720e+02 3.6870e+02 3.9350e+02 3.5440e+02 6.0800e+02 8.6390e+02 + 7.5490e+02 1.5468e+03 1.6812e+03 9.3910e+02 6.5930e+02 6.3050e+02 1.1089e+03 + 9.7900e+02 5.9540e+02 1.0973e+03 2.0092e+03 1.5120e+03 9.7320e+02 1.2543e+03 + 6.3930e+02 3.2700e+02 1.0696e+03 1.2004e+03 1.8449e+03 1.4773e+03 5.5200e+02 + 3.5520e+02 8.4390e+02 3.1841e+03 1.6390e+03 4.4690e+02 3.1200e+02 7.8590e+02 + 9.8060e+02 7.5740e+02 1.8977e+03 2.3190e+03 6.7830e+02 3.8130e+02 4.0010e+02 + 6.5290e+02 6.0120e+02 4.8010e+02 4.6150e+02 4.1220e+02 7.6320e+02 1.3203e+03 + 2.5171e+03 9.9660e+02 2.6330e+02 1.6910e+02 4.6350e+02 8.0980e+02 6.7830e+02 + 3.6790e+02 1.8540e+03 1.7923e+03 3.5790e+02 8.4660e+02 3.7680e+02 5.7480e+02 + 2.0190e+02 2.9740e+02 4.4670e+02 3.0000e+02 5.1290e+02 1.5430e+03 1.6713e+03 + 2.0194e+03 6.3850e+02 5.1710e+02 6.2050e+02 1.0110e+03 5.5880e+02 1.1781e+03 + 2.1206e+03 1.9450e+03 1.1270e+03 4.9460e+02 6.1760e+02 7.1220e+02 6.0160e+02 + 8.0010e+02 2.0235e+03 1.0104e+03 8.3730e+02 3.8830e+02 1.2674e+03 3.3999e+03 + 9.8450e+02 3.4530e+02 7.6070e+02 6.2230e+02 7.0590e+02 1.4479e+03 1.5295e+03 + 2.1584e+03 1.5460e+03 4.4930e+02 3.2170e+02 4.6980e+02 6.6330e+02 5.9010e+02 + 3.5080e+02 3.1540e+02 1.5600e+03 2.3409e+03 1.7744e+03 7.1330e+02 3.5910e+02 + 2.2130e+02 3.6910e+02 8.2150e+02 4.6460e+02 7.7010e+02 1.2783e+03 1.8624e+03 + 7.3010e+02 9.3700e+02 5.8690e+02 3.1080e+02 2.1700e+02 3.3930e+02 4.5400e+02 + 7.9100e+02 5.7130e+02 1.3346e+03 2.3079e+03 1.6979e+03 9.6230e+02 4.1450e+02 + 7.1400e+02 5.1280e+02 4.9680e+02 7.6710e+02 1.7481e+03 1.8847e+03 2.5870e+02 + 7.0920e+02 4.2630e+02 4.7690e+02 4.7220e+02 1.2344e+03 1.1870e+03 1.5786e+03 + 7.5030e+02 9.6400e+02 1.2469e+03 2.7678e+03 8.9130e+02 4.5040e+02 4.1960e+02 + 8.0800e+02 5.9170e+02 6.8840e+02 1.5944e+03 2.7914e+03 7.9510e+02 9.5370e+02 + 5.1940e+02 2.3540e+02 4.4720e+02 5.6930e+02 2.0610e+02 4.7480e+02 7.8130e+02 + 2.4035e+03 1.9186e+03 1.7279e+03 5.4030e+02 5.9000e+02 5.5190e+02 7.5110e+02 + 8.3390e+02 1.1270e+03 8.2310e+02 1.5820e+03 5.5410e+02 1.0401e+03 3.0310e+02 + 1.0057e+03 4.3480e+02 6.4800e+01 2.9590e+02 4.7340e+02 5.8080e+02 7.0870e+02 + 9.0310e+02 2.1788e+03 1.1679e+03 9.6320e+02 8.3430e+02 4.3980e+02 4.1090e+02 + 1.1337e+03 1.7277e+03 2.7474e+03 1.0141e+03 3.1560e+02 1.7270e+02 3.0650e+02 + 8.9780e+02 8.2600e+02 1.2544e+03 3.0454e+03 1.5376e+03 8.2390e+02 1.1396e+03 + 2.5404e+03 9.1470e+02 9.7500e+02 4.1870e+02 3.9380e+02 7.7810e+02 9.6630e+02 + 1.3810e+03 1.7086e+03 9.5430e+02 9.8750e+02 4.5140e+02 9.9400e+01 3.2720e+02 + 7.1400e+02 6.5600e+02 6.5370e+02 6.1100e+02 3.0488e+03 2.4214e+03 1.0598e+03 + 5.6150e+02 7.0610e+02 3.8240e+02 4.6230e+02 8.2100e+02 1.2049e+03 1.3714e+03 + 9.4390e+02 9.6360e+02 6.2490e+02 3.8800e+02 7.6870e+02 5.9530e+02 2.1230e+02 + 4.1070e+02 4.3400e+02 5.8220e+02 8.9310e+02 1.1180e+03 1.6763e+03 2.3470e+03 + 1.2400e+03 8.6840e+02 2.4410e+02 1.7540e+02 1.0062e+03 2.5554e+03 1.8580e+03 + 1.1410e+03 3.7330e+02 2.1250e+02 3.8510e+02 8.8770e+02 3.9580e+02 5.0720e+02 + 1.5654e+03 2.0807e+03 5.5800e+02 7.4080e+02 3.0061e+03 7.1350e+02 7.5660e+02 + 3.1630e+02 7.9380e+02 6.1790e+02 6.4810e+02 1.1408e+03 1.7077e+03 2.0527e+03 + 1.3327e+03 7.1290e+02 4.6260e+02 5.4600e+02 9.1380e+02 9.5740e+02 7.4950e+02 + 8.2560e+02 1.9162e+03 3.0306e+03 1.4418e+03 4.8470e+02 7.3840e+02 6.3120e+02 + 1.3690e+03 1.5872e+03 1.7908e+03 1.2287e+03 9.4660e+02 6.2340e+02 5.7130e+02 + 3.7450e+02 8.3020e+02 3.9730e+02 5.4850e+02 4.6550e+02 6.0400e+02 5.8200e+02 + 7.4410e+02 9.6320e+02 2.2437e+03 2.7735e+03 1.5766e+03 9.1010e+02 2.1530e+02 + 3.4250e+02 8.1040e+02 1.8647e+03 2.3259e+03 9.9250e+02 7.9030e+02 2.8590e+02 + 7.9270e+02 9.2330e+02 3.8690e+02 6.1920e+02 2.2894e+03 2.6540e+03 1.4022e+03 + 8.0630e+02 1.6494e+03 1.1141e+03 6.1000e+02 5.8600e+02 2.0970e+02 1.0246e+03 + 5.4960e+02 7.7700e+02 2.8407e+03 2.0097e+03 1.5316e+03 6.7070e+02 2.1940e+02 + 3.2710e+02 7.5000e+02 7.8300e+02 6.4420e+02 4.7090e+02 1.6838e+03 1.9528e+03 + 1.4134e+03 9.5230e+02 1.5454e+03 6.4510e+02 1.1551e+03 1.5544e+03 1.6435e+03 + 1.0958e+03 8.3970e+02 5.3740e+02 3.5710e+02 2.9040e+02 6.1220e+02 6.6890e+02 + 6.3950e+02 1.0999e+03 6.4700e+02 3.6350e+02 4.4910e+02 4.3450e+02 1.5444e+03 + 1.9340e+03 2.1290e+03 1.2024e+03 2.6920e+02 2.3210e+02 5.1980e+02 1.5804e+03 + 2.0257e+03 1.1257e+03 6.1280e+02 5.2740e+02 9.3850e+02 1.1171e+03 2.6420e+02 + 5.6510e+02 1.8226e+03 2.7812e+03 2.3742e+03 8.8060e+02 1.9712e+03 7.8900e+02 + 6.3690e+02 4.5050e+02 3.3690e+02 7.3480e+02 3.6470e+02 1.4352e+03 2.5605e+03 + 2.0471e+03 1.0147e+03 6.4590e+02 5.0300e+02 5.0150e+02 8.8520e+02 1.3426e+03 + 8.0790e+02 1.0973e+03 2.5372e+03 2.0095e+03 1.9097e+03 9.7850e+02 1.5051e+03 + 1.6150e+03 1.8574e+03 1.8159e+03 6.4980e+02 1.0315e+03 3.4850e+02 4.7110e+02 + 6.6410e+02 5.6530e+02 3.3410e+02 5.1250e+02 2.3330e+02 1.0127e+03 4.0850e+02 + 2.1500e+02 2.1800e+02 4.4830e+02 8.7890e+02 1.8424e+03 1.8686e+03 9.6040e+02 + 3.1930e+02 3.5070e+02 1.1298e+03 6.8750e+02 1.8447e+03 1.0073e+03 5.2400e+02 + 7.3880e+02 8.9520e+02 4.0380e+02 2.9180e+02 3.9980e+02 1.1713e+03 2.1094e+03 + 1.7238e+03 1.6985e+03 3.1498e+03 5.3090e+02 6.3830e+02 6.3660e+02 3.4930e+02 + 3.9530e+02 4.9280e+02 1.5210e+03 2.1698e+03 1.6078e+03 4.8960e+02 5.0660e+02 + 4.8630e+02 4.0170e+02 5.0750e+02 1.4208e+03 6.5200e+02 1.6313e+03 3.5000e+03 + 2.5943e+03 1.3667e+03 1.5489e+03 5.9670e+02 1.7438e+03 1.9643e+03 1.1986e+03 + 7.0530e+02 5.0440e+02 6.0990e+02 4.6440e+02 3.7970e+02 6.3970e+02 8.9010e+02 + 3.7170e+02 5.5100e+02 5.6540e+02 4.7130e+02 2.8400e+02 1.9430e+02 4.9110e+02 + 1.0238e+03 1.3542e+03 2.0668e+03 2.2294e+03 7.1800e+02 3.6320e+02 5.3900e+02 + 1.4113e+03 2.1596e+03 1.8598e+03 5.8310e+02 8.2450e+02 8.8250e+02 5.0690e+02 + 6.0740e+02 4.3250e+02 7.0030e+02 1.0900e+03 3.5000e+03 3.1363e+03 2.3696e+03 + 1.2362e+03 7.0020e+02 6.7960e+02 2.6240e+02 3.2220e+02 5.1190e+02 1.2189e+03 + 1.6654e+03 1.6768e+03 8.5310e+02 5.0890e+02 6.7120e+02 4.5160e+02 1.5045e+03 + 1.5019e+03 1.0544e+03 1.1085e+03 3.0393e+03 2.4090e+03 1.7524e+03 1.5705e+03 + 1.4271e+03 1.5274e+03 1.4234e+03 8.6590e+02 4.1610e+02 5.2310e+02 5.8420e+02 + 5.3080e+02 3.7240e+02 2.9630e+02 4.6130e+02 4.1020e+02 4.4970e+02 5.2360e+02 + 4.7840e+02 1.8560e+02 5.2680e+02 2.9130e+02 4.5200e+02 9.4570e+02 1.9096e+03 + 2.1546e+03 5.7830e+02 4.0080e+02 6.2440e+02 1.5958e+03 1.5937e+03 2.5469e+03 + 5.5310e+02 6.3550e+02 8.2210e+02 4.5770e+02 5.0630e+02 5.2890e+02 8.7230e+02 + 7.4110e+02 2.9884e+03 3.5000e+03 1.7654e+03 5.7100e+02 9.1970e+02 6.2720e+02 + 2.2600e+02 3.6410e+02 3.3570e+02 1.6603e+03 1.0851e+03 1.5745e+03 1.3921e+03 + 9.5520e+02 5.5220e+02 1.5453e+03 1.2433e+03 8.5980e+02 9.2090e+02 9.3380e+02 + 2.4390e+03 3.1946e+03 8.8440e+02 1.0890e+03 6.3660e+02 6.9890e+02 9.2250e+02 + 3.5710e+02 3.9570e+02 5.0040e+02 4.0470e+02 6.0560e+02 4.3890e+02 6.0730e+02 + 6.7610e+02 3.9590e+02 3.3170e+02 5.7790e+02 2.6090e+02 4.0110e+02 2.1410e+02 + 3.9630e+02 4.2240e+02 1.0000e+03 1.8881e+03 1.1315e+03 4.0970e+02 6.6630e+02 + 6.9910e+02 1.2916e+03 1.3140e+03 2.2195e+03 6.9730e+02 5.9700e+02 7.0180e+02 + 3.5560e+02 8.3780e+02 8.5250e+02 1.0701e+03 6.6030e+02 1.0923e+03 3.5000e+03 + 1.5902e+03 7.7310e+02 5.1080e+02 5.9930e+02 3.1730e+02 3.2200e+02 4.4380e+02 + 1.0035e+03 2.1458e+03 1.3801e+03 1.1606e+03 6.8370e+02 1.4799e+03 1.2184e+03 + 2.1674e+03 6.7040e+02 1.3109e+03 1.3349e+03 1.9554e+03 1.7475e+03 1.7695e+03 + 6.2850e+02 5.6840e+02 1.0171e+03 6.6620e+02 6.2240e+02 6.4390e+02 5.5230e+02 + 2.2610e+02 3.6150e+02 3.6200e+02 8.6660e+02 6.4500e+02 3.7800e+02 3.1530e+02 + 2.3780e+02 2.0050e+02 3.4580e+02 4.4660e+02 3.4960e+02 8.3910e+02 8.6210e+02 + 1.1296e+03 2.1029e+03 8.4170e+02 5.2160e+02 8.7100e+02 1.8615e+03 9.7280e+02 + 1.5647e+03 1.2301e+03 1.0482e+03 3.9330e+02 6.1610e+02 5.5400e+02 8.0220e+02 + 9.3800e+02 2.6380e+02 8.0710e+02 3.5000e+03 2.3905e+03 1.1633e+03 4.6980e+02 + 3.6930e+02 3.6010e+02 5.2750e+02 9.4820e+02 1.2146e+03 2.6361e+03 1.4952e+03 + 1.0425e+03 8.0310e+02 1.2745e+03 1.6559e+03 1.3568e+03 1.0083e+03 3.4100e+02 + 8.9820e+02 1.7664e+03 2.3413e+03 1.5331e+03 5.2140e+02 3.7040e+02 8.8680e+02 + 9.2810e+02 7.6960e+02 1.0899e+03 4.9250e+02 4.2960e+02 3.3040e+02 8.7030e+02 + 1.0375e+03 5.2970e+02 3.4480e+02 4.3170e+02 2.2210e+02 2.4670e+02 3.9960e+02 + 5.3050e+02 3.5320e+02 4.8920e+02 4.9500e+02 6.6440e+02 1.5213e+03 4.6890e+02 + 2.9330e+02 1.4197e+03 9.2260e+02 1.4408e+03 1.3180e+03 1.3041e+03 6.8100e+02 + 6.3780e+02 3.9150e+02 6.6180e+02 5.2090e+02 3.6110e+02 4.9690e+02 1.7820e+03 + 2.9772e+03 2.9286e+03 6.5080e+02 5.8110e+02 2.9160e+02 4.8980e+02 7.3320e+02 + 9.0650e+02 1.3001e+03 2.0833e+03 7.4460e+02 3.4420e+02 4.3960e+02 2.0696e+03 + 3.3336e+03 1.2169e+03 7.4930e+02 4.7060e+02 1.5361e+03 1.1464e+03 2.6421e+03 + 1.6578e+03 7.0090e+02 4.0130e+02 3.7240e+02 7.2880e+02 7.7410e+02 7.8090e+02 + 3.9930e+02 4.0540e+02 4.9530e+02 8.6790e+02 7.6340e+02 6.0600e+02 3.1020e+02 + 2.4070e+02 6.4760e+02 8.6890e+02 5.4140e+02 6.0450e+02 4.4970e+02 3.8600e+02 + 4.6600e+02 8.1610e+02 4.6950e+02 5.8340e+02 3.9050e+02 5.8080e+02 7.7230e+02 + 1.1974e+03 1.5362e+03 1.4927e+03 1.1520e+03 6.5040e+02 3.1260e+02 7.1090e+02 + 3.3490e+02 4.6220e+02 4.6900e+02 1.7614e+03 3.5000e+03 2.9461e+03 4.1730e+02 + 7.7910e+02 3.1700e+02 5.4160e+02 7.2320e+02 5.3040e+02 2.1076e+03 1.9744e+03 + 1.2760e+03 2.0220e+02 7.7180e+02 1.1546e+03 1.9543e+03 9.0900e+02 3.4280e+02 + 7.3920e+02 1.0864e+03 8.6810e+02 2.5747e+03 2.2252e+03 1.2163e+03 2.8770e+02 + 2.7640e+02 6.8900e+02 7.1810e+02 6.1000e+02 1.0111e+03 5.6700e+02 5.3240e+02 + 4.6040e+02 9.9050e+02 4.7140e+02 2.3510e+02 3.2380e+02 1.0131e+03 9.1170e+02 + 6.4750e+02 6.1530e+02 4.5980e+02 3.4520e+02 4.1170e+02 3.2630e+02 3.4000e+02 + 4.6470e+02 3.4710e+02 5.0380e+02 8.3870e+02 6.8840e+02 2.2259e+03 1.5542e+03 + 8.0010e+02 6.8180e+02 6.2850e+02 4.4750e+02 3.6220e+02 3.3580e+02 5.1190e+02 + 1.5235e+03 2.8255e+03 2.4985e+03 2.0758e+03 4.5970e+02 2.8630e+02 4.1300e+02 + 4.1330e+02 9.0440e+02 1.0281e+03 1.7473e+03 1.1077e+03 3.3590e+02 6.1030e+02 + 2.7542e+03 2.3684e+03 4.8490e+02 9.0700e+02 7.9810e+02 1.3865e+03 1.0263e+03 + 2.2491e+03 2.4485e+03 1.2834e+03 2.4700e+02 2.4300e+02 3.8590e+02 3.2180e+02 + 6.7410e+02 5.5270e+02 1.0037e+03 5.3460e+02 1.5280e+02 4.9220e+02 9.1330e+02 + 2.6160e+02 3.9940e+02 9.0790e+02 6.5740e+02 7.3700e+02 6.1600e+02 8.3880e+02 + 4.2690e+02 6.3670e+02 6.2380e+02 4.0610e+02 6.2020e+02 6.3250e+02 4.7980e+02 + 3.5650e+02 5.6490e+02 1.5140e+03 2.4486e+03 7.5710e+02 4.9320e+02 3.6390e+02 + 6.0900e+02 2.1690e+02 8.8820e+02 1.9453e+03 1.6031e+03 2.6852e+03 2.8743e+03 + 1.8779e+03 8.7860e+02 2.5380e+02 2.6550e+02 2.3240e+02 9.2610e+02 1.5074e+03 + 2.6122e+03 1.3631e+03 5.9260e+02 5.5350e+02 1.1285e+03 1.9976e+03 1.7536e+03 + 9.8990e+02 5.7970e+02 6.7340e+02 7.4580e+02 1.4721e+03 2.7687e+03 7.3630e+02 + 3.2840e+02 2.5510e+02 5.1890e+02 4.5340e+02 4.7960e+02 7.0300e+02 7.8020e+02 + 1.4120e+02 2.8560e+02 5.2860e+02 3.8970e+02 3.2270e+02 3.3620e+02 1.3096e+03 + 8.7310e+02 6.1740e+02 7.0490e+02 5.7610e+02 4.0040e+02 4.3340e+02 2.4530e+02 + 6.4610e+02 3.9470e+02 3.9770e+02 3.1210e+02 4.0620e+02 8.4810e+02 1.6449e+03 + 2.7571e+03 5.5910e+02 4.8780e+02 5.6420e+02 5.0270e+02 5.0590e+02 7.2170e+02 + 9.4200e+02 1.7549e+03 1.6033e+03 1.7378e+03 1.6588e+03 8.9370e+02 6.0030e+02 + 3.8590e+02 1.9660e+02 6.4500e+02 1.0422e+03 2.2773e+03 8.3910e+02 9.5020e+02 + 1.0189e+03 1.0012e+03 2.5069e+03 1.8602e+03 8.6160e+02 3.1260e+02 6.2210e+02 + 8.2450e+02 2.1025e+03 2.0233e+03 1.1615e+03 3.2850e+02 3.7530e+02 6.0650e+02 + 8.8050e+02 6.1180e+02 3.7570e+02 6.2390e+02 4.3690e+02 3.8580e+02 5.8560e+02 + 5.7620e+02 5.4130e+02 7.9680e+02 7.3930e+02 3.2060e+02 3.5210e+02 3.6430e+02 + 3.3080e+02 2.7130e+02 2.6480e+02 3.7070e+02 8.7130e+02 3.3450e+02 5.7640e+02 + 9.1110e+02 2.3500e+02 4.2530e+02 1.0771e+03 1.5478e+03 8.6320e+02 6.4180e+02 + 4.1690e+02 2.1720e+02 3.3780e+02 1.0643e+03 2.7334e+03 2.2701e+03 1.5785e+03 + 1.0780e+03 1.8401e+03 9.8140e+02 5.8080e+02 2.2330e+02 2.3020e+02 3.8510e+02 + 1.6040e+03 2.1255e+03 9.6490e+02 5.7130e+02 7.7820e+02 9.0670e+02 3.1025e+03 + 1.6769e+03 1.2061e+03 7.6340e+02 5.1400e+02 5.1340e+02 1.5146e+03 1.8965e+03 + 1.0534e+03 5.9760e+02 5.9990e+02 7.0700e+02 6.1900e+02 4.9580e+02 3.7460e+02 + 5.2510e+02 6.0830e+02 3.5510e+02 4.3240e+02 5.4200e+02 8.5310e+02 1.2642e+03 + 9.9850e+02 5.4850e+02 2.2390e+02 1.5300e+02 4.6520e+02 5.4170e+02 2.1340e+02 + 6.5760e+02 4.9000e+02 2.7590e+02 4.8600e+02 4.4010e+02 2.6640e+02 8.9630e+02 + 1.3871e+03 1.6316e+03 4.4330e+02 3.5310e+02 2.0930e+02 5.0320e+02 8.2230e+02 + 1.2664e+03 2.8267e+03 1.0817e+03 1.2238e+03 1.1608e+03 1.5243e+03 2.3794e+03 + 1.4958e+03 5.0770e+02 3.3620e+02 3.4660e+02 1.1249e+03 2.7234e+03 9.9810e+02 + 5.6980e+02 4.7810e+02 1.2285e+03 1.9733e+03 1.5919e+03 6.5110e+02 1.2519e+03 + 2.7350e+02 4.9730e+02 9.0240e+02 2.2298e+03 1.3608e+03 5.6530e+02 7.6770e+02 + 5.4630e+02 8.7030e+02 3.1380e+02 4.5720e+02 3.7110e+02 4.5300e+02 5.8990e+02 + 6.3020e+02 4.2690e+02 5.1820e+02 8.3820e+02 8.7310e+02 2.8450e+02 2.8300e+02 + 4.3750e+02 8.4100e+02 3.8600e+02 1.1270e+02 3.8580e+02 5.2740e+02 5.5490e+02 + 2.0680e+02 4.1210e+02 4.0570e+02 1.3985e+03 1.7079e+03 2.1014e+03 1.0705e+03 + 3.7420e+02 3.0370e+02 3.3030e+02 1.0882e+03 2.4363e+03 2.1115e+03 1.5459e+03 + 3.6560e+02 9.3290e+02 1.8967e+03 1.7133e+03 1.3708e+03 4.3630e+02 2.5280e+02 + 6.2430e+02 1.1715e+03 2.9417e+03 1.5526e+03 4.6070e+02 6.3150e+02 1.7465e+03 + 2.0820e+03 2.3547e+03 1.1174e+03 6.5370e+02 6.3410e+02 3.8870e+02 1.0220e+03 + 1.7015e+03 1.7693e+03 1.0409e+03 4.4780e+02 6.0490e+02 1.0120e+03 3.0290e+02 + 3.7600e+02 3.1250e+02 5.3850e+02 6.8210e+02 7.6430e+02 6.0010e+02 1.7460e+02 + 4.0490e+02 2.9270e+02 2.0830e+02 3.1800e+02 7.0030e+02 4.2890e+02 2.5300e+02 + 5.1010e+02 7.0710e+02 3.8430e+02 3.3570e+02 3.3360e+02 6.0970e+02 5.2320e+02 + 7.5780e+02 1.7902e+03 9.0250e+02 7.6530e+02 5.4970e+02 3.1340e+02 5.0540e+02 + 9.4840e+02 2.2134e+03 2.0140e+03 1.5398e+03 2.4040e+02 5.1940e+02 1.2240e+03 + 1.6944e+03 1.4997e+03 5.5940e+02 3.3480e+02 4.4300e+02 1.3169e+03 1.7788e+03 + 1.1352e+03 4.3270e+02 4.5880e+02 9.4500e+02 1.3180e+03 1.5439e+03 1.5457e+03 + 1.5880e+03 6.1960e+02 9.6030e+02 9.2990e+02 8.6240e+02 2.1370e+03 1.9312e+03 + 6.3170e+02 7.6010e+02 7.2190e+02 3.6290e+02 4.7420e+02 4.0450e+02 3.2400e+02 + 6.7700e+02 9.5010e+02 6.5110e+02 4.1430e+02 1.8750e+02 1.9710e+02 2.6870e+02 + 3.3920e+02 6.9380e+02 5.5880e+02 4.5900e+02 1.0719e+03 6.7300e+02 7.1520e+02 + 5.8390e+02 3.9810e+02 5.1410e+02 7.7630e+02 1.5863e+03 2.5290e+03 1.0587e+03 + 6.2500e+02 7.8320e+02 2.7830e+02 3.9720e+02 2.1475e+03 2.0163e+03 1.8140e+03 + 5.3980e+02 4.8270e+02 5.7820e+02 1.0043e+03 1.5020e+03 2.4230e+03 8.4710e+02 + 3.0960e+02 6.0460e+02 9.9520e+02 1.5308e+03 1.9151e+03 1.4743e+03 4.7780e+02 + 9.7160e+02 5.2080e+02 1.6642e+03 1.3026e+03 1.8543e+03 1.5422e+03 1.6480e+03 + 9.2200e+02 1.3154e+03 1.6735e+03 2.3535e+03 9.8550e+02 6.2890e+02 5.3240e+02 + 3.4790e+02 4.7970e+02 2.6480e+02 3.9430e+02 6.5170e+02 1.0309e+03 5.7680e+02 + 4.5450e+02 3.6060e+02 1.6070e+02 3.5930e+02 5.2890e+02 6.4230e+02 5.3780e+02 + 5.5320e+02 7.8070e+02 7.5160e+02 5.7060e+02 2.1150e+02 6.5250e+02 5.6250e+02 + 1.5325e+03 1.5313e+03 2.1690e+03 6.2070e+02 4.9100e+02 4.4470e+02 5.6730e+02 + 1.2329e+03 2.6221e+03 1.5321e+03 3.7060e+02 2.2880e+02 5.2200e+02 3.4270e+02 + 4.0780e+02 1.6497e+03 1.7321e+03 9.4920e+02 4.7150e+02 3.4790e+02 1.5265e+03 + 1.0488e+03 2.0188e+03 8.1400e+02 1.3515e+03 1.9960e+02 9.7750e+02 8.9610e+02 + 1.0363e+03 1.2437e+03 1.8834e+03 9.1060e+02 8.9800e+02 1.0181e+03 1.5428e+03 + 1.8060e+03 8.2920e+02 2.8190e+02 5.8380e+02 2.8900e+02 3.9740e+02 7.5580e+02 + 2.0800e+02 3.7900e+02 8.6360e+02 4.2210e+02 1.7040e+02 1.3420e+02 3.1070e+02 + 6.4030e+02 3.5590e+02 7.9860e+02 5.9180e+02 5.4140e+02 2.7990e+02 7.4170e+02 + 3.9390e+02 2*5.5620e+02 8.7940e+02 1.0719e+03 2.0347e+03 1.0383e+03 + 6.5780e+02 4.2330e+02 5.5690e+02 4.5120e+02 1.0297e+03 2.7147e+03 1.0952e+03 + 2.9790e+02 3.5640e+02 5.3850e+02 4.7440e+02 7.9880e+02 9.9280e+02 2.8528e+03 + 1.9025e+03 5.7340e+02 2.8160e+02 1.2910e+03 1.4926e+03 1.9481e+03 1.7080e+03 + 2.7880e+02 1.4520e+02 3.4830e+02 5.8840e+02 5.8980e+02 3.6120e+02 8.5480e+02 + 1.7614e+03 2.0869e+03 1.0115e+03 2.7324e+03 3.5000e+03 2.1561e+03 5.6820e+02 + 4.1020e+02 1.9230e+02 4.8970e+02 5.7080e+02 2.2390e+02 3.4170e+02 8.1520e+02 + 4.0120e+02 2.1710e+02 5.6890e+02 7.0710e+02 7.7450e+02 4.4170e+02 3.7000e+02 + 6.0940e+02 4.5850e+02 3.2690e+02 5.7550e+02 5.3410e+02 6.2150e+02 8.4390e+02 + 1.5901e+03 2.1618e+03 1.3134e+03 7.8560e+02 5.2000e+02 4.8400e+02 4.3230e+02 + 8.9830e+02 2.4258e+03 1.4370e+03 1.6301e+03 7.0120e+02 3.7170e+02 4.6570e+02 + 4.6650e+02 2.3990e+02 9.3500e+02 2.8622e+03 2.2220e+03 5.8580e+02 6.0520e+02 + 7.8260e+02 6.1910e+02 1.0854e+03 2.1366e+03 1.2740e+03 4.1910e+02 3.8900e+02 + 6.6180e+02 6.4680e+02 6.2740e+02 4.4820e+02 1.1466e+03 1.0286e+03 2.0334e+03 + 3.1261e+03 3.1029e+03 2.8061e+03 1.5826e+03 6.8240e+02 3.8920e+02 4.6140e+02 + 8.5250e+02 3.1900e+02 2.2350e+02 5.2970e+02 5.4270e+02 3.2140e+02 5.6990e+02 + 4.5690e+02 7.1650e+02 5.8040e+02 3.6680e+02 5.8160e+02 1.0176e+03 4.3390e+02 + 6.2900e+02 1.5123e+03 5.6080e+02 6.3220e+02 1.5843e+03 1.6913e+03 1.6477e+03 + 4.7400e+02 4.9730e+02 3.3530e+02 3.9300e+02 1.5102e+03 1.5115e+03 6.9420e+02 + 1.0662e+03 4.7510e+02 4.7410e+02 3.9020e+02 3.5290e+02 2.4400e+02 9.4200e+02 + 1.6022e+03 2.6595e+03 1.2228e+03 5.9950e+02 4.2750e+02 6.3950e+02 1.5594e+03 + 3.1058e+03 2.1971e+03 2.7880e+02 7.1250e+02 5.7780e+02 6.4960e+02 4.9670e+02 + 4.9690e+02 3.1100e+02 6.1540e+02 1.5031e+03 2.0203e+03 1.9319e+03 3.5000e+03 + 2.1828e+03 5.7270e+02 3.5810e+02 8.6620e+02 7.9800e+02 4.0420e+02 3.3920e+02 + 3.7460e+02 6.2070e+02 3.0910e+02 7.1000e+02 6.1660e+02 6.6390e+02 4.9470e+02 + 1.9450e+02 5.8070e+02 8.4480e+02 2.7450e+02 2.3550e+02 9.5510e+02 6.3680e+02 + 7.6100e+02 1.2871e+03 2.1776e+03 7.8220e+02 1.0328e+03 4.4640e+02 3.5810e+02 + 5.8120e+02 2.3628e+03 2.4403e+03 8.3790e+02 1.4200e+02 6.8930e+02 1.0218e+03 + 4.2790e+02 2.8660e+02 2.9130e+02 4.1470e+02 1.7144e+03 2.6790e+03 1.6090e+03 + 3.3370e+02 3.0800e+02 6.5880e+02 1.5593e+03 2.6729e+03 1.8928e+03 1.6270e+03 + 1.1838e+03 5.3220e+02 4.3320e+02 3.6680e+02 7.0040e+02 7.1050e+02 4.0930e+02 + 3.5170e+02 5.5630e+02 1.7701e+03 2.3619e+03 2.6584e+03 1.6834e+03 5.1360e+02 + 9.4650e+02 4.0520e+02 2.6420e+02 1.7940e+02 4.8250e+02 6.1520e+02 5.8780e+02 + 4.5550e+02 8.4440e+02 6.3690e+02 5.6910e+02 3.4400e+02 7.5450e+02 7.9600e+02 + 2.8780e+02 4.9550e+02 1.1449e+03 6.2770e+02 8.6950e+02 2.4721e+03 1.7695e+03 + 9.8010e+02 6.3330e+02 7.5890e+02 3.5470e+02 6.2630e+02 1.2742e+03 2.6575e+03 + 8.2370e+02 2.2590e+02 5.7200e+02 8.5380e+02 8.4450e+02 2.8890e+02 4.3430e+02 + 8.2390e+02 9.9640e+02 2.1866e+03 1.7868e+03 1.1143e+03 3.1340e+02 4.2330e+02 + 8.4120e+02 1.4576e+03 2.2584e+03 2.1632e+03 1.2361e+03 7.1470e+02 5.0680e+02 + 2.0860e+02 5.5760e+02 4.6870e+02 4.5110e+02 3.6980e+02 8.0510e+02 9.0790e+02 + 3.4378e+03 3.5000e+03 1.7868e+03 8.9590e+02 9.2330e+02 6.7520e+02 4.6370e+02 + 1.6840e+02 2.5070e+02 6.2640e+02 7.0070e+02 4.2550e+02 5.0610e+02 9.6900e+02 + 3.8080e+02 3.4730e+02 9.5950e+02 1.1215e+03 1.9860e+02 4.2790e+02 3.2400e+02 + 6.0170e+02 1.5208e+03 2.3029e+03 8.0640e+02 1.0328e+03 7.2550e+02 4.6280e+02 + 3.3400e+02 4.7540e+02 2.4533e+03 2.3311e+03 6.0440e+02 2.1640e+02 3.9050e+02 + 8.5510e+02 4.4170e+02 2.8670e+02 3.8650e+02 6.5260e+02 1.3818e+03 1.1878e+03 + 2.4636e+03 4.2210e+02 3.3760e+02 5.9090e+02 3.4060e+02 5.4320e+02 1.2114e+03 + 1.8112e+03 4.4520e+02 1.1656e+03 2.3610e+02 2.1420e+02 4.0460e+02 3.5700e+02 + 4.7840e+02 3.7190e+02 3.6530e+02 1.2238e+03 2.7532e+03 2.2254e+03 3.1944e+03 + 1.1185e+03 1.5014e+03 4.7710e+02 2.8610e+02 1.5090e+02 4.6620e+02 5.8770e+02 + 6.8650e+02 5.5360e+02 6.6500e+02 5.4120e+02 5.0330e+02 3.8420e+02 4.0910e+02 + 3.0590e+02 4.2180e+02 4.9830e+02 9.0610e+02 1.1428e+03 1.9852e+03 1.8115e+03 + 7.5640e+02 4.3250e+02 6.0520e+02 5.5830e+02 4.0330e+02 8.0960e+02 2.1085e+03 + 1.7439e+03 7.4780e+02 6.0080e+02 3.2560e+02 5.8390e+02 3.8790e+02 2.7290e+02 + 5.9580e+02 4.5520e+02 5.2530e+02 1.5368e+03 2.0273e+03 9.7820e+02 3.2200e+02 + 3.1440e+02 7.1510e+02 4.8400e+02 1.0016e+03 1.5873e+03 1.0732e+03 1.0890e+03 + 6.5990e+02 1.6340e+02 6.5440e+02 7.7220e+02 4.5270e+02 5.5920e+02 5.7410e+02 + 1.0395e+03 1.8747e+03 1.9856e+03 1.8521e+03 2.2399e+03 6.0280e+02 4.6510e+02 + 5.2740e+02 3.1620e+02 4.8560e+02 7.7110e+02 4.0060e+02 6.4520e+02 6.4070e+02 + 3.1480e+02 6.8580e+02 6.7010e+02 3.8300e+02 5.0370e+02 4.6570e+02 7.1760e+02 + 1.3718e+03 1.0420e+03 1.4628e+03 1.8798e+03 1.5893e+03 5.1880e+02 5.7460e+02 + 4.5550e+02 4.8230e+02 1.6571e+03 1.8577e+03 2.3358e+03 8.8640e+02 9.7350e+02 + 2.1830e+02 4.2110e+02 3.7460e+02 4.5620e+02 3.8250e+02 4.5480e+02 2.8480e+02 + 1.5887e+03 1.9490e+03 2.0389e+03 1.5553e+03 9.5400e+02 3.4140e+02 5.0880e+02 + 9.7380e+02 1.5585e+03 1.3503e+03 2.2664e+03 1.3973e+03 3.8680e+02 4.2170e+02 + 7.6480e+02 7.1630e+02 4.9280e+02 5.5360e+02 1.2904e+03 1.6064e+03 2.5069e+03 + 8.4160e+02 2.3746e+03 1.0068e+03 6.3980e+02 8.0420e+02 5.7230e+02 5.3810e+02 + 4.6640e+02 3.8710e+02 9.8530e+02 5.8750e+02 2.3840e+02 3.1070e+02 7.6840e+02 + 8.1290e+02 4.8760e+02 5.0110e+02 9.2510e+02 9.9830e+02 1.5569e+03 1.9011e+03 + 2.0226e+03 5.0130e+02 4.0940e+02 4.1330e+02 5.2390e+02 6.5770e+02 1.8722e+03 + 2.8482e+03 2.2749e+03 1.2801e+03 1.0959e+03 6.6870e+02 7.5640e+02 3.9150e+02 + 5.6230e+02 4.6200e+02 3.1740e+02 3.2450e+02 8.8570e+02 1.8002e+03 2.0955e+03 + 1.5578e+03 9.7160e+02 4.4540e+02 8.5970e+02 6.5010e+02 1.1533e+03 9.1970e+02 + 1.9799e+03 1.0438e+03 7.1290e+02 7.1390e+02 1.3686e+03 5.9410e+02 3.8930e+02 + 3.1130e+02 1.2006e+03 1.9088e+03 1.7687e+03 2.3949e+03 2.4257e+03 1.5400e+03 + 7.9310e+02 6.8300e+02 7.7030e+02 6.2400e+02 6.9420e+02 3.5600e+02 6.3530e+02 + 4.1360e+02 1.9190e+02 8.2330e+02 8.7620e+02 7.7400e+02 4.1750e+02 6.4950e+02 + 1.6613e+03 2.4749e+03 2.2975e+03 2.0523e+03 1.2805e+03 3.6370e+02 1.7360e+02 + 5.3960e+02 5.8150e+02 3.6840e+02 1.5606e+03 1.6004e+03 1.5707e+03 6.8640e+02 + 7.3120e+02 3.8270e+02 7.1340e+02 6.1690e+02 2.8230e+02 2.3280e+02 1.3070e+02 + 4.1230e+02 6.3190e+02 8.7290e+02 2.1213e+03 1.0526e+03 9.9060e+02 4.9510e+02 + 2.3220e+02 5.9520e+02 1.0866e+03 1.2499e+03 2.1698e+03 1.5983e+03 1.2071e+03 + 1.2197e+03 6.8290e+02 3.4240e+02 1.4460e+02 3.4550e+02 1.5759e+03 1.6394e+03 + 1.8276e+03 1.9712e+03 1.9162e+03 1.5227e+03 5.3530e+02 7.9070e+02 7.6830e+02 + 3.0370e+02 8.1610e+02 1.1370e+03 5.8370e+02 3.1720e+02 8.1320e+02 5.3800e+02 + 4.4490e+02 5.0310e+02 8.4790e+02 8.4480e+02 1.5804e+03 1.6583e+03 2.5503e+03 + 2.1809e+03 1.2162e+03 1.6100e+02 4.0800e+02 3.4330e+02 8.3370e+02 8.5080e+02 + 1.0251e+03 2.2841e+03 1.1051e+03 1.1056e+03 6.7040e+02 3.9120e+02 8.4230e+02 + 6.1530e+02 2.3310e+02 4.4410e+02 2.2850e+02 4.8850e+02 1.1242e+03 1.7934e+03 + 2.3399e+03 1.1933e+03 8.3210e+02 5.0430e+02 4.3710e+02 2.7330e+02 6.9820e+02 + 1.1568e+03 1.5020e+03 1.6129e+03 1.6250e+03 1.4316e+03 7.4510e+02 1.9130e+02 + 1.6840e+02 2.1670e+02 1.6842e+03 1.8546e+03 1.3137e+03 1.6965e+03 1.9601e+03 + 1.6523e+03 1.1220e+03 7.4460e+02 3.8400e+02 6.2120e+02 1.0324e+03 8.7510e+02 + 3.3430e+02 3.0670e+02 8.2000e+02 6.6760e+02 1.6350e+02 2.2480e+02 7.9400e+02 + 9.9610e+02 1.3532e+03 2.3757e+03 2.5542e+03 2.8294e+03 7.1550e+02 4.6400e+02 + 4.8740e+02 4.2140e+02 6.9810e+02 6.7960e+02 8.8910e+02 2.2391e+03 1.5006e+03 + 6.5690e+02 5.3230e+02 5.7190e+02 6.4350e+02 5.4470e+02 3.6330e+02 4.0610e+02 + 3.3670e+02 4.2170e+02 7.3280e+02 7.0340e+02 2.3077e+03 9.1100e+02 6.1760e+02 + 3.5640e+02 2.5850e+02 4.7260e+02 1.0044e+03 6.1000e+02 4.6160e+02 1.1639e+03 + 1.9906e+03 1.5201e+03 1.3590e+03 1.6800e+02 3.8170e+02 6.8350e+02 1.5325e+03 + 1.8168e+03 1.9009e+03 1.9431e+03 2.0545e+03 6.5750e+02 6.0270e+02 4.8840e+02 + 3.9430e+02 4.6060e+02 7.6990e+02 4.2950e+02 2.5220e+02 3.0980e+02 7.7130e+02 + 4.6470e+02 2.5170e+02 3.5820e+02 5.5800e+02 1.2727e+03 7.6500e+02 2.0126e+03 + 2.1241e+03 2.0991e+03 8.4470e+02 7.1490e+02 5.0310e+02 4.2780e+02 5.5180e+02 + 6.1930e+02 1.0075e+03 1.8328e+03 6.0160e+02 4.9380e+02 4.6400e+02 8.2180e+02 + 8.0050e+02 3.3780e+02 1.6220e+02 3.2870e+02 2.0140e+02 2.1680e+02 7.8820e+02 + 1.3397e+03 1.8855e+03 1.1235e+03 6.5430e+02 6.7710e+02 2.4650e+02 4.3810e+02 + 5.9170e+02 4.9870e+02 5.7390e+02 5.1790e+02 1.7436e+03 2.0855e+03 1.4496e+03 + 4.2800e+02 3.8630e+02 1.0772e+03 1.9698e+03 1.8386e+03 9.4410e+02 1.5705e+03 + 2.6923e+03 1.5563e+03 6.3260e+02 4.4560e+02 3.1370e+02 4.9470e+02 5.8240e+02 + 2.6350e+02 8.5600e+01 4.5960e+02 3.0580e+02 7.3870e+02 3.2320e+02 3.4510e+02 + 3.8190e+02 8.2020e+02 1.3436e+03 2.1113e+03 1.1708e+03 2.3160e+03 1.6090e+03 + 9.5230e+02 6.6440e+02 3.2280e+02 3.3270e+02 3.5170e+02 4.1100e+02 1.4691e+03 + 9.0040e+02 2.2130e+02 6.4740e+02 9.1690e+02 9.2070e+02 3.8660e+02 2.3560e+02 + 5.5220e+02 8.1710e+02 4.5760e+02 1.0707e+03 6.0260e+02 2.5160e+03 1.1888e+03 + 5.3740e+02 6.4520e+02 7.0210e+02 8.2640e+02 1.2009e+03 3.4430e+02 3.0030e+02 + 3.3870e+02 1.0579e+03 3.0544e+03 1.8156e+03 5.6410e+02 6.7660e+02 1.0572e+03 + 2.9482e+03 1.2520e+03 1.5678e+03 1.1484e+03 2.1392e+03 8.7230e+02 9.8700e+02 + 6.7710e+02 4.5860e+02 5.3240e+02 3.2870e+02 3.0180e+02 5.1440e+02 3.7730e+02 + 7.3420e+02 7.7060e+02 4.1020e+02 3.8910e+02 4.6580e+02 1.2454e+03 1.1534e+03 + 1.6190e+03 2.2485e+03 2.0475e+03 1.5612e+03 6.0290e+02 3.8960e+02 4.5910e+02 + 1.5520e+02 2.3160e+02 3.9960e+02 9.7470e+02 1.7623e+03 5.8040e+02 5.0870e+02 + 4.9890e+02 7.6910e+02 4.2450e+02 3.7610e+02 7.4890e+02 5.2200e+02 6.0290e+02 + 7.1650e+02 9.9700e+02 2.1898e+03 1.2634e+03 1.0426e+03 6.0270e+02 6.5170e+02 + 6.8570e+02 7.1640e+02 5.0130e+02 3.1160e+02 3.4870e+02 1.1044e+03 2.9332e+03 + 2.2834e+03 1.2619e+03 1.2186e+03 1.2034e+03 2.1663e+03 9.6350e+02 1.4280e+03 + 2.5874e+03 1.5022e+03 5.8480e+02 1.0250e+03 8.1730e+02 2.5670e+02 5.3680e+02 + 4.1320e+02 4.9560e+02 4.7550e+02 4.9540e+02 7.3790e+02 6.2770e+02 4.1840e+02 + 5.1920e+02 4.4010e+02 4.4420e+02 2.1887e+03 1.6928e+03 1.5893e+03 3.3003e+03 + 6.2430e+02 5.2240e+02 4.3810e+02 3.7400e+02 3.8280e+02 3.2050e+02 1.6860e+02 + 1.4064e+03 1.8697e+03 9.9240e+02 5.5930e+02 4.2080e+02 8.5750e+02 3.0450e+02 + 3.1380e+02 8.7840e+02 5.7840e+02 5.5990e+02 8.0900e+02 6.8790e+02 1.5695e+03 + 1.0971e+03 6.5070e+02 9.3040e+02 1.0279e+03 5.4600e+02 4.5020e+02 4.8710e+02 + 5.2960e+02 2.6610e+02 7.2830e+02 1.6059e+03 1.7569e+03 1.7614e+03 1.0763e+03 + 2.0421e+03 1.5023e+03 1.1934e+03 1.5634e+03 2.6493e+03 2.1031e+03 1.3653e+03 + 8.2310e+02 8.0310e+02 5.6320e+02 4.4620e+02 5.9920e+02 5.5350e+02 6.3630e+02 + 8.2310e+02 6.2880e+02 4.4260e+02 4.6790e+02 4.2350e+02 6.4830e+02 1.3245e+03 + 1.9333e+03 1.1877e+03 1.6377e+03 3.0082e+03 6.0850e+02 3.5310e+02 4.6480e+02 + 8.7960e+02 9.9410e+02 2.7480e+02 2.7060e+02 1.3263e+03 2.5263e+03 1.1001e+03 + 2.7980e+02 6.1460e+02 3.1340e+02 3.1680e+02 5.2840e+02 7.0050e+02 7.4960e+02 + 3.4570e+02 8.5080e+02 1.6925e+03 2.4879e+03 1.0964e+03 4.7600e+02 5.9450e+02 + 4.7640e+02 5.5870e+02 3.7830e+02 3.4850e+02 3.1460e+02 3.5150e+02 7.1530e+02 + 7.8270e+02 2.2459e+03 1.5858e+03 1.5312e+03 1.9309e+03 9.5320e+02 1.1424e+03 + 1.3929e+03 9.8660e+02 1.6623e+03 2.7740e+02 6.2510e+02 1.2943e+03 3.9660e+02 + 3.7230e+02 5.2720e+02 8.1850e+02 2.6680e+02 7.4570e+02 5.8370e+02 7.9730e+02 + 5.6420e+02 6.3080e+02 7.8240e+02 7.5550e+02 2.1470e+03 9.8510e+02 1.5553e+03 + 2.0234e+03 1.5539e+03 3.0960e+02 3.3380e+02 8.7130e+02 1.0809e+03 5.3600e+02 + 5.2860e+02 9.2080e+02 2.6333e+03 2.2435e+03 2.4880e+02 4.6090e+02 4.4050e+02 + 2.1760e+02 5.4630e+02 4.8690e+02 1.0821e+03 3.6420e+02 6.5220e+02 2.1108e+03 + 2.5280e+03 1.0970e+03 6.6090e+02 7.7860e+02 4.2520e+02 5.2190e+02 3.8780e+02 + 3.1500e+02 5.9820e+02 9.4830e+02 5.6930e+02 9.7840e+02 8.9400e+02 2.5117e+03 + 1.9379e+03 1.8470e+03 1.1457e+03 8.5400e+02 9.0360e+02 2.3513e+03 2.5865e+03 + 2.4500e+02 4.9700e+02 3.2510e+02 4.2100e+02 3.5280e+02 5.3410e+02 4.4250e+02 + 4.3570e+02 6.5150e+02 3.1500e+02 2.4640e+02 1.1910e+03 7.5290e+02 3.4140e+02 + 7.2300e+02 1.7153e+03 1.4690e+03 1.8401e+03 2.5637e+03 9.4860e+02 5.6360e+02 + 2.3210e+02 6.1150e+02 8.4570e+02 5.8020e+02 6.8650e+02 7.5460e+02 1.5489e+03 + 1.5340e+03 9.8720e+02 4.5640e+02 4.9060e+02 3.3010e+02 3.2330e+02 7.7990e+02 + 4.2590e+02 3.2350e+02 1.0819e+03 2.8401e+03 1.7804e+03 1.1048e+03 5.8960e+02 + 5.2110e+02 4.9730e+02 8.1470e+02 5.5410e+02 5.8440e+02 5.1550e+02 8.6740e+02 + 6.3820e+02 1.2935e+03 1.7795e+03 3.3037e+03 2.2318e+03 1.9348e+03 1.1249e+03 + 5.7590e+02 9.8690e+02 2.5373e+03 9.8750e+02 5.7400e+02 3.8270e+02 5.0470e+02 + 4.9630e+02 3.3370e+02 4.7340e+02 3.3290e+02 3.7060e+02 5.1390e+02 7.2180e+02 + 4.6670e+02 8.2310e+02 5.0980e+02 5.6220e+02 9.0540e+02 2.6594e+03 1.1931e+03 + 1.9383e+03 2.6848e+03 1.2710e+03 4.1910e+02 2.2430e+02 3.2120e+02 3.9190e+02 + 7.3650e+02 8.7560e+02 5.9050e+02 9.5500e+02 2.0124e+03 2.7838e+03 1.5385e+03 + 6.1100e+02 4.8110e+02 6.8900e+02 4.2420e+02 5.0840e+02 6.8520e+02 1.2908e+03 + 1.9124e+03 1.9057e+03 1.2832e+03 1.0070e+03 4.7760e+02 6.0720e+02 5.0910e+02 + 3.8380e+02 4.4490e+02 1.0809e+03 7.1050e+02 6.3000e+02 3.4840e+02 2.3508e+03 + 2.9598e+03 3.5000e+03 6.4160e+02 6.9510e+02 5.0000e+02 1.5555e+03 2.5097e+03 + 1.2793e+03 9.9920e+02 7.4650e+02 4.2260e+02 2.7670e+02 7.0730e+02 4.6380e+02 + 5.4800e+02 1.9500e+02 6.4420e+02 5.8880e+02 5.3750e+02 6.6230e+02 6.8660e+02 + 4.6920e+02 1.0866e+03 2.0189e+03 2.7357e+03 1.5802e+03 2.7662e+03 1.3242e+03 + 3.3150e+02 2.1580e+02 3.9110e+02 5.2260e+02 6.7200e+02 8.1860e+02 6.1690e+02 + 7.4890e+02 9.5900e+02 3.3371e+03 9.3940e+02 6.0040e+02 6.0620e+02 6.2960e+02 + 7.6940e+02 3.6230e+02 1.1236e+03 7.6160e+02 3.2667e+03 2.1523e+03 1.2599e+03 + 5.6770e+02 4.3570e+02 5.4460e+02 5.5210e+02 2.9310e+02 4.0880e+02 6.3000e+02 + 7.6590e+02 2.9770e+02 5.0370e+02 8.7950e+02 3.5000e+03 2.7424e+03 7.5390e+02 + 8.3320e+02 6.6580e+02 1.5465e+03 1.7115e+03 1.6929e+03 1.3988e+03 6.1710e+02 + 3.4800e+02 3.3830e+02 5.8400e+02 3.1270e+02 1.7920e+02 1.3470e+02 5.0350e+02 + 6.1280e+02 6.3100e+02 3.9780e+02 3.6920e+02 5.4460e+02 8.5780e+02 1.3750e+03 + 1.9299e+03 1.6068e+03 2.6519e+03 2.0513e+03 5.7090e+02 2.8740e+02 2.3900e+02 + 5.1140e+02 6.6820e+02 4.5180e+02 4.9710e+02 3.5800e+02 5.2970e+02 2.6180e+03 + 2.1403e+03 6.3010e+02 6.3410e+02 5.5400e+02 3.8140e+02 4.2440e+02 4.9120e+02 + 1.9781e+03 2.2544e+03 1.6514e+03 6.6640e+02 5.7820e+02 4.5060e+02 6.4030e+02 + 7.6210e+02 4.3300e+02 2.5410e+02 4.3580e+02 1.1045e+03 6.0860e+02 4.0740e+02 + 2.2118e+03 3.2524e+03 3.5000e+03 8.3870e+02 6.0950e+02 4.1100e+02 1.3623e+03 + 1.7908e+03 2.5755e+03 1.3204e+03 7.5980e+02 5.3220e+02 2.3250e+02 4.2230e+02 + 7.2450e+02 3.1040e+02 7.3490e+02 5.3310e+02 4.6210e+02 8.0010e+02 6.8730e+02 + 4.8770e+02 6.1280e+02 6.4300e+02 9.0570e+02 1.5499e+03 1.6011e+03 2.8372e+03 + 9.9910e+02 5.9750e+02 4.1300e+02 3.1210e+02 4.3580e+02 4.9760e+02 5.2210e+02 + 5.3870e+02 3.1990e+02 1.2686e+03 1.7918e+03 1.8754e+03 1.3644e+03 3.6150e+02 + 4.2880e+02 2.7330e+02 5.0930e+02 1.4317e+03 2.5811e+03 2.2603e+03 9.4430e+02 + 7.8900e+02 3.9500e+02 5.4440e+02 3.9730e+02 3.5920e+02 2.2930e+02 1.6710e+02 + 5.7940e+02 8.1510e+02 6.0510e+02 1.0044e+03 2.5426e+03 3.0112e+03 3.1557e+03 + 5.6730e+02 5.3550e+02 3.9380e+02 1.0105e+03 1.0542e+03 2.1181e+03 1.5394e+03 + 1.2472e+03 5.9080e+02 1.8520e+02 3.0440e+02 5.8980e+02 8.2080e+02 4.7450e+02 + 5.2650e+02 4.9660e+02 5.2950e+02 6.7990e+02 3.8360e+02 4.5680e+02 5.1150e+02 + 9.9760e+02 2.0504e+03 7.1070e+02 1.9082e+03 2.5428e+03 9.0230e+02 6.0540e+02 + 4.0950e+02 4.2300e+02 6.3530e+02 7.9080e+02 4.2550e+02 4.0070e+02 7.4900e+02 + 1.7763e+03 2.1305e+03 1.1142e+03 3.2450e+02 4.2000e+02 1.1710e+02 8.5400e+02 + 1.1728e+03 2.9036e+03 1.2468e+03 1.1029e+03 9.4760e+02 5.9390e+02 3.5380e+02 + 2.0240e+02 3.9240e+02 4.6500e+02 3.7850e+02 3.9440e+02 4.7990e+02 4.8930e+02 + 6.5810e+02 2.8032e+03 3.0642e+03 8.2160e+02 7.9930e+02 4.6880e+02 6.6460e+02 + 4.2390e+02 1.5808e+03 2.8286e+03 1.6113e+03 7.0890e+02 4.1040e+02 3.1400e+02 + 5.5240e+02 5.9290e+02 6.4420e+02 3.1120e+02 2.7640e+02 4.8920e+02 9.1450e+02 + 7.3460e+02 4.9510e+02 6.7210e+02 4.4340e+02 6.2910e+02 2.0208e+03 1.4264e+03 + 1.7954e+03 1.9968e+03 8.9140e+02 4.3130e+02 4.8000e+02 6.2730e+02 7.4020e+02 + 5.8940e+02 4.3860e+02 5.4990e+02 3.4180e+02 1.8678e+03 1.3964e+03 2.4056e+03 + 7.6390e+02 4.3280e+02 2.9430e+02 6.2340e+02 2.0617e+03 1.9691e+03 1.5026e+03 + 1.0183e+03 6.7010e+02 6.7920e+02 2.9530e+02 3.8410e+02 2.8100e+02 4.1330e+02 + 3.1870e+02 2.8280e+02 2.5610e+02 4.5170e+02 2.2675e+03 3.1793e+03 2.5055e+03 + 1.0649e+03 7.3870e+02 3.7350e+02 5.6430e+02 2.3970e+02 1.5184e+03 1.8276e+03 + 1.0973e+03 1.0552e+03 8.6120e+02 5.8310e+02 7.4710e+02 8.4890e+02 8.9370e+02 + 3.9100e+02 4.1960e+02 5.2850e+02 4.4940e+02 6.5380e+02 4.4880e+02 4.7070e+02 + 5.4730e+02 6.5320e+02 1.6907e+03 7.6530e+02 2.4115e+03 1.9199e+03 8.1040e+02 + 4.7610e+02 5.2490e+02 3.3470e+02 6.8280e+02 9.9460e+02 7.9390e+02 4.0810e+02 + 1.0701e+03 6.0300e+02 1.2454e+03 1.8956e+03 9.7720e+02 6.2430e+02 6.1740e+02 + 1.0640e+03 1.6460e+03 1.1139e+03 7.1230e+02 6.7920e+02 6.3050e+02 4.6310e+02 + 4.2940e+02 4.1870e+02 5.4820e+02 4.7420e+02 5.6220e+02 6.9260e+02 3.1980e+02 + 1.4576e+03 1.0100e+03 3.5000e+03 2.7536e+03 1.5195e+03 3.4940e+02 4.1720e+02 + 4.7250e+02 3.7350e+02 1.0418e+03 1.8145e+03 1.6359e+03 1.1837e+03 6.4680e+02 + 1.0411e+03 7.4750e+02 9.2510e+02 6.3370e+02 6.4320e+02 3.8270e+02 2.1870e+02 + 4.4870e+02 8.7420e+02 2.8070e+02 2.3300e+02 4.9680e+02 5.7110e+02 1.9995e+03 + 1.0772e+03 1.8182e+03 3.3876e+03 8.0860e+02 7.7620e+02 4.5150e+02 4.4670e+02 + 3.0110e+02 9.9620e+02 4.9290e+02 4.0680e+02 4.7660e+02 4.2970e+02 1.3321e+03 + 3.0717e+03 1.2957e+03 9.3520e+02 1.5407e+03 1.7593e+03 1.8895e+03 8.3640e+02 + 4.3760e+02 2.9230e+02 7.3700e+02 3.2790e+02 5.4830e+02 5.4070e+02 7.3760e+02 + 4.1630e+02 5.1550e+02 9.6880e+02 6.6070e+02 1.0194e+03 1.6080e+03 2.3646e+03 + 2.6613e+03 1.5017e+03 4.7020e+02 3.7550e+02 4.9350e+02 3.8490e+02 3.1360e+02 + 9.4250e+02 1.1318e+03 1.2126e+03 8.2090e+02 6.8830e+02 1.2404e+03 5.0710e+02 + 6.0470e+02 4.8590e+02 6.7000e+02 4.7200e+02 7.9570e+02 8.9090e+02 4.3810e+02 + 5.7200e+01 3.4690e+02 9.6310e+02 1.7837e+03 7.6840e+02 9.6120e+02 2.9975e+03 + 1.2105e+03 7.9400e+02 4.1740e+02 5.3440e+02 3.2180e+02 9.7930e+02 3.9990e+02 + 4.6830e+02 4.6490e+02 3.6510e+02 1.0959e+03 1.1301e+03 1.7860e+03 1.5006e+03 + 2.5630e+03 1.5643e+03 1.8439e+03 6.7670e+02 3.1720e+02 4.1990e+02 5.0490e+02 + 6.7860e+02 4.5050e+02 6.5170e+02 4.9580e+02 1.5720e+02 2.1260e+02 5.4750e+02 + 7.8180e+02 1.2757e+03 2.1112e+03 2.0968e+03 3.0547e+03 8.2690e+02 5.6310e+02 + 2.7930e+02 7.2940e+02 6.5100e+02 7.1970e+02 1.2146e+03 1.2684e+03 8.0700e+02 + 1.3732e+03 2.3830e+03 1.8180e+03 7.8450e+02 6.7850e+02 4.7840e+02 5.6140e+02 + 1.1937e+03 6.7770e+02 1.0866e+03 3.6470e+02 1.5350e+02 3.0440e+02 1.0527e+03 + 1.9959e+03 7.8400e+02 7.4600e+02 2.2815e+03 2.3655e+03 1.3184e+03 1.1452e+03 + 3.5150e+02 6.1820e+02 6.3620e+02 5.6640e+02 3.4320e+02 5.0730e+02 6.2950e+02 + 8.9400e+02 1.1096e+03 1.7945e+03 3.3880e+03 2.4967e+03 1.3240e+03 1.4435e+03 + 7.3960e+02 4.1000e+01 2.1310e+02 3.2560e+02 3.3820e+02 5.7610e+02 4.5660e+02 + 4.6790e+02 6.7100e+01 6.0200e+01 6.2780e+02 9.0190e+02 9.7630e+02 2.7411e+03 + 3.1085e+03 2.0680e+03 1.3164e+03 3.7960e+02 9.1040e+02 8.4780e+02 5.1610e+02 + 5.3880e+02 5.0660e+02 5.6740e+02 1.4061e+03 9.9600e+02 2.0672e+03 1.5568e+03 + 1.3675e+03 1.5059e+03 1.6258e+03 1.4021e+03 1.8684e+03 7.3490e+02 7.9390e+02 + 8.4230e+02 2.8440e+02 5.5840e+02 1.5354e+03 1.7296e+03 3.7540e+02 7.0760e+02 + 1.6696e+03 1.9514e+03 1.2735e+03 1.3529e+03 7.0240e+02 3.5490e+02 7.5250e+02 + 4.9400e+02 5.2130e+02 4.2300e+02 4.4090e+02 6.6520e+02 1.3674e+03 2.2198e+03 + 3.5000e+03 2.5989e+03 1.6041e+03 5.9660e+02 3.2770e+02 3.3900e+02 5.0380e+02 + 8.9390e+02 3.8740e+02 4.4980e+02 6.2760e+02 2.8970e+02 3.1960e+02 1.9710e+02 + 6.5050e+02 1.3142e+03 1.4947e+03 1.8482e+03 2.7156e+03 1.9416e+03 5.7500e+02 + 5.2290e+02 1.0371e+03 7.7260e+02 5.3830e+02 3.8070e+02 1.0587e+03 7.9650e+02 + 2.9710e+02 8.9250e+02 1.0024e+03 1.4448e+03 1.5853e+03 9.0650e+02 8.5340e+02 + 1.2162e+03 1.0569e+03 1.3255e+03 4.8110e+02 6.8320e+02 4.3940e+02 4.3070e+02 + 1.6733e+03 1.7267e+03 5.2840e+02 8.7530e+02 1.2792e+03 1.0479e+03 2.3360e+03 + 1.5314e+03 6.8740e+02 4.7110e+02 9.1320e+02 4.9240e+02 6.1930e+02 2.7400e+02 + 3.7790e+02 4.4180e+02 1.5461e+03 2.1366e+03 3.5000e+03 1.2675e+03 1.8028e+03 + 9.3600e+02 3.7740e+02 4.1070e+02 3.3880e+02 8.4790e+02 6.3570e+02 7.7130e+02 + 6.0070e+02 3.3160e+02 5.0650e+02 5.5330e+02 5.7380e+02 1.4396e+03 2.6850e+03 + 2.3848e+03 3.5000e+03 2.0877e+03 4.9930e+02 3.3450e+02 8.9830e+02 5.8940e+02 + 5.1510e+02 3.6340e+02 1.1349e+03 7.0550e+02 4.8760e+02 4.2730e+02 1.2162e+03 + 7.9960e+02 9.5670e+02 1.1231e+03 1.8690e+03 1.9946e+03 1.4415e+03 1.0793e+03 + 1.7443e+03 8.5370e+02 7.5590e+02 1.3074e+03 1.9406e+03 1.6615e+03 7.4590e+02 + 3.7880e+02 1.4977e+03 1.7779e+03 1.6272e+03 1.6276e+03 7.7500e+02 5.6490e+02 + 4.3100e+02 5.9570e+02 3.9400e+02 5.7850e+02 1.7410e+02 9.0220e+02 8.2890e+02 + 2.2027e+03 3.5000e+03 1.7251e+03 1.0771e+03 2.9180e+02 3.5970e+02 4.2640e+02 + 5.4750e+02 9.1720e+02 5.4560e+02 9.3420e+02 5.0080e+02 1.7690e+02 8.1320e+02 + 6.0470e+02 5.4340e+02 1.5402e+03 2.4007e+03 1.8104e+03 2.0916e+03 1.8683e+03 + 6.2700e+02 2.3050e+02 5.0570e+02 5.8280e+02 4.7370e+02 2.9370e+02 4.4330e+02 + 4.9130e+02 4.9860e+02 3.9660e+02 1.1220e+03 1.5334e+03 9.6660e+02 7.0920e+02 + 9.7430e+02 1.2095e+03 1.9142e+03 1.9717e+03 1.4303e+03 1.0577e+03 8.8530e+02 + 7.8200e+02 1.0414e+03 1.5057e+03 9.1100e+02 5.6140e+02 5.5220e+02 8.0830e+02 + 2.0321e+03 1.5567e+03 9.9500e+02 3.4720e+02 2.4710e+02 3.7760e+02 4.0030e+02 + 8.2930e+02 8.1310e+02 1.2152e+03 1.2563e+03 1.5974e+03 2.1659e+03 1.7297e+03 + 1.4447e+03 3.2150e+02 3.2770e+02 8.7460e+02 1.1576e+03 8.5920e+02 7.6770e+02 + 4.0990e+02 4.5080e+02 3.0480e+02 2.0520e+02 4.0930e+02 1.2966e+03 1.0446e+03 + 1.9306e+03 1.1701e+03 1.6241e+03 9.8190e+02 7.8270e+02 2.4880e+02 2.5390e+02 + 2.1600e+02 2.9540e+02 3.0610e+02 2.6460e+02 3.7630e+02 3.2180e+02 3.8780e+02 + 6.5900e+02 5.2830e+02 8.3030e+02 4.9710e+02 7.0710e+02 1.5968e+03 1.0197e+03 + 1.0222e+03 1.7576e+03 8.8870e+02 2.2611e+03 5.5920e+02 2.2881e+03 1.7672e+03 +/ diff --git a/examples/egg/eclipse/include/realizations/realization-2/eclipse/include/grid/active.inc b/examples/egg/eclipse/include/realizations/realization-2/eclipse/include/grid/active.inc new file mode 120000 index 00000000000..2ab54c5daeb --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-2/eclipse/include/grid/active.inc @@ -0,0 +1 @@ +../../../../../grid/active.inc \ No newline at end of file diff --git a/examples/egg/eclipse/include/realizations/realization-2/eclipse/include/schedule b/examples/egg/eclipse/include/realizations/realization-2/eclipse/include/schedule new file mode 120000 index 00000000000..ed5b970d39c --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-2/eclipse/include/schedule @@ -0,0 +1 @@ +../../../../schedule \ No newline at end of file diff --git a/examples/egg/eclipse/include/realizations/realization-2/eclipse/include/summary b/examples/egg/eclipse/include/realizations/realization-2/eclipse/include/summary new file mode 120000 index 00000000000..e5a0eb405d3 --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-2/eclipse/include/summary @@ -0,0 +1 @@ +../../../../summary \ No newline at end of file diff --git a/examples/egg/eclipse/include/realizations/realization-2/eclipse/model/EGG.DATA b/examples/egg/eclipse/include/realizations/realization-2/eclipse/model/EGG.DATA new file mode 120000 index 00000000000..e4b3ffa3150 --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-2/eclipse/model/EGG.DATA @@ -0,0 +1 @@ +../../../../EGG.DATA \ No newline at end of file diff --git a/examples/egg/eclipse/include/realizations/realization-2/eclipse/model/EGG_FLOW.DATA b/examples/egg/eclipse/include/realizations/realization-2/eclipse/model/EGG_FLOW.DATA new file mode 120000 index 00000000000..931f4143326 --- /dev/null +++ b/examples/egg/eclipse/include/realizations/realization-2/eclipse/model/EGG_FLOW.DATA @@ -0,0 +1 @@ +../../../../EGG_FLOW.DATA \ No newline at end of file diff --git a/examples/egg/eclipse/include/schedule/events.sch b/examples/egg/eclipse/include/schedule/events.sch new file mode 100644 index 00000000000..346225cc873 --- /dev/null +++ b/examples/egg/eclipse/include/schedule/events.sch @@ -0,0 +1,71 @@ +-- standard operational settings: +-- producer BHP 395 bar +-- injector surface liquid rate target 97.5 SM3/D, BHP limit 420 bar + +RPTSCHED + FIP WELSPECS WELLS / + +RPTRST + BASIC=3 FREQ=1 / + +WELSPECS + 'INJECT1' 'INJECT' 5 57 1* 'WATER' / + 'INJECT2' 'INJECT' 30 53 1* 'WATER' / + 'INJECT3' 'INJECT' 2 35 1* 'WATER' / + 'INJECT4' 'INJECT' 27 29 1* 'WATER' / + 'INJECT5' 'INJECT' 50 35 1* 'WATER' / + 'INJECT6' 'INJECT' 8 9 1* 'WATER' / + 'INJECT7' 'INJECT' 32 2 1* 'WATER' / + 'INJECT8' 'INJECT' 57 6 1* 'WATER' / + 'PROD1' 'PRODUC' 16 43 1* 'OIL' / + 'PROD2' 'PRODUC' 35 40 1* 'OIL' / + 'PROD3' 'PRODUC' 23 16 1* 'OIL' / + 'PROD4' 'PRODUC' 43 18 1* 'OIL' / +/ + +COMPDAT + 'INJECT1' 2* 1 7 'OPEN' 2* 0.2 1* 0 / + 'INJECT2' 2* 1 7 'OPEN' 2* 0.2 1* 0 / + 'INJECT3' 2* 1 7 'OPEN' 2* 0.2 1* 0 / + 'INJECT4' 2* 1 7 'OPEN' 2* 0.2 1* 0 / + 'INJECT5' 2* 1 7 'OPEN' 2* 0.2 1* 0 / + 'INJECT6' 2* 1 7 'OPEN' 2* 0.2 1* 0 / + 'INJECT7' 2* 1 7 'OPEN' 2* 0.2 1* 0 / + 'INJECT8' 2* 1 7 'OPEN' 2* 0.2 1* 0 / + 'PROD1' 2* 1 7 'OPEN' 2* 0.2 1* 0 / + 'PROD2' 2* 1 7 'OPEN' 2* 0.2 1* 0 / + 'PROD3' 2* 1 7 'OPEN' 2* 0.2 1* 0 / + 'PROD4' 2* 1 7 'OPEN' 2* 0.2 1* 0 / +/ + +WCONPROD + 'PROD1' 'SHUT' 'BHP' 5* 395 / + 'PROD3' 'SHUT' 'BHP' 5* 395 / + 'PROD2' 'SHUT' 'BHP' 5* 395 / + 'PROD4' 'SHUT' 'BHP' 5* 395 / +/ + +WCONINJE + 'INJECT1' 'WATER' 'SHUT' 'GRUP' 79.5 1* 420 / + 'INJECT2' 'WATER' 'SHUT' 'GRUP' 79.5 1* 420 / + 'INJECT3' 'WATER' 'SHUT' 'GRUP' 79.5 1* 420 / + 'INJECT4' 'WATER' 'SHUT' 'GRUP' 79.5 1* 420 / + 'INJECT5' 'WATER' 'SHUT' 'GRUP' 79.5 1* 420 / + 'INJECT6' 'WATER' 'SHUT' 'GRUP' 79.5 1* 420 / + 'INJECT7' 'WATER' 'SHUT' 'GRUP' 79.5 1* 420 / + 'INJECT8' 'WATER' 'SHUT' 'GRUP' 79.5 1* 420 / +/ + +TUNING +0.1 30 / +/ +12 1 250 1* 25 / + +GRUPTREE + 'PRODUC' 'FIELD' / + 'INJECT' 'FIELD' / +/ + +GCONINJE + 'INJECT' 'WATER' 'VREP' 30000 2* 1 4* 'PRODUC' / +/ diff --git a/examples/egg/eclipse/include/schedule/schedule.tmpl b/examples/egg/eclipse/include/schedule/schedule.tmpl new file mode 100755 index 00000000000..1ef0da26486 --- /dev/null +++ b/examples/egg/eclipse/include/schedule/schedule.tmpl @@ -0,0 +1,129 @@ + + +RPTRST + BASIC=3 FREQ=3 / + +DATES + 30 MAY 2014 / +/ + +DATES + 28 AUG 2014 / +/ + + +DATES + 26 NOV 2014 / +/ + +DATES + 24 FEB 2015 / +/ + +DATES + 25 MAY 2015 / +/ + +DATES + 23 AUG 2015 / +/ + +DATES + 21 NOV 2015 / +/ + +DATES + 19 FEB 2016 / +/ + +DATES + 19 MAY 2016 / +/ + + +-- this END limits the life cycle period to 5 years instead of 10 +END + + +DATES + 17 AUG 2016 / +/ + +DATES + 15 NOV 2016 / +/ + +DATES + 13 FEB 2017 / +/ + +DATES + 14 MAY 2017 / +/ + +DATES + 12 AUG 2017 / +/ + +DATES + 10 NOV 2017 / +/ + +DATES + 8 FEB 2018 / +/ + +DATES + 9 MAY 2018 / +/ + +DATES + 7 AUG 2018 / +/ + +DATES + 5 NOV 2018 / +/ + +DATES + 3 FEB 2019 / +/ + +DATES + 4 MAY 2019 / +/ + +DATES + 2 AUG 2019 / +/ + +DATES + 31 OCT 2019 / +/ + +DATES + 29 JAN 2020 / +/ + +DATES + 28 APR 2020 / +/ + +DATES + 27 JUL 2020 / +/ + +DATES + 25 OCT 2020 / +/ + +DATES + 23 JAN 2021 / +/ + +DATES + 23 APR 2021 / +/ + + +END diff --git a/examples/egg/eclipse/include/summary/example_summary.txt b/examples/egg/eclipse/include/summary/example_summary.txt new file mode 100755 index 00000000000..6dfef7b8efe --- /dev/null +++ b/examples/egg/eclipse/include/summary/example_summary.txt @@ -0,0 +1,274 @@ +-- +-- Field Data +----------------------------- +-- Production Rates +----------------------------- + +FOPR +FOPRH +FGPR +FGPRH +FWPR +FWPRH +FLPR +FLPRH +FVPR +FOPRF +FOPRS +FGSR +FGPRF +FGPRS +----------------------------- +-- Production Rate Potential +----------------------------- +FOPP +FWPP +FGPP +----------------------------- +-- Production and Injection wells +----------------------------- +FMWPR +FMWIN +-- Injection Rates +FVIR +FWIR +FWIRH +FGIR +FGIRH +-- gas lift injection rate +FGLIR +----------------------------- +-- Control Mode -- +----------------------------- +FMCTP +----------------------------- +-- Cummulatives -- +----------------------------- +-- Production +FVPT +FOPT +FOPTH +FWPT +FWPTH +FGPT +FGPTH +FWIT +FWITH +FGIT +FGITH +FOPTF +FOPTS +----------------------------- +-- In place +----------------------------- +FWIP +FOIP +FGIP +-- Ratios +FWCT +FWCTH +FGOR +FGORH +FGLR +FWGR +-- Pressures +FPR +-- Region data +RPR +/ +ROIP +/ +ROIPL +/ +ROIPG +/ +RGIP +/ +RGIPL +/ +RGIPG +/ +RGPR +/ +RGPT +/ +----------------- +-- Group data -- +----------------- +----------------------------- +-- Production and Injection wells +----------------------------- +GMWPR +GMWIN +/ +GGLIR +/ +GOPR +/ +GOPRH +/ +GGPR +/ +GGPRH +/ +GWPR +/ +GWPRH +/ +GVPR +/ +GLPR +/ +GOPRF +/ +GOPRS +/ +GGPRF +/ +GGPRS +/ +GWCT +/ +GWCTH +/ +GGOR +/ +GGORH +/ +GWGR +/ +GGLR +/ +GOPT +/ +GOPTH +/ +GGPT +/ +GGPTH +/ +GWPT +/ +GWPTH +/ +GVPT +/ +GLPT +/ +GOPTF +/ +GOPTS +/ +GGPTF +/ +GGPTS +/ +GWIR +/ +GVIR +/ +GWIRH +/ +GGIR +/ +GGIRH +/ +-- Potentials +GOPP +/ +GGPP +/ +GWPP +/ +----------------------------- +-- Control Mode -- +----------------------------- +GMCTP +/ +-- Well Data +-- Production Rates +WOPR +/ +WOPRH +/ +WGPR +/ +WGPRH +/ +WWPR +/ +WWPRH +/ +-- Production Cummulatives +WOPT +/ +WWPT +/ +WGPT +/ +WOPTH +/ +WWPTH +/ +WGPTH +/ +-- Ratios +WWCT +/ +WWCTH +/ +WGOR +/ +WGORH +/ +WWIR +/ +WWIRH +/ +WGIR +/ +WGIRH +/ +WWIT +/ +WWITH +/ +WGIT +/ +WGITH +/ +-- Performance +WBHP +/ +WTHP +/ +WPI +/ +WVPR +/ +WBP +/ +WBP4 +/ +WBP9 +/ +WMCTL +/ +WLPR +/ +-- Well Gas Lift Injection Rate +WGLIR +/ +-- Well Oil Gas Lift Ratio (i.e. incremental gradiend +-- of the field's production rate with respect to the +-- addition of another gas lift increment to that well) +WOGLR +/ +-- +-- + +-- +-- +-- Simulatior performance +TCPU +TCPUDAY diff --git a/examples/egg/eclipse/include/summary/grid b/examples/egg/eclipse/include/summary/grid new file mode 120000 index 00000000000..5b320d18437 --- /dev/null +++ b/examples/egg/eclipse/include/summary/grid @@ -0,0 +1 @@ +../grid \ No newline at end of file diff --git a/examples/egg/eclipse/include/summary/schedule b/examples/egg/eclipse/include/summary/schedule new file mode 120000 index 00000000000..6d9f858c9e2 --- /dev/null +++ b/examples/egg/eclipse/include/summary/schedule @@ -0,0 +1 @@ +../schedule \ No newline at end of file diff --git a/examples/egg/everest/input/files/at_config.yml b/examples/egg/everest/input/files/at_config.yml new file mode 100644 index 00000000000..61402769c7f --- /dev/null +++ b/examples/egg/everest/input/files/at_config.yml @@ -0,0 +1,11 @@ +templates: + - + file: './files/templates/wconinje.j2.html' + keys: + opname: rate + phase: WATER + - + file: './files/templates/wconprod.j2.html' + keys: + opname: rate + phase: OIL diff --git a/examples/egg/everest/input/files/templates/wconinje.j2.html b/examples/egg/everest/input/files/templates/wconinje.j2.html new file mode 100644 index 00000000000..b16aba2a3dc --- /dev/null +++ b/examples/egg/everest/input/files/templates/wconinje.j2.html @@ -0,0 +1,3 @@ +WCONINJE + '{{ name }}' '{{ phase }}' 'OPEN' 'RATE' {{ rate }} 1* 320 1* 1* 1* / +/ diff --git a/examples/egg/everest/input/files/templates/wconprod.j2.html b/examples/egg/everest/input/files/templates/wconprod.j2.html new file mode 100644 index 00000000000..8bd0160632c --- /dev/null +++ b/examples/egg/everest/input/files/templates/wconprod.j2.html @@ -0,0 +1,3 @@ +WCONPROD + '{{ name }}' 'OPEN' 'ORAT' {{ rate }} 4* 100 / +/ diff --git a/examples/egg/everest/input/files/wc_config.yml b/examples/egg/everest/input/files/wc_config.yml new file mode 100644 index 00000000000..cf22885bafd --- /dev/null +++ b/examples/egg/everest/input/files/wc_config.yml @@ -0,0 +1,108 @@ +PROD1: + 1: + phase: + value: OIL + rate: + min: 500 + max: 1000 + duration: + value: 50 +PROD2: + 1: + phase: + value: OIL + rate: + min: 800 + max: 1400 + duration: + value: 50 +PROD3: + 1: + phase: + value: OIL + rate: + min: 500 + max: 1000 + duration: + value: 50 +PROD4: + 1: + phase: + value: OIL + rate: + min: 800 + max: 1400 + duration: + value: 50 +INJECT1: + 1: + phase: + value: WATER + rate: + min: 5000 + max: 10000 + duration: + value: 50 +INJECT2: + 1: + phase: + value: WATER + rate: + min: 5000 + max: 10000 + duration: + value: 50 +INJECT3: + 1: + phase: + value: WATER + rate: + min: 5000 + max: 10000 + duration: + value: 50 +INJECT4: + 1: + phase: + value: WATER + rate: + min: 5000 + max: 10000 + duration: + value: 50 +INJECT5: + 1: + phase: + value: WATER + rate: + min: 5000 + max: 10000 + duration: + value: 50 +INJECT6: + 1: + phase: + value: WATER + rate: + min: 5000 + max: 10000 + duration: + value: 50 +INJECT7: + 1: + phase: + value: WATER + rate: + min: 5000 + max: 10000 + duration: + value: 50 +INJECT8: + 1: + phase: + value: WATER + rate: + min: 5000 + max: 10000 + duration: + value: 50 diff --git a/examples/egg/everest/input/files/well_readydate.json b/examples/egg/everest/input/files/well_readydate.json new file mode 100644 index 00000000000..16ee5b18cad --- /dev/null +++ b/examples/egg/everest/input/files/well_readydate.json @@ -0,0 +1,50 @@ +[ + { + "name": "PROD1", + "readydate": "2000-01-01" + }, + { + "name": "PROD2", + "readydate": "2000-01-01" + }, + { + "name": "PROD3", + "readydate": "2000-01-01" + }, + { + "name": "PROD4", + "readydate": "2000-01-01" + }, + { + "name": "INJECT1", + "readydate": "2000-01-01" + }, + { + "name": "INJECT2", + "readydate": "2000-01-01" + }, + { + "name": "INJECT3", + "readydate": "2000-01-01" + }, + { + "name": "INJECT4", + "readydate": "2000-01-01" + }, + { + "name": "INJECT5", + "readydate": "2000-01-01" + }, + { + "name": "INJECT6", + "readydate": "2000-01-01" + }, + { + "name": "INJECT7", + "readydate": "2000-01-01" + }, + { + "name": "INJECT8", + "readydate": "2000-01-01" + } +] diff --git a/examples/egg/everest/model/config.yml b/examples/egg/everest/model/config.yml new file mode 100644 index 00000000000..5d056c10709 --- /dev/null +++ b/examples/egg/everest/model/config.yml @@ -0,0 +1,118 @@ +definitions: + eclbase: eclipse/model/EGG + realization_folder: r{{configpath}}/../../eclipse/include/realizations/realization-r{{realization}}/eclipse + data_file: r{{realization_folder}}/model/EGG.DATA + +wells: + - { name: PROD1 } + - { name: PROD2 } + - { name: PROD3 } + - { name: PROD4 } + - { name: INJECT1 } + - { name: INJECT2 } + - { name: INJECT3 } + - { name: INJECT4 } + - { name: INJECT5 } + - { name: INJECT6 } + - { name: INJECT7 } + - { name: INJECT8 } + +controls: + - + name: well_rate + type: generic_control + min: 0 + max: 1 + perturbation_magnitude: 0.15 + variables: + - + name: PROD1 + index: 1 + initial_guess: 0.2 + - + name: PROD2 + index: 1 + initial_guess: 0.6 + - + name: PROD3 + index: 1 + initial_guess: 0.2 + - + name: PROD4 + index: 1 + initial_guess: 0.6 + - + name: INJECT1 + index: 1 + initial_guess: 0.6 + - + name: INJECT2 + index: 1 + initial_guess: 0.6 + - + name: INJECT3 + index: 1 + initial_guess: 0.6 + - + name: INJECT4 + index: 1 + initial_guess: 0.6 + - + name: INJECT5 + index: 1 + initial_guess: 0.6 + - + name: INJECT6 + index: 1 + initial_guess: 0.6 + - + name: INJECT7 + index: 1 + initial_guess: 0.6 + - + name: INJECT8 + index: 1 + initial_guess: 0.6 + +objective_functions: + - name: rf + + +optimization: + algorithm: optpp_q_newton + min_realizations_success: 1 + perturbation_num: 1 # per realization + speculative: True + max_iterations: 2 + max_function_evaluations: 3 + convergence_tolerance: 1.0E+1 + +model: + realizations: [0, 1, 2] + data_file: r{{data_file}} + report_steps: ['2014-05-30', '2014-08-28', '2014-11-26', '2015-02-24', '2015-05-25', '2015-08-23', '2015-11-21', '2016-02-19', '2016-05-19'] + +environment: + simulation_folder: egg_simulations + random_seed: 123456 + +simulator: + queue_system: local + cores: 3 + +install_data: + - + source: r{{realization_folder}} + target: eclipse + - + source: r{{ configpath }}/../input/files + target: files + link: true + + +forward_model: + - well_constraints -i files/well_readydate.json -c files/wc_config.yml -rc well_rate.json -o wc_wells.json + - add_templates -i wc_wells.json -c files/at_config.yml -o at_wells.json + - schmerge -s eclipse/include/schedule/schedule.tmpl -i at_wells.json -o eclipse/include/schedule/schedule.sch + - eclipse100 r{{eclbase}}.DATA --version 2020.2 + - rf -s r{{ eclbase }} -o rf diff --git a/examples/egg/everest/model/config_flow.yml b/examples/egg/everest/model/config_flow.yml new file mode 100644 index 00000000000..4b1c32b48f4 --- /dev/null +++ b/examples/egg/everest/model/config_flow.yml @@ -0,0 +1,121 @@ +definitions: + eclbase: eclipse/model/EGG_FLOW + +wells: + - { name: PROD1 } + - { name: PROD2 } + - { name: PROD3 } + - { name: PROD4 } + - { name: INJECT1 } + - { name: INJECT2 } + - { name: INJECT3 } + - { name: INJECT4 } + - { name: INJECT5 } + - { name: INJECT6 } + - { name: INJECT7 } + - { name: INJECT8 } + +controls: + - + name: well_rate + type: generic_control + min: 0 + max: 1 + perturbation_magnitude: 0.15 + variables: + - + name: PROD1 + index: 1 + initial_guess: 0.2 + - + name: PROD2 + index: 1 + initial_guess: 0.6 + - + name: PROD3 + index: 1 + initial_guess: 0.2 + - + name: PROD4 + index: 1 + initial_guess: 0.6 + - + name: INJECT1 + index: 1 + initial_guess: 0.6 + - + name: INJECT2 + index: 1 + initial_guess: 0.6 + - + name: INJECT3 + index: 1 + initial_guess: 0.6 + - + name: INJECT4 + index: 1 + initial_guess: 0.6 + - + name: INJECT5 + index: 1 + initial_guess: 0.6 + - + name: INJECT6 + index: 1 + initial_guess: 0.6 + - + name: INJECT7 + index: 1 + initial_guess: 0.6 + - + name: INJECT8 + index: 1 + initial_guess: 0.6 + +objective_functions: + - name: rf + + +optimization: + algorithm: optpp_q_newton + min_realizations_success: 1 + perturbation_num: 1 # per realization + speculative: True + max_iterations: 2 + max_function_evaluations: 3 + convergence_tolerance: 1.0E+1 + +model: + realizations: [0, 1, 2] + data_file: ../../eclipse/include/realizations/realization-r{{realization}}/eclipse/model/EGG_FLOW.DATA + report_steps: ['2014-05-30', '2014-08-28', '2014-11-26', '2015-02-24', '2015-05-25', '2015-08-23', '2015-11-21', '2016-02-19', '2016-05-19'] + +environment: + simulation_folder: egg_simulations + random_seed: 123456 + +simulator: + queue_system: local + cores: 3 + +install_jobs: + - + name: myflow + source: r{{ configpath }}/jobs/flow + +install_data: + - + source: r{{ configpath }}/../../eclipse/include/realizations/realization-r{{ realization }}/eclipse + target: eclipse + - + source: r{{ configpath }}/../input/files + target: files + link: true + + +forward_model: + - well_constraints -i files/well_readydate.json -c files/wc_config.yml -rc well_rate.json -o wc_wells.json + - add_templates -i wc_wells.json -c files/at_config.yml -o at_wells.json + - schmerge -s eclipse/include/schedule/schedule.tmpl -i at_wells.json -o eclipse/include/schedule/schedule.sch + - myflow r{{ eclbase }} --enable-tuning + - rf -s r{{ eclbase }} -o rf diff --git a/examples/egg/everest/model/jobs/flow b/examples/egg/everest/model/jobs/flow new file mode 100644 index 00000000000..ae96ce70280 --- /dev/null +++ b/examples/egg/everest/model/jobs/flow @@ -0,0 +1,6 @@ +EXECUTABLE ./flow.py +STDOUT flow.stdout +STDERR flow.stderr + +TARGET_FILE flow.ok +ARGLIST diff --git a/examples/egg/everest/model/jobs/flow.py b/examples/egg/everest/model/jobs/flow.py new file mode 100755 index 00000000000..28a47a07a1d --- /dev/null +++ b/examples/egg/everest/model/jobs/flow.py @@ -0,0 +1,18 @@ +#!/usr/bin/env python +import argparse +import os +import subprocess + +arg_parser = argparse.ArgumentParser(description="Run a flow job") +arg_parser.add_argument("input", help="Input directory") +arg_parser.add_argument("--flow-path", help="Path to the flow binary", default="flow") +arg_parser.add_argument("--enable-tuning", help="Enable tuning", action="store_true") +options = arg_parser.parse_args() + +call_args = [options.flow_path, options.input] +if options.enable_tuning: + call_args.append("--enable-tuning=1") +flow_process = subprocess.call(call_args, cwd=os.getcwd()) + +with open("flow.ok", "w", encoding="utf-8"): + pass diff --git a/examples/math_func/adv_target_0.json b/examples/math_func/adv_target_0.json new file mode 100644 index 00000000000..661c5bf909e --- /dev/null +++ b/examples/math_func/adv_target_0.json @@ -0,0 +1,7 @@ +{ + "x": { + "0": -1.5, + "1": -1.5, + "2": 0.5 + } +} diff --git a/examples/math_func/adv_target_2.json b/examples/math_func/adv_target_2.json new file mode 100644 index 00000000000..79fd9bf9a3c --- /dev/null +++ b/examples/math_func/adv_target_2.json @@ -0,0 +1,7 @@ +{ + "x": { + "0": 0.5, + "1": 0.5, + "2": 0.5 + } +} diff --git a/examples/math_func/config_advanced.yml b/examples/math_func/config_advanced.yml new file mode 100644 index 00000000000..b9952f51557 --- /dev/null +++ b/examples/math_func/config_advanced.yml @@ -0,0 +1,78 @@ +wells: [] + +controls: + - name: point + max: 1.0 + min: -1.0 + initial_guess: 0.25 + perturbation_magnitude: 0.005 + type: generic_control + variables: + - name: x + index: 0 + - name: x + index: 1 + - name: x + index: 2 + +objective_functions: + - name: distance + +input_constraints: + - weights: + point.x-0: 0 + point.x-1: 0 + point.x-2: 1 + upper_bound: 0.4 + +output_constraints: + - name: x-0_coord + lower_bound: 0.1 + scale: 0.1 + + +# Optimal value expected at x=0.1, y=0, z=0.4, with distance 3.72 + + +install_jobs: + - name: adv_distance3 + source: jobs/ADV_DISTANCE3 + - name: adv_dump_controls + source: jobs/ADV_DUMP_CONTROLS + + +forward_model: + # Compute distance (squared and negated) between 2 points + - adv_distance3 --point-file point.json --target-file data/r{{ realization}}/target.json + --out distance + # Write the value of each control to a separate file + - adv_dump_controls --controls-file point.json --out-suffix _coord +# Left this here for testing/debugging purposes +# - sleep --min 0.1 --max 5 --fail-chance 0.5 + + + +model: + realizations: [0, 2] + realizations_weights: [0.25, 0.75] + + +install_data: + - link: false + source: r{{ configpath }}/adv_target_r{{ realization }}.json + target: data/r{{ realization}}/target.json + + +install_templates: [] + +optimization: + algorithm: optpp_q_newton + convergence_tolerance: 0.005 + perturbation_num: 7 + speculative: true + +environment: + log_level: debug + random_seed: 999 + simulation_folder: scratch/advanced/ + output_folder: everest_output/ diff --git a/examples/math_func/config_advanced_scipy.yml b/examples/math_func/config_advanced_scipy.yml new file mode 100644 index 00000000000..786052a2d7e --- /dev/null +++ b/examples/math_func/config_advanced_scipy.yml @@ -0,0 +1,92 @@ +# This config file is the same as config_advanced.yml, except that it uses the +# SciPy backend. + +wells: [] + +controls: +- initial_guess: 0.25 + max: 1.0 + min: -1.0 + name: point + perturbation_magnitude: 0.005 + type: generic_control + variables: + - name: x + index: 0 + - name: x + index: 1 + - name: x + index: 2 + +objective_functions: + - + name: distance + +input_constraints: + - + weights: + point.x-0: 0 + point.x-1: 0 + point.x-2: 1 + upper_bound: 0.4 + +output_constraints: + - name: x-0_coord + lower_bound: 0.1 + scale: 0.1 + + +# Optimal value expected at x=0.1, y=0, z=0.4, with distance 3.72 + + +install_jobs: + - + name: adv_distance3 + source: jobs/ADV_DISTANCE3 + - + name: adv_dump_controls + source: jobs/ADV_DUMP_CONTROLS + + +forward_model: + # Compute distance (squared and negated) between 2 points + - adv_distance3 --point-file point.json + --target-file data/r{{ realization}}/target.json + --out distance + # Write the value of each control to a separate file + - adv_dump_controls --controls-file point.json + --out-suffix _coord + + + +model: + realizations: [0, 2] + realizations_weights: [ 0.25, 0.75] + + +install_data: + - + link: false + source: r{{ configpath }}/adv_target_r{{ realization }}.json + target: data/r{{ realization}}/target.json + + +install_templates: [] + +optimization: + backend: scipy + algorithm: SLSQP + convergence_tolerance: 0.001 + constraint_tolerance: 0.001 + perturbation_num: 7 + speculative: True + max_batch_num: 4 + backend_options: + maxiter: 100 + + +environment: + log_level: debug + random_seed: 123 + simulation_folder: scratch/advanced/ + output_folder: everest_output/ diff --git a/examples/math_func/config_auto_scaled_controls.yml b/examples/math_func/config_auto_scaled_controls.yml new file mode 100644 index 00000000000..ffc8b0ea319 --- /dev/null +++ b/examples/math_func/config_auto_scaled_controls.yml @@ -0,0 +1,49 @@ +controls: + - + name: point + type: generic_control + min: -1 + max: 1 + initial_guess: 0.2 + perturbation_magnitude : 0.01 + auto_scale: True + scaled_range: [0.3, 0.7] + variables: + - name: x + - name: y + - name: z + + +objective_functions: + - + name: distance + + +optimization: + algorithm: optpp_q_newton + convergence_tolerance: 0.005 + max_batch_num: 9 + +install_jobs: + - + name: distance3 + source: jobs/DISTANCE3 + +model: + realizations: [0] + +forward_model: + - distance3 --point-file point.json + --target 0.5 0.5 0.5 + --out distance + --scaling -1 1 0.3 0.7 + +environment: + simulation_folder: sim_output + log_level: debug + random_seed: 999 + +input_constraints: + - + weights: {point.x: 1.0, point.y: 1.0} + upper_bound: 0.5 diff --git a/examples/math_func/config_cvar.yml b/examples/math_func/config_cvar.yml new file mode 100644 index 00000000000..bd9353f707a --- /dev/null +++ b/examples/math_func/config_cvar.yml @@ -0,0 +1,45 @@ +controls: + - + name: point + type: generic_control + perturbation_magnitude : 0.01 + min: -2.0 + max: 2.0 + variables: + - name: x + initial_guess: 0.0 + - name: y + initial_guess: 0.0 + - name: z + initial_guess: 0.0 + +objective_functions: + - + name: distance + +optimization: + backend: scipy + algorithm: slsqp + max_batch_num: 5 + cvar: + percentile: 0.5 + # number_of_realizations: 1 + + +install_jobs: + - + name: distance3 + source: jobs/DISTANCE3 + +model: + realizations: [0, 1] + +forward_model: + - distance3 --point-file point.json --realization r{{realization}} + --target 0.5 0.5 0.5 + --out distance + +environment: + output_folder: distance_output + simulation_folder: sim_output + random_seed: 999 diff --git a/examples/math_func/config_discrete.yml b/examples/math_func/config_discrete.yml new file mode 100644 index 00000000000..fd1ad8adaa9 --- /dev/null +++ b/examples/math_func/config_discrete.yml @@ -0,0 +1,40 @@ +controls: + - name: point + type: generic_control + min: 0 + max: 10 + initial_guess: 0 + control_type: integer + variables: + - name: x + - name: y + +objective_functions: + - name: func + +input_constraints: + - weights: { point.x: 1.0, point.y: 1.0 } + upper_bound: 10 + +optimization: + backend: scipy + algorithm: differential_evolution + max_function_evaluations: 4 + backend_options: + seed: 9 + parallel: False + +install_jobs: + - name: discrete + source: jobs/DISCRETE + +model: + realizations: [0] + +forward_model: + - discrete --point-file point.json --out func + +environment: + simulation_folder: sim_output + log_level: debug + random_seed: 999 diff --git a/examples/math_func/config_fm_failure.yml b/examples/math_func/config_fm_failure.yml new file mode 100644 index 00000000000..9445a4cffbb --- /dev/null +++ b/examples/math_func/config_fm_failure.yml @@ -0,0 +1,54 @@ +wells: [] + +controls: + - + name: point + type: generic_control + min: -1.0 + max: 1.0 + initial_guess: 0 + perturbation_magnitude : 0.001 + variables: + - name: x + - name: y + - name: z + +objective_functions: + - + name: distance + +install_jobs: + - + name: distance3 + source: jobs/DISTANCE3 + - + name: toggle_failure + source: jobs/FAIL_SIMULATION + +forward_model: + - distance3 --point-file point.json + --target 0.5 0.5 0.5 + --out distance + + - toggle_failure --fail simulation_2 + + +model: + realizations: [0] + +optimization: + algorithm: optpp_q_newton + convergence_tolerance: 0.005 + min_realizations_success: 1 + min_pert_success: 1 + max_iterations: 1 + perturbation_num: 2 + +environment: + random_seed: 123 + simulation_folder: scratch/advanced/ + output_folder: everest_output/ + + +simulator: + delete_run_path: True diff --git a/examples/math_func/config_in_constr.yml b/examples/math_func/config_in_constr.yml new file mode 100644 index 00000000000..b697c7ac8ad --- /dev/null +++ b/examples/math_func/config_in_constr.yml @@ -0,0 +1,46 @@ +controls: + - + name: point + type: generic_control + min: -0.9 + max: 0.9 + initial_guess: 0 + perturbation_magnitude : 0.001 + variables: + - name: x + - name: y + - name: z + + +objective_functions: + - + name: distance + + +optimization: + algorithm: optpp_q_newton + convergence_tolerance: 0.001 + max_batch_num: 8 + +install_jobs: + - + name: distance3 + source: jobs/DISTANCE3 + +model: + realizations: [0] + +forward_model: + - distance3 --point-file point.json + --target 0.5 0.5 0.5 + --out distance + +environment: + simulation_folder: sim_output + log_level: debug + random_seed: 999 + +input_constraints: + - + weights: {point.x: 1.0, point.y: 1.0} + upper_bound: 0.5 diff --git a/examples/math_func/config_minimal.yml b/examples/math_func/config_minimal.yml new file mode 100644 index 00000000000..49e5309c815 --- /dev/null +++ b/examples/math_func/config_minimal.yml @@ -0,0 +1,43 @@ +controls: + - + name: point + type: generic_control + min: -1.0 + max: 1.0 + initial_guess: 0.1 + perturbation_magnitude : 0.001 + variables: + - name: x + - name: y + - name: z + + +objective_functions: + - + name: distance + + +optimization: + algorithm: optpp_q_newton + convergence_tolerance: 0.001 + max_batch_num: 4 + constraint_tolerance: 0.1 # To test that it is ignored. + + +install_jobs: + - + name: distance3 + source: jobs/DISTANCE3 + +model: + realizations: [0] + +forward_model: + - distance3 --point-file point.json + --target 0.5 0.5 0.5 + --out distance + +environment: + simulation_folder: sim_output + log_level: debug + random_seed: 123 diff --git a/examples/math_func/config_minimal_slow.yml b/examples/math_func/config_minimal_slow.yml new file mode 100644 index 00000000000..4e590d46710 --- /dev/null +++ b/examples/math_func/config_minimal_slow.yml @@ -0,0 +1,46 @@ +controls: + - + name: point + type: generic_control + min: -1.0 + max: 1.0 + initial_guess: 0.1 + perturbation_magnitude : 0.001 + variables: + - name: x + - name: y + - name: z + + +objective_functions: + - + name: distance + + +optimization: + algorithm: optpp_q_newton + convergence_tolerance: 0.001 + max_batch_num: 4 + + +install_jobs: + - + name: distance3 + source: jobs/DISTANCE3 + - + name: sleep + source: jobs/SLEEP + +model: + realizations: [0] + +forward_model: + - distance3 --point-file point.json + --target 0.5 0.5 0.5 + --out distance + - sleep --sleep 10 + +environment: + simulation_folder: sim_output + log_level: debug + random_seed: 123 diff --git a/examples/math_func/config_multiobj.yml b/examples/math_func/config_multiobj.yml new file mode 100644 index 00000000000..721e9948c10 --- /dev/null +++ b/examples/math_func/config_multiobj.yml @@ -0,0 +1,50 @@ +controls: + - + name: point + type: generic_control + min: -1.0 + max: 1.0 + initial_guess: 0 + perturbation_magnitude : 0.01 + variables: + - name: x + - name: y + - name: z + + +objective_functions: + - name: distance_p + weight: 0.50 + normalization: 1.5 + - name: distance_q + weight: 0.25 + normalization: 1.0 + + +optimization: + algorithm: optpp_q_newton + convergence_tolerance: 0.005 + perturbation_num: 5 + max_batch_num: 3 + +install_jobs: + - + name: distance3 + source: jobs/DISTANCE3 + +model: + realizations: [0] + +forward_model: + - distance3 --point-file point.json + --target 0.5 0.5 0.5 + --out distance_p + - distance3 --point-file point.json + --target -1.5 -1.5 0.5 + --out distance_q + +environment: + simulation_folder: sim_output + output_folder: everest_output_multiobj + log_level: debug + random_seed: 999 diff --git a/examples/math_func/config_one_batch.yml b/examples/math_func/config_one_batch.yml new file mode 100644 index 00000000000..466cf72f779 --- /dev/null +++ b/examples/math_func/config_one_batch.yml @@ -0,0 +1,41 @@ +controls: + - + name: point + type: generic_control + min: -1.0 + max: 1.0 + initial_guess: 0 + perturbation_magnitude : 0.001 + variables: + - name: x + - name: y + - name: z + + +objective_functions: + - + name: distance + + +optimization: + algorithm: optpp_q_newton + max_batch_num: 1 + + +install_jobs: + - + name: distance3 + source: jobs/DISTANCE3 + +model: + realizations: [0] + +forward_model: + - distance3 --point-file point.json + --target 0.5 0.5 0.5 + --out distance + +environment: + simulation_folder: sim_output + log_level: debug + random_seed: 999 diff --git a/examples/math_func/config_out_constr.yml b/examples/math_func/config_out_constr.yml new file mode 100644 index 00000000000..8a9ba682829 --- /dev/null +++ b/examples/math_func/config_out_constr.yml @@ -0,0 +1,52 @@ +controls: + - + name: point + type: generic_control + min: -1.0 + max: 1.0 + initial_guess: 0 + perturbation_magnitude : 0.001 + variables: + - name: x + - name: y + - name: z + + +objective_functions: + - + name: distance + + +output_constraints: + - + name: z_coord + upper_bound: 0.3 + +optimization: + algorithm: optpp_q_newton + convergence_tolerance: 0.001 + max_batch_num: 6 + + +install_jobs: + - + name: distance3 + source: jobs/DISTANCE3 + - + name: dump_controls + source: jobs/DUMP_CONTROLS + +model: + realizations: [0] + +forward_model: + - distance3 --point-file point.json + --target 0.5 0.5 0.5 + --out distance + - dump_controls --controls-file point.json --out-suffix _coord + +environment: + output_folder: everest_output_out_constr + simulation_folder: scratch + log_level: debug + random_seed: 999 diff --git a/examples/math_func/config_remove_run_path.yml b/examples/math_func/config_remove_run_path.yml new file mode 100644 index 00000000000..3b6ecda5067 --- /dev/null +++ b/examples/math_func/config_remove_run_path.yml @@ -0,0 +1,55 @@ +wells: [] + +controls: + - + name: point + type: generic_control + min: -1.0 + max: 1.0 + initial_guess: 0 + perturbation_magnitude : 0.001 + variables: + - name: x + - name: y + - name: z + +objective_functions: + - + name: distance + +install_jobs: + - + name: distance3 + source: jobs/DISTANCE3 + - + name: toggle_failure + source: jobs/FAIL_SIMULATION + +forward_model: + - distance3 --point-file point.json + --target 0.5 0.5 0.5 + --out distance + + - toggle_failure + + +model: + realizations: [0] + +optimization: + algorithm: optpp_q_newton + convergence_tolerance: 0.005 + min_realizations_success: 1 + min_pert_success: 1 + max_iterations: 1 + perturbation_num: 2 + +environment: + log_level: debug + random_seed: 123 + simulation_folder: scratch/advanced/ + output_folder: everest_output/ + + +simulator: + delete_run_path: True diff --git a/examples/math_func/config_restart.yml b/examples/math_func/config_restart.yml new file mode 100644 index 00000000000..055026cae63 --- /dev/null +++ b/examples/math_func/config_restart.yml @@ -0,0 +1,95 @@ +# This config file is the same as config_advanced.yml, except that it uses the +# SciPy backend. + +wells: [] + +controls: +- initial_guess: 0.25 + max: 1.0 + min: -1.0 + name: point + perturbation_magnitude: 0.005 + type: generic_control + variables: + - name: x + index: 0 + - name: x + index: 1 + - name: x + index: 2 + +objective_functions: + - + name: distance + +input_constraints: + - + weights: + point.x-0: 0 + point.x-1: 0 + point.x-2: 1 + upper_bound: 0.4 + +output_constraints: + - name: x-0_coord + lower_bound: 0.1 + scale: 0.1 + + +# Optimal value expected at x=0.1, y=0, z=0.4, with distance 3.72 + + +install_jobs: + - + name: adv_distance3 + source: jobs/ADV_DISTANCE3 + - + name: adv_dump_controls + source: jobs/ADV_DUMP_CONTROLS + + +forward_model: + # Compute distance (squared and negated) between 2 points + - adv_distance3 --point-file point.json + --target-file data/r{{ realization}}/target.json + --out distance + # Write the value of each control to a separate file + - adv_dump_controls --controls-file point.json + --out-suffix _coord + + + +model: + realizations: [0, 2] + realizations_weights: [ 0.25, 0.75] + + +install_data: + - + link: false + source: r{{ configpath }}/adv_target_r{{ realization }}.json + target: data/r{{ realization}}/target.json + + +install_templates: [] + +optimization: + backend: scipy + algorithm: SLSQP + convergence_tolerance: 0.001 + constraint_tolerance: 0.001 + perturbation_num: 4 + speculative: True + max_function_evaluations: 3 + restart: + max_restarts: 1 + restart_from: "last" + +environment: + log_level: debug + random_seed: 123 + simulation_folder: scratch/advanced/ + output_folder: everest_output/ + +simulator: + enable_cache: false diff --git a/examples/math_func/config_stddev.yml b/examples/math_func/config_stddev.yml new file mode 100644 index 00000000000..8616039c7b5 --- /dev/null +++ b/examples/math_func/config_stddev.yml @@ -0,0 +1,49 @@ +controls: + - + name: point + type: generic_control + perturbation_magnitude : 0.01 + min: -1.0 + max: 1.0 + variables: + - name: x + initial_guess: 0.0 + - name: y + initial_guess: 0.0 + - name: z + initial_guess: 0.0 + +objective_functions: + - + name: distance + weight: 1.0 + - + name: stddev + weight: 1.0 + type: stddev + alias: distance + +optimization: + backend: scipy + algorithm: slsqp + max_batch_num: 5 + convergence_tolerance: 0.0001 + perturbation_num: 3 + +install_jobs: + - + name: distance3 + source: jobs/DISTANCE3 + +model: + realizations: [0, 1] + +forward_model: + - distance3 --point-file point.json --realization r{{realization}} + --target 0.5 0.5 0.5 + --out distance + +environment: + output_folder: distance_output + simulation_folder: sim_output + random_seed: 999 diff --git a/examples/math_func/jobs/ADV_DISTANCE3 b/examples/math_func/jobs/ADV_DISTANCE3 new file mode 100755 index 00000000000..85312175eb2 --- /dev/null +++ b/examples/math_func/jobs/ADV_DISTANCE3 @@ -0,0 +1,4 @@ +EXECUTABLE adv_distance3.py + +MIN_ARG 4 +MAX_ARG 6 diff --git a/examples/math_func/jobs/ADV_DUMP_CONTROLS b/examples/math_func/jobs/ADV_DUMP_CONTROLS new file mode 100755 index 00000000000..096ac97a450 --- /dev/null +++ b/examples/math_func/jobs/ADV_DUMP_CONTROLS @@ -0,0 +1,4 @@ +EXECUTABLE adv_dump_controls.py + +MIN_ARG 1 +MAX_ARG 3 diff --git a/examples/math_func/jobs/DISCRETE b/examples/math_func/jobs/DISCRETE new file mode 100644 index 00000000000..f719a731caa --- /dev/null +++ b/examples/math_func/jobs/DISCRETE @@ -0,0 +1 @@ +EXECUTABLE discrete.py diff --git a/examples/math_func/jobs/DISTANCE3 b/examples/math_func/jobs/DISTANCE3 new file mode 100755 index 00000000000..72ce8511f6e --- /dev/null +++ b/examples/math_func/jobs/DISTANCE3 @@ -0,0 +1,4 @@ +EXECUTABLE distance3.py + +MIN_ARG 4 +MAX_ARG 6 diff --git a/examples/math_func/jobs/DUMP_CONTROLS b/examples/math_func/jobs/DUMP_CONTROLS new file mode 100755 index 00000000000..3a42ab6d89c --- /dev/null +++ b/examples/math_func/jobs/DUMP_CONTROLS @@ -0,0 +1,4 @@ +EXECUTABLE dump_controls.py + +MIN_ARG 1 +MAX_ARG 3 diff --git a/examples/math_func/jobs/FAIL_SIMULATION b/examples/math_func/jobs/FAIL_SIMULATION new file mode 100755 index 00000000000..c37c2755059 --- /dev/null +++ b/examples/math_func/jobs/FAIL_SIMULATION @@ -0,0 +1,4 @@ +EXECUTABLE fail_simulation.py + +MIN_ARG 0 +MAX_ARG 2 diff --git a/examples/math_func/jobs/SLEEP b/examples/math_func/jobs/SLEEP new file mode 100755 index 00000000000..58ed6cdd5c4 --- /dev/null +++ b/examples/math_func/jobs/SLEEP @@ -0,0 +1,4 @@ +EXECUTABLE sleep.py + +MIN_ARG 0 +MAX_ARG 6 diff --git a/examples/math_func/jobs/adv_distance3.py b/examples/math_func/jobs/adv_distance3.py new file mode 100755 index 00000000000..4749d58c7e0 --- /dev/null +++ b/examples/math_func/jobs/adv_distance3.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python + +import argparse +import json +import sys + + +def compute_distance_squared(p, q): + d = ((i - j) ** 2 for i, j in zip(p, q)) + d = sum(d) + return -d + + +def read_point(filename): + with open(filename, "r", encoding="utf-8") as f: + point = json.load(f) + x = point["x"] + return x["0"], x["1"], x["2"] + + +def main(argv): + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument("--point-file", type=str) + arg_parser.add_argument("--point", nargs=3, type=float) + arg_parser.add_argument("--target-file", type=str) + arg_parser.add_argument("--target", nargs=3, type=float) + arg_parser.add_argument("--out", type=str) + options, _ = arg_parser.parse_known_args(args=argv) + + point = options.point if options.point else read_point(options.point_file) + if len(point) != 3: + raise RuntimeError("Failed parsing point") + + target = options.target if options.target else read_point(options.target_file) + if len(target) != 3: + raise RuntimeError("Failed parsing target") + + value = compute_distance_squared(point, target) + + if options.out: + with open(options.out, "w", encoding="utf-8") as f: + f.write("%g \n" % value) + else: + print(value) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/examples/math_func/jobs/adv_dump_controls.py b/examples/math_func/jobs/adv_dump_controls.py new file mode 100755 index 00000000000..19b1bb9a435 --- /dev/null +++ b/examples/math_func/jobs/adv_dump_controls.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python + +import argparse +import json +import sys + + +def main(argv): + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument("--controls-file", type=str, required=True) + arg_parser.add_argument("--out-prefix", type=str, default="") + arg_parser.add_argument("--out-suffix", type=str, default="") + opts, _ = arg_parser.parse_known_args(args=argv) + + with open(opts.controls_file, "r", encoding="utf-8") as f: + controls = json.load(f) + + for name, indices in controls.items(): + for idx, val in indices.items(): + out_file = "{}{}{}".format( + opts.out_prefix, "{}-{}".format(name, idx), opts.out_suffix + ) + with open(out_file, "w", encoding="utf-8") as f: + f.write("%g \n" % val) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/examples/math_func/jobs/discrete.py b/examples/math_func/jobs/discrete.py new file mode 100755 index 00000000000..44bb659b99c --- /dev/null +++ b/examples/math_func/jobs/discrete.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +import argparse +import json +import sys + + +def compute_func(x, y): + return min(3 * x, y) + + +def read_point(filename): + with open(filename, "r", encoding="utf-8") as f: + point = json.load(f) + return point["x"], point["y"] + + +def main(argv): + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument("--point-file", type=str) + arg_parser.add_argument("--out", type=str) + options, _ = arg_parser.parse_known_args(args=argv) + + point = read_point(options.point_file) + if len(point) != 2: + raise RuntimeError("Failed parsing point") + + value = compute_func(*point) + + if options.out: + with open(options.out, "w", encoding="utf-8") as f: + f.write("%g \n" % value) + else: + print(value) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/examples/math_func/jobs/distance3.py b/examples/math_func/jobs/distance3.py new file mode 100755 index 00000000000..8eeb14b123d --- /dev/null +++ b/examples/math_func/jobs/distance3.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python + +import argparse +import json +import sys + + +def compute_distance_squared(p, q): + d = ((i - j) ** 2 for i, j in zip(p, q)) + d = sum(d) + return -d + + +def read_point(filename): + with open(filename, "r", encoding="utf-8") as f: + point = json.load(f) + return point["x"], point["y"], point["z"] + + +def main(argv): + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument("--point-file", type=str) + arg_parser.add_argument("--point", nargs=3, type=float) + arg_parser.add_argument("--target-file", type=str) + arg_parser.add_argument("--target", nargs=3, type=float) + arg_parser.add_argument("--out", type=str) + arg_parser.add_argument("--scaling", nargs=4, type=float) + arg_parser.add_argument("--realization", type=float) + options, _ = arg_parser.parse_known_args(args=argv) + + point = options.point if options.point else read_point(options.point_file) + if len(point) != 3: + raise RuntimeError("Failed parsing point") + + target = options.target if options.target else read_point(options.target_file) + if len(target) != 3: + raise RuntimeError("Failed parsing target") + + if options.scaling is not None: + min_range, max_range, target_min, target_max = options.scaling + point = [(p - target_min) / (target_max - target_min) for p in point] + point = [p * (max_range - min_range) + min_range for p in point] + + value = compute_distance_squared(point, target) + # If any realizations with an index > 0 are passed we make those incorrect + # by taking the negative value. This used by test_cvar.py. + if options.realization: + value = -value + + if options.out: + with open(options.out, "w", encoding="utf-8") as f: + f.write("%g \n" % value) + else: + print(value) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/examples/math_func/jobs/dump_controls.py b/examples/math_func/jobs/dump_controls.py new file mode 100755 index 00000000000..be45295703d --- /dev/null +++ b/examples/math_func/jobs/dump_controls.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +import argparse +import json +import sys + + +def main(argv): + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument("--controls-file", type=str, required=True) + arg_parser.add_argument("--out-prefix", type=str, default="") + arg_parser.add_argument("--out-suffix", type=str, default="") + opts, _ = arg_parser.parse_known_args(args=argv) + + with open(opts.controls_file, "r", encoding="utf-8") as f: + controls = json.load(f) + + for k, v in controls.items(): + out_file = "{}{}{}".format(opts.out_prefix, k, opts.out_suffix) + with open(out_file, "w", encoding="utf-8") as f: + f.write("%g \n" % v) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/examples/math_func/jobs/fail_simulation.py b/examples/math_func/jobs/fail_simulation.py new file mode 100755 index 00000000000..6e2a861ca8d --- /dev/null +++ b/examples/math_func/jobs/fail_simulation.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python + +import argparse +import os +import sys +import time + + +def main(argv): + """ + This job should only be used for testing! Was designed to fail when running + a specific simulation. + + Example: + fail_simulation.py --fail simulation_2. Will fail when the jobs + is run for simulation_2 + """ + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument("--fail", type=str) + options, _ = arg_parser.parse_known_args(args=argv) + + if options.fail in os.getcwd(): + raise Exception("Failing %s by request!" % options.fail) + + time.sleep(1) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/examples/math_func/jobs/sleep.py b/examples/math_func/jobs/sleep.py new file mode 100755 index 00000000000..d41e15e522c --- /dev/null +++ b/examples/math_func/jobs/sleep.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python + +import argparse +import sys +import time + + +def main(argv): + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument("--sleep", type=int) + options, _ = arg_parser.parse_known_args(args=argv) + time.sleep(options.sleep) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/examples/math_func/readme.md b/examples/math_func/readme.md new file mode 100644 index 00000000000..356c6f49c6c --- /dev/null +++ b/examples/math_func/readme.md @@ -0,0 +1,13 @@ +# Math function example + +This example contains some ways to use Everest to evaluate a simply objective function: the squared distance between two 3D points. + +The purpose of the configuration files are meant to showcase the following: + +- `config_minimal.yml`: A minimally functional configuration to run everest with the distance3 job. It minimizes the distance between `point`, starting at (0,0,0), to the target of (0.5, 0.5, 0.5). + +All other configuration files are extensions of the above configuration. These are the most important ones. +- `config_out_constr.yml`: Adds an output constraint to the configuration that constrains the `z` coordinate to not allow it to be higher than 0.3. +- `config_in_constr.yml`: Adds an input constraint that not allows the `x` and `y` coordinates to go over 0.5. +- `config_multiobj.yml`: Adds an additional objective function that checks the distance of the controls to a second target point (-1.5, -1.5, 0.5). +- `config_advanced.yml`: Adds both in- and output constraints to the configuration. Also adds realizations with differing weights to the model. diff --git a/examples/math_func/target_0.json b/examples/math_func/target_0.json new file mode 100644 index 00000000000..3cb9969fa61 --- /dev/null +++ b/examples/math_func/target_0.json @@ -0,0 +1,5 @@ +{ + "x-0": -1.5, + "y-0": -1.5, + "z-0": 0.5 +} diff --git a/examples/math_func/target_2.json b/examples/math_func/target_2.json new file mode 100644 index 00000000000..bad0448ee2c --- /dev/null +++ b/examples/math_func/target_2.json @@ -0,0 +1,5 @@ +{ + "x-0": 0.5, + "y-0": 0.5, + "z-0": 0.5 +} diff --git a/pyproject.toml b/pyproject.toml index 82d5251e5c8..5e1d0bd34e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -79,6 +79,16 @@ dependencies = [ [project.scripts] ert = "ert.__main__:main" "job_dispatch.py" = "_ert.forward_model_runner.job_dispatch:main" +everest = "everest.bin.main:start_everest" +everserver = "everest.detached.jobs.everserver:main" +recovery_factor = "everest.jobs.scripts.recovery_factor:main" +render = "everest.jobs.scripts.render:main" +wdcompl = "everest.jobs.scripts.wdcompl:main" +wddatefilter = "everest.jobs.scripts.wddatefilter:main" +wdfilter = "everest.jobs.scripts.wdfilter:main" +wdreorder = "everest.jobs.scripts.wdreorder:main" +wdset = "everest.jobs.scripts.wdset:main" +wdupdate = "everest.jobs.scripts.wdupdate:main" [project.urls] Repository = "https://github.com/equinor/ert" @@ -129,11 +139,42 @@ types = [ "types-docutils", "types-tqdm", "types-psutil", + "types-setuptools" +] +everest = [ + "python-dateutil", + "Jinja2>=2.10", + "matplotlib", + "pandas", + "progressbar2", + "pydantic", + "ruamel.yaml", + "seaborn", + "flask", + "cryptography", + "dnspython", + "qtpy", + "pluggy", + "decorator", + "resdata", + "PyQt5", + "colorama", + "numpy<2", + "ropt[pandas]<0.7", + "ropt-dakota<0.7", + "seba-sqlite", + "setuptools; python_version >= '3.12'", ] [tool.setuptools] +package-dir = {"" = "src"} platforms = ["all"] +[tool.setuptools.package-data] +everest = ["data/**/*", "*.tmpl", "detached/jobs/everserver"] +ieverest = ["*.ui"] + + [tool.pytest.ini_options] addopts = "-ra --strict-markers" markers = [ @@ -144,6 +185,12 @@ markers = [ "requires_window_manager", "script", "slow", + "everest_models_test", + "integration_test", + "simulation_test", + "ui_test", + "redundant_test", + "fails_on_macos_github_workflow", # Tests marked fail due to gui-related issues ] log_cli = "false" asyncio_mode = "auto" diff --git a/src/everest/__init__.py b/src/everest/__init__.py new file mode 100644 index 00000000000..d4dbcef788d --- /dev/null +++ b/src/everest/__init__.py @@ -0,0 +1,45 @@ +""" +This is the main Everest module. + +""" + +from .loader import load + +try: + from ert.shared.version import version + + __version__ = version +except ImportError: + __version__ = "0.0.0" + +from everest import detached, docs, jobs, templates, util +from everest.bin.utils import export_to_csv, export_with_progress +from everest.config_keys import ConfigKeys +from everest.export import MetaDataColumnNames, export, filter_data, validate_export +from everest.suite import ( # flake8: noqa F401 + SIMULATOR_END, + SIMULATOR_START, + SIMULATOR_UPDATE, + start_optimization, +) + +__author__ = "Equinor ASA and TNO" +__all__ = [ + "SIMULATOR_END", + "SIMULATOR_START", + "SIMULATOR_UPDATE", + "ConfigKeys", + "MetaDataColumnNames", + "detached", + "docs", + "export", + "export_to_csv", + "export_with_progress", + "filter_data", + "jobs", + "load", + "start_optimization", + "templates", + "util", + "validate_export", +] diff --git a/src/everest/api/__init__.py b/src/everest/api/__init__.py new file mode 100644 index 00000000000..40b2b8d08a5 --- /dev/null +++ b/src/everest/api/__init__.py @@ -0,0 +1,3 @@ +from everest.api.everest_data_api import EverestDataAPI + +__all__ = ["EverestDataAPI"] diff --git a/src/everest/api/everest_data_api.py b/src/everest/api/everest_data_api.py new file mode 100644 index 00000000000..ef95e3a0387 --- /dev/null +++ b/src/everest/api/everest_data_api.py @@ -0,0 +1,211 @@ +from collections import OrderedDict + +import pandas as pd +from seba_sqlite.snapshot import SebaSnapshot + +from ert.storage import open_storage +from everest.config import EverestConfig +from everest.detached import ServerStatus, everserver_status + + +class EverestDataAPI: + def __init__(self, config: EverestConfig, filter_out_gradient=True): + self._config = config + output_folder = config.optimization_output_dir + self._snapshot = SebaSnapshot(output_folder).get_snapshot(filter_out_gradient) + + @property + def batches(self): + batch_ids = list({opt.batch_id for opt in self._snapshot.optimization_data}) + return sorted(batch_ids) + + @property + def accepted_batches(self): + batch_ids = list( + {opt.batch_id for opt in self._snapshot.optimization_data if opt.merit_flag} + ) + return sorted(batch_ids) + + @property + def objective_function_names(self): + return [fnc.name for fnc in self._snapshot.metadata.objectives.values()] + + @property + def output_constraint_names(self): + return [fnc.name for fnc in self._snapshot.metadata.constraints.values()] + + def input_constraint(self, control): + controls = [ + con + for con in self._snapshot.metadata.controls.values() + if con.name == control + ] + return {"min": controls[0].min_value, "max": controls[0].max_value} + + def output_constraint(self, constraint): + """ + :return: a dictionary with two keys: "type" and "right_hand_side". + "type" has three options: + ["lower_bound", "upper_bound", "target"] + "right_hand_side" is a constant real number that indicates + the constraint bound/target. + """ + constraints = [ + con + for con in self._snapshot.metadata.constraints.values() + if con.name == constraint + ] + return { + "type": constraints[0].constraint_type, + "right_hand_side": constraints[0].rhs_value, + } + + @property + def realizations(self): + return list( + OrderedDict.fromkeys( + int(sim.realization) for sim in self._snapshot.simulation_data + ) + ) + + @property + def simulations(self): + return list( + OrderedDict.fromkeys( + [int(sim.simulation) for sim in self._snapshot.simulation_data] + ) + ) + + @property + def control_names(self): + return [con.name for con in self._snapshot.metadata.controls.values()] + + @property + def control_values(self): + controls = [con.name for con in self._snapshot.metadata.controls.values()] + return [ + {"control": con, "batch": sim.batch, "value": sim.controls[con]} + for sim in self._snapshot.simulation_data + for con in controls + if con in sim.controls + ] + + @property + def objective_values(self): + return [ + { + "function": objective.name, + "batch": sim.batch, + "realization": sim.realization, + "simulation": sim.simulation, + "value": sim.objectives[objective.name], + "weight": objective.weight, + "norm": objective.normalization, + } + for sim in self._snapshot.simulation_data + for objective in self._snapshot.metadata.objectives.values() + if objective.name in sim.objectives + ] + + @property + def single_objective_values(self): + single_obj = [ + { + "batch": optimization_el.batch_id, + "objective": optimization_el.objective_value, + "accepted": optimization_el.merit_flag, + } + for optimization_el in self._snapshot.optimization_data + ] + metadata = { + func.name: {"weight": func.weight, "norm": func.normalization} + for func in self._snapshot.metadata.functions.values() + if func.function_type == func.FUNCTION_OBJECTIVE_TYPE + } + if len(metadata) == 1: + return single_obj + objectives = [] + for name, values in self._snapshot.expected_objectives.items(): + for idx, val in enumerate(values): + factor = metadata[name]["weight"] * metadata[name]["norm"] + if len(objectives) > idx: + objectives[idx].update({name: val * factor}) + else: + objectives.append({name: val * factor}) + for idx, obj in enumerate(single_obj): + obj.update(objectives[idx]) + + return single_obj + + @property + def gradient_values(self): + return [ + { + "batch": optimization_el.batch_id, + "function": function, + "control": control, + "value": value, + } + for optimization_el in self._snapshot.optimization_data + for function, info in optimization_el.gradient_info.items() + for control, value in info.items() + ] + + def summary_values(self, batches=None, keys=None): + if batches is None: + batches = self.batches + simulations = self.simulations + data_frames = [] + storage = open_storage(self._config.storage_dir, "r") + for batch_id in batches: + case_name = f"batch_{batch_id}" + experiment = storage.get_experiment_by_name(f"experiment_{case_name}") + ensemble = experiment.get_ensemble_by_name(case_name) + summary = ensemble.load_all_summary_data() + if not summary.empty: + columns = set(summary.columns) + if keys is not None: + columns = columns.intersection(set(keys)) + summary = summary[list(columns)] + summary = summary.dropna(axis=0, how="all", subset=columns) + summary = summary.dropna(axis=1, how="all") + summary = summary[ + summary.index.get_level_values("Realization").isin(simulations) + ] + summary.reset_index(inplace=True) + summary["batch"] = batch_id + # The 'Realization' column exported by ert are + # the 'simulations' of everest. + summary.rename( + columns={"Realization": "simulation", "Date": "date"}, inplace=True + ) + # The realization ID as defined by Everest must be + # retrieved via the seba snapshot. + realization_map = { + str(sim.simulation): sim.realization + for sim in self._snapshot.simulation_data + if sim.batch == batch_id + } + summary["realization"] = ( + summary["simulation"].astype(str).map(realization_map) + ) + # If possible, convert the realization id to integer. + summary["realization"] = pd.to_numeric( + summary["realization"], errors="ignore", downcast="integer" + ) + + data_frames.append(summary) + storage.close() + return pd.concat(data_frames) + + @property + def output_folder(self): + return self._config.output_dir + + @property + def everest_csv(self): + state = everserver_status(self._config) + if state["status"] == ServerStatus.completed: + return self._config.export_path + else: + return None diff --git a/src/everest/bin/__init__.py b/src/everest/bin/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/everest/bin/config_branch_script.py b/src/everest/bin/config_branch_script.py new file mode 100644 index 00000000000..5b8ae0f5fb5 --- /dev/null +++ b/src/everest/bin/config_branch_script.py @@ -0,0 +1,116 @@ +import argparse +from copy import deepcopy as copy +from functools import partial +from os.path import exists, join +from typing import Any, Dict, Optional, Tuple + +from ruamel.yaml import YAML +from seba_sqlite.database import Database as seba_db +from seba_sqlite.snapshot import SebaSnapshot + +from everest.config import EverestConfig +from everest.config_file_loader import load_yaml +from everest.config_keys import ConfigKeys as CK + + +def _yaml_config(file_path: str, parser) -> Tuple[str, Optional[Dict[str, Any]]]: + loaded_config = EverestConfig.load_file_with_argparser(file_path, parser) + + assert loaded_config is not None + opt_folder = loaded_config.optimization_output_dir + return opt_folder, load_yaml(file_path) + + +def _build_args_parser(): + arg_parser = argparse.ArgumentParser( + description="Create new config file with updated controls " + "from specified simulation batch number\n" + "**Warning**: Previous simulation output folder will be overwritten" + " if it was placed outside the everest output folder", + usage="""everest branch -b #""", + ) + arg_parser.add_argument( + "input_config", + help="The path to the everest configuration file", + type=partial(_yaml_config, parser=arg_parser), + ) + arg_parser.add_argument("output_config", help="The path to the new everest file") + arg_parser.add_argument( + "-b", + "--batch", + type=int, + help="Batch id from which to retrieve control values", + required=True, + ) + return arg_parser + + +def opt_controls_by_batch(optimization_dir, batch): + snapshot = SebaSnapshot(optimization_dir) + for opt_data in snapshot.get_optimization_data(): + if opt_data.batch_id == batch: + return opt_data.controls + return None + + +def _updated_initial_guess(conf_controls, opt_controls): + conf_controls = copy(conf_controls) + + for control in conf_controls: + control.pop(CK.INITIAL_GUESS, None) + control_name = "{}_".format(control[CK.NAME]) + batch_controls = { + key.split(control_name)[-1]: val + for key, val in opt_controls.items() + if control_name in key + } + + for variable in control[CK.VARIABLES]: + var_index = variable.get(CK.INDEX, None) + + if var_index is not None: + opt_control_name = "{}-{}".format(variable[CK.NAME], var_index) + else: + opt_control_name = variable[CK.NAME] + + opt_control_val = batch_controls.get(opt_control_name) + + if opt_control_val is None: + print( + "No generated optimization control value found for" + " control {} index {}".format(variable[CK.NAME], var_index) + ) + return None + else: + variable[CK.INITIAL_GUESS] = opt_control_val + + return conf_controls + + +def config_branch_entry(args=None): + parser = _build_args_parser() + options = parser.parse_args(args) + optimization_dir, yml_config = options.input_config + + db_path = join(optimization_dir, seba_db.FILENAME) + if not exists(db_path): + parser.error("Optimization source {} not found".format(db_path)) + + opt_controls = opt_controls_by_batch(optimization_dir, options.batch) + if opt_controls is None: + parser.error("Batch {} not present in optimization data".format(options.batch)) + + yml_config[CK.CONTROLS] = _updated_initial_guess( + conf_controls=yml_config[CK.CONTROLS], opt_controls=opt_controls + ) + + yaml = YAML() + yaml.indent(mapping=2, sequence=4, offset=2) # pylint: disable=not-callable + yaml.preserve_quotes = True + with open(options.output_config, "w", encoding="utf-8") as f: + yaml.dump(yml_config, f) + print("New config file {} created.".format(options.output_config)) + + +if __name__ == "__main__": + config_branch_entry() diff --git a/src/everest/bin/everconfigdump_script.py b/src/everest/bin/everconfigdump_script.py new file mode 100755 index 00000000000..db96e7a8256 --- /dev/null +++ b/src/everest/bin/everconfigdump_script.py @@ -0,0 +1,36 @@ +#!/usr/bin/env python + +import argparse +import sys + +from ruamel.yaml import YAML + +from everest.config import EverestConfig + + +def _build_args_parser(): + """Build arg parser""" + arg_parser = argparse.ArgumentParser( + description="Display the configuration data loaded from a config file after replacing templated arguments.", + usage="""everest show """, + ) + arg_parser.add_argument( + "config_file", help="The path to the everest configuration file" + ) + return arg_parser + + +def config_dump_entry(args=None): + parser = _build_args_parser() + options = parser.parse_args(args) + + config = EverestConfig.load_file(options.config_file) + + yaml = YAML(typ="safe", pure=True) + yaml.indent = 2 + yaml.default_flow_style = False + yaml.dump(config.to_dict(), sys.stdout) + + +if __name__ == "__main__": + config_dump_entry() diff --git a/src/everest/bin/everest_script.py b/src/everest/bin/everest_script.py new file mode 100755 index 00000000000..cf5c04e086d --- /dev/null +++ b/src/everest/bin/everest_script.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python + +import argparse +import json +import logging +import signal +import threading +from functools import partial + +from ert.config import ErtConfig +from ert.storage import open_storage +from everest.config import EverestConfig +from everest.detached import ( + ServerStatus, + everserver_status, + generate_everserver_ert_config, + server_is_running, + start_server, + wait_for_context, + wait_for_server, +) +from everest.plugins.site_config_env import PluginSiteConfigEnv +from everest.util import makedirs_if_needed, version_info + +from .utils import ( + handle_keyboard_interrupt, + report_on_previous_run, + run_detached_monitor, +) + + +def everest_entry(args=None): + """Entry point for running an optimization.""" + parser = _build_args_parser() + options = parser.parse_args(args) + + if options.debug: + logging.getLogger().setLevel(logging.DEBUG) + # Remove the null handler if set: + logging.getLogger().removeHandler(logging.NullHandler()) + + logging.info(version_info()) + logging.debug(json.dumps(options.config.to_dict(), sort_keys=True, indent=2)) + + if threading.current_thread() is threading.main_thread(): + signal.signal( + signal.SIGINT, + partial(handle_keyboard_interrupt, options=options), + ) + + run_everest(options) + + +def _build_args_parser(): + """Build arg parser""" + + arg_parser = argparse.ArgumentParser( + description="Everest console runner, start an optimization case based on a given config file", + usage="everest run [arguments]", + ) + arg_parser.add_argument( + "config", + type=partial(EverestConfig.load_file_with_argparser, parser=arg_parser), + help="The path to the everest configuration file", + ) + arg_parser.add_argument( + "--new-run", + action="store_true", + help="Run the optimization even though results are already available", + ) + arg_parser.add_argument( + "--debug", action="store_true", help="Display debug information in the terminal" + ) + arg_parser.add_argument( + "--show-all-jobs", + action="store_true", + help="Display all jobs executed from the forward model", + ) + + return arg_parser + + +def _run_everest(options, ert_config, storage): + with PluginSiteConfigEnv(): + context = start_server(options.config, ert_config, storage) + print("Waiting for server ...") + wait_for_server(options.config, timeout=600, context=context) + print("Everest server found!") + run_detached_monitor(options.config, show_all_jobs=options.show_all_jobs) + wait_for_context() + + +def run_everest(options): + logger = logging.getLogger("everest_main") + server_state = everserver_status(options.config) + + if server_is_running(options.config): + config_file = options.config.config_file + print( + "An optimization is currently running.\n" + "To monitor the running optimization use command:\n" + f" `everest monitor {config_file}`\n" + "To kill the running optimization use command:\n" + f" `everest kill {config_file}`" + ) + elif server_state["status"] == ServerStatus.never_run or options.new_run: + config_dict = options.config.to_dict() + logger.info("Running everest with config info\n {}".format(config_dict)) + for fm_job in options.config.forward_model or []: + job_name = fm_job.split()[0] + logger.info("Everest forward model contains job {}".format(job_name)) + + with PluginSiteConfigEnv(): + ert_config = ErtConfig.with_plugins().from_dict( + config_dict=generate_everserver_ert_config( + options.config, options.debug + ) + ) + + makedirs_if_needed(options.config.output_dir, roll_if_exists=True) + + with open_storage(ert_config.ens_path, "w") as storage: + _run_everest(options, ert_config, storage) + + server_state = everserver_status(options.config) + server_state_info = server_state["message"] + if server_state["status"] == ServerStatus.failed: + logger.error("Everest run failed with: {}".format(server_state_info)) + raise SystemExit(server_state_info) + if server_state_info is not None: + logger.info("Everest run finished with: {}".format(server_state_info)) + print(server_state_info) + else: + report_on_previous_run(options.config) + + +if __name__ == "__main__": + everest_entry() diff --git a/src/everest/bin/everexport_script.py b/src/everest/bin/everexport_script.py new file mode 100755 index 00000000000..814201b951d --- /dev/null +++ b/src/everest/bin/everexport_script.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python + +import argparse +import logging +from functools import partial + +from everest import export_to_csv, validate_export +from everest.config import EverestConfig +from everest.config.export_config import ExportConfig +from everest.strings import EVEREST + + +def everexport_entry(args=None): + parser = _build_args_parser() + options = parser.parse_args(args) + logger = logging.getLogger(EVEREST) + if options.debug: + logger.setLevel(logging.DEBUG) + # Remove the null handler if set: + logging.getLogger().removeHandler(logging.NullHandler()) + + config = options.config_file + + # Turn into .export once + # explicit None is disallowed + if config.export is None: + config.export = ExportConfig() + + if options.batches is not None: + batch_list = [int(item) for item in options.batches] + config.export.batches = batch_list + + err_msgs, export_ecl = validate_export(config) + for msg in err_msgs: + logger.warning(msg) + export_to_csv(config, export_ecl=export_ecl) + + +def _build_args_parser(): + """Build arg parser""" + arg_parser = argparse.ArgumentParser( + description="Export data from a completed optimization case", + usage="everest export ", + ) + arg_parser.add_argument( + "config_file", + type=partial(EverestConfig.load_file_with_argparser, parser=arg_parser), + help="The path to the everest configuration file", + ) + arg_parser.add_argument( + "-b", + "--batches", + nargs="*", + help="List of batches to be exported", + ) + arg_parser.add_argument( + "-d", + "--debug", + action="store_true", + help="Display debug information in the terminal", + ) + + return arg_parser + + +if __name__ == "__main__": + everexport_entry() diff --git a/src/everest/bin/everlint_script.py b/src/everest/bin/everlint_script.py new file mode 100644 index 00000000000..992f8318ee4 --- /dev/null +++ b/src/everest/bin/everlint_script.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python + +import argparse +from functools import partial + +from everest.config import EverestConfig + + +def _build_args_parser(): + """Build arg parser""" + arg_parser = argparse.ArgumentParser( + description="Check if a config file is valid", + usage="""everest lint """, + ) + arg_parser.add_argument( + "config_file", + type=partial(EverestConfig.load_file_with_argparser, parser=arg_parser), + help="The path to the everest configuration file", + ) + return arg_parser + + +def lint_entry(args=None): + parser = _build_args_parser() + options = parser.parse_args(args) + parsed_config = options.config_file + conf_file = parsed_config.config_path + + print(f"{conf_file} is valid") + + +if __name__ == "__main__": + lint_entry() diff --git a/src/everest/bin/everload_script.py b/src/everest/bin/everload_script.py new file mode 100755 index 00000000000..d1552d93979 --- /dev/null +++ b/src/everest/bin/everload_script.py @@ -0,0 +1,196 @@ +#!/usr/bin/env python + +import argparse +import datetime +import logging +import os +import shutil +from functools import partial + +from ert import LibresFacade +from ert.config import ErtConfig +from ert.storage import open_storage +from everest import MetaDataColumnNames as MDCN +from everest import export +from everest.config import EverestConfig +from everest.config.export_config import ExportConfig +from everest.simulator.everest_to_ert import everest_to_ert_config +from everest.util import version_info + + +def everload_entry(args=None): + parser = _build_args_parser() + options = parser.parse_args(args) + if options.debug: + logging.getLogger().setLevel(logging.DEBUG) + # Remove the null handler if set: + logging.getLogger().removeHandler(logging.NullHandler()) + logging.info(version_info()) + + config: EverestConfig = options.config_file + + if options.batches is not None: + batch_list = [int(item) for item in options.batches] + if config.export is None: + config.export = ExportConfig(batches=batch_list) + else: + config.export.batches = batch_list + + # The case must have run before + out_dir = config.output_dir + if not os.path.isdir(out_dir): + raise RuntimeError("This case was never run, cannot internalize data") + + # The simulation directory should be available + # At the moment we check only if the simulation folder exists. In the future + # we may consider carrying out some more thorough sanity check on the folder + # before proceding with the internalization + sim_dir = config.simulation_dir + if not os.path.isdir(sim_dir): + raise RuntimeError( + ( + "The simulation directory '{}' cannot be found, " + "cannot internalize data" + ).format(sim_dir) + ) + + # Warn the user and ask for confirmation + storage_path = config.storage_dir + backup_path = None + if not os.path.isdir(storage_path): + storage_path = None + elif not options.overwrite: + backup_path = storage_path + datetime.datetime.utcnow().strftime( + "__%Y-%m-%d_%H.%M.%S.%f" + ) + + if not options.silent and not user_confirms(sim_dir, storage_path, backup_path): + return + + reload_data(config, backup_path=backup_path) + + +def _build_args_parser(): + """Build arg parser""" + arg_parser = argparse.ArgumentParser( + description="Load Eclipse data from an existing simulation folder", + usage="""everest load """, + ) + + def batch(batch_str, parser=arg_parser): + batch_str = "{}".format( + batch_str.strip() + ) # Because isnumeric only works on unicode strings in py27 + if not batch_str.isnumeric() or (batch_str[0] == "0" and len(batch_str) > 1): + parser.error("Invalid batch given: '{}'".format(batch_str)) + return int(batch_str) + + arg_parser.add_argument( + "config_file", + type=partial(EverestConfig.load_file_with_argparser, parser=arg_parser), + help="The path to the everest configuration file", + ) + arg_parser.add_argument( + "-s", + "--silent", + action="store_true", + help="Backup/overwrite current internal storage without asking", + ) + arg_parser.add_argument( + "--overwrite", + action="store_true", + help="Overwrite the internal storage instead of backing it up", + ) + arg_parser.add_argument( + "-b", + "--batches", + nargs="+", + type=batch, + help="List of batches to be internalized", + ) + arg_parser.add_argument( + "--debug", + action="store_true", + help="Display debug information in the terminal", + ) + + return arg_parser + + +def user_confirms(simulation_path, storage_path=None, backup_path=None): + print("\n*************************************************************") + print("*** This operation can take several minutes or even hours ***") + print("*************************************************************\n") + print("The Everest internal storage will be populated using data from") + print(" {}".format(simulation_path)) + if storage_path is not None: + if backup_path is None: + print("WARNING: the current internal storage will be deleted") + else: + print("The current internal storage will be backed up in") + print(" {}".format(backup_path)) + while True: + text = input("Are you sure you want to proceed? (y/n) ") + if not text: + continue + if text[0] in ("n", "N"): + return False + if text[0] in ("y", "Y"): + return True + + +def reload_data(ever_config: EverestConfig, backup_path=None): + """Load data from a completed optimization into ert storage + + If @batch_ids are given, only the specified batches are internalized + If a @backup_path is specified, the current internal storage will be copied + to the given path instead of being deleted. + """ + # The ErtConfig constructor is picky, these sections can produce errors, but + # we don't need them for re-internalizing the data + + ever_config.forward_model = None + ever_config.install_jobs = None + ever_config.install_workflow_jobs = None + ever_config.install_data = None + ever_config.install_templates = None + + # prepare the ErtConfig object + ert_config_dict = everest_to_ert_config( + ever_config, site_config=ErtConfig.read_site_config() + ) + ert_config = ErtConfig.with_plugins().from_dict(config_dict=ert_config_dict) + + # load information about batches from previous run + df = export(ever_config, export_ecl=False) + groups = df.groupby(by=MDCN.BATCH) + + # backup or delete the previous internal storage + if backup_path: + shutil.move(ever_config.storage_dir, backup_path) + else: + shutil.rmtree(ever_config.storage_dir) + + # internalize one batch at a time + for batch_id, group in groups: + _internalize_batch(ert_config, batch_id, group) + + +def _internalize_batch(ert_config, batch_id, batch_data): + facade = LibresFacade(ert_config) + case_name = "batch_{}".format(batch_id) + batch_size = batch_data.shape[0] + with open_storage(facade.enspath, "w") as storage: + experiment = storage.get_experiment_by_name(f"experiment_{case_name}") + ensemble = experiment.get_ensemble_by_name(case_name) + # Everest artificially inflates the ensemble size as it is not possible to + # add after the fact, therefore a batch is much smaller than the overall + # ensemble size + realizations = [True] * batch_size + [False] * ( + facade.get_ensemble_size() - batch_size + ) + facade.load_from_forward_model(ensemble, realizations, 0) + + +if __name__ == "__main__": + everload_entry() diff --git a/src/everest/bin/kill_script.py b/src/everest/bin/kill_script.py new file mode 100755 index 00000000000..42fdbe82ac6 --- /dev/null +++ b/src/everest/bin/kill_script.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python + +import argparse +import json +import logging +import os +import signal +import sys +import threading +import traceback +from functools import partial + +from everest.config import EverestConfig +from everest.detached import server_is_running, stop_server, wait_for_server_to_stop +from everest.util import version_info + + +def kill_entry(args=None): + """Entry point for running an optimization.""" + parser = _build_args_parser() + options = parser.parse_args(args) + + if options.debug: + logging.getLogger().setLevel(logging.DEBUG) + # Remove the null handler if set: + logging.getLogger().removeHandler(logging.NullHandler()) + + logging.info(version_info()) + logging.debug(json.dumps(options.config.to_dict(), sort_keys=True, indent=2)) + + if threading.current_thread() is threading.main_thread(): + signal.signal(signal.SIGINT, partial(_handle_keyboard_interrupt)) + + kill_everest(options) + + +def _build_args_parser(): + """Build arg parser""" + + arg_parser = argparse.ArgumentParser( + description="Kill a running optimization case based on a given config file", + usage="everest kill ", + ) + arg_parser.add_argument( + "config", + type=partial(EverestConfig.load_file_with_argparser, parser=arg_parser), + help="The path to the everest configuration file", + ) + arg_parser.add_argument( + "--debug", action="store_true", help="Display debug information in the terminal" + ) + + return arg_parser + + +def _handle_keyboard_interrupt(signal, frame, after=False): + if after: + print( + f"KeyboardInterrupt (ID: {signal}) has been caught, " + "but kill request will proceed..." + ) + else: + print( + f"KeyboardInterrupt (ID: {signal}) has been caught, " + "kill request will be cancelled..." + ) + sys.tracebacklimit = 0 + sys.stdout = open(os.devnull, "w", encoding="utf-8") # noqa SIM115 + sys.exit() + + +def kill_everest(options): + if not server_is_running(options.config): + print("Server is not running.") + return + + stopping = stop_server(options.config) + if threading.current_thread() is threading.main_thread(): + signal.signal(signal.SIGINT, partial(_handle_keyboard_interrupt, after=True)) + + if not stopping: + print("Stop request failed, you may have to kill the server manually") + return + try: + print("Waiting for server to stop ...") + wait_for_server_to_stop(options.config, timeout=60) + print("Server stopped.") + except: + logging.debug(traceback.format_exc()) + print( + "Server is still running after 60 seconds, " + "you may have to kill the server manually" + ) + + +if __name__ == "__main__": + kill_entry() diff --git a/src/everest/bin/main.py b/src/everest/bin/main.py new file mode 100644 index 00000000000..1fa186b3d15 --- /dev/null +++ b/src/everest/bin/main.py @@ -0,0 +1,154 @@ +# pylint: disable=logging-fstring-interpolation +import argparse +import logging +import sys + +from ert.shared.version import __version__ as everest_version +from everest import docs +from everest.bin.config_branch_script import config_branch_entry +from everest.bin.everconfigdump_script import config_dump_entry +from everest.bin.everest_script import everest_entry +from everest.bin.everexport_script import everexport_entry +from everest.bin.everlint_script import lint_entry +from everest.bin.everload_script import everload_entry +from everest.bin.kill_script import kill_entry +from everest.bin.monitor_script import monitor_entry +from everest.bin.visualization_script import visualization_entry +from everest.util import configure_logger +from ieverest.bin.ieverest_script import ieverest_entry + + +def _create_dump_action(dumps, extended=False): + # Action for aiding user, --help stype + class _DumpAction(argparse.Action): + def __init__( + self, + option_strings, + dest=argparse.SUPPRESS, + default=argparse.SUPPRESS, + help=None, + ): + super(_DumpAction, self).__init__( + option_strings=option_strings, + dest=dest, + default=default, + nargs=0, + help=help, + ) + + def __call__( + self, + parser, + namespace, + values, + option_string=None, + ): + print(dumps(extended=extended)) + parser.exit() + + return _DumpAction + + +def _build_args_parser(): + """Build arg parser""" + arg_parser = argparse.ArgumentParser( + description="Tool for performing reservoir management optimization", + usage=( + "everest []\n\n" + "The most commonly used everest commands are:\n" + "{commands}\n\n" + "Run everest --help for more information on a command" + ).format(commands=EverestMain.methods_help()), + ) + arg_parser.add_argument("command", help="Subcommand to run") + arg_parser.add_argument( + "--docs", + action=_create_dump_action(docs.generate_docs_pydantic_to_rst, extended=False), + help="dump everest config documentation and exit", + ) + arg_parser.add_argument( + "--manual", + action=_create_dump_action(docs.generate_docs_pydantic_to_rst, extended=True), + help="dump extended everest config documentation and exit", + ) + arg_parser.add_argument( + "--version", + action="version", + version="%(prog)s {version}".format(version=everest_version), + ) + return arg_parser + + +class EverestMain(object): + def __init__(self, args): + parser = _build_args_parser() + # Parse_args defaults to [1:] for args, but you need to + # exclude the rest of the args too, or validation will fail + parsed_args = parser.parse_args(args[1:2]) + if not hasattr(self, parsed_args.command): + parser.error("Unrecognized command") + + # Somewhere some logging to the root is done, this leads to logging going to + # the console. Install a null handler to prevent this: + null_handler = logging.NullHandler() + logging.getLogger().addHandler(null_handler) + logger = configure_logger("everest_main", log_to_azure=True) + logger.info(f"Started everest with {parsed_args}") + # Use dispatch pattern to invoke method with same name + getattr(self, parsed_args.command)(args[2:]) + + @classmethod + def methods_help(cls): + """Return documentation of the public methods in this class""" + pubmets = [m for m in dir(cls) if not m.startswith("_")] + pubmets.remove("methods_help") # Current method should not show up in desc + maxlen = max(len(m) for m in pubmets) + docstrs = [getattr(cls, m).__doc__ for m in pubmets] + doclist = [m.ljust(maxlen + 1) + d for m, d in zip(pubmets, docstrs)] + return "\n".join(doclist) + + def run(self, args): + """Start an optimization case base on given config file""" + everest_entry(args) + + def monitor(self, args): + """Monitor a running optimization case base on given config file""" + monitor_entry(args) + + def kill(self, args): + """Kill a running optimization case base on given config file""" + kill_entry(args) + + def gui(self, args): + """Start the graphical user interface""" + ieverest_entry(args) + + def export(self, args): + """Export data from a completed optimization case""" + everexport_entry(args) + + def lint(self, args): + """Validate a config file""" + lint_entry(args) + + def load(self, args): + """Load Eclipse data from an existing simulation folder""" + everload_entry(args) + + def render(self, args): + """Display the configuration data loaded from a config file""" + config_dump_entry(args) + + def branch(self, args): + """Construct possible restart config file""" + config_branch_entry(args) + + def results(self, args): + """Start everest visualization plugin""" + visualization_entry(args) + + +def start_everest(args=None): + """Main entry point for the everest application""" + args = args or sys.argv + EverestMain(args) diff --git a/src/everest/bin/monitor_script.py b/src/everest/bin/monitor_script.py new file mode 100755 index 00000000000..672968b9dc0 --- /dev/null +++ b/src/everest/bin/monitor_script.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python + +import argparse +import logging +import signal +import threading +from functools import partial + +from everest.config import EverestConfig +from everest.detached import ServerStatus, everserver_status, server_is_running + +from .utils import ( + handle_keyboard_interrupt, + report_on_previous_run, + run_detached_monitor, +) + + +def monitor_entry(args=None): + """Entry point for monitoring an optimization.""" + parser = _build_args_parser() + options = parser.parse_args(args) + + if options.debug: + logging.getLogger().setLevel(logging.DEBUG) + # Remove the null handler if set: + logging.getLogger().removeHandler(logging.NullHandler()) + + if threading.current_thread() is threading.main_thread(): + signal.signal( + signal.SIGINT, + partial(handle_keyboard_interrupt, options=options), + ) + + monitor_everest(options) + + +def _build_args_parser(): + """Build arg parser""" + + arg_parser = argparse.ArgumentParser( + description="Everest console monitor a running optimization case based on a config file", + usage="everest monitor ", + ) + arg_parser.add_argument( + "config", + type=partial(EverestConfig.load_file_with_argparser, parser=arg_parser), + help="The path to the everest configuration file", + ) + arg_parser.add_argument( + "--debug", action="store_true", help="Display debug information in the terminal" + ) + arg_parser.add_argument( + "--show-all-jobs", + action="store_true", + help="Display all jobs executed from the forward model", + ) + + return arg_parser + + +def monitor_everest(options): + config: EverestConfig = options.config + server_state = everserver_status(options.config) + + if server_is_running(config): + run_detached_monitor(config, show_all_jobs=options.show_all_jobs) + server_state = everserver_status(config) + if server_state["status"] == ServerStatus.failed: + raise SystemExit(server_state["message"]) + if server_state["message"] is not None: + print(server_state["message"]) + elif server_state["status"] == ServerStatus.never_run: + config_file = config.config_file + print( + "The optimization has not run yet.\n" + "To run the optimization use command:\n" + f" `everest run {config_file}`" + ) + else: + report_on_previous_run(config) + + +if __name__ == "__main__": + monitor_entry() diff --git a/src/everest/bin/utils.py b/src/everest/bin/utils.py new file mode 100644 index 00000000000..bdce715a78e --- /dev/null +++ b/src/everest/bin/utils.py @@ -0,0 +1,332 @@ +import logging +import os +import sys +import traceback +from dataclasses import dataclass, field +from itertools import groupby +from typing import ClassVar, Dict, List + +import colorama +from colorama import Fore + +from ert.simulator.batch_simulator_context import Status +from everest.config import EverestConfig +from everest.detached import ( + OPT_PROGRESS_ID, + SIM_PROGRESS_ID, + ServerStatus, + everserver_status, + get_opt_status, + start_monitor, +) +from everest.export import export +from everest.jobs import shell_commands +from everest.simulator import JOB_FAILURE, JOB_RUNNING, JOB_SUCCESS +from everest.strings import EVEREST + +try: + from progressbar import AdaptiveETA, Bar, Percentage, ProgressBar, Timer +except ImportError: + ProgressBar = None # type: ignore + + +def export_with_progress(config, export_ecl=True): + logging.getLogger(EVEREST).info("Exporting results to csv ...") + if ProgressBar is not None: + widgets = [Percentage(), " ", Bar(), " ", Timer(), " ", AdaptiveETA()] + with ProgressBar(max_value=1, widgets=widgets) as bar: + export_data = export( + config=config, export_ecl=export_ecl, progress_callback=bar.update + ) + else: + export_data = export(config=config, export_ecl=export_ecl) + + return export_data + + +def export_to_csv(config: EverestConfig, data_frame=None, export_ecl=True): + if data_frame is None: + data_frame = export_with_progress(config, export_ecl) + + export_path = config.export_path + output_folder = os.path.dirname(export_path) + if not os.path.exists(output_folder): + os.makedirs(output_folder) + + data_frame.to_csv(export_path, sep=";", index=False) + logging.getLogger(EVEREST).info("Data exported to {}".format(export_path)) + + +def handle_keyboard_interrupt(signal, frame, options): + print("\n" + "=" * 80) + print(f"KeyboardInterrupt (ID: {signal}) has been caught. Program will exit...") + config_file = options.config.config_file + print( + "You are running in detached mode.\n" + "To monitor the running optimization use command:\n" + f" `everest monitor {config_file}`\n" + "To kill the running optimization use command:\n" + f" `everest kill {config_file}`" + ) + print("=" * 80) + sys.tracebacklimit = 0 + sys.stdout = open(os.devnull, "w", encoding="utf-8") # noqa SIM115 + sys.stderr = open(os.devnull, "w", encoding="utf-8") # noqa SIM115 + sys.exit() + + +def _get_max_width(sequence): + return max(len(item) for item in sequence) + + +def _format_list(values): + """Formats a sequence of integers into a comma separated string of ranges. + + For instance: {1, 3, 4, 5, 7, 8, 10} -> "1, 3-5, 7-8, 10" + """ + grouped = ( + tuple(y for _, y in x) + for _, x in groupby(enumerate(sorted(values)), lambda x: x[0] - x[1]) + ) + return ", ".join( + ( + "-".join([str(sub_group[0]), str(sub_group[-1])]) + if len(sub_group) > 1 + else str(sub_group[0]) + ) + for sub_group in grouped + ) + + +@dataclass +class JobProgress: + name: str + status: Dict[str, List[int]] = field( + default_factory=lambda: { + JOB_RUNNING: [], # contains running simulation numbers i.e [7,8,9] + JOB_SUCCESS: [], # contains successful simulation numbers i.e [0,1,3,4] + JOB_FAILURE: [], # contains failed simulation numbers i.e [5,6] + } + ) + STATUS_COLOR: ClassVar = { + JOB_RUNNING: Fore.BLUE, + JOB_SUCCESS: Fore.GREEN, + JOB_FAILURE: Fore.RED, + } + + def _status_string(self, max_widths: Dict[str, int]) -> str: + string = [] + for state in [JOB_RUNNING, JOB_SUCCESS, JOB_FAILURE]: + number_of_simulations = len(self.status[state]) + width = max_widths[state] + color = self.STATUS_COLOR[state] if number_of_simulations else Fore.BLACK + string.append(f"{color}{number_of_simulations:>{width}}{Fore.RESET}") + return "/".join(string) + + def progress_str(self, max_widths: Dict[str, int]) -> str: + msg = "" + for state in [JOB_SUCCESS, JOB_FAILURE]: + simulations_list = _format_list(self.status[state]) + width = _get_max_width([simulations_list]) + if width > 0: + color = self.STATUS_COLOR[state] + msg += f" | {color}{state}: {simulations_list:<{width}}{Fore.RESET}" + + return self._status_string(max_widths) + msg + + +class _DetachedMonitor: + WIDTH = 78 + INDENT = 2 + FLOAT_FMT = ".5g" + + def __init__(self, config, show_all_jobs): + self._config = config + self._show_all_jobs: bool = show_all_jobs + self._clear_lines = 0 + self._batches_done = set() + self._last_reported_batch = -1 + colorama.init(autoreset=True) + + def update(self, status): + try: + if OPT_PROGRESS_ID in status: + opt_status = status[OPT_PROGRESS_ID] + if opt_status and opt_status["cli_monitor_data"]: + msg, batch = self.get_opt_progress(opt_status) + if msg.strip(): + # Clear the last reported batch of simulations if it + # should be after this optimization report: + if self._last_reported_batch > batch: + self._clear() + print(msg + "\n") + self._clear_lines = 0 + if SIM_PROGRESS_ID in status: + sim_progress = status[SIM_PROGRESS_ID] + sim_progress["status"] = Status(**sim_progress["status"]) + sim_progress["progress"] = self._filter_jobs(sim_progress["progress"]) + msg, batch = self.get_fm_progress(sim_progress) + if msg.strip(): + # Clear the previous report if it is still the same batch: + if batch == self._last_reported_batch: + self._clear() + print(msg) + self._clear_lines = len(msg.split("\n")) + self._last_reported_batch = batch + except: + logging.getLogger(EVEREST).debug(traceback.format_exc()) + + def get_opt_progress(self, context_status): + cli_monitor_data = context_status["cli_monitor_data"] + messages = [] + first_batch = -1 + for idx, batch in enumerate(cli_monitor_data["batches"]): + if batch not in self._batches_done: + if first_batch < 0: + first_batch = batch + self._batches_done.add(batch) + msg = self._get_opt_progress_batch(cli_monitor_data, batch, idx) + messages.append(msg) + return self._join_two_newlines(messages), first_batch + + def _get_opt_progress_batch(self, cli_monitor_data, batch, idx): + header = self._make_header(f"Optimization progress (Batch #{batch})") + width = _get_max_width(cli_monitor_data["controls"][idx].keys()) + controls = self._join_one_newline_indent( + f"{name:>{width}}: {value:{self.FLOAT_FMT}}" + for name, value in cli_monitor_data["controls"][idx].items() + ) + expected_objectives = cli_monitor_data["expected_objectives"] + width = _get_max_width(expected_objectives.keys()) + objectives = self._join_one_newline_indent( + f"{name:>{width}}: {value[idx]:{self.FLOAT_FMT}}" + for name, value in expected_objectives.items() + ) + objective_value = cli_monitor_data["objective_value"][idx] + total_objective = ( + f"Total normalized objective: {objective_value:{self.FLOAT_FMT}}" + ) + return self._join_two_newlines_indent( + (header, controls, objectives, total_objective) + ) + + def get_fm_progress(self, context_status): + batch_number = int(context_status["batch_number"]) + header = self._make_header( + f"Running forward models (Batch #{batch_number})", Fore.BLUE + ) + summary = self._get_progress_summary(context_status["status"]) + job_states = self._get_job_states(context_status["progress"]) + msg = self._join_two_newlines_indent((header, summary, job_states)) + "\n" + return msg, batch_number + + @staticmethod + def _get_progress_summary(status): + colors = [ + Fore.BLACK, + Fore.BLACK, + Fore.BLUE if status[2] > 0 else Fore.BLACK, + Fore.GREEN if status[3] > 0 else Fore.BLACK, + Fore.RED if status[4] > 0 else Fore.BLACK, + ] + labels = ("Waiting", "Pending", "Running", "Complete", "FAILED") + return " | ".join( + f"{color}{key}: {value}{Fore.RESET}" + for color, key, value in zip(colors, labels, status) + ) + + @classmethod + def _get_job_states(cls, progress): + print_lines = "" + jobs_status = cls._get_jobs_status(progress) + if jobs_status: + max_widths = { + state: _get_max_width( + str(len(item.status[state])) for item in jobs_status + ) + for state in [JOB_RUNNING, JOB_SUCCESS, JOB_FAILURE] + } + width = _get_max_width([item.name for item in jobs_status]) + print_lines = cls._join_one_newline_indent( + f"{item.name:>{width}}: {item.progress_str(max_widths)}{Fore.RESET}" + for item in jobs_status + ) + return print_lines + + @staticmethod + def _get_jobs_status(progress): + job_progress = {} + for queue in progress: + for job_idx, job in enumerate(queue): + if job_idx not in job_progress: + job_progress[job_idx] = JobProgress(name=job["name"]) + simulation = int(job["simulation"]) + status = job["status"] + if status in [JOB_RUNNING, JOB_SUCCESS, JOB_FAILURE]: + job_progress[job_idx].status[status].append(simulation) + return job_progress.values() + + def _filter_jobs(self, progress): + if not self._show_all_jobs: + progress = [ + [job for job in progress_list if job["name"] not in shell_commands] + for progress_list in progress + ] + return progress + + @classmethod + def _join_one_newline_indent(cls, sequence): + return ("\n" + " " * cls.INDENT).join(sequence) + + @classmethod + def _join_two_newlines_indent(cls, sequence): + return ("\n\n" + " " * cls.INDENT).join(sequence) + + @classmethod + def _join_two_newlines(cls, sequence): + return "\n\n".join(sequence) + + @classmethod + def _make_header(cls, msg, color=Fore.BLACK): + header = msg.center(len(msg) + 2).center(cls.WIDTH, "=") + return f"{color}{header}{Fore.RESET}" + + def _clear(self): + for _ in range(self._clear_lines): + print(colorama.Cursor.UP(), end=colorama.ansi.clear_line()) + + +def run_detached_monitor(config: EverestConfig, show_all_jobs: bool = False): + monitor = _DetachedMonitor(config, show_all_jobs) + start_monitor(config, callback=monitor.update) + opt_status = get_opt_status(config.optimization_output_dir) + if opt_status.get("cli_monitor_data"): + msg, _ = monitor.get_opt_progress(opt_status) + if msg.strip(): + print(f"{msg}\n") + + +def report_on_previous_run(config: EverestConfig): + server_state = everserver_status(config) + config_file = config.config_file + if server_state["status"] == ServerStatus.failed: + error_msg = server_state["message"] + print( + f"Optimization run failed, with error: {error_msg}\n" + "To re-run optimization case use command:\n" + f"` everest run --new-run {config_file}`\n" + ) + else: + output_dir = config.output_dir + opt_status = get_opt_status(config.optimization_output_dir) + if opt_status.get("cli_monitor_data"): + monitor = _DetachedMonitor(config, show_all_jobs=False) + msg, _ = monitor.get_opt_progress(opt_status) + print(msg + "\n") + print( + f"Optimization completed, results in {output_dir}\n" + "\nTo re-run the optimization use command:\n" + f" `everest run --new-run {config_file}`\n" + "To export the results use command:\n" + f" `everest export {config_file}`" + ) diff --git a/src/everest/bin/visualization_script.py b/src/everest/bin/visualization_script.py new file mode 100644 index 00000000000..129abdda6d4 --- /dev/null +++ b/src/everest/bin/visualization_script.py @@ -0,0 +1,37 @@ +#!/usr/bin/env python + +import argparse +from functools import partial + +from everest.api import EverestDataAPI +from everest.config import EverestConfig +from everest.detached import ServerStatus, everserver_status +from everest.plugins.hook_manager import EverestPluginManager + + +def _build_args_parser(): + arg_parser = argparse.ArgumentParser( + description="Start possible plugin containing everest visualization", + usage="""everest results """, + ) + arg_parser.add_argument( + "config_file", + type=partial(EverestConfig.load_file_with_argparser, parser=arg_parser), + help="The path to the everest configuration file", + ) + return arg_parser + + +def visualization_entry(args=None): + parser = _build_args_parser() + options = parser.parse_args(args) + config = options.config_file + + server_state = everserver_status(config) + if server_state["status"] != ServerStatus.never_run: + pm = EverestPluginManager() + pm.hook.visualize_data(api=EverestDataAPI(config)) + + +if __name__ == "__main__": + visualization_entry() diff --git a/src/everest/config/__init__.py b/src/everest/config/__init__.py new file mode 100644 index 00000000000..51db0b74a5d --- /dev/null +++ b/src/everest/config/__init__.py @@ -0,0 +1,47 @@ +from .control_config import ControlConfig +from .control_variable_config import ( + ControlVariableConfig, + ControlVariableGuessListConfig, +) +from .cvar_config import CVaRConfig +from .environment_config import EnvironmentConfig +from .everest_config import EverestConfig +from .export_config import ExportConfig +from .input_constraint_config import InputConstraintConfig +from .install_data_config import InstallDataConfig +from .install_job_config import InstallJobConfig +from .install_template_config import InstallTemplateConfig +from .model_config import ModelConfig +from .objective_function_config import ObjectiveFunctionConfig +from .optimization_config import OptimizationConfig +from .output_constraint_config import OutputConstraintConfig +from .restart_config import RestartConfig +from .sampler_config import SamplerConfig +from .server_config import ServerConfig +from .simulator_config import SimulatorConfig +from .well_config import WellConfig +from .workflow_config import WorkflowConfig + +__all__ = [ + "CVaRConfig", + "ControlConfig", + "ControlVariableConfig", + "ControlVariableGuessListConfig", + "EnvironmentConfig", + "EverestConfig", + "ExportConfig", + "InputConstraintConfig", + "InstallDataConfig", + "InstallJobConfig", + "InstallTemplateConfig", + "ModelConfig", + "ObjectiveFunctionConfig", + "OptimizationConfig", + "OutputConstraintConfig", + "RestartConfig", + "SamplerConfig", + "ServerConfig", + "SimulatorConfig", + "WellConfig", + "WorkflowConfig", +] diff --git a/src/everest/config/control_config.py b/src/everest/config/control_config.py new file mode 100644 index 00000000000..cb6783717c2 --- /dev/null +++ b/src/everest/config/control_config.py @@ -0,0 +1,219 @@ +from itertools import chain +from typing import Any, List, Literal, Optional, Tuple, Union + +from pydantic import AfterValidator, BaseModel, ConfigDict, Field, model_validator +from ropt.enums import PerturbationType, VariableType +from typing_extensions import Annotated, Self, TypeAlias + +from .control_variable_config import ( + ControlVariableConfig, + ControlVariableGuessListConfig, +) +from .sampler_config import SamplerConfig +from .validation_utils import ( + control_variables_validation, + no_dots_in_string, + unique_items, + valid_range, +) + +ControlVariable: TypeAlias = Union[ + List[ControlVariableConfig], List[ControlVariableGuessListConfig] +] + + +def _all_or_no_index(variables: ControlVariable) -> ControlVariable: + if isinstance(variables[-1], ControlVariableGuessListConfig): + return variables + + if len({getattr(variable, "index", None) is None for variable in variables}) != 1: + raise ValueError( + "Index should be given either for all of the variables or for none" + " of them" + ) + return variables + + +class ControlConfig(BaseModel): + name: Annotated[str, AfterValidator(no_dots_in_string)] = Field( + description="Control name" + ) + type: Literal["well_control", "generic_control"] = Field( + description=""" +Only two allowed control types are accepted + +* **well_control**: Standard built-in Everest control type designed for field\ + optimization + +* **generic_control**: Enables the user to define controls types to be employed for\ + customized optimization jobs. +""" + ) + variables: Annotated[ + ControlVariable, + AfterValidator(_all_or_no_index), + AfterValidator(unique_items), + ] = Field(description="List of control variables", min_length=1) + initial_guess: Optional[float] = Field( + default=None, + description=""" +Initial guess for the control group all control variables with initial_guess not +defined will be assigned this value. Individual initial_guess values in the control +variables will overwrite this value. +""", + ) + control_type: Literal["real", "integer"] = Field( + default="real", + description=""" +The type of the controls for the control group. Individual control types in the +control variables will override this value. Set to "integer" for discrete +optimization. This may be ignored if the algorithm that is used does not support +different control types. +""", + ) + enabled: Optional[bool] = Field( + default=True, + description=""" +If `True`, all variables in this control group will be optimized. If set to `False` +the value of the variables will remain fixed. +""", + ) + auto_scale: bool = Field( + default=False, + description=""" +Can be set to true to re-scale controls from the range +defined by [min, max] to the range defined by +scaled_range (default [0, 1]). + """, + ) + min: Optional[float] = Field( + default=None, + description=""" +Defines left-side value in the control group range [min, max]. +This value will be overwritten by the control variable min value if given. + +The initial guess for both the group and the individual variables needs to be contained +in the resulting [min, max] range +""", + ) + max: Optional[float] = Field( + default=None, + description=""" +Defines right-side value in the control group range [min, max]. +This value will be overwritten by the control variable max value if given. + +The initial guess for both the group and the individual variables needs to be contained +in the resulting [min, max] range +""", + ) + perturbation_type: Literal["absolute", "relative"] = Field( + default="absolute", + description=""" +Example: absolute or relative +Specifies the perturbation type for a set of controls of a certain type. The + perturbation type keyword defines whether the perturbation magnitude + (perturbation_magnitude) should be considered as an absolute value or relative + to the dynamic range of the controls. + +NOTE: currently the dynamic range is computed with respect to all controls, so + defining relative perturbation type for control types with different dynamic + ranges might have unintended effects. + """, + ) + perturbation_magnitude: Optional[float] = Field( + default=None, + description=""" +Specifies the perturbation magnitude for a set of controls of a certain type. + +This controls the size of perturbations (standard deviation of a +normal distribution) of controls used to approximate the gradient. +The value depends on the type of control and magnitude of the variables. +For continuous controls smaller values should give a better gradient, +whilst for more discrete controls larger values should give a better +result. However, this is a balance as too large or too small +of values also cause issues. + +NOTE: In most cases this should not be configured, and the default value should be used. + """, + ) + scaled_range: Annotated[ + Optional[Tuple[float, float]], AfterValidator(valid_range) + ] = Field( + default=None, + description=""" +Can be used to set the range of the control values +after scaling (default = [0, 1]). + +This option has no effect if auto_scale is not set. + """, + ) + sampler: Optional[SamplerConfig] = Field( + default=None, + description=""" +A sampler specification section applies to a group of controls, or to an +individual control. Sampler specifications are not required, with the +following behavior, if no sampler sections are provided, a normal +distribution is used. + +If at least one control group or variable has a sampler specification, only +the groups or variables with a sampler specification are perturbed. +Controls/variables that do not have a sampler section will not be perturbed +at all. If that is not desired, make sure to specify a sampler for each +control group and/or variable (or none at all to use a normal distribution +for each control). + +Within the sampler section, the *shared* keyword can be used to direct the +sampler to use the same perturbations for each realization. + """, + ) + + @property + def ropt_perturbation_type(self) -> PerturbationType: + return PerturbationType[self.perturbation_type.upper()] + + @property + def ropt_control_type(self) -> VariableType: + return VariableType[self.control_type.upper()] + + @property + def has_auto_scale(self) -> bool: + return self.auto_scale or any( + variable.auto_scale for variable in self.variables + ) + + @model_validator(mode="after") + def validate_variables(self) -> Self: + if self.variables is None: + return self + + if error := list( + chain.from_iterable( + control_variables_validation( + variable.name, + self.min if variable.min is None else variable.min, + self.max if variable.max is None else variable.max, + ( + self.initial_guess + if variable.initial_guess is None + else variable.initial_guess + ), + ) + for variable in self.variables + ) + ): + raise ValueError(error) + return self + + def __hash__(self) -> int: + return hash(self.name) + + def __eq__(self, other: Any) -> bool: + return isinstance(other, self.__class__) and other.name == self.name + + @property + def uniqueness(self) -> str: + return "name" + + model_config = ConfigDict( # type: ignore + extra="forbid", + ) diff --git a/src/everest/config/control_variable_config.py b/src/everest/config/control_variable_config.py new file mode 100644 index 00000000000..8236de12d7c --- /dev/null +++ b/src/everest/config/control_variable_config.py @@ -0,0 +1,140 @@ +from typing import Any, List, Literal, Optional, Tuple + +from pydantic import ( + AfterValidator, + BaseModel, + ConfigDict, + Field, + NonNegativeInt, + PositiveFloat, +) +from ropt.enums import VariableType +from typing_extensions import Annotated + +from everest.config.validation_utils import no_dots_in_string, valid_range + +from .sampler_config import SamplerConfig + + +class _ControlVariable(BaseModel): + model_config = ConfigDict(extra="forbid") + + name: Annotated[str, AfterValidator(no_dots_in_string)] = Field( + description="Control variable name" + ) + control_type: Optional[Literal["real", "integer"]] = Field( + default=None, + description=""" +The type of control. Set to "integer" for discrete optimization. This may be +ignored if the algorithm that is used does not support different control types. +""", + ) + enabled: Optional[bool] = Field( + default=None, + description=""" +If `True`, the variable will be optimized, otherwise it will be fixed to the +initial value. +""", + ) + auto_scale: Optional[bool] = Field( + default=None, + description=""" +Can be set to true to re-scale variable from the range +defined by [min, max] to the range defined by scaled_range (default [0, 1]) +""", + ) + scaled_range: Annotated[ + Optional[Tuple[float, float]], AfterValidator(valid_range) + ] = Field( + default=None, + description=""" +Can be used to set the range of the variable values +after scaling (default = [0, 1]). + +This option has no effect if auto_scale is not set. +""", + ) + min: Optional[float] = Field( + default=None, + description=""" +Minimal value allowed for the variable + +initial_guess is required to be greater than this value. +""", + ) + max: Optional[float] = Field( + default=None, + description=""" + Max value allowed for the variable + + initial_guess is required to be less than this value. + """, + ) + perturbation_magnitude: Optional[PositiveFloat] = Field( + default=None, + description=""" +Specifies the perturbation magnitude for this particular variable. +This feature adds flexibility to combine controls into more logical +of structures at the same time allowing the variable to contain time ( +how long rate applies for) & value (the actual rate). + +NOTE: In most cases this should not be configured, and the default value should be used. +""", + ) + sampler: Optional[SamplerConfig] = Field( + default=None, description="The backend used by Everest for sampling points" + ) + + @property + def ropt_control_type(self) -> Optional[VariableType]: + return VariableType[self.control_type.upper()] if self.control_type else None + + +class ControlVariableConfig(_ControlVariable): + model_config = ConfigDict(title="variable control") + initial_guess: Optional[float] = Field( + default=None, + description=""" +Starting value for the control variable, if given needs to be in the interval [min, max] +""", + ) + index: Optional[NonNegativeInt] = Field( + default=None, + description=""" +Index should be given either for all of the variables or for none of them +""", + ) + + def __hash__(self) -> int: + return hash(self.name) + hash(self.index) + + def __eq__(self, other: Any) -> bool: + return ( + isinstance(other, self.__class__) + and other.name == self.name + and other.index == self.index + ) + + @property + def uniqueness(self) -> str: + return "name-index" + + +class ControlVariableGuessListConfig(_ControlVariable): + initial_guess: Annotated[ + List[float], + Field( + default=None, + description="List of Starting values for the control variable", + ), + ] + + def __hash__(self) -> int: + return hash(self.name) + + def __eq__(self, other: Any) -> bool: + return isinstance(other, self.__class__) and other.name == self.name + + @property + def uniqueness(self) -> str: + return "name" diff --git a/src/everest/config/cvar_config.py b/src/everest/config/cvar_config.py new file mode 100644 index 00000000000..98400473cd2 --- /dev/null +++ b/src/everest/config/cvar_config.py @@ -0,0 +1,46 @@ +from typing import Optional + +from pydantic import BaseModel, ConfigDict, Field, model_validator + + +class CVaRConfig(BaseModel): # type: ignore + number_of_realizations: Optional[int] = Field( + default=None, + description="""The number of realizations used for CVaR estimation. + +Sets the number of realizations that is used to calculate the total objective. + +This option is exclusive with the **percentile** option. +""", + ) + percentile: Optional[float] = Field( + default=None, + ge=0.0, + le=1.0, + description="""The percentile used for CVaR estimation. + +Sets the percentile of distribution of the objective over the realizations that +is used to calculate the total objective. + +This option is exclusive with the **number_of_realizations** option. + + """, + ) + + @model_validator(mode="before") + @classmethod + def validate_mutex_nreals_percentile(cls, values): # pylint: disable=E0213 + has_nreals = values.get("number_of_realizations") is not None + has_percentile = values.get("percentile") is not None + + if not (has_nreals ^ has_percentile): + raise ValueError( + "Invalid CVaR section; Specify only one of the" + " following: number_of_realizations, percentile" + ) + + return values + + model_config = ConfigDict( + extra="forbid", + ) diff --git a/src/everest/config/environment_config.py b/src/everest/config/environment_config.py new file mode 100644 index 00000000000..7925ef178e1 --- /dev/null +++ b/src/everest/config/environment_config.py @@ -0,0 +1,47 @@ +from typing import Literal, Optional + +from pydantic import BaseModel, Field, field_validator + +from everest.config.validation_utils import check_path_valid + + +class EnvironmentConfig(BaseModel, extra="forbid"): # type: ignore + simulation_folder: str = Field( + default="simulation_folder", description="Folder used for simulation by Everest" + ) + output_folder: Optional[str] = Field( + default="everest_output", description="Folder for outputs of Everest" + ) + log_level: Optional[Literal["debug", "info", "warning", "error", "critical"]] = ( + Field( + default="info", + description="""Defines the verbosity of logs output by Everest. + +The default log level is `info`. All supported log levels are: + +debug: Detailed information, typically of interest only when diagnosing +problems. + +info: Confirmation that things are working as expected. + +warning: An indication that something unexpected happened, or indicative of some +problem in the near future (e.g. `disk space low`). The software is still +working as expected. + +error: Due to a more serious problem, the software has not been able to perform +some function. + +critical: A serious error, indicating that the program itself may be unable to +continue running. +""", + ) + ) + random_seed: Optional[int] = Field( + default=None, description="Random seed (must be positive)" + ) + + @field_validator("output_folder", mode="before") + @classmethod + def validate_output_folder(cls, output_folder): # pylint:disable=E0213 + check_path_valid(output_folder) + return output_folder diff --git a/src/everest/config/everest_config.py b/src/everest/config/everest_config.py new file mode 100644 index 00000000000..b9d4fd87df6 --- /dev/null +++ b/src/everest/config/everest_config.py @@ -0,0 +1,818 @@ +import json +import logging +import os +import shutil +from argparse import ArgumentParser +from io import StringIO +from pathlib import Path +from typing import TYPE_CHECKING, List, Literal, Optional, Protocol, no_type_check + +from pydantic import ( + AfterValidator, + BaseModel, + ConfigDict, + Field, + ValidationError, + field_validator, + model_validator, +) +from ruamel.yaml import YAML, YAMLError +from typing_extensions import Annotated + +from ert.config import ErtConfig +from everest.config.control_variable_config import ControlVariableGuessListConfig +from everest.config.install_template_config import InstallTemplateConfig +from everest.config.server_config import ServerConfig +from everest.config.validation_utils import ( + InstallDataContext, + as_abs_path, + check_for_duplicate_names, + check_path_exists, + check_writeable_path, + format_errors, + unique_items, + validate_forward_model_configs, +) +from everest.jobs import script_names +from everest.util.forward_models import collect_forward_models + +from ..config_file_loader import yaml_file_to_substituted_config_dict +from ..strings import ( + CERTIFICATE_DIR, + DEFAULT_OUTPUT_DIR, + DETACHED_NODE_DIR, + HOSTFILE_NAME, + OPTIMIZATION_LOG_DIR, + OPTIMIZATION_OUTPUT_DIR, + SERVER_STATUS, + SESSION_DIR, + STORAGE_DIR, +) +from .control_config import ControlConfig +from .environment_config import EnvironmentConfig +from .export_config import ExportConfig +from .input_constraint_config import InputConstraintConfig +from .install_data_config import InstallDataConfig +from .install_job_config import InstallJobConfig +from .model_config import ModelConfig +from .objective_function_config import ObjectiveFunctionConfig +from .optimization_config import OptimizationConfig +from .output_constraint_config import OutputConstraintConfig +from .simulator_config import SimulatorConfig +from .well_config import WellConfig +from .workflow_config import WorkflowConfig + +if TYPE_CHECKING: + from pydantic_core import ErrorDetails + + +def _dummy_ert_config(): + site_config = ErtConfig.read_site_config() + dummy_config = {"NUM_REALIZATIONS": 1, "ENSPATH": "."} + dummy_config.update(site_config) + return ErtConfig.with_plugins().from_dict(config_dict=dummy_config) + + +def get_system_installed_jobs(): + """Returns list of all system installed job names""" + return list(_dummy_ert_config().installed_forward_model_steps.keys()) + + +# Makes property.setter work +# Based on https://github.com/pydantic/pydantic/issues/1577#issuecomment-790506164 +# We should use computed_property instead of this, when upgrading to pydantic 2. +class BaseModelWithPropertySupport(BaseModel): + @no_type_check + def __setattr__(self, name, value): + """ + To be able to use properties with setters + """ + try: + getattr(self.__class__, name).fset(self, value) + except AttributeError: + super().__setattr__(name, value) + + +class HasName(Protocol): + name: str + + +class EverestConfig(BaseModelWithPropertySupport): # type: ignore + controls: Annotated[List[ControlConfig], AfterValidator(unique_items)] = Field( + description="""Defines a list of controls. + Controls should have unique names each control defines + a group of control variables + """, + ) + objective_functions: List[ObjectiveFunctionConfig] = Field( + description="List of objective function specifications", + ) + optimization: OptimizationConfig = Field(description="Optimizer options") + model: ModelConfig = Field( + description="Configuration of the Everest model", + ) + + # It IS required but is currently used in a non-required manner by tests + # Thus, it is to be made explicitly required as the other logic + # is being rewritten + environment: EnvironmentConfig = Field( + description="The environment of Everest, specifies which folders are used " + "for simulation and output, as well as the level of detail in Everest-logs", + ) + wells: List[WellConfig] = Field( + default_factory=lambda: [], + description="A list of well configurations, all with unique names.", + ) + definitions: Optional[dict] = Field( + default_factory=lambda: {}, + description="""Section for specifying variables. + +Used to specify variables that will be replaced in the file when encountered. + +| scratch: /scratch/ert/ +| num_reals: 10 +| min_success: 13 +| fixed_wells: [Prod1, Inj3] + +Some keywords are pre-defined by Everest, + +| realization: +| configpath: +| runpath_file: +| eclbase: + +and environment variables are exposed in the form 'os.NAME', for example: + +| os.USER: $USER +| os.HOSTNAME: $HOSTNAME +| ... + """, + ) + input_constraints: Optional[List[InputConstraintConfig]] = Field( + default=None, description="List of input constraints" + ) + output_constraints: Optional[List[OutputConstraintConfig]] = Field( + default=None, description="A list of output constraints with unique names." + ) + install_jobs: Optional[List[InstallJobConfig]] = Field( + default=None, description="A list of jobs to install" + ) + install_workflow_jobs: Optional[List[InstallJobConfig]] = Field( + default=None, description="A list of workflow jobs to install" + ) + install_data: Optional[List[InstallDataConfig]] = Field( + default=None, + description="""A list of install data elements from the install_data config + section. Each item marks what folders or paths need to be copied or linked + in order for the evaluation jobs to run.""", + ) + install_templates: Optional[List[InstallTemplateConfig]] = Field( + default=None, + description="""Allow the user to define the workflow establishing the model + chain for the purpose of sensitivity analysis, enabling the relationship + between sensitivity input variables and quantities of interests to be + evaluated. +""", + ) + server: Optional[ServerConfig] = Field( + default=None, + description="""Defines Everest server settings, i.e., which queue system, + queue name and queue options are used for the everest server. + The main reason for changing this section is situations where everest + times out because it can not add the server to the queue. + This makes it possible to reduce the resource requirements as they tend to + be low compared with the forward model. + + Queue system and queue name defaults to the same as simulator, and the + server should not need to be configured by most users. + This is also true for the --include-host and --exclude-host options + that are used by the SLURM driver. + + Note that changing values in this section has no impact on the resource + requirements of the forward models. +""", + ) + simulator: Optional[SimulatorConfig] = Field( + default=None, description="Simulation settings" + ) + forward_model: Optional[List[str]] = Field( + default=None, description="List of jobs to run" + ) + workflows: Optional[WorkflowConfig] = Field( + default=None, description="Workflows to run during optimization" + ) + export: Optional[ExportConfig] = Field( + default=None, + description="Settings to control the exports of a optimization run by everest.", + ) + config_path: Path = Field() + model_config = ConfigDict(extra="forbid") + + @model_validator(mode="after") + def validate_install_job_sources(self): # pylint: disable=E0213 + model = self.model + config_path = self.config_path + if not model or not config_path: + return self + + errors = [] + config_dir = Path(config_path).parent + realizations = model.realizations + + for install_jobs in (self.install_jobs, self.install_workflow_jobs): + if not install_jobs: + continue + + sources = [job.source for job in install_jobs] + for source in sources: + try: + check_path_exists( + path_source=source, + config_path=config_path, + realizations=realizations, + ) + except ValueError as e: + errors.append(str(e)) + abs_config_path = as_abs_path(source, str(config_dir)) + if not os.path.isfile(abs_config_path): + errors.append(f"Is not a file {abs_config_path}") + continue + exec_path = None + valid_jobfile = True + with open(abs_config_path, "r", encoding="utf-8") as jobfile: + for line in jobfile: + if not line.startswith("EXECUTABLE"): + continue + data = line.strip().split() + if len(data) != 2: + valid_jobfile = False + continue + exec_path = data[1] + break + + if not valid_jobfile: + errors.append(f"malformed EXECUTABLE in {source}") + continue + if exec_path is None: + errors.append(f"missing EXECUTABLE in {source}") + continue + + exec_relpath = os.path.join(os.path.dirname(abs_config_path), exec_path) + if os.path.isfile(exec_relpath): + if os.access(exec_relpath, os.X_OK): + continue + # exec_relpath is a file, but not executable; flag and return False + errors.append(f"{exec_relpath} is not executable") + continue + + if not shutil.which(exec_path): + errors.append(f"No such executable {exec_path}") + + if len(errors) > 0: + raise ValueError(errors) + + return self + + @model_validator(mode="after") + def validate_forward_model_job_name_installed(self): # pylint: disable=E0213 + install_jobs = self.install_jobs + forward_model_jobs = self.forward_model + if install_jobs is None: + install_jobs = [] + if not forward_model_jobs: + return self + installed_jobs_name = [job.name for job in install_jobs] + installed_jobs_name += list(script_names) # default jobs + installed_jobs_name += get_system_installed_jobs() # system jobs + installed_jobs_name += [job["name"] for job in collect_forward_models()] + + errors = [] + for fm_job in forward_model_jobs: + job_name = fm_job.split()[0] + if job_name not in installed_jobs_name: + errors.append(f"unknown job {job_name}") + + if len(errors) > 0: # Note: python3.11 ExceptionGroup will solve this nicely + raise ValueError(errors) + return self + + @model_validator(mode="after") + def validate_workflow_name_installed(self): # pylint: disable=E0213 + workflows = self.workflows + if workflows is None: + return self + + install_workflow_jobs = self.install_workflow_jobs + if install_workflow_jobs is None: + install_workflow_jobs = [] + installed_jobs_name = [job.name for job in install_workflow_jobs] + + errors = [] + workflows_dict = workflows.model_dump() + for trigger in ("pre_simulation", "post_simulation"): + trigger_jobs = workflows_dict.get(trigger) + if trigger_jobs is None: + continue + for workflow_job in trigger_jobs: + job_name = workflow_job.split()[0] + if job_name not in installed_jobs_name: + errors.append(f"unknown workflow job {job_name}") + + if len(errors) > 0: # Note: python3.11 ExceptionGroup will solve this nicely + raise ValueError(errors) + return self + + @field_validator("install_templates") + @classmethod + def validate_install_templates_unique_output_files(cls, install_templates): # pylint: disable=E0213 + check_for_duplicate_names( + [t.output_file for t in install_templates], + "install_templates", + "output_file", + ) + return install_templates + + @model_validator(mode="after") + def validate_install_templates_are_existing_files(self): + install_templates = self.install_templates + + if not install_templates: + return self + + config_path = self.config_path + model = self.model + + if not config_path or not model: + return self + + template_paths = [t.template for t in install_templates] + errors = [] + for template_path in template_paths: + try: + check_path_exists( + path_source=template_path, + config_path=config_path, + realizations=model.realizations, + ) + except ValueError as e: + errors.append(str(e)) + + if len(errors) > 0: + raise ValueError(errors) + + return self + + @model_validator(mode="after") + def validate_cvar_nreals_interval(self): # pylint: disable=E0213 + optimization = self.optimization + if not optimization: + return self + + cvar = optimization.cvar + + if not cvar: + return self + + nreals = cvar.number_of_realizations + model = self.model + + if ( + cvar + and nreals is not None + and model is not None + and not (0 < nreals < len(model.realizations)) + ): + raise ValueError( + f"number_of_realizations: (got {nreals}) was" + f" expected to be between 0 and number of realizations specified " + f"in model config: {len(model.realizations)}" + ) + + return self + + @model_validator(mode="after") + def validate_install_data_source_exists(self): + install_data = self.install_data or [] + if not install_data: + return self + config_path = self.config_path + model = self.model + if model and config_path: + for install_data_cfg in install_data: + check_path_exists( + install_data_cfg.source, config_path, model.realizations + ) + + return self + + @model_validator(mode="after") + def validate_model_data_file_exists(self): # pylint: disable=E0213 + model = self.model + if not model: + return self + config_path = self.config_path + + if model.data_file is not None: + check_path_exists(model.data_file, config_path, model.realizations) + + return self + + @model_validator(mode="after") + def validate_maintained_forward_models(self): + install_data = self.install_data + model = self.model + realizations = model.realizations if model else [0] + + with InstallDataContext(install_data, self.config_path) as context: + for realization in realizations: + context.add_links_for_realization(realization) + validate_forward_model_configs(self.forward_model, self.install_jobs) + return self + + @model_validator(mode="after") + # pylint: disable=E0213 + def validate_input_constraints_weight_definition(self): + input_constraints = self.input_constraints + if not input_constraints: + return self + + controls = self.controls + if controls is None: + return self + control_full_name = [] + errors = [] + for c in controls: + for v in c.variables: + if isinstance(v, ControlVariableGuessListConfig): + control_full_name.extend( + f"{c.name}.{v.name}-{index}" + for index, _ in enumerate(v.initial_guess, start=1) + ) + elif v.index is not None: + control_full_name.append(f"{c.name}.{v.name}-{v.index}") + else: + control_full_name.append(f"{c.name}.{v.name}") + + for input_const in input_constraints: + for key in input_const.weights: + if key not in control_full_name: + errors.append( + f"Input control weight name {key} " + f"does not match any instance of " + f"control_name.variable_name-variable_index" + ) + + if len(errors) > 0: # Note: python3.11 ExceptionGroup will solve this nicely + raise ValueError(errors) + + return self + + @model_validator(mode="after") + def validate_variable_name_match_well_name(self): # pylint: disable=E0213 + controls = self.controls + wells = self.wells + if controls is None or wells is None: + return self + well_names = [w.name for w in wells] + if not well_names: + return self + for c in controls: + if c.type == "generic_control": + continue + for v in c.variables: + if v.name not in well_names: + raise ValueError("Variable name does not match any well name") + + return self + + @model_validator(mode="after") + def validate_that_environment_sim_folder_is_writeable(self): + environment = self.environment + config_path = self.config_path + if environment is None or config_path is None: + return self + + check_writeable_path(environment.simulation_folder, Path(config_path)) + return self + + # pylint: disable=E0213 + @field_validator("wells") + @no_type_check + @classmethod + def validate_unique_well_names(cls, wells: List[WellConfig]): + check_for_duplicate_names([w.name for w in wells], "well", "name") + return wells + + # pylint: disable=E0213 + @field_validator("output_constraints") + @no_type_check + @classmethod + def validate_unique_output_constraint_names( + cls, output_constraints: List[OutputConstraintConfig] + ): + check_for_duplicate_names( + [c.name for c in output_constraints], "output constraint", "name" + ) + return output_constraints + + @field_validator("objective_functions") + @no_type_check + @classmethod + def validate_objective_function_weights_for_all_or_none(cls, functions): + objective_names = [function.name for function in functions] + weights = [ + function.weight for function in functions if function.weight is not None + ] + if weights and len(weights) != len(objective_names): + raise ValueError( + "Weight should be given either for all of the objectives" + " or for none of them" + ) + return functions + + @field_validator("objective_functions") + @no_type_check + @classmethod + def validate_objective_function_aliases_valid(cls, functions): + objective_names = [function.name for function in functions] + + aliases = [ + function.alias for function in functions if function.alias is not None + ] + for alias in aliases: + if alias not in objective_names: + raise ValueError(f"Invalid alias {alias}") + return functions + + @field_validator("config_path") + @no_type_check + @classmethod + def validate_config_path_exists(cls, config_path): + expanded_path = os.path.realpath(config_path) + if not os.path.exists(expanded_path): + raise ValueError(f"no such file or directory {expanded_path}") + return config_path + + def copy(self) -> "EverestConfig": # type: ignore + return EverestConfig.model_validate(self.model_dump(exclude_none=True)) + + @property + def logging_level(self) -> int: + level = self.environment.log_level if self.environment is not None else "info" + + if level is None: + level = "info" + + levels = { + "debug": logging.DEBUG, # 10 + "info": logging.INFO, # 20 + "warning": logging.WARNING, # 30 + "error": logging.ERROR, # 40 + "critical": logging.CRITICAL, # 50 + } + return levels.get(level.lower(), logging.INFO) + + @logging_level.setter + def logging_level( + self, level: Literal["debug", "info", "warning", "error", "critical"] + ): + env = self.environment + assert env is not None + env.log_level = level # pylint:disable = E0237 + + @property + def config_directory(self) -> Optional[str]: + if self.config_path is not None: + return str(self.config_path.parent) + + return None + + @property + def config_file(self) -> Optional[str]: + if self.config_path is not None: + return self.config_path.name + return None + + @property + def output_dir(self) -> Optional[str]: + assert self.environment is not None + path = self.environment.output_folder + + if path is None: + path = DEFAULT_OUTPUT_DIR + + if os.path.isabs(path): + return path + + cfgdir = self.config_directory + + if cfgdir is None: + return path + + return os.path.join(cfgdir, path) + + @property + def simulation_dir(self) -> Optional[str]: + assert self.environment is not None + path = self.environment.simulation_folder + + if os.path.isabs(path): + return path + + cfgdir = self.output_dir + if cfgdir is None: + return path + + return os.path.join(cfgdir, path) + + def _get_output_subdirectory(self, subdirname: str): + if self.output_dir is None: + return None + + return os.path.join(os.path.abspath(self.output_dir), subdirname) + + @property + def optimization_output_dir(self): + """Return the path to folder with the optimization output""" + return self._get_output_subdirectory(OPTIMIZATION_OUTPUT_DIR) + + @property + def storage_dir(self): + return self._get_output_subdirectory(STORAGE_DIR) + + @property + def log_dir(self): + return self._get_output_subdirectory(OPTIMIZATION_LOG_DIR) + + @property + def detached_node_dir(self): + return self._get_output_subdirectory(DETACHED_NODE_DIR) + + @property + def session_dir(self): + """Return path to the session directory containing information about the + certificates and host information""" + return os.path.join(self.detached_node_dir, SESSION_DIR) + + @property + def certificate_dir(self): + """Return the path to certificate folder""" + return os.path.join(self.session_dir, CERTIFICATE_DIR) + + def get_server_url(self, server_info=None): + """Return the url of the server. + + If server_info are given, the url is generated using that info. Otherwise + server information are retrieved from the hostfile + """ + if server_info is None: + server_info = self.server_info + + url = f"https://{server_info['host']}:{server_info['port']}" + return url + + @property + def hostfile_path(self): + return os.path.join(self.session_dir, HOSTFILE_NAME) + + @property + def server_info(self): + """Load server information from the hostfile""" + host_file_path = self.hostfile_path + + with open(host_file_path, "r", encoding="utf-8") as f: + json_string = f.read() + + data = json.loads(json_string) + if set(data.keys()) != {"host", "port", "cert", "auth"}: + raise RuntimeError("Malformed hostfile") + + return data + + @property + def server_context(self): + """Returns a tuple with + - url of the server + - path to the .cert file + - password for the certificate file + """ + + return ( + self.get_server_url(self.server_info), + self.server_info[CERTIFICATE_DIR], + ("username", self.server_info["auth"]), + ) + + @property + def export_path(self): + """Returns the export file path. If not file name is provide the default + export file name will have the same name as the config file, with the '.csv' + extension.""" + + export = self.export + + output_path = None + if export is not None: + output_path = export.csv_output_filepath + + if output_path is None: + output_path = "" + + full_file_path = os.path.join(self.output_dir, output_path) + if output_path: + return full_file_path + else: + default_export_file = f"{os.path.splitext(self.config_file)[0]}.csv" + return os.path.join(full_file_path, default_export_file) + + @property + def everserver_status_path(self): + """Returns path to the everest server status file""" + return os.path.join(self.session_dir, SERVER_STATUS) + + def to_dict(self) -> dict: + the_dict = self.model_dump(exclude_none=True) + + if "config_path" in the_dict: + the_dict["config_path"] = str(the_dict["config_path"]) + + return the_dict + + @classmethod + def with_defaults(cls, **kwargs): + """ + Creates an Everest config with default values. Useful for initializing a config + without having to provide empty defaults. + """ + defaults = { + "controls": [], + "objective_functions": [], + "optimization": OptimizationConfig(), + "model": ModelConfig(), + "environment": EnvironmentConfig(), + "config_path": ".", + } + + return EverestConfig.model_validate({**defaults, **kwargs}) + + @staticmethod + def lint_config_dict(config: dict) -> List["ErrorDetails"]: + try: + EverestConfig.model_validate(config) + return [] + except ValidationError as err: + return err.errors() + + @staticmethod + def lint_config_dict_with_raise(config: dict): + # Future work: Catch the validation error + # and reformulate the pydantic ones to make them + # more understandable + EverestConfig.model_validate(config) + + @staticmethod + def load_file(config_path: str) -> "EverestConfig": + config_path = os.path.realpath(config_path) + + if not os.path.isfile(config_path): + raise FileNotFoundError("File not found: {}".format(config_path)) + + config_dict = yaml_file_to_substituted_config_dict(config_path) + return EverestConfig.model_validate(config_dict) + + @staticmethod + def load_file_with_argparser( + config_path, parser: ArgumentParser + ) -> Optional["EverestConfig"]: + try: + return EverestConfig.load_file(config_path) + except FileNotFoundError: + parser.error(f"File not found: {config_path}") + except YAMLError as e: + parser.error( + f"The config file: <{config_path}> contains" + f" invalid YAML syntax: {e!s}" + ) + except ValidationError as e: + parser.error( + f"Loading config file <{config_path}> failed with:\n" + f"{format_errors(e)}" + ) + + def dump(self, fname: Optional[str] = None) -> Optional[str]: + """Write a config dict to file or return it if fname is None.""" + stripped_conf = self.to_dict() + + del stripped_conf["config_path"] + + yaml = YAML(typ="safe", pure=True) + yaml.default_flow_style = False + if fname is None: + with StringIO() as sio: + yaml.dump(stripped_conf, sio) + return sio.getvalue() + + with open(fname, "w", encoding="utf-8") as out: + yaml.dump(stripped_conf, out) + + return None diff --git a/src/everest/config/export_config.py b/src/everest/config/export_config.py new file mode 100644 index 00000000000..60f612b4b54 --- /dev/null +++ b/src/everest/config/export_config.py @@ -0,0 +1,43 @@ +from typing import List, Optional + +from pydantic import BaseModel, Field, field_validator + +from everest.config.validation_utils import check_writable_filepath + + +class ExportConfig(BaseModel, extra="forbid"): # type: ignore + csv_output_filepath: Optional[str] = Field( + default=None, + description="""Specifies which file to write the export to. + Defaults to .csv in output folder.""", + ) + discard_gradient: Optional[bool] = Field( + default=None, + description="If set to True, Everest export will not contain " + "gradient simulation data.", + ) + discard_rejected: Optional[bool] = Field( + default=None, + description="""If set to True, Everest export will contain only simulations + that have the increase_merit flag set to true.""", + ) + keywords: Optional[List[str]] = Field( + default=None, + description="List of eclipse keywords to be exported into csv.", + ) + batches: Optional[List[int]] = Field( + default=None, + description="list of batches to be exported, default is all batches.", + ) + skip_export: Optional[bool] = Field( + default=None, + description="""set to True if export should not + be run after the optimization case. + Default value is False.""", + ) + + @field_validator("csv_output_filepath", mode="before") + @classmethod + def validate_output_file_writable(cls, csv_output_filepath): # pylint:disable=E0213 + check_writable_filepath(csv_output_filepath) + return csv_output_filepath diff --git a/src/everest/config/has_ert_queue_options.py b/src/everest/config/has_ert_queue_options.py new file mode 100644 index 00000000000..c427391455a --- /dev/null +++ b/src/everest/config/has_ert_queue_options.py @@ -0,0 +1,13 @@ +from typing import Any, List, Tuple + + +class HasErtQueueOptions: + def extract_ert_queue_options( + self, queue_system: str, everest_to_ert_key_tuples: List[Tuple[str, str]] + ) -> List[Tuple[str, str, Any]]: + result = [] + for ever_key, ert_key in everest_to_ert_key_tuples: + attribute = getattr(self, ever_key) + if attribute is not None: + result.append((queue_system, ert_key, attribute)) + return result diff --git a/src/everest/config/input_constraint_config.py b/src/everest/config/input_constraint_config.py new file mode 100644 index 00000000000..3a5f82809c5 --- /dev/null +++ b/src/everest/config/input_constraint_config.py @@ -0,0 +1,71 @@ +from typing import Dict, Optional + +from pydantic import BaseModel, Field, field_validator + + +class InputConstraintConfig(BaseModel, extra="forbid"): # type: ignore + weights: Dict[str, float] = Field( + description="""**Example** +If we are trying to constrain only one control (i.e the z control) value: +| input_constraints: +| - weights: +| point_3D.x-0: 0 +| point_3D.y-1: 0 +| point_3D.z-2: 1 +| upper_bound: 0.2 + +Only control values (x, y, z) that satisfy the following equation will be allowed: +`x-0 * 0 + y-1 * 0 + z-2 * 1 > 0.2` +""", + ) + target: Optional[float] = Field( + default=None, + description="""**Example** +| input_constraints: +| - weights: +| point_3D.x-0: 1 +| point_3D.y-1: 2 +| point_3D.z-2: 3 +| target: 4 + +Only control values (x, y, z) that satisfy the following equation will be allowed: +`x-0 * 1 + y-1 * 2 + z-2 * 3 = 4` +""", + ) + lower_bound: Optional[float] = Field( + default=None, + description="""**Example** +| input_constraints: +| - weights: +| point_3D.x-0: 1 +| point_3D.y-1: 2 +| point_3D.z-2: 3 +| lower_bound: 4 + +Only control values (x, y, z) that satisfy the following +equation will be allowed: +`x-0 * 1 + y-1 * 2 + z-2 * 3 >= 4` +""", + ) + upper_bound: Optional[float] = Field( + default=None, + description="""**Example** +| input_constraints: +| - weights: +| point_3D.x-0: 1 +| point_3D.y-1: 2 +| point_3D.z-2: 3 +| upper_bound: 4 + +Only control values (x, y, z) that satisfy the following equation will be allowed: +`x-0 * 1 + y-1 * 2 + z-2 * 3 <= 4` +""", + ) + + @field_validator("weights") + @classmethod + # pylint: disable=E0213 + def validate_weights_not_empty(cls, weights: Dict[str, float]) -> Dict[str, float]: + if weights is None or weights == {}: + raise ValueError("Input weight data required for input constraints") + return weights diff --git a/src/everest/config/install_data_config.py b/src/everest/config/install_data_config.py new file mode 100644 index 00000000000..065045a7a99 --- /dev/null +++ b/src/everest/config/install_data_config.py @@ -0,0 +1,40 @@ +from pathlib import Path +from typing import Optional + +from pydantic import BaseModel, Field, field_validator, model_validator + + +class InstallDataConfig(BaseModel, extra="forbid"): # type: ignore + source: str = Field( + description=""" + Path to file or directory that needs to be copied or linked in the evaluation + execution context. + """ + ) # existing path + target: str = Field( + description=""" + Relative path to place the copy or link for the given source. + """ + ) # path + link: Optional[bool] = Field( + default=None, + description=""" + If set to true will create a link to the given source at the given target, + if not set the source will be copied at the given target. + """, + ) + + @field_validator("link", mode="before") + @classmethod + def validate_link_type(cls, link): # pylint: disable=E0213 + if link is None: + return link + if not isinstance(link, bool): + raise ValueError(f" {link} could not be parsed to a boolean") + return link + + @model_validator(mode="after") + def validate_target(self): + if self.target in (".", "./"): + self.target = Path(self.source).name + return self diff --git a/src/everest/config/install_job_config.py b/src/everest/config/install_job_config.py new file mode 100644 index 00000000000..482f682ab95 --- /dev/null +++ b/src/everest/config/install_job_config.py @@ -0,0 +1,6 @@ +from pydantic import BaseModel, Field + + +class InstallJobConfig(BaseModel, extra="forbid"): # type: ignore + name: str = Field(description="name of the installed job") + source: str = Field(description="source file of the ert job") diff --git a/src/everest/config/install_template_config.py b/src/everest/config/install_template_config.py new file mode 100644 index 00000000000..b5085403b10 --- /dev/null +++ b/src/everest/config/install_template_config.py @@ -0,0 +1,9 @@ +from typing import Optional + +from pydantic import BaseModel, Field + + +class InstallTemplateConfig(BaseModel, extra="forbid"): # type: ignore + template: str = Field() # existing file + output_file: str = Field() # path + extra_data: Optional[str] = Field(default=None) # path diff --git a/src/everest/config/model_config.py b/src/everest/config/model_config.py new file mode 100644 index 00000000000..594e71b6fdb --- /dev/null +++ b/src/everest/config/model_config.py @@ -0,0 +1,71 @@ +from datetime import datetime +from typing import List, Optional + +from pydantic import BaseModel, Field, NonNegativeInt, field_validator, model_validator + +from everest.strings import DATE_FORMAT + + +class ModelConfig(BaseModel, extra="forbid"): # type: ignore + realizations: List[NonNegativeInt] = Field( + default_factory=lambda: [], + description="""List of realizations to use in optimization ensemble. + +Typically, this is a list [0, 1, ..., n-1] of all realizations in the ensemble.""", + ) + data_file: Optional[str] = Field( + default=None, + description="""Path to the eclipse data file used for optimization. + The path can contain r{{geo_id}}. + +NOTE: Without a data file no well or group specific summary data will be exported.""", + ) + realizations_weights: Optional[List[float]] = Field( + default=None, + description="""List of weights, one per realization. + +If specified, it must be a list of numeric values, one per realization.""", + ) + report_steps: Optional[List[str]] = Field( + default=None, + description="List of dates allowed in the summary file.", + ) + + @model_validator(mode="before") + @classmethod + def validate_realizations_weights_same_cardinaltiy(cls, values): # pylint: disable=E0213 + weights = values.get("realizations_weights") + reals = values.get("realizations") + + if not weights: + return values + + if len(weights) != len(reals): + raise ValueError( + "Specified realizations_weights must have one" + " weight per specified realization in realizations" + ) + + return values + + @field_validator("report_steps") + @classmethod + def validate_report_steps_are_dates(cls, report_steps): # pylint: disable=E0213 + invalid_steps = [] + for step in report_steps: + try: + if not isinstance(step, str): + invalid_steps.append(str(step)) + continue + + datetime.strptime(step, DATE_FORMAT) + except ValueError: + invalid_steps.append(step) + + if len(invalid_steps) > 0: + raise ValueError( + f"malformed dates: {', '.join(invalid_steps)}," + f"expected format: {DATE_FORMAT}" + ) + + return report_steps diff --git a/src/everest/config/objective_function_config.py b/src/everest/config/objective_function_config.py new file mode 100644 index 00000000000..cab5439c331 --- /dev/null +++ b/src/everest/config/objective_function_config.py @@ -0,0 +1,71 @@ +from typing import Optional + +from pydantic import BaseModel, Field, PositiveFloat, field_validator + + +class ObjectiveFunctionConfig(BaseModel, extra="forbid"): # type: ignore + name: str = Field() + alias: Optional[str] = Field( + default=None, + description=""" +alias can be set to the name of another objective function, directing everest +to copy the value of that objective into the current objective. This is useful +when used together with the **type** option, for instance to construct an objective +function that consist of the sum of the mean and standard-deviation over the +realizations of the same objective. In such a case, add a second objective with +**type** equal to "stddev" and set **alias** to the name of the first objective to make +sure that the standard deviation is calculated over the values of that objective. +""", + ) + weight: Optional[PositiveFloat] = Field( + default=None, + description=""" +weight determines the importance of an objective function relative to the other +objective functions. + +Ultimately, the weighted sum of all the objectives is what Everest tries to optimize. +Note that, in case the weights do not sum up to 1, they are normalized before being +used in the optimization process. +""", + ) + normalization: Optional[float] = Field( + default=None, + description=""" +normalization is a multiplication factor defined per objective function. + +The value of each objective function is multiplied by the related normalization value. +When optimizing with respect to multiple objective functions, it is important +that the normalization is set so that all the normalized objectives have the same order +of magnitude. Ultimately, the normalized objectives are used in computing +the weighted sum that Everest tries to optimize. +""", + ) + auto_normalize: Optional[bool] = Field( + default=None, + description=""" +auto_normalize can be set to true to automatically +determine the normalization factor from the objective value in batch 0. + +If normalization is also set, the automatic value is multiplied by its value. +""", + ) + type: Optional[str] = Field( + default=None, + description=""" +type can be set to the name of a method that should be applied to calculate a +total objective function from the objectives obtained for all realizations. +Currently, the only values supported are "mean" and "stddev", which calculate +the mean and the negative of the standard deviation over the realizations, +respectively. The negative of the standard deviation is used, since in general +the aim is to minimize the standard deviation as opposed to the mean, which is +preferred to be maximized. + +""", + ) + + @field_validator("normalization") + @classmethod + def validate_normalization_is_not_zero(cls, normalization): # pylint: disable=E0213 + if normalization == 0.0: + raise ValueError("Normalization value cannot be zero") + return normalization diff --git a/src/everest/config/optimization_config.py b/src/everest/config/optimization_config.py new file mode 100644 index 00000000000..22c90ca9d19 --- /dev/null +++ b/src/everest/config/optimization_config.py @@ -0,0 +1,218 @@ +from typing import Any, Dict, List, Optional + +from pydantic import BaseModel, Field, model_validator + +from everest.config.cvar_config import CVaRConfig +from everest.config.restart_config import RestartConfig +from everest.optimizer.utils import get_ropt_plugin_manager + + +class OptimizationConfig(BaseModel, extra="forbid"): # type: ignore + algorithm: Optional[str] = Field( + default="default", + description="""Algorithm used by Everest. Defaults to +optpp_q_newton, a quasi-Newton algorithm in Dakota's OPT PP library. +""", + ) + convergence_tolerance: Optional[float] = Field( + default=None, + description="""Defines the threshold value on relative change +in the objective function that indicates convergence. + +The convergence_tolerance specification provides a real value for controlling +the termination of iteration. In most cases, it is a relative convergence tolerance +for the objective function; i.e., if the change in the objective function between +successive iterations divided by the previous objective function is less than +the amount specified by convergence_tolerance, then this convergence criterion is +satisfied on the current iteration. + +Since no progress may be made on one iteration followed by significant progress +on a subsequent iteration, some libraries require that the convergence tolerance +be satisfied on two or more consecutive iterations prior to termination of +iteration. + +(From the Dakota Manual.)""", + ) + backend: Optional[str] = Field( + default="dakota", + description="""The optimization backend used. Defaults to "dakota". + +Currently, backends are included to use Dakota or SciPy ("dakota" and "scipy"). +The Dakota backend is the default, and can be assumed to be installed. The SciPy +backend is optional, and will only be available if SciPy is installed on the +system.""", + ) + backend_options: Optional[Dict[str, Any]] = Field( + default=None, + description="""Dict of optional parameters for the optimizer backend. +This dict of values is passed unchanged to the selected algorithm in the backend. + +Note that the default Dakota backend ignores this option, because it requires a +list of strings rather than a dictionary. For setting Dakota backend options, see +the 'option' keyword.""", + ) + constraint_tolerance: Optional[float] = Field( + default=None, + description="""Determines the maximum allowable value of +infeasibility that any constraint in an optimization problem may possess and +still be considered to be satisfied. + +It is specified as a positive real value. If a constraint function is greater +than this value then it is considered to be violated by the optimization +algorithm. This specification gives some control over how tightly the +constraints will be satisfied at convergence of the algorithm. However, if the +value is set too small the algorithm may terminate with one or more constraints +being violated. + +(From the Dakota Manual.)""", + ) + cvar: Optional[CVaRConfig] = Field( + default=None, + description="""Directs the optimizer to use CVaR estimation. + +When this section is present Everest will use Conditional Value at Risk (CVaR) +to minimize risk. Effectively this means that at each iteration the objective +and constraint functions will be calculated as the mean over the sub-set of the +realizations that perform worst. The size of this set is specified as an +absolute number or as a percentile value. These options are selected by setting +either the **number_of_realizations** option, or the **percentile** option, +which are mutually exclusive. +""", + ) + max_batch_num: Optional[int] = Field( + default=None, + gt=0, + description="""Limits the number of batches of simulations +during optimization, where 0 represents unlimited simulation batches. +When max_batch_num is specified and the current batch index is greater than +max_batch_num an exception is raised.""", + ) + max_function_evaluations: Optional[int] = Field( + default=None, + gt=0, + description="""Limits the maximum number of function evaluations. + +The max_function_evaluations controls the number of control update steps the optimizer +will allow before convergence is obtained. + +See max_iterations for a description. +""", + ) + max_iterations: Optional[int] = Field( + default=None, + gt=0, + description="""Limits the maximum number of iterations. + +The difference between an iteration and a batch is that an iteration corresponds to +a complete accepted batch (i.e., a batch that provides an improvement in the +objective function while satisfying all constraints).""", + ) + min_pert_success: Optional[int] = Field( + default=None, + gt=0, + description="""specifies the minimum number of successfully completed +evaluations of perturbed controls required to compute a gradient. The optimization +process will stop if this minimum is not reached, and otherwise a gradient will be +computed based on the set of successful perturbation runs. The minimum is checked for +each realization individually. + +A special case is robust optimization with `perturbation_num: 1`. In that case the +minimum applies to all realizations combined. In other words, a robust gradient may then +still be computed based on a subset of the realizations. + +The user-provided value is reset to perturbation_num if it is larger than this number +and a message is produced. In the special case of robust optimization case with +`perturbation_num: 1` the maximum allowed value is the number of realizations specified +by realizations instead.""", + ) + min_realizations_success: Optional[int] = Field( + default=None, + ge=0, + description="""Minimum number of realizations + +The minimum number of realizations that should be available for the computation +of either expected function values (both objective function and constraint +functions) or of the expected gradient. Note that this keyword does not apply +to gradient computation in the robust case with 1 perturbation in which the +expected gradient is computed directly. + +The optimization process will stop if this minimum is not reached, and otherwise +the expected objective function value (and expected gradient/constraint function +values) will be computed based on the set of successful contributions. In other +words, a robust objective function, a robust gradient and robust constraint +functions may then still be computed based on a subset of the realizations. + +The user-provided value is reset to the number of realizations specified by +realizations if it is larger than this number and a message is produced. + +Note that it is possible to set the minimum number of successful realizations equal +to zero. Some optimization algorithms are able to handle this and will proceed even +if all realizations failed. Most algorithms are not capable of this and will adjust +the value to be equal to one. +""", + ) + options: Optional[List[str]] = Field( + default=None, + description="""specifies non-validated, optional +passthrough parameters for the optimizer + +| Examples used are +| - max_repetitions = 300 +| - retry_if_fail +| - classical_search 1""", + ) + perturbation_num: Optional[int] = Field( + default=None, + gt=0, + description="""The number of perturbed control vectors per realization. + +The number of simulation runs used for estimating the gradient is equal to the +the product of perturbation_num and model.realizations.""", + ) + speculative: Optional[bool] = Field( + default=None, + description="""specifies whether to enable speculative computation. + +The speculative specification enables speculative computation of gradient and/or +Hessian information, where applicable, for parallel optimization studies. By +speculating that the derivative information at the current point will be used +later, the complete data set (all available gradient/Hessian information) can be +computed on every function evaluation. While some of these computations will be +wasted, the positive effects are a consistent parallel load balance and usually +shorter wall clock time. The speculative specification is applicable only when +parallelism in the gradient calculations can be exploited by Dakota (it will be +ignored for vendor numerical gradients). (From the Dakota Manual.)""", + ) + parallel: Optional[bool] = Field( + default=None, + description="""whether to allow parallel function evaluation. + +By default Everest will evaluate a single function and gradient evaluation at +a time. In case of gradient-free optimizer this can be highly inefficient, +since these tend to need many independent function evaluations at each +iteration. By setting parallel to True, multiple functions may be evaluated in +parallel, if supported by the optimization algorithm. + +The default is to use parallel evaluation if supported. +""", + ) + restart: Optional[RestartConfig] = Field( + default=None, + description="""Optional restarting configuration. + +Restarting the optimization from scratch from a new initial point can be +beneficial to the optimization process for some optimization algorithms. This +option can be used to direct Everest to restart the optimization once or +multiple times. +""", + ) + + @model_validator(mode="after") + def validate_backend_and_algorithm(self): # pylint: disable=E0213 + method = "default" if self.algorithm is None else self.algorithm + backend = "dakota" if self.backend is None else self.backend + if not get_ropt_plugin_manager().is_supported( + "optimizer", f"{backend}/{method}" + ): + raise ValueError(f"Optimizer algorithm '{backend}/{method}' not found") + return self diff --git a/src/everest/config/output_constraint_config.py b/src/everest/config/output_constraint_config.py new file mode 100644 index 00000000000..a0b15298e00 --- /dev/null +++ b/src/everest/config/output_constraint_config.py @@ -0,0 +1,74 @@ +from typing import Optional + +from pydantic import BaseModel, Field, model_validator + + +class OutputConstraintConfig(BaseModel, extra="forbid"): # type: ignore + name: str = Field(description="The unique name of the output constraint.") + target: Optional[float] = Field( + default=None, + description="""Defines the equality constraint + +(f(x) - b) / c = 0, + +where b is the target, f is a function of the control vector x, and c is the +scale (scale). + +""", + ) + auto_scale: Optional[bool] = Field( + default=None, + description="""If set to true, Everest will automatically +determine the scaling factor from the constraint value in batch 0. + +If scale is also set, the automatic value is multiplied by its value.""", + ) + lower_bound: Optional[float] = Field( + default=None, + description="""Defines the lower bound +(greater than or equal) constraint + +(f(x) - b) / c >= 0, + +where b is the lower bound, f is a function of the control vector x, and c is +the scale (scale). +""", + ) + upper_bound: Optional[float] = Field( + default=None, + description="""Defines the upper bound (less than or equal) constraint: + +(f(x) - b) / c <= 0, + +where b is the upper bound, f is a function of the control vector x, and c is +the scale (scale).""", + ) + scale: Optional[float] = Field( + default=None, + description="""Scaling of constraints (scale). + +scale is a normalization factor which can be used to scale the constraint +to control its importance relative to the (singular) objective and the controls. + +Both the upper_bound and the function evaluation value will be scaled with this number. +That means that if, e.g., the upper_bound is 0.5 and the scaling is 10, then the +function evaluation value will be divided by 10 and bounded from above by 0.05. + +""", + ) + + @model_validator(mode="after") + def validate_bounds_in_place( + self, + ): + has_equality = self.target is not None + has_inequality = self.upper_bound is not None or self.lower_bound is not None + is_valid = has_equality ^ has_inequality + + if not is_valid: + raise ValueError( + "Output constraints must have only one of the following: { target }," + " or { upper and/or lower bound }" + ) + + return self diff --git a/src/everest/config/restart_config.py b/src/everest/config/restart_config.py new file mode 100644 index 00000000000..97100aefa85 --- /dev/null +++ b/src/everest/config/restart_config.py @@ -0,0 +1,39 @@ +from typing import Literal + +from pydantic import BaseModel, ConfigDict, Field + + +class RestartConfig(BaseModel): # type: ignore + max_restarts: int = Field( + default=1, + gt=0, + description="""The maximum number of restarts. + +Sets the maximum number of times that the optimization process will be +restarted. + +The default is equal to a single restart. +""", + ) + + restart_from: Literal["initial", "last", "optimal", "last_optimal"] = Field( + description="""Restart from the initial, optimal or the last controls. + +When restarting, the initial values for the new run are set according to this field: +- initial: Use the initial controls from the configuration +- last: Use the last controls used by the previous run +- optimal: Use the controls from the optimal solution found so far +- last_optimal: Use the controls from the optimal solution found in previous run + +When restarting from optimal values, the best result obtained so far (either +overall, or in the last restart run) is used, which is defined as the result +with the maximal weighted total objective value. If the `constraint_tolerance` +option is set in the `optimization` section, this tolerance will be used to +exclude results that violate a constraint. + +""", + ) + + model_config = ConfigDict( + extra="forbid", + ) diff --git a/src/everest/config/sampler_config.py b/src/everest/config/sampler_config.py new file mode 100644 index 00000000000..5fbf454abb0 --- /dev/null +++ b/src/everest/config/sampler_config.py @@ -0,0 +1,51 @@ +from typing import Any, Dict, Optional + +from pydantic import BaseModel, ConfigDict, Field, model_validator + +from everest.optimizer.utils import get_ropt_plugin_manager + + +class SamplerConfig(BaseModel): # type: ignore + backend: str = Field( + default="scipy", + description="""The backend used by Everest for sampling points. + +The sampler backend provides the methods for sampling the points used to +estimate the gradient. The default is the built-in 'scipy' backend. + +""", + ) + options: Optional[Dict[str, Any]] = Field( + default=None, + alias="backend_options", + description=""" +Specifies a dict of optional parameters for the sampler backend. + +This dict of values is passed unchanged to the selected method in the backend. + +""", + ) + method: str = Field( + default="default", + description="""The sampling method or distribution used by the sampler backend. +""", + ) + shared: Optional[bool] = Field( + default=None, + description="""Whether to share perturbations between realizations. +""", + ) + + @model_validator(mode="after") + def validate_backend_and_method(self): # pylint: disable=E0213 + if not get_ropt_plugin_manager().is_supported("sampler", f"{self.ropt_method}"): + raise ValueError(f"Sampler '{self.backend}/{self.method}' not found") + return self + + @property + def ropt_method(self) -> str: + return f"{self.backend}/{self.method}" + + model_config = ConfigDict( + extra="forbid", + ) diff --git a/src/everest/config/server_config.py b/src/everest/config/server_config.py new file mode 100644 index 00000000000..4ee3a00e34f --- /dev/null +++ b/src/everest/config/server_config.py @@ -0,0 +1,43 @@ +from typing import Literal, Optional + +from pydantic import BaseModel, ConfigDict, Field + +from .has_ert_queue_options import HasErtQueueOptions + + +class ServerConfig(BaseModel, HasErtQueueOptions): # type: ignore + name: Optional[str] = Field( + None, + description="""Specifies which queue to use. + +Examples are +* mr +* bigmem + +The everest server generally has lower resource requirements than forward models such +as RMS and Eclipse. + """, + ) # Corresponds to queue name + exclude_host: Optional[str] = Field( + None, + description="""Comma separated list of nodes that should be + excluded from the slurm run""", + ) + include_host: Optional[str] = Field( + None, + description="""Comma separated list of nodes that + should be included in the slurm run""", + ) + options: Optional[str] = Field( + None, + description="""Used to specify options to LSF. + Examples to set memory requirement is: + * rusage[mem=1000]""", + ) + queue_system: Optional[Literal["lsf", "local", "slurm"]] = Field( + None, + description="Defines which queue system the everest server runs on.", + ) + model_config = ConfigDict( + extra="forbid", + ) diff --git a/src/everest/config/simulator_config.py b/src/everest/config/simulator_config.py new file mode 100644 index 00000000000..9ac570cee98 --- /dev/null +++ b/src/everest/config/simulator_config.py @@ -0,0 +1,120 @@ +from typing import Literal, Optional + +from pydantic import BaseModel, Field, NonNegativeInt, PositiveInt + +from .has_ert_queue_options import HasErtQueueOptions + + +class SimulatorConfig(BaseModel, HasErtQueueOptions, extra="forbid"): # type: ignore + name: Optional[str] = Field( + default=None, description="Specifies which queue to use" + ) + cores: Optional[PositiveInt] = Field( + default=None, + description="""Defines the number of simultaneously running forward models. + + When using queue system lsf, this corresponds to number of nodes used at one + time, whereas when using the local queue system, cores refers to the number of + cores you want to use on your system. + + This number is specified in Ert as MAX_RUNNING. + """, + ) + cores_per_node: Optional[PositiveInt] = Field( + default=None, + description="""defines the number of CPUs when running + the forward models. This can for example be used in conjunction with the Eclipse + parallel keyword for multiple CPU simulation runs. This keyword has no effect + when running with the local queue. + + This number is specified in Ert as NUM_CPU.""", + ) + delete_run_path: Optional[bool] = Field( + default=None, + description="Whether the batch folder for a successful simulation " + "needs to be deleted.", + ) + exclude_host: Optional[str] = Field( + None, + description="""Comma separated list of nodes that should be + excluded from the slurm run.""", + ) + include_host: Optional[str] = Field( + None, + description="""Comma separated list of nodes that + should be included in the slurm run""", + ) + max_memory: Optional[str] = Field( + default=None, + description="Maximum memory usage for a slurm job.", + ) + max_memory_cpu: Optional[str] = Field( + default=None, + description="Maximum memory usage per cpu for a slurm job.", + ) + max_runtime: Optional[NonNegativeInt] = Field( + default=None, + description="""Maximum allowed running time of a forward model. When + set, a job is only allowed to run for max_runtime seconds. + A value of 0 means unlimited runtime. + """, + ) + options: Optional[str] = Field( + default=None, + description="""Used to specify options to LSF. + Examples to set memory requirement is: + * rusage[mem=1000]""", + ) + queue_system: Optional[Literal["lsf", "local", "slurm"]] = Field( + default="local", + description="Defines which queue system the everest server runs on.", + ) + resubmit_limit: Optional[NonNegativeInt] = Field( + default=None, + description=""" + Defines how many times should the queue system retry a forward model. + + A forward model may fail for reasons that are not due to the forward model + itself, like a node in the cluster crashing, network issues, etc. Therefore, it + might make sense to resubmit a forward model in case it fails. + resumbit_limit defines the number of times we will resubmit a failing forward model. + If not specified, a default value of 1 will be used.""", + ) + sbatch: Optional[str] = Field( + default=None, + description="sbatch executable to be used by the slurm queue interface.", + ) + scancel: Optional[str] = Field( + default=None, + description="scancel executable to be used by the slurm queue interface.", + ) + scontrol: Optional[str] = Field( + default=None, + description="scontrol executable to be used by the slurm queue interface.", + ) + squeue: Optional[str] = Field( + default=None, + description="squeue executable to be used by the slurm queue interface.", + ) + server: Optional[str] = Field(default=None, description="Name of LSF server to use") + slurm_timeout: Optional[int] = Field( + default=None, + description="Timeout for cached status used by the slurm queue interface", + ) + squeue_timeout: Optional[int] = Field( + default=None, + description="Timeout for cached status used by the slurm queue interface.", + ) + enable_cache: bool = Field( + default=False, + description="""Enable forward model result caching. + + If enabled, objective and constraint function results are cached for + each realization. If the optimizer requests an evaluation that has + already been done before, these cached values will be re-used without + running the forward model again. + + This option is disabled by default, since it will not be necessary for + the most common use of a standard optimization with a continuous + optimizer.""", + ) diff --git a/src/everest/config/validation_utils.py b/src/everest/config/validation_utils.py new file mode 100644 index 00000000000..1d1035a3df3 --- /dev/null +++ b/src/everest/config/validation_utils.py @@ -0,0 +1,306 @@ +import errno +import os +import tempfile +from collections import Counter +from itertools import chain +from pathlib import Path +from typing import TYPE_CHECKING, List, Optional, Sequence, Tuple, TypeVar, Union + +from pydantic import BaseModel, ValidationError + +from everest.config.install_data_config import InstallDataConfig +from everest.util.forward_models import ( + collect_forward_model_schemas, + lint_forward_model_job, + parse_forward_model_file, +) + +from .install_job_config import InstallJobConfig + +if TYPE_CHECKING: + from pydantic_core import ErrorDetails +_VARIABLE_ERROR_MESSAGE = ( + "Variable {name} must define {variable_type} value either" + " at control level or variable level" +) + + +class InstallDataContext: + def __init__(self, install_data: List[InstallDataConfig], config_path: Path): + self._install_data = install_data or [] + self._config_dir = str(config_path.parent) + self._cwd = os.getcwd() + + def __enter__(self): + self._temp_dir = tempfile.TemporaryDirectory() + for data in self._install_data: + if "" not in data.source: + self._set_symlink(data.source, data.target, None) + + os.chdir(self._temp_dir.name) + return self + + def _set_symlink(self, source: str, target: str, realization: Optional[int]): + if realization is not None: + source = source.replace("", str(realization)) + target = target.replace("", str(realization)) + + tmp_target = Path(self._temp_dir.name) / Path(target) + if tmp_target.exists(): + tmp_target.unlink() + tmp_target.parent.mkdir(parents=True, exist_ok=True) + tmp_target.symlink_to(as_abs_path(source, self._config_dir)) + + def add_links_for_realization(self, realization: int): + for data in self._install_data: + if "" in data.source: + self._set_symlink(data.source, data.target, realization) + + def __exit__(self, exc_type, exc_value, exc_tb): + if self._temp_dir: + self._temp_dir.cleanup() + os.chdir(self._cwd) + + +def control_variables_validation( + name: str, + _min: Optional[float], + _max: Optional[float], + initial_guess: Union[float, List[float], None], +) -> List[str]: + error = [] + if _min is None: + error.append(_VARIABLE_ERROR_MESSAGE.format(name=name, variable_type="min")) + if _max is None: + error.append(_VARIABLE_ERROR_MESSAGE.format(name=name, variable_type="max")) + if initial_guess is None: + error.append( + _VARIABLE_ERROR_MESSAGE.format(name=name, variable_type="initial_guess") + ) + if isinstance(initial_guess, float): + initial_guess = [initial_guess] + if ( + _min is not None + and _max is not None + and ( + msg := ", ".join( + str(guess) for guess in initial_guess or [] if not _min <= guess <= _max + ) + ) + ): + error.append( + f"Variable {name} must respect {_min} <= initial_guess <= {_max}: {msg}" + ) + return error + + +def no_dots_in_string(value: str) -> str: + if "." in value: + raise ValueError("Variable name can not contain any dots (.)") + return value + + +T = TypeVar("T", bound=BaseModel) + + +def _duplicate_string(items: Sequence[T]) -> str: + def duplicate_values(item: T) -> str: + return ", ".join( + f"{key}: {getattr(item, key) or 'null'}" + for key in item.uniqueness.split("-") # type: ignore + ) + + return ", ".join( + f"'{duplicate_values(item)}' ({count} occurrences)" + for item, count in Counter(items).items() + if count > 1 + ) + + +def uniform_variables(items: Sequence[T]) -> Sequence[T]: + if ( + len( + { + len(variable.initial_guess) # type: ignore + for variable in items + if isinstance(variable.initial_guess, list) # type: ignore + } + ) + > 1 + ): + raise ValueError("All initial_guess list must be the same length") + return items + + +def unique_items(items: Sequence[T]) -> Sequence[T]: + if duplicates := _duplicate_string(items): + raise ValueError( + f"Subfield(s) `{items[0].uniqueness}` must be unique. " # type: ignore + f"Detected multiple occurrences of the following {duplicates}" + ) + return items + + +def valid_range(range_value: Tuple[float, float]): + if range_value[0] >= range_value[1]: + raise ValueError("scaled_range must be a valid range [a, b], where a < b.") + return range_value + + +def check_path_valid(path: str): + if not isinstance(path, str): + raise ValueError("str type expected") + + root = os.path.sep + for dirname in str(path).split(os.path.sep): + try: + os.lstat(os.path.join(root, dirname)) + + except OSError as e: + if e.errno in (errno.ENAMETOOLONG, errno.ERANGE): + raise ValueError(e.strerror) from e + except TypeError as e: + raise ValueError(str(e)) from e + + +def check_writable_filepath(path: str): + check_path_valid(path) + + if os.path.isdir(path) or not os.path.basename(path): + raise ValueError("Invalid type") + if os.path.isfile(path) and not os.access(path, os.W_OK | os.X_OK): + raise ValueError(f"User does not have write access to {path}") + + +def check_for_duplicate_names(names: List[str], item_name: str, key: str = "item"): + if len(set(names)) != len(names): + histogram = {k: names.count(k) for k in set(names) if names.count(k) > 1} + occurrences_str = ", ".join( + [f"{k} ({v} occurrences)" for k, v in histogram.items()] + ) + raise ValueError( + f"{item_name.capitalize()} {key}s must be unique. Detected multiple " + f"occurrences of the following" + f" {item_name.lower()} {key}: {occurrences_str}" + ) + + +def as_abs_path(path: str, config_dir: str) -> str: + if os.path.isabs(path): + return path + return os.path.realpath(os.path.join(config_dir, path)) + + +def expand_geo_id_paths(path_source: str, realizations: List[int]): + if "" in path_source: + return [path_source.replace("", str(r)) for r in realizations] + return [path_source] + + +def check_path_exists( + path_source: str, config_path: Optional[Path], realizations: List[int] +): + """Check if the given path exists. If the given path contains + or GEO_ID they will be expanded and all instances of expanded paths need to exist. + """ + if not isinstance(path_source, str): + raise ValueError( + f"Expected path_source to be a str, but got {type(path_source)}" + ) + if config_path is None: + raise ValueError("Config path not defined") + config_dir = config_path.parent + + if path_source.count("") > 1: + raise ValueError(f" occurs twice in path {path_source}.") + if path_source.count("") == 1: + pre, pos = path_source.split("") + if pos and pos[0] == "/": + pos = pos[1:] + path_source = os.path.join(pre, config_dir, pos) + + expanded_paths = expand_geo_id_paths(str(path_source), realizations) + for exp_path in [as_abs_path(p, str(config_dir)) for p in expanded_paths]: + if not os.path.exists(exp_path): + raise ValueError(f"No such file or directory {exp_path}") + + +def check_writeable_path(path_source: str, config_path: Path): + # check that the lowest existing folder is writeable + path = as_abs_path(path_source, str(config_path.parent)) + while True: + if os.path.isdir(path): + if os.access(path, os.W_OK | os.X_OK): + break + elif os.path.isfile(path): + # path is a file, cannot create folder + raise ValueError(f"File {path} exists, cannot create path {path_source}") + parent = os.path.dirname(path) + if parent == path: # ie, if path is root + break + path = parent + + if not os.access(path, os.W_OK | os.X_OK): + raise ValueError(f"User does not have write access to {path}") + + +def _error_loc(error_dict: "ErrorDetails") -> str: + return " -> ".join( + str(e) for e in error_dict["loc"] if e is not None and e != "__root__" + ) + + +def format_errors(error: ValidationError) -> str: + errors = error.errors() + msg = f"Found {len(errors)} validation error{'s' if len(errors) > 1 else ''}:\n\n" + error_map = {} + for err in error.errors(): + key = _error_loc(err) + if key not in error_map: + error_map[key] = [key] + error_map[key].append(f" * {err['msg']} (type={err['type']})") + return msg + "\n".join(list(chain.from_iterable(error_map.values()))) + + +def validate_forward_model_configs( + forward_model: Optional[List[str]], install_jobs: Optional[List[InstallJobConfig]] +): + if not forward_model: + return + + install_jobs = install_jobs or [] + user_defined_jobs = [job.name for job in install_jobs] + + def _job_config_index(*args): + return next( + ( + i + for i, arg in enumerate(args) + if arg in ["-c", "--config"] and i + 1 < len(args) + ), + None, + ) + + job_schemas = collect_forward_model_schemas() + + for command in forward_model: + job, *args = command.split() + if ( + job in user_defined_jobs + or not args + or args[0] == "schema" + or (schema := job_schemas.get(job)) is None + ): + continue + + if (index := _job_config_index(*args)) is None: + raise ValueError(f"No config file specified for job {job}") + + if args[0] in ("run", "lint") and ( + errors := lint_forward_model_job(job, args[index : index + 2]) + ): + raise ValueError("\n\t".join(errors)) + + path = args[index + 1] + message = f"{job = }\t-c/--config = {path}\n\t\t{{error}}" + parse_forward_model_file(path, schema, message) diff --git a/src/everest/config/well_config.py b/src/everest/config/well_config.py new file mode 100644 index 00000000000..87872e1c6b8 --- /dev/null +++ b/src/everest/config/well_config.py @@ -0,0 +1,54 @@ +from datetime import datetime +from typing import Optional + +from pydantic import BaseModel, ConfigDict, Field, field_validator + +from everest.strings import DATE_FORMAT + + +class WellConfig(BaseModel): + name: str = Field(description="The unique name of the well") + drill_date: Optional[str] = Field( + None, + description="""Ideal date to drill a well. + +The interpretation of this is up to the forward model. The standard tooling will +consider this as the earliest possible drill date. +""", + ) + drill_time: Optional[float] = Field( + None, + description="""specifies the time it takes + to drill the well under consideration.""", + ) + model_config = ConfigDict( + extra="forbid", + ) + + @field_validator("drill_time") + @classmethod + def validate_positive_drill_time(cls, drill_time): # pylint:disable=E0213 + if drill_time <= 0: + raise ValueError("Drill time must be a positive number") + + return drill_time + + @field_validator("name") + @classmethod + def validate_no_dots_in_well_nane(cls, well_name): # pylint:disable=E0213 + if "." in well_name: + raise ValueError("Well name can not contain any dots (.)") + + return well_name + + @field_validator("drill_date") + @classmethod + def validate_drill_date_is_valid_date(cls, drill_date): # pylint:disable=E0213 + try: + if not isinstance(drill_date, str): + raise ValueError("invalid type str expected") + datetime.strptime(drill_date, DATE_FORMAT) + except ValueError as e: + raise ValueError( + f"malformed date: {drill_date}, expected format: {DATE_FORMAT}" + ) from e diff --git a/src/everest/config/workflow_config.py b/src/everest/config/workflow_config.py new file mode 100644 index 00000000000..bd5dadf3048 --- /dev/null +++ b/src/everest/config/workflow_config.py @@ -0,0 +1,18 @@ +from typing import List, Optional + +from pydantic import BaseModel, ConfigDict, Field + + +class WorkflowConfig(BaseModel): # type: ignore + pre_simulation: Optional[List[str]] = Field( + default=None, + description="List of workflow jobs triggered pre-simulation", + ) + post_simulation: Optional[List[str]] = Field( + default=None, + description="List of workflow jobs triggered post-simulation", + ) + + model_config = ConfigDict( + extra="forbid", + ) diff --git a/src/everest/config_file_loader.py b/src/everest/config_file_loader.py new file mode 100644 index 00000000000..4aa49fea9d6 --- /dev/null +++ b/src/everest/config_file_loader.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python + +import logging +import os +from typing import Any, Dict, List, Optional + +import jinja2 +from ruamel.yaml import YAML, YAMLError + +from .config_keys import ConfigKeys + +# Since YAML interprets '{' as start of a dict, we need to prefix it with +# something to make reading possible. +# +# We chose to use 'r{{' and '}}', and 'r{%' and '%}' as the template rendering +# delimiters, '<' and '<%' are also good options. These should be somewhat +# consistent with the use in the template system used outside of the config file +# as well. + +BLOCK_START_STRING = "r{%" # end string remains as '}' +VARIABLE_START_STRING = "r{{" # end string remains as '}}' + + +# Jinja vars which should NOT be included in definitions portion of config. +ERT_CONFIG_TEMPLATES = { + "realization": "GEO_ID", + "runpath_file": "RUNPATH_FILE", +} + + +def load_yaml(file_name: str) -> Optional[Dict[str, Any]]: + with open(file_name, "r", encoding="utf-8") as input_file: + input_data: List[str] = input_file.readlines() + try: + yaml = YAML() + yaml.preserve_quotes = True + return yaml.load("".join(input_data)) + except YAMLError as exc: + if hasattr(exc, "problem_mark"): + mark = exc.problem_mark + raise YAMLError( + str(exc) + + "\nError in line: {}\n {}^)".format( + input_data[mark.line], " " * mark.column + ) + ) from exc + + return None + + +def _get_definitions(configuration, configpath): + defs = {} + if configuration: + if ConfigKeys.DEFINITIONS not in configuration: + msg = "No {} node found in configuration file" + logging.debug(msg.format(ConfigKeys.DEFINITIONS)) + else: + defs = configuration.get(ConfigKeys.DEFINITIONS, {}) + + for key, val in ERT_CONFIG_TEMPLATES.items(): + if key in defs: + logging.warn( + "Internal key {k} specified by user as {u}. " + "Overriding as {v}".format(k=key, u=defs[key], v=val) + ) + defs[key] = "<{}>".format(val) # ert uses as format + else: + logging.warn("Empty configuration file provided!") + + # If user didn't define a config path, we can insert it here. + defs["configpath"] = defs.get("configpath", configpath) + + # If user didn't define a eclbase arg for eclipse100, we insert it. + defs[ConfigKeys.ECLBASE] = defs.get(ConfigKeys.ECLBASE, "eclipse/ECL") + + return defs + + +def _os(): + """Return an object whose properties are the users environment variables. + + For example, calling os.USER returns the username, os.HOSTNAME returns the + hostname (according to the environment variable). It is used by Jinja to + substitute {{ os.VAR }} with the corresponding value os.environ[VAR]. + + """ + + class Os(object): + pass + + x = Os() + x.__dict__.update(os.environ) + return x + + +def _render_definitions(definitions, jinja_env): + # pylint: disable=unnecessary-lambda-assignment + render = lambda s, d: jinja_env.from_string(s).render(**d) + for key in definitions: + if not isinstance(definitions[key], str): + continue + + for _idx in range(len(definitions) + 1): + new_val = render(definitions[key], definitions) + if definitions[key] != new_val: + definitions[key] = new_val + else: + break + + if VARIABLE_START_STRING in definitions[key]: + raise ValueError( + """Circular dependencies in definitions. Please """ + """resolve using everlint.""" + ) + + +def yaml_file_to_substituted_config_dict(config_path: str) -> Dict[str, Any]: + configuration = load_yaml(config_path) + + definitions = _get_definitions( + configuration=configuration, + configpath=os.path.dirname(os.path.abspath(config_path)), + ) + definitions["os"] = _os() # update definitions with os namespace + with open(config_path, "r", encoding="utf-8") as f: + txt = "".join(f.readlines()) + jenv = jinja2.Environment( + block_start_string=BLOCK_START_STRING, + variable_start_string=VARIABLE_START_STRING, + ) + + _render_definitions(definitions, jenv) + + # Replace in definitions + config = jenv.from_string(txt).render(**definitions) + + # Load the config with definitions again as yaml + yaml = YAML(typ="safe", pure=True).load(config) + + if not isinstance(yaml, Dict): + yaml = {} + + # Inject config path + yaml[ConfigKeys.CONFIGPATH] = config_path + return yaml diff --git a/src/everest/config_keys.py b/src/everest/config_keys.py new file mode 100644 index 00000000000..dc713a32524 --- /dev/null +++ b/src/everest/config_keys.py @@ -0,0 +1,132 @@ +class ConfigKeys: + ABSOLUTE = "absolute" + ALGORITHM = "algorithm" + ALGORITHM_CONST_TOL = "constraint_tolerance" + ALGORITHM_CONV_TOL = "convergence_tolerance" + ALGORITHM_GRAD_SPEC = "speculative" + ALGORITHM_MAX_EVAL = "max_function_evaluations" + ALGORITHM_MAX_ITER = "max_iterations" + ALGORITHM_OUTPUT = "output" + AUTO_NORMALIZE = "auto_normalize" + AUTO_SCALE = "auto_scale" + SCALED_RANGE = "scaled_range" + BATCHES = "batches" + COMPLETION_DATE = "completion_date" + CONFIGPATH = "config_path" + CONTROLS = "controls" + CORES = "cores" + CSV_OUTPUT_FILEPATH = "csv_output_filepath" + CVAR = "cvar" + CVAR_NUMBER_OF_REALIZATIONS = "number_of_realizations" + CVAR_PERCENTILE = "percentile" + DATA_FILE = "data_file" + DATE = "date" + DEFINITIONS = "definitions" + DELETE_RUN_PATH = "delete_run_path" + DISCARD_GRADIENT = "discard_gradient" + DISCARD_REJECTED = "discard_rejected" + DRILL_TIME = "drill_time" + DRILL_DATE = "drill_date" + DRILL_DELAY = "drill_delay" + ECLBASE = "eclbase" + CORES_PER_NODE = "cores_per_node" + ENVIRONMENT = "environment" + EVERSERVER = "server" + EXPORT = "export" + EXTRA_DATA = "extra_data" + EXTERNAL_TAG = "external_tag" + FORWARD_MODEL = "forward_model" + GENERIC_CONTROL = "generic_control" + GRADIENT_REG_TYPE = "gradient_reg_type" + GROUP = "group" + INDEX = "index" + INITIAL_GUESS = "initial_guess" + INITIAL_VALUE = "initial_value" + INPUT = "input" + INPUT_CONSTRAINTS = "input_constraints" + INSTALL_DATA = "install_data" + INSTALL_JOBS = "install_jobs" + INSTALL_TEMPLATES = "install_templates" + JOBNAME = "jobname" + KEYWORDS = "keywords" + LINK = "link" + LOAD = "load" + LOCAL = "local" + LOG_LEVEL = "log_level" + LOWER_BOUND = "lower_bound" + LSF = "lsf" + LSF_OPTIONS = "options" # LSF_RESOURCES + LSF_QUEUE_NAME = "name" + LSF_SERVER = "server" + SLURM = "slurm" + SLURM_QUEUE = "name" + SLURM_SBATCH = "sbatch" + SLURM_SCANCEL = "scancel" + SLURM_SCONTROL = "scontrol" + SLURM_SQUEUE = "squeue" + SLURM_SQUEUE_TIMEOUT = "squeue_timeout" + SLURM_MAX_RUNTIME = "slurm_timeout" + SLURM_MEMORY = "max_memory" + SLURM_MEMORY_PER_CPU = "max_memory_cpu" + SLURM_EXCLUDE_HOST_OPTION = "exclude_host" + SLURM_INCLUDE_HOST_OPTION = "include_host" + MAX = "max" + MAX_RUNTIME = "max_runtime" + MAX_VALUE = "max_value" + MAX_BATCH_NUM = "max_batch_num" + MIN = "min" + MIN_PERT_SUCCESS = "min_pert_success" + MIN_REAL_SUCCESS = "min_realizations_success" + MIN_VALUE = "min_value" + MODEL = "model" + NAME = "name" + NORMALIZATION = "normalization" + OBJECTIVE_FUNCTIONS = "objective_functions" + OBJECTIVE_TYPE = "type" + OBJECTIVE_ALIAS = "alias" + OPTIMIZATION = "optimization" + OPTIMIZER_BACKEND = "backend" + OPTIMIZER_OPTIONS = "options" + OPTIMIZER_BACKEND_OPTIONS = "backend_options" + OPTIMIZER_PARALLEL = "parallel" + SAMPLER = "sampler" + SAMPLER_BACKEND = "backend" + SAMPLER_METHOD = "method" + SAMPLER_SHARED = "shared" + SAMPLER_BACKEND_OPTIONS = "backend_options" + OUTPUT_CONSTRAINTS = "output_constraints" + OUTPUT_DIR = "output_folder" + OUTPUT_FILE = "output_file" + PERT_MAGNITUDE = "perturbation_magnitude" + PERT_TYPE = "perturbation_type" + PERTURBATION_NUM = "perturbation_num" + QUEUE_SYSTEM = "queue_system" + RANDOM_SEED = "random_seed" + REALIZATIONS = "realizations" + REALIZATIONS_WEIGHTS = "realizations_weights" + RELATIVE = "relative" + REPORT_STEPS = "report_steps" + RESUBMIT_LIMIT = "resubmit_limit" + SKIP_EXPORT = "skip_export" + RUN_TEMPLATE = "run_template" + SCALE = "scale" + SCALING = "scaling" + SIMULATION_FOLDER = "simulation_folder" + SIMULATOR = "simulator" + SOURCE = "source" + STORE = "store" + SUMMARY = "summary" + TARGET = "target" + TEMPLATE = "template" + TIME_CORR = "time_correlation" + TIMES_LIST = "times_list" + TYPE = "type" + UPPER_BOUND = "upper_bound" + USER_DEFINED_TYPE = "user_defined_type" + VARIABLES = "variables" + WEIGHT = "weight" + WEIGHTS = "weights" + WELLS = "wells" + WELL_CONTROL = "well_control" + WELL_DRILL = "well_drill" + WELL_ORDER = "well_order" diff --git a/src/everest/data/__init__.py b/src/everest/data/__init__.py new file mode 100644 index 00000000000..9a598959c98 --- /dev/null +++ b/src/everest/data/__init__.py @@ -0,0 +1 @@ +# data package, no code diff --git a/src/everest/data/misc/welopen_format b/src/everest/data/misc/welopen_format new file mode 100644 index 00000000000..861d34243e2 --- /dev/null +++ b/src/everest/data/misc/welopen_format @@ -0,0 +1,3 @@ +WELOPEN + '__NAME__' 'OPEN' / +/ diff --git a/src/everest/data/wizard.yml b/src/everest/data/wizard.yml new file mode 100644 index 00000000000..1a28e14169f --- /dev/null +++ b/src/everest/data/wizard.yml @@ -0,0 +1,26 @@ +controls: [] + +objective_functions: [] + +optimization: + algorithm: optpp_q_newton + +model: + realizations: [] + +install_jobs: + - + name: schmerge + source: /project/res/etc/ERT/Config/jobs/wpro/SCHMERGE + - + name: npv + source: /project/res/etc/ERT/Config/jobs/wpro/NPV + +environment: + simulation_folder: ~ + +install_data: [] + +install_templates: [] + +forward_model: [] diff --git a/src/everest/detached/__init__.py b/src/everest/detached/__init__.py new file mode 100644 index 00000000000..6e526d0ba7d --- /dev/null +++ b/src/everest/detached/__init__.py @@ -0,0 +1,587 @@ +import json +import logging +import os +import re +import time +import traceback +from datetime import datetime +from enum import Enum +from typing import List, Literal, Mapping, Optional, Tuple + +import pkg_resources +import requests +from seba_sqlite.exceptions import ObjectNotFoundError +from seba_sqlite.snapshot import SebaSnapshot + +from ert import BatchContext, BatchSimulator +from ert.config import ErtConfig, QueueSystem +from everest.config import EverestConfig +from everest.config_keys import ConfigKeys as CK +from everest.simulator import JOB_FAILURE, JOB_SUCCESS, Status +from everest.strings import ( + EVEREST, + EVEREST_SERVER_CONFIG, + OPT_PROGRESS_ENDPOINT, + OPT_PROGRESS_ID, + SIM_PROGRESS_ENDPOINT, + SIM_PROGRESS_ID, + SIMULATION_DIR, + STOP_ENDPOINT, +) +from everest.util import configure_logger + +# Specifies how many times to try a http request within the specified timeout. +_HTTP_REQUEST_RETRY = 10 + +# Proxy configuration for outgoing requests. +# For internal LAN HTTP requests not using a proxy is recommended. +PROXY = {"http": None, "https": None} + +# The methods in this file are typically called for the client side. +# Information from the client side is relatively uninteresting, so we show it in +# the default logger (stdout). Info from the server will be logged to the +# everest.log file instead + + +# The Everest server is launched through ert. When running on LSF everything +# works fine. But when running on the local queue (mainly for testing and +# debugging) the ert causes all sorts of problems if the server or the +# context go out of scope. So we keep them alive for now. +# Note that, after the server is stopped (eg by a call to stop_server), the +# context does not immediately terminate. The method _context_stop_and_wait +# stops the context (if available) and waits until the context is terminated +# (to be used typically in tests) +_server = None +_context = None + + +def start_server(config: EverestConfig, ert_config: ErtConfig, storage): + """ + Start an Everest server running the optimization defined in the config + """ + if server_is_running(config): # better safe than sorry + return + + log_dir = config.log_dir + + configure_logger( + name="res", + file_path=os.path.join(log_dir, "everest_server.log"), + log_level=logging.INFO, + log_to_azure=True, + ) + + configure_logger( + name=__name__, + file_path=os.path.join(log_dir, "simulations.log"), + log_level=logging.INFO, + ) + + global _server # noqa: PLW0603 + global _context # noqa: PLW0603 + if _context and _context.running(): + raise RuntimeError( + "Starting two instances of everest server " + "in the same process is not allowed!" + ) + + try: + _save_running_config(config) + except (OSError, LookupError) as e: + logging.getLogger(EVEREST).error( + "Failed to save optimization config: {}".format(e) + ) + + _server = BatchSimulator(ert_config, {}, []) + _context = _server.start("dispatch_server", [(0, {})], storage) + + return _context + + +def _save_running_config(config: EverestConfig): + assert config.output_dir is not None + assert config.config_file is not None + save_config_path = os.path.join(config.output_dir, config.config_file) + config.dump(save_config_path) + + +def context_stop_and_wait(): + global _context # noqa: PLW0602 + if _context: + _context.stop() + while _context.running(): + time.sleep(1) + + +def wait_for_context(): + global _context # noqa: PLW0602 + if _context and _context.running(): + while _context.running(): + time.sleep(1) + + +def stop_server(config: EverestConfig, retries: int = 5): + """ + Stop server if found and it is running. + """ + for retry in range(retries): + try: + url, cert, auth = config.server_context + stop_endpoint = "/".join([url, STOP_ENDPOINT]) + response = requests.post( + stop_endpoint, + verify=cert, + auth=auth, + proxies=PROXY, # type: ignore + ) + response.raise_for_status() + return True + except: + logging.debug(traceback.format_exc()) + time.sleep(retry) + return False + + +def extract_errors_from_file(path: str): + with open(path, "r", encoding="utf-8") as f: + content = f.read() + return re.findall(r"(Error \w+.*)", content) + + +def wait_for_server( + config: EverestConfig, timeout: int, context: Optional[BatchContext] = None +) -> None: + """ + Checks everest server has started _HTTP_REQUEST_RETRY times. Waits + progressively longer between each check. + + Raise an exception when the timeout is reached. + """ + if not server_is_running(config): + sleep_time_increment = float(timeout) / (2**_HTTP_REQUEST_RETRY - 1) + for retry_count in range(_HTTP_REQUEST_RETRY): + # Failure may occur before contact with the server is established: + status = everserver_status(config) + if status["status"] == ServerStatus.completed: + # For very small cases the optimization will finish and bring down the + # server before we can verify that it is running. + return + + if status["status"] == ServerStatus.failed: + raise SystemExit( + "Failed to start Everest with error:\n{}".format(status["message"]) + ) + # Job queueing may fail: + if context is not None and context.has_job_failed(0): + path = context.job_progress(0).steps[0].std_err_file + for err in extract_errors_from_file(path): + update_everserver_status(config, ServerStatus.failed, message=err) + logging.error(err) + raise SystemExit("Failed to start Everest server.") + sleep_time = sleep_time_increment * (2**retry_count) + time.sleep(sleep_time) + if server_is_running(config): + return + + # If number of retries reached and server is not running - throw exception + if not server_is_running(config): + raise Exception("Failed to start server within configured timeout.") + + +def get_sim_status(config: EverestConfig): + """Retrieve a seba database snapshot and return a list of simulation + information objects for each of the available batches in the database + + Example: [{progress: [[{'start_time': u'Thu, 16 May 2019 16:53:20 UTC', + 'end_time': u'Thu, 16 May 2019 16:53:20 UTC', + 'status': JOB_SUCCESS}]], + 'batch_number': 0, + 'event': 'update'}, ..] + """ + + seba_snapshot = SebaSnapshot(config.optimization_output_dir) + snapshot = seba_snapshot.get_snapshot() + + def timestamp2str(timestamp): + if timestamp: + return "{} UTC".format( + datetime.fromtimestamp(timestamp).strftime("%a, %d %b %Y %H:%M:%S %Z") + ) + else: + return None + + sim_progress: dict = {} + for sim in snapshot.simulation_data: + sim_metadata = { + "start_time": timestamp2str(sim.start_time), + "end_time": timestamp2str(sim.end_time), + "realization": sim.realization, + "simulation": sim.simulation, + "status": JOB_SUCCESS if sim.success else JOB_FAILURE, + } + if sim.batch in sim_progress: + sim_progress[sim.batch]["progress"].append([sim_metadata]) + else: + sim_progress[sim.batch] = { + "progress": [[sim_metadata]], + "batch_number": sim.batch, + "event": "update", + } + for status in sim_progress.values(): + fm_runs = len(status["progress"]) + failed = sum( + fm_run[0]["status"] == JOB_FAILURE for fm_run in status["progress"] + ) + status.update( + { + "status": Status( + waiting=0, + pending=0, + running=0, + failed=failed, + complete=fm_runs - failed, + ) + } + ) + + return list(sim_progress.values()) + + +def get_opt_status(output_folder): + """Retrieve a seba database snapshot and return a dictionary with + optimization information.""" + if not os.path.exists(os.path.join(output_folder, "seba.db")): + return {} + try: + seba_snapshot = SebaSnapshot(output_folder) + except ObjectNotFoundError: + return {} + snapshot = seba_snapshot.get_snapshot(filter_out_gradient=True) + + cli_monitor_data = {} + if snapshot.optimization_data: + cli_monitor_data = { + "batches": [item.batch_id for item in snapshot.optimization_data], + "controls": [item.controls for item in snapshot.optimization_data], + "objective_value": [ + item.objective_value for item in snapshot.optimization_data + ], + "expected_objectives": snapshot.expected_objectives, + } + + return { + "objective_history": snapshot.expected_single_objective, + "control_history": snapshot.optimization_controls, + "objectives_history": snapshot.expected_objectives, + "accepted_control_indices": snapshot.increased_merit_indices, + "cli_monitor_data": cli_monitor_data, + } + + +def wait_for_server_to_stop(config: EverestConfig, timeout): + """ + Checks everest server has stoped _HTTP_REQUEST_RETRY times. Waits + progressively longer between each check. + + Raise an exception when the timeout is reached. + """ + if server_is_running(config): + sleep_time_increment = float(timeout) / (2**_HTTP_REQUEST_RETRY - 1) + for retry_count in range(_HTTP_REQUEST_RETRY): + sleep_time = sleep_time_increment * (2**retry_count) + time.sleep(sleep_time) + if not server_is_running(config): + return + + # If number of retries reached and server still running - throw exception + if server_is_running(config): + raise Exception("Failed to stop server within configured timeout.") + + +def server_is_running(config: EverestConfig): + try: + url, cert, auth = config.server_context + response = requests.get( + url, + verify=cert, + auth=auth, + timeout=1, + proxies=PROXY, # type: ignore + ) + response.raise_for_status() + except: + logging.debug(traceback.format_exc()) + return False + return True + + +def get_optimization_status(config: EverestConfig): + seba_snapshot = SebaSnapshot(config.optimization_output_dir) + snapshot = seba_snapshot.get_snapshot(filter_out_gradient=True) + + return { + "objective_history": snapshot.expected_single_objective, + "control_history": snapshot.optimization_controls, + } + + +def start_monitor(config: EverestConfig, callback, polling_interval=5): + """ + Checks status on Everest server and calls callback when status changes + + Monitoring stops when the server stops answering. It can also be + interrupted by returning True from the callback + """ + url, cert, auth = config.server_context + sim_endpoint = "/".join([url, SIM_PROGRESS_ENDPOINT]) + opt_endpoint = "/".join([url, OPT_PROGRESS_ENDPOINT]) + + sim_status: dict = {} + opt_status: dict = {} + stop = False + + try: + while not stop: + new_sim_status = _query_server(cert, auth, sim_endpoint) + if new_sim_status != sim_status: + sim_status = new_sim_status + ret = bool(callback({SIM_PROGRESS_ID: sim_status})) + stop |= ret + # When the API will support it query only from a certain batch on + + # Check the optimization status + new_opt_status = _query_server(cert, auth, opt_endpoint) + if new_opt_status != opt_status: + opt_status = new_opt_status + ret = bool(callback({OPT_PROGRESS_ID: opt_status})) + stop |= ret + time.sleep(polling_interval) + except: + logging.debug(traceback.format_exc()) + + +_EVERSERVER_JOB_PATH = pkg_resources.resource_filename( + "everest.detached", os.path.join("jobs", EVEREST_SERVER_CONFIG) +) + +_QUEUE_SYSTEMS: Mapping[Literal["LSF", "SLURM"], dict] = { + "LSF": { + "options": [(CK.LSF_OPTIONS, "LSF_RESOURCE")], + "name": "LSF_QUEUE", + }, + "SLURM": { + "options": [ + (CK.SLURM_EXCLUDE_HOST_OPTION, "EXCLUDE_HOST"), + (CK.SLURM_INCLUDE_HOST_OPTION, "INCLUDE_HOST"), + ], + "name": "PARTITION", + }, +} + + +def _add_simulator_defaults( + options, + config: EverestConfig, + queue_options: List[Tuple[str, str]], + queue_system: Literal["LSF", "SLURM"], +): + simulator_options = ( + config.simulator.extract_ert_queue_options( + queue_system=queue_system, everest_to_ert_key_tuples=queue_options + ) + if config.simulator is not None + else [] + ) + + option_names = [option[1] for option in options] + simulator_option_names = [option[1] for option in simulator_options] + options.extend( + simulator_options[simulator_option_names.index(res_key)] + for _, res_key in queue_options + if res_key not in option_names and res_key in simulator_option_names + ) + return options + + +def _generate_queue_options( + config: EverestConfig, + queue_options: List[Tuple[str, str]], + res_queue_name: str, # Literal["LSF_QUEUE", "PARTITION"]? + queue_system: Literal["LSF", "SLURM"], +): + queue_name_simulator = ( + config.simulator.name if config.simulator is not None else None + ) + + queue_name = config.server.name if config.server is not None else None + + if queue_name is None: + queue_name = queue_name_simulator + + options = ( + config.server.extract_ert_queue_options( + queue_system=queue_system, everest_to_ert_key_tuples=queue_options + ) + if config.server is not None + else [(queue_system, "MAX_RUNNING", 1)] + ) + + if queue_name: + options.append( + ( + queue_system, + res_queue_name, + queue_name, + ), + ) + # Inherit the include/exclude_host from the simulator config entry, if necessary. + # Currently this is only used by the slurm driver. + if queue_system == "SLURM": + options = _add_simulator_defaults(options, config, queue_options, queue_system) + return options + + +def _find_res_queue_system(config: EverestConfig): + queue_system_simulator: Literal["lsf", "local", "slurm"] = "local" + if config.simulator is not None: + queue_system_simulator = config.simulator.queue_system or queue_system_simulator + + queue_system = queue_system_simulator + if config.server is not None: + queue_system = config.server.queue_system or queue_system + + if queue_system_simulator == CK.LOCAL and queue_system_simulator != queue_system: + raise ValueError( + f"The simulator is using {CK.LOCAL} as queue system " + f"while the everest server is using {queue_system}. " + f"If the simulator is using {CK.LOCAL}, so must the everest server." + ) + + assert queue_system is not None + return QueueSystem(queue_system.upper()) + + +def generate_everserver_ert_config(config: EverestConfig, debug_mode: bool = False): + assert config.config_directory is not None + assert config.config_file is not None + + site_config = ErtConfig.read_site_config() + abs_everest_config = os.path.join(config.config_directory, config.config_file) + detached_node_dir = config.detached_node_dir + simulation_path = os.path.join(detached_node_dir, SIMULATION_DIR) + queue_system = _find_res_queue_system(config) + arg_list = ["--config-file", abs_everest_config] + if debug_mode: + arg_list.append("--debug") + + everserver_config = {} if site_config is None else site_config + everserver_config.update( + { + "RUNPATH": simulation_path, + "JOBNAME": EVEREST_SERVER_CONFIG, + "NUM_REALIZATIONS": 1, + "MAX_SUBMIT": 1, + "ENSPATH": os.path.join(detached_node_dir, EVEREST_SERVER_CONFIG), + "RUNPATH_FILE": os.path.join(detached_node_dir, ".res_runpath_list"), + } + ) + install_job = everserver_config.get("INSTALL_JOB", []) + install_job.append((EVEREST_SERVER_CONFIG, _EVERSERVER_JOB_PATH)) + everserver_config["INSTALL_JOB"] = install_job + + simulation_job = everserver_config.get("SIMULATION_JOB", []) + simulation_job.append([EVEREST_SERVER_CONFIG, *arg_list]) + everserver_config["SIMULATION_JOB"] = simulation_job + + if queue_system in _QUEUE_SYSTEMS: + everserver_config["QUEUE_SYSTEM"] = queue_system + queue_options = _generate_queue_options( + config, + _QUEUE_SYSTEMS[queue_system]["options"], + _QUEUE_SYSTEMS[queue_system]["name"], + queue_system, + ) + if queue_options: + everserver_config.setdefault("QUEUE_OPTION", []).extend(queue_options) + else: + everserver_config["QUEUE_SYSTEM"] = queue_system + + return everserver_config + + +def _query_server(cert, auth, endpoint): + """Retrieve data from an endpoint as a dictionary""" + response = requests.get(endpoint, verify=cert, auth=auth, proxies=PROXY) + response.raise_for_status() + return response.json() + + +class ServerStatus(Enum): + """Keep track of the different states the everest server is in""" + + starting = 1 + running = 2 + exporting_to_csv = 3 + completed = 4 + stopped = 5 + failed = 6 + never_run = 7 + + +class ServerStatusEncoder(json.JSONEncoder): + """Facilitates encoding and decoding the server status enum object to + and from a json file""" + + def default(self, o): + if type(o) is ServerStatus: + return {"__enum__": str(o)} + return json.JSONEncoder.default(self, o) + + @staticmethod + def decode(obj): + if "__enum__" in obj: + _, member = obj["__enum__"].split(".") + return getattr(ServerStatus, member) + else: + return obj + + +def update_everserver_status( + config: EverestConfig, status: ServerStatus, message: Optional[str] = None +): + """Update the everest server status with new status information""" + new_status = {"status": status, "message": message} + path = config.everserver_status_path + if not os.path.exists(os.path.dirname(path)): + os.makedirs(os.path.dirname(path)) + with open(path, "w", encoding="utf-8") as outfile: + json.dump(new_status, outfile, cls=ServerStatusEncoder) + elif os.path.exists(path): + server_status = everserver_status(config) + if server_status["message"] is not None: + if message is not None: + new_status["message"] = "{}\n{}".format( + server_status["message"], message + ) + else: + new_status["message"] = server_status["message"] + with open(path, "w", encoding="utf-8") as outfile: + json.dump(new_status, outfile, cls=ServerStatusEncoder) + + +def everserver_status(config: EverestConfig): + """Returns a dictionary representing the everest server status. If the + status file is not found we assume the server has never ran before, and will + return a status of ServerStatus.never_run + + Example: { + 'status': ServerStatus.completed + 'message': None + } + """ + path = config.everserver_status_path + if os.path.exists(path): + with open(path, "r", encoding="utf-8") as f: + return json.load(f, object_hook=ServerStatusEncoder.decode) + else: + return {"status": ServerStatus.never_run, "message": None} diff --git a/src/everest/detached/jobs/__init__.py b/src/everest/detached/jobs/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/everest/detached/jobs/everserver.py b/src/everest/detached/jobs/everserver.py new file mode 100755 index 00000000000..69b9b4454d5 --- /dev/null +++ b/src/everest/detached/jobs/everserver.py @@ -0,0 +1,411 @@ +import argparse +import json +import logging +import os +import socket +import ssl +import threading +import traceback +from base64 import b64encode +from datetime import datetime, timedelta +from functools import partial, wraps + +from cryptography import x509 +from cryptography.hazmat.backends import default_backend +from cryptography.hazmat.primitives import hashes, serialization +from cryptography.hazmat.primitives.asymmetric import rsa +from cryptography.x509.oid import NameOID +from dns import resolver, reversename +from flask import Flask, Response, jsonify, request +from ropt.enums import OptimizerExitCode + +from everest import export_to_csv, start_optimization, validate_export +from everest.config import EverestConfig +from everest.detached import ServerStatus, get_opt_status, update_everserver_status +from everest.simulator import JOB_FAILURE +from everest.strings import ( + EVEREST, + OPT_FAILURE_REALIZATIONS, + OPT_PROGRESS_ENDPOINT, + SIM_PROGRESS_ENDPOINT, + STOP_ENDPOINT, +) +from everest.util import configure_logger, makedirs_if_needed, version_info + + +def get_machine_name(): + """Returns a name that can be used to identify this machine in a network + + A fully qualified domain name is returned if available. Otherwise returns + the string `localhost` + """ + hostname = socket.gethostname() + try: + # We need the ip-address to perform a reverse lookup to deal with + # differences in how the clusters are getting their fqdn's + ip_addr = socket.gethostbyname(hostname) + reverse_name = reversename.from_address(ip_addr) + resolved_hosts = [ + str(ptr_record).rstrip(".") + for ptr_record in resolver.resolve(reverse_name, "PTR") + ] + resolved_hosts.sort() + return resolved_hosts[0] + except (resolver.NXDOMAIN, resolver.NoResolverConfiguration): + # If local address and reverse lookup not working - fallback + # to socket fqdn which are using /etc/hosts to retrieve this name + return socket.getfqdn() + except socket.gaierror: + logging.debug(traceback.format_exc()) + return "localhost" + + +def _sim_monitor(context_status, event=None, shared_data=None): + status = context_status["status"] + shared_data[SIM_PROGRESS_ENDPOINT] = { + "batch_number": context_status["batch_number"], + "status": { + "running": status.running, + "waiting": status.waiting, + "pending": status.pending, + "complete": status.complete, + "failed": status.failed, + }, + "progress": context_status["progress"], + "event": event, + } + + if shared_data[STOP_ENDPOINT]: + return "stop_queue" + + +def _opt_monitor(shared_data=None): + if shared_data[STOP_ENDPOINT]: + return "stop_optimization" + + +def _everserver_thread(shared_data, server_config): + app = Flask(__name__) + + def check_user(password): + return password == server_config["authentication"] + + def requires_authenticated(f): + @wraps(f) + def decorated(*args, **kwargs): + auth = request.authorization + if not auth or not check_user(auth.password): + return "unauthorized", 401 + return f(*args, **kwargs) + + return decorated + + def log(f): + @wraps(f) + def decorated(*args, **kwargs): + url = request.path + method = request.method + ip = request.environ.get("HTTP_X_REAL_IP", request.remote_addr) + logging.getLogger("everserver").info( + "{} entered from {} with HTTP {}".format(url, ip, method) + ) + return f(*args, **kwargs) + + return decorated + + @app.route("/") + @requires_authenticated + @log + def get_home(): + return "Everest is running" + + @app.route("/" + STOP_ENDPOINT, methods=["POST"]) + @requires_authenticated + @log + def stop(): + shared_data[STOP_ENDPOINT] = True + return Response("Raise STOP flag succeeded. Everest initiates shutdown..", 200) + + @app.route("/" + SIM_PROGRESS_ENDPOINT) + @requires_authenticated + @log + def get_sim_progress(): + return jsonify(shared_data[SIM_PROGRESS_ENDPOINT]) + + @app.route("/" + OPT_PROGRESS_ENDPOINT) + @requires_authenticated + @log + def get_opt_progress(): + progress = get_opt_status(server_config["optimization_output_dir"]) + return jsonify(progress) + + ctx = ssl.SSLContext(ssl.PROTOCOL_SSLv23) + ctx.load_cert_chain( + server_config["cert_path"], + server_config["key_path"], + server_config["key_passwd"], + ) + app.run(host="0.0.0.0", port=server_config["port"], ssl_context=ctx) + + +def _find_open_port(host, lower, upper): + for port in range(lower, upper): + try: + sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + sock.bind((host, port)) + sock.close() + return port + except socket.error: + logging.getLogger("everserver").info( + "Port {} for host {} is taken".format(port, host) + ) + msg = "No open port for host {} in the range {}-{}".format(host, lower, upper) + logging.getLogger("everserver").exception(msg) + raise Exception(msg) + + +def _write_hostfile(config: EverestConfig, host, port, cert, auth): + host_file_path = config.hostfile_path + if not os.path.exists(os.path.dirname(host_file_path)): + os.makedirs(os.path.dirname(host_file_path)) + data = { + "host": host, + "port": port, + "cert": cert, + "auth": auth, + } + json_string = json.dumps(data) + + with open(host_file_path, "w", encoding="utf-8") as f: + f.write(json_string) + + +def _configure_loggers(config: EverestConfig): + detached_node_dir = config.detached_node_dir + everest_logs_dir = config.log_dir + + configure_logger( + name="res", + file_path=os.path.join(detached_node_dir, "simulations.log"), + log_level=logging.INFO, + ) + + configure_logger( + name="everserver", + file_path=os.path.join(detached_node_dir, "endpoint.log"), + log_level=logging.INFO, + ) + + configure_logger( + name=EVEREST, + file_path=os.path.join(everest_logs_dir, "everest.log"), + log_level=config.logging_level, + log_to_azure=True, + ) + + configure_logger( + name="forward_models", + file_path=os.path.join(everest_logs_dir, "forward_models.log"), + log_level=config.logging_level, + ) + + configure_logger( + name="ropt", + file_path=os.path.join(everest_logs_dir, "ropt.log"), + log_level=config.logging_level, + ) + + +def main(): + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument("--config-file", type=str) + arg_parser.add_argument("--debug", action="store_true") + options = arg_parser.parse_args() + config = EverestConfig.load_file(options.config_file) + if options.debug: + config.logging_level = "debug" + + try: + _configure_loggers(config) + update_everserver_status(config, ServerStatus.starting) + logging.getLogger(EVEREST).info(version_info()) + logging.getLogger(EVEREST).info( + "Output directory: {}".format(config.output_dir) + ) + logging.getLogger(EVEREST).debug(str(options)) + + authentication = _generate_authentication() + cert_path, key_path, key_pw = _generate_certificate(config) + host = get_machine_name() + port = _find_open_port(host, lower=5000, upper=5800) + _write_hostfile(config, host, port, cert_path, authentication) + + shared_data = { + SIM_PROGRESS_ENDPOINT: {}, + STOP_ENDPOINT: False, + } + + server_config = { + "optimization_output_dir": config.optimization_output_dir, + "port": port, + "cert_path": cert_path, + "key_path": key_path, + "key_passwd": key_pw, + "authentication": authentication, + } + + everserver_instance = threading.Thread( + target=_everserver_thread, + args=(shared_data, server_config), + ) + everserver_instance.daemon = True + everserver_instance.start() + except: + update_everserver_status( + config, ServerStatus.failed, message=traceback.format_exc() + ) + return + + try: + update_everserver_status(config, ServerStatus.running) + exit_code = start_optimization( + config, + simulation_callback=partial(_sim_monitor, shared_data=shared_data), + optimization_callback=partial(_opt_monitor, shared_data=shared_data), + ) + status, message = _get_optimization_status(exit_code, shared_data) + if status != ServerStatus.completed: + update_everserver_status(config, status, message) + return + except: + if shared_data[STOP_ENDPOINT]: + update_everserver_status( + config, ServerStatus.stopped, message="Optimization aborted." + ) + else: + update_everserver_status( + config, ServerStatus.failed, message=traceback.format_exc() + ) + return + + try: + # Exporting data + update_everserver_status(config, ServerStatus.exporting_to_csv) + err_msgs, export_ecl = validate_export(config) + for msg in err_msgs: + logging.getLogger(EVEREST).warning(msg) + export_to_csv(config, export_ecl=export_ecl) + except: + update_everserver_status( + config, ServerStatus.failed, message=traceback.format_exc() + ) + return + + update_everserver_status(config, ServerStatus.completed, message=message) + + +def _get_optimization_status(exit_code, shared_data): + if exit_code == "max_batch_num_reached": + return ServerStatus.completed, "Maximum number of batches reached." + + if exit_code == OptimizerExitCode.MAX_FUNCTIONS_REACHED: + return ServerStatus.completed, "Maximum number of function evaluations reached." + + if exit_code == OptimizerExitCode.USER_ABORT: + return ServerStatus.stopped, "Optimization aborted." + + if exit_code == OptimizerExitCode.TOO_FEW_REALIZATIONS: + status = ( + ServerStatus.stopped if shared_data[STOP_ENDPOINT] else ServerStatus.failed + ) + messages = _failed_realizations_messages(shared_data) + for msg in messages: + logging.getLogger(EVEREST).error(msg) + return status, "\n".join(messages) + + return ServerStatus.completed, "Optimization completed." + + +def _failed_realizations_messages(shared_data): + messages = [OPT_FAILURE_REALIZATIONS] + failed = shared_data[SIM_PROGRESS_ENDPOINT]["status"]["failed"] + if failed > 0: + # Find the set of jobs that failed. To keep the order in which they + # are found in the queue, use a dict as sets are not ordered. + failed_jobs = dict.fromkeys( + ( + job["name"] + for queue in shared_data[SIM_PROGRESS_ENDPOINT]["progress"] + for job in queue + if job["status"] == JOB_FAILURE + ) + ).keys() + messages.append( + "{} job failures caused by: {}".format(failed, ", ".join(failed_jobs)) + ) + return messages + + +def _generate_certificate(config: EverestConfig): + """Generate a private key and a certificate signed with it + + Both the certificate and the key are written to files in the folder given + by `get_certificate_dir(config)`. The key is encrypted before being + stored. + Returns the path to the certificate file, the path to the key file, and + the password used for encrypting the key + """ + # Generate private key + key = rsa.generate_private_key( + public_exponent=65537, key_size=4096, backend=default_backend() + ) + + # Generate the certificate and sign it with the private key + cert_name = get_machine_name() + subject = issuer = x509.Name( + [ + x509.NameAttribute(NameOID.COUNTRY_NAME, "NO"), + x509.NameAttribute(NameOID.STATE_OR_PROVINCE_NAME, "Bergen"), + x509.NameAttribute(NameOID.LOCALITY_NAME, "Sandsli"), + x509.NameAttribute(NameOID.ORGANIZATION_NAME, "Equinor"), + x509.NameAttribute(NameOID.COMMON_NAME, "{}".format(cert_name)), + ] + ) + cert = ( + x509.CertificateBuilder() + .subject_name(subject) + .issuer_name(issuer) + .public_key(key.public_key()) + .serial_number(x509.random_serial_number()) + .not_valid_before(datetime.utcnow()) + .not_valid_after(datetime.utcnow() + timedelta(days=365)) # 1 year + .add_extension( + x509.SubjectAlternativeName([x509.DNSName("{}".format(cert_name))]), + critical=False, + ) + .sign(key, hashes.SHA256(), default_backend()) + ) + + # Write certificate and key to disk + cert_folder = config.certificate_dir + makedirs_if_needed(cert_folder) + cert_path = os.path.join(cert_folder, cert_name + ".crt") + with open(cert_path, "wb") as f: + f.write(cert.public_bytes(serialization.Encoding.PEM)) + key_path = os.path.join(cert_folder, cert_name + ".key") + pw = bytes(os.urandom(28)) + with open(key_path, "wb") as f: + f.write( + key.private_bytes( + encoding=serialization.Encoding.PEM, + format=serialization.PrivateFormat.TraditionalOpenSSL, + encryption_algorithm=serialization.BestAvailableEncryption(pw), + ) + ) + return cert_path, key_path, pw + + +def _generate_authentication(): + n_bytes = 128 + random_bytes = bytes(os.urandom(n_bytes)) + return b64encode(random_bytes).decode("utf-8") diff --git a/src/everest/detached/jobs/everserver_config b/src/everest/detached/jobs/everserver_config new file mode 100755 index 00000000000..aee9d30592f --- /dev/null +++ b/src/everest/detached/jobs/everserver_config @@ -0,0 +1,4 @@ +EXECUTABLE everserver + +STDOUT ../../logs/everest_server.stdout +STDERR ../../logs/everest_server.stderr diff --git a/src/everest/docs/__init__.py b/src/everest/docs/__init__.py new file mode 100644 index 00000000000..38c1330a664 --- /dev/null +++ b/src/everest/docs/__init__.py @@ -0,0 +1,3 @@ +from everest.docs.generate_docs_from_config_spec import generate_docs_pydantic_to_rst + +__all__ = ["generate_docs_pydantic_to_rst"] diff --git a/src/everest/docs/__main__.py b/src/everest/docs/__main__.py new file mode 100644 index 00000000000..d25347ffaee --- /dev/null +++ b/src/everest/docs/__main__.py @@ -0,0 +1,16 @@ +import os + +from tests.everest.utils import relpath + +from everest.docs.generate_docs_from_config_spec import generate_docs_pydantic_to_rst + +committed_file = os.path.abspath( + relpath("..", "..", "docs", "everest", "config_generated.rst") +) + +print(f"Writing new docs contents to {committed_file}") +docs_content = generate_docs_pydantic_to_rst() +with open(committed_file, "w", encoding="utf-8") as fp: + fp.write(docs_content) + +print(f"Writing updated docs to {committed_file} complete, you may now commit it.") diff --git a/src/everest/docs/generate_docs_from_config_spec.py b/src/everest/docs/generate_docs_from_config_spec.py new file mode 100644 index 00000000000..766bc9dbf89 --- /dev/null +++ b/src/everest/docs/generate_docs_from_config_spec.py @@ -0,0 +1,206 @@ +import dataclasses +import inspect +import re +import sys +from typing import Dict, List, Optional + +from pydantic.fields import FieldInfo + +from everest.config import EverestConfig + +CONFIGS = { + name: obj + for name, obj in inspect.getmembers(sys.modules["everest.config"]) + if inspect.isclass(obj) +} + + +@dataclasses.dataclass +class ParsedField: + name: str + description: str + type: str + is_required: bool + subfields: Optional[List["ParsedField"]] + + def doc_title(self) -> str: + return f"{self.name} ({'required' if self.is_required else 'optional'})" + + def doc_description(self) -> str: + lines = self.description.splitlines() + + return "\n".join( + [ + (line if line.startswith("|") else " ".join(line.split())) + for line in lines + ] + ) + + def clean_type(self) -> str: + if sys.version_info < (3, 10): + self.type = self.type.replace("Annotated[int, Ge(ge=0)]", "NonNegativeInt") + self.type = self.type.replace("Annotated[int, Gt(gt=0)]", "PositiveInt") + self.type = self.type.replace("Annotated[float, Gt(gt=0)]", "PositiveFloat") + self.type = re.sub(r"Union\[(.+),\s+NoneType\]", r"Optional[\1]", self.type) + + self.type = self.type.replace("Annotated[int, Ge]", "NonNegativeInt") + self.type = self.type.replace("Annotated[int, Gt]", "PositiveInt") + self.type = self.type.replace("Annotated[float, Gt]", "PositiveFloat") + self.type = self.type.replace("Dict[", "Mapping[") + + self.type = re.sub(r"Union\[(.+),\s+NoneType\]", r"Optional[\1]", self.type) + return self.type + + +def parse_field_info(field_infos: Dict[str, FieldInfo]): + """ + Extracts relevant info from a list of pydantic model fields into a convenient + format of ParsedField items, to be used for further generation of docs + """ + parsed_fields = [] + for name, model_field in field_infos.items(): + annotation = str(dict(model_field.__repr_args__()).get("annotation")) + parsed_subfields = None + try: + if model_field.annotation is not None and hasattr( + model_field.annotation, "model_fields" + ): + subfields = model_field.annotation.model_fields + parsed_subfields = parse_field_info(subfields) + elif "everest.config" in str(model_field.annotation): + for cls_name, value in CONFIGS.items(): + if cls_name in annotation: + subfields = value.model_fields + annotation = re.sub( + r"List\[(.*)\.(\w+)\]", r"List[\2]", annotation + ) + parsed_subfields = parse_field_info(subfields) + + except Exception: + # If it failed, we simply assume the field was a str, int, float etc. + pass + + parsed_fields.append( + ParsedField( + name=name, + description=model_field.description or "", + type=annotation, + is_required=model_field.is_required(), + subfields=parsed_subfields, + ) + ) + + return parsed_fields + + +class DocBuilder: + def __init__(self, extended: bool): + self.doc = "" + self.extended = extended + + @staticmethod + def _box_doc(msg, level): + def indent(line): + return " " * (2 * level) + f"| {line}" + + if not msg: + return "" + lines = msg.split("\n") + + return "\n".join(map(indent, map(str.strip, lines))) + + @staticmethod + def _indent(text: str, level: int): + stripped_lines = [line.strip() for line in text.split("\n")] + if level > 0: + stripped_lines = [ + " " * (level - 1) + line if line else "" for line in stripped_lines + ] + + return "\n".join(stripped_lines) + + def add_title(self, title: str, level: int): + if level == 0: + self.doc += title + "\n" + self.doc += "-" * len(title) + else: + self.doc += self._indent(f"**{title}**", level) + + def add_description(self, description: str, level: int): + if self.extended: + self.doc += self._indent( + text=self._box_doc(f"\nDocumentation: {description}\n", level), + level=level, + ) + else: + self.doc += self._indent(description, level) + + self.doc += "\n" + + def add_type(self, type: str, level: int): + self.doc += self._indent(f"Type: *{type}*", level) + self.doc += "\n" + + def add_newline(self): + self.doc += "\n" + + +def _generate_rst( + parsed_fields: List[ParsedField], + level: int = 0, + builder: Optional[DocBuilder] = None, + extended=False, +): + if not builder: + builder = DocBuilder(extended=extended) + + for f in parsed_fields: + builder.add_title(title=f.doc_title(), level=level) + builder.add_newline() + + builder.add_type(f.clean_type(), level=level + 1) + builder.add_newline() + + builder.add_description(f.doc_description(), level=level + 1) + builder.add_newline() + + if f.subfields: + _generate_rst(f.subfields, level=level + 1, builder=builder) + + builder.add_newline() + + return builder + + +def generate_docs_pydantic_to_rst(extended: bool = False): + order = ( + "name", + "model", + "controls", + "optimization", + "objective_functions", + "environment", + "wells", + "input_constraints", + "output_constraints", + "simulator", + "install_jobs", + "install_workflow_jobs", + "install_data", + "install_templates", + "forward_model", + "workflows", + "source", + "target", + "template", + "server", + "export", + "definitions", + ) + + fields = EverestConfig.model_fields + list_of_fields = {n: fields[n] for n in order if n in fields} + + parsed_field_info = parse_field_info(list_of_fields) + + return _generate_rst(parsed_field_info, extended=extended).doc.strip() + "\n" diff --git a/src/everest/export.py b/src/everest/export.py new file mode 100644 index 00000000000..4740b1d3c17 --- /dev/null +++ b/src/everest/export.py @@ -0,0 +1,346 @@ +import os +import re +import sys +from typing import Any, Dict, List, Optional, Set + +import pandas as pd +from pandas import DataFrame +from seba_sqlite.snapshot import SebaSnapshot + +from ert.storage import open_storage +from everest.config import EverestConfig +from everest.strings import STORAGE_DIR + +if sys.version_info < (3, 11): + from enum import Enum + + class StrEnum(str, Enum): + pass + +else: + from enum import StrEnum + + +class MetaDataColumnNames(StrEnum): + # NOTE: Always add a new column name to the list below! + BATCH = "batch" + REALIZATION = "realization" + REALIZATION_WEIGHT = "realization_weight" + SIMULATION = "simulation" + IS_GRADIENT = "is_gradient" + SUCCESS = "success" + START_TIME = "start_time" + END_TIME = "end_time" + SIM_AVERAGED_OBJECTIVE = "sim_avg_obj" + REAL_AVERAGED_OBJECTIVE = "real_avg_obj" + SIMULATED_DATE = "sim_date" + INCREASED_MERIT = "increased_merit" + + @classmethod + def get_all(cls): + return [ + cls.BATCH, + cls.REALIZATION, + cls.REALIZATION_WEIGHT, + cls.SIMULATION, + cls.IS_GRADIENT, + cls.SUCCESS, + cls.START_TIME, + cls.END_TIME, + cls.SIM_AVERAGED_OBJECTIVE, + cls.REAL_AVERAGED_OBJECTIVE, + cls.SIMULATED_DATE, + cls.INCREASED_MERIT, + ] + + +def filter_data(data: DataFrame, keyword_filters: Set[str]): + filtered_columns = [] + + for col in data.columns: + for expr in keyword_filters: + expr = expr.replace("*", ".*") + if re.match(expr, col) is not None: + filtered_columns.append(col) + + return data[filtered_columns] + + +def _valid_batches(batches: List[int], config: EverestConfig): + snapshot = SebaSnapshot(config.optimization_output_dir).get_snapshot( + filter_out_gradient=False, batches=None + ) + available_batches = {data.batch for data in snapshot.simulation_data} + valid_batches = [batch for batch in batches if batch in available_batches] + return valid_batches + + +def _metadata(config: EverestConfig): + discard_gradient = True + discard_rejected = True + batches = None + + if config.export is not None: + if config.export.discard_gradient is not None: + discard_gradient = config.export.discard_gradient + + if config.export.discard_rejected is not None: + discard_rejected = config.export.discard_rejected + + if config.export.batches: + # If user defined batches to export in the conf file, ignore previously + # discard gradient and discard rejected flags if defined and true + discard_rejected = False + discard_gradient = False + batches = config.export.batches + + snapshot = SebaSnapshot(config.optimization_output_dir).get_snapshot( + filter_out_gradient=discard_gradient, + batches=batches, + ) + + opt_data = snapshot.optimization_data_by_batch + metadata = [] + for data in snapshot.simulation_data: + # If export section not defined in the config file export only increased + # merit non-gradient simulation results + if ( + discard_rejected + and data.batch in opt_data + and opt_data[data.batch].merit_flag != 1 + ): + continue + + md_row: Dict[str, Any] = { + MetaDataColumnNames.BATCH: data.batch, + MetaDataColumnNames.SIM_AVERAGED_OBJECTIVE: data.sim_avg_obj, + MetaDataColumnNames.IS_GRADIENT: data.is_gradient, + MetaDataColumnNames.REALIZATION: int(data.realization), + MetaDataColumnNames.START_TIME: data.start_time, + MetaDataColumnNames.END_TIME: data.end_time, + MetaDataColumnNames.SUCCESS: data.success, + MetaDataColumnNames.REALIZATION_WEIGHT: data.realization_weight, + MetaDataColumnNames.SIMULATION: int(data.simulation), + } + if data.objectives: + md_row.update(data.objectives) + if data.constraints: + md_row.update(data.constraints) + if data.controls: + md_row.update(data.controls) + + if not md_row[MetaDataColumnNames.IS_GRADIENT]: + if md_row[MetaDataColumnNames.BATCH] in opt_data: + opt = opt_data[md_row[MetaDataColumnNames.BATCH]] + md_row.update( + { + MetaDataColumnNames.REAL_AVERAGED_OBJECTIVE: opt.objective_value, + MetaDataColumnNames.INCREASED_MERIT: opt.merit_flag, + } + ) + for function, gradients in opt.gradient_info.items(): + for control, gradient_value in gradients.items(): + md_row.update( + {"gradient-{}-{}".format(function, control): gradient_value} + ) + else: + print( + "Batch {} has no available optimization data".format( + md_row[MetaDataColumnNames.BATCH] + ) + ) + metadata.append(md_row) + + return metadata + + +def get_internalized_keys(config: EverestConfig, batch_ids: Optional[Set[int]] = None): + if batch_ids is None: + metadata = _metadata(config) + batch_ids = {data[MetaDataColumnNames.BATCH] for data in metadata} + internal_keys: Set = set() + with open_storage(config.storage_dir, "r") as storage: + for batch_id in batch_ids: + case_name = f"batch_{batch_id}" + experiment = storage.get_experiment_by_name(f"experiment_{case_name}") + ensemble = experiment.get_ensemble_by_name(case_name) + if not internal_keys: + internal_keys = set(ensemble.get_summary_keyset()) + else: + internal_keys = internal_keys.intersection( + set(ensemble.get_summary_keyset()) + ) + + return internal_keys + + +def validate_export(config: EverestConfig): + """ + Checks for possible errors when attempting to export current optimization + case. + :param config: Everest config + :return: List of error messages + """ + export_ecl = True + export_errors: List[str] = [] + if config.export is None: + return export_errors, export_ecl + + # TODO turn into attr accessor when ExplicitNone & everlint is phased out + user_def_batches = config.export.batches + if user_def_batches: + valid_batches = _valid_batches(user_def_batches, config) + for batch in user_def_batches: + if batch not in valid_batches: + export_errors.append( + "Batch {} not found in optimization " + "results. Skipping for current export." + "".format(batch) + ) + user_def_batches = valid_batches + config.export.batches = user_def_batches + + if user_def_batches == []: + export_ecl = False + export_errors.append( + "No batches selected for export. " + "Only optimization data will be exported." + ) + return export_errors, export_ecl + + if not config.model.data_file: + export_ecl = False + export_errors.append( + "No data file found in config." "Only optimization data will be exported." + ) + + user_def_kw = config.export.keywords + if user_def_kw == []: + export_ecl = False + export_errors.append( + "No eclipse keywords selected for export. Only" + " optimization data will be exported." + ) + + # If no user defined keywords are present it is no longer possible to check + # availability in internal storage + if user_def_kw is None: + return export_errors, export_ecl + + internal_keys = get_internalized_keys( + config, set(user_def_batches) if user_def_batches else None + ) + + extra_keys = set(user_def_kw).difference(set(internal_keys)) + if extra_keys: + export_ecl = False + export_errors.append( + f"Non-internalized ecl keys selected for export '{' '.join(extra_keys)}'." + " in order to internalize missing keywords " + f"run 'everest load {config.config_file}'. " + "Only optimization data will be exported." + ) + + return export_errors, export_ecl + + +def export(config: EverestConfig, export_ecl=True, progress_callback=lambda _: None): + """Export everest data into a pandas dataframe. If the config specifies + a data_file and @export_ecl is True, simulation data is included. When + exporting simulation data, only keywords matching elements in @ecl_keywords + are exported. Note that wildcards are allowed. + + @progress_callback will be called with a number between 0 and 1 indicating + the fraction of batches that has been loaded. + """ + + ecl_keywords = None + # If user exports with a config file that has the SKIP_EXPORT + # set to true export nothing + if config.export is not None: + if config.export.skip_export or config.export.batches == []: + return pd.DataFrame([]) + + ecl_keywords = config.export.keywords + + metadata = _metadata(config) + data_file = config.model.data_file + if data_file is None or not export_ecl: + return pd.DataFrame(metadata) + + data = _load_simulation_data(config, metadata, progress_callback=progress_callback) + + if ecl_keywords is not None: + keywords = tuple(ecl_keywords) + # NOTE: Some of these keywords are necessary for a success full export, + # should not leave this to the user.. + keywords += tuple(pd.DataFrame(metadata).columns) + keywords += tuple(MetaDataColumnNames.get_all()) + keywords_set = set(keywords) + data = filter_data(data, keywords_set) + + return data + + +def _load_simulation_data( + config: EverestConfig, metadata: List[dict], progress_callback=lambda _: None +): + """Export simulations to a pandas DataFrame + @config the case configuration + @tags is a one ora a list of dictionaries. Keys from the dictionary become + columns in the resulting dataframe. The values from the dictionary are + assigned to those columns for the corresponding simulation. + If a column is defined for some simulations but not for others, the value + for that column is set to NaN for simulations without it + + For instance, assume we have 2 simulations and + tags = [ {'geoid': 0, 'sim': 'ro'}, + {'geoid': 2, 'sim': 'pi', 'best': True }, + ] + And assume exporting each of the two simulations produces 3 rows. + The resulting dataframe will be something like + geoid sim best data... + 0 0 ro sim_0_row_0... + 1 0 ro sim_0_row_1... + 2 0 ro sim_0_row_2... + 3 2 pi True sim_1_row_0... + 4 2 pi True sim_2_row_0... + 5 2 pi True sim_3_row_0... + """ + assert config.output_dir is not None # avoiding mypy error + ens_path = os.path.join(config.output_dir, STORAGE_DIR) + with open_storage(ens_path, "r") as storage: + # pylint: disable=unnecessary-lambda-assignment + def load_batch_by_id(): + case_name = f"batch_{batch}" + experiment = storage.get_experiment_by_name(f"experiment_{case_name}") + ensemble = experiment.get_ensemble_by_name(case_name) + return ensemble.load_all_summary_data() + + batches = {elem[MetaDataColumnNames.BATCH] for elem in metadata} + batch_data = [] + for idx, batch in enumerate(batches): + progress_callback(float(idx) / len(batches)) + batch_data.append(load_batch_by_id()) + batch_data[-1][MetaDataColumnNames.BATCH] = batch + + for b in batch_data: + b.reset_index(inplace=True) + b.rename( + index=str, + inplace=True, + columns={ + "Realization": MetaDataColumnNames.SIMULATION, + "Date": MetaDataColumnNames.SIMULATED_DATE, + }, + ) + + data = pd.concat(batch_data, ignore_index=True, sort=False) + data = pd.merge( + left=data, + right=pd.DataFrame(metadata), + on=[MetaDataColumnNames.BATCH, MetaDataColumnNames.SIMULATION], + sort=False, + ) + + return data diff --git a/src/everest/jobs/__init__.py b/src/everest/jobs/__init__.py new file mode 100644 index 00000000000..af772b1428d --- /dev/null +++ b/src/everest/jobs/__init__.py @@ -0,0 +1,63 @@ +import os + +import pkg_resources + +from everest.jobs import io, templating, well_tools + +from .recovery_factor import recovery_factor + +script_names = ( + "render", + "recovery_factor", + "wdreorder", + "wdfilter", + "wdupdate", + "wdset", + "wdcompl", + "wddatefilter", +) + +__all__ = [ + "io", + "recovery_factor", + "script_names", + "templating", + "well_tools", +] + + +def _inject_scripts(): + def fetch_script_path(script_name): + rel_script_path = os.path.join("scripts", script_name) + return pkg_resources.resource_filename("everest.jobs", rel_script_path) + + _scripts = {} + for script_name in script_names: + _scripts[script_name] = fetch_script_path(script_name) + globals()[script_name] = _scripts[script_name] + + globals()["_scripts"] = _scripts + + +def fetch_script(script_name): + if script_name in _scripts: # noqa F821 + return _scripts[script_name] # noqa F821 + else: + raise KeyError("Unknown script: %s" % script_name) + + +_inject_scripts() + +# Note: Must be kept in sync with shell scripts on ERT-side +# (which is also not expected to change frequently/drastically) +shell_commands = ( + "careful_copy_file", + "copy_directory", + "copy_file", + "delete_directory", + "delete_file", + "make_directory", + "make_symlink", + "move_file", + "symlink", +) diff --git a/src/everest/jobs/io/__init__.py b/src/everest/jobs/io/__init__.py new file mode 100644 index 00000000000..91c5f08383a --- /dev/null +++ b/src/everest/jobs/io/__init__.py @@ -0,0 +1,43 @@ +import json +import os + +from ruamel.yaml import YAML + + +def load_data(filename): + """Will try to load data from @filename first as yaml, and if that fails, + as json. If both fail, a ValueError with both of the error messages will be + raised. + """ + yaml_err = "" + json_err = "" + with open(filename, encoding="utf-8") as fin: + try: + return YAML(typ="safe", pure=True).load(fin) + except Exception as err: + yaml_err = err + + try: + return json.load(fin) + except Exception as err: + json_err = err + + err_msg = "%s is neither yaml (err_msg=%s) nor json (err_msg=%s)" + raise IOError(err_msg % (filename, str(yaml_err), str(json_err))) + + +def _create_folders(filename): + dirname = os.path.realpath(os.path.dirname(filename)) + if not os.path.isdir(dirname): + os.makedirs(dirname) + + +def safe_open(file, mode="r", **kwargs): + """If @file is opened in a writable mode (mode contains 'w', 'x', 'a', or + '+') it first creates all potentially missing directories, before opening + the file + """ + + if any(wtoken in mode for wtoken in "wxa+"): + _create_folders(file) + return open(file, mode, encoding="utf-8", **kwargs) # noqa SIM115 diff --git a/src/everest/jobs/recovery_factor.py b/src/everest/jobs/recovery_factor.py new file mode 100644 index 00000000000..7d3e10e325b --- /dev/null +++ b/src/everest/jobs/recovery_factor.py @@ -0,0 +1,25 @@ +from resdata.summary import Summary + +import everest + + +def _compute_recovery_factor(load_case): + summary = Summary(load_case) + + fopt = summary.last_value("FOPT") + foip = summary.first_value("FOIP") + + if foip == 0: + return 0 + + return fopt / foip + + +def _save_object_value(object_value, target_file): + with everest.jobs.io.safe_open(target_file, "w") as f: + f.write("{}\n".format(object_value)) + + +def recovery_factor(load_case, output_file): + object_value = _compute_recovery_factor(load_case) + _save_object_value(object_value, output_file) diff --git a/src/everest/jobs/scripts/recovery_factor b/src/everest/jobs/scripts/recovery_factor new file mode 100755 index 00000000000..db4246e5d10 --- /dev/null +++ b/src/everest/jobs/scripts/recovery_factor @@ -0,0 +1,40 @@ +#!/usr/bin/env python + +import argparse + +from everest.jobs import recovery_factor + + +def _build_argument_parser() -> argparse.ArgumentParser: + description = ( + 'Loads the summary data from "load_case" ("some/path/.UNSMRY") ' + 'and calculates recovery factor, then dump result to "output_file".' + ) + parser = argparse.ArgumentParser(description=description) + parser.add_argument( + "--load_case", + "-s", + required=True, + help="eclipse load-case name", + ) + parser.add_argument( + "--output_file", + required=False, + default="rf", + help="the output file, defaults to rf", + ) + return parser + + +def main(): + arg_parser = _build_argument_parser() + args = arg_parser.parse_args() + + recovery_factor( + args.load_case, + args.output_file, + ) + + +if __name__ == "__main__": + main() diff --git a/src/everest/jobs/scripts/render b/src/everest/jobs/scripts/render new file mode 100755 index 00000000000..c7192e64cf6 --- /dev/null +++ b/src/everest/jobs/scripts/render @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +import argparse + +import everest + + +def _build_argument_parser() -> argparse.ArgumentParser: + description = ( + 'Loads the data from each file ("some/path/filename.xxx") in INPUT_FILES ' + 'and exposes it as the variable "filename". It then loads the Jinja2 ' + "template TEMPLATE_FILE and dumps the rendered resoult to OUTPUT." + ) + parser = argparse.ArgumentParser(description=description) + parser.add_argument( + "--output", + required=True, + help="the output file", + ) + parser.add_argument( + "--template_file", + required=True, + help="the jinja2 template file", + ) + parser.add_argument( + "--input_files", + required=True, + nargs="+", + help="list of json and yaml input files", + ) + return parser + + +def main(): + arg_parser = _build_argument_parser() + args = arg_parser.parse_args() + + everest.jobs.templating.render( + args.input_files, + args.template_file, + args.output, + ) + + +if __name__ == "__main__": + main() diff --git a/src/everest/jobs/scripts/wdcompl b/src/everest/jobs/scripts/wdcompl new file mode 100755 index 00000000000..d58931f0d9c --- /dev/null +++ b/src/everest/jobs/scripts/wdcompl @@ -0,0 +1,48 @@ +#!/usr/bin/env python + +import argparse + +import everest + + +def _build_argument_parser() -> argparse.ArgumentParser: + eck = everest.ConfigKeys + description = ( + f"Sets the {eck.COMPLETION_DATE} for each well in WELL_DATA based on the " + "START_DATE. In particular, the wells are drilled in the provided order. " + f"For no well is the drilling initiated before its {eck.DRILL_DATE} and " + f"each well finishes its {eck.DRILL_TIME} (defaulted to 0) before the " + "drilling of the next well is initiated." + ) + parser = argparse.ArgumentParser(description=description) + parser.add_argument( + "--output", + required=True, + help="updated well data will be output to this file as json", + ) + parser.add_argument( + "--well_data", + required=True, + help="the well data as json or yaml", + ) + parser.add_argument( + "--start_date", + required=True, + help="the start date of operations on format: dd.mm.yyyy", + ) + return parser + + +def main(): + arg_parser = _build_argument_parser() + args = arg_parser.parse_args() + + everest.jobs.well_tools.add_completion_date( + args.well_data, + args.start_date, + args.output, + ) + + +if __name__ == "__main__": + main() diff --git a/src/everest/jobs/scripts/wddatefilter b/src/everest/jobs/scripts/wddatefilter new file mode 100755 index 00000000000..cc54bce3da5 --- /dev/null +++ b/src/everest/jobs/scripts/wddatefilter @@ -0,0 +1,55 @@ +#!/usr/bin/env python + +import argparse + +import everest + + +def _build_argument_parser() -> argparse.ArgumentParser: + description = ( + "Filters the well entries in WELL_DATA based on the properties " + '"drill_time" and "completion_time". In particular, it filters out ' + "any entry violating the following constraint: " + "START_DATE <= COMPLETION_DATE-DRILL_TIME <= COMPLETION_DATA <= END_DATA." + "All input files are expected to be formatted as JSON or YAML. All input " + "dates are expected to be on the format dd.mm.yyyy." + "The output file will be written as JSON." + ) + parser = argparse.ArgumentParser(description=description) + parser.add_argument( + "--output", + required=True, + help="file to output filtered well data to", + ) + parser.add_argument( + "--well_data", + required=True, + help="the well data as json or yaml", + ) + parser.add_argument( + "--start_date", + required=True, + help="the start date of operations (dd.mm.yyyy)", + ) + parser.add_argument( + "--end_date", + required=True, + help="the end date of operations (dd.mm.yyyy)", + ) + return parser + + +def main(): + arg_parser = _build_argument_parser() + args = arg_parser.parse_args() + + everest.jobs.well_tools.well_opdate_filter( + args.well_data, + args.start_date, + args.end_date, + args.output, + ) + + +if __name__ == "__main__": + main() diff --git a/src/everest/jobs/scripts/wdfilter b/src/everest/jobs/scripts/wdfilter new file mode 100755 index 00000000000..1a503da8841 --- /dev/null +++ b/src/everest/jobs/scripts/wdfilter @@ -0,0 +1,43 @@ +#!/usr/bin/env python + +import argparse + +import everest + + +def _build_argument_parser() -> argparse.ArgumentParser: + description = ( + 'Removes all entires of WELL_DATA which "name" is not listed in FILTER.' + ) + parser = argparse.ArgumentParser(description=description) + parser.add_argument( + "--output", + required=True, + help="the well data will be output to this file as json", + ) + parser.add_argument( + "--well_data", + required=True, + help="the well data as json or yaml", + ) + parser.add_argument( + "--filter", + required=True, + help="the well filter, a list containing the wells to keep, as yaml or json", + ) + return parser + + +def main(): + arg_parser = _build_argument_parser() + args = arg_parser.parse_args() + + everest.jobs.well_tools.well_filter( + args.well_data, + args.filter, + args.output, + ) + + +if __name__ == "__main__": + main() diff --git a/src/everest/jobs/scripts/wdreorder b/src/everest/jobs/scripts/wdreorder new file mode 100755 index 00000000000..08953aec204 --- /dev/null +++ b/src/everest/jobs/scripts/wdreorder @@ -0,0 +1,44 @@ +#!/usr/bin/env python + +import argparse + +import everest + + +def _build_argument_parser() -> argparse.ArgumentParser: + description = ( + 'Reorders WELL_DATA (by the "name" key) according to the provided ORDER. ' + "ORDER is expected to be a list of all the names listed in WELL_DATA." + ) + parser = argparse.ArgumentParser(description=description) + parser.add_argument( + "--output", + required=True, + help="the well data will be output to this file as json", + ) + parser.add_argument( + "--well_data", + required=True, + help="the well data as json or yaml", + ) + parser.add_argument( + "--order", + required=True, + help="an ordering of the wells as a list in yaml or json", + ) + return parser + + +def main(): + arg_parser = _build_argument_parser() + args = arg_parser.parse_args() + + everest.jobs.well_tools.well_reorder( + args.well_data, + args.order, + args.output, + ) + + +if __name__ == "__main__": + main() diff --git a/src/everest/jobs/scripts/wdset b/src/everest/jobs/scripts/wdset new file mode 100755 index 00000000000..309b567853f --- /dev/null +++ b/src/everest/jobs/scripts/wdset @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +import argparse + +import everest + + +def _build_argument_parser() -> argparse.ArgumentParser: + description = ( + "Sets ENTRY in WELL_DATA. ENTRY is expected to be a dictionary mapping a " + "single key to a list of the same lenght as WELL_DATA. In the resulting " + "well data each entry maps the specified key to the value in ENTRY of " + "corresponding index. This operation is similar to wdupdate, but is based " + 'on order instead of the "name" key.' + ) + parser = argparse.ArgumentParser(description=description) + parser.add_argument( + "--output", + required=True, + help="the well data will be output to this file as json", + ) + parser.add_argument( + "--well_data", + required=True, + help="the well data as json or yaml", + ) + parser.add_argument( + "--entry", + required=True, + help="an entry that is to be set in well_data as yaml or json", + ) + return parser + + +def main(): + arg_parser = _build_argument_parser() + args = arg_parser.parse_args() + + everest.jobs.well_tools.well_set( + args.well_data, + args.entry, + args.output, + ) + + +if __name__ == "__main__": + main() diff --git a/src/everest/jobs/scripts/wdupdate b/src/everest/jobs/scripts/wdupdate new file mode 100755 index 00000000000..cc0ec2cd498 --- /dev/null +++ b/src/everest/jobs/scripts/wdupdate @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +import argparse + +import everest + + +def _build_argument_parser() -> argparse.ArgumentParser: + description = ( + 'Updates WELL_DATA by ADD_DATA, entry by entry (based on "name"). ' + "The applicance of wdupdae is associative with respect to ADD_DATA." + ) + parser = argparse.ArgumentParser(description=description) + parser.add_argument( + "--output", + required=True, + help="the well data will be output to this file as json", + ) + parser.add_argument( + "--well_data", + required=True, + help="the master well data as json or yaml", + ) + parser.add_argument( + "--add_data", + required=True, + nargs="+", + help="the data files as yaml or json, " + "will be merged into the main well data file", + ) + return parser + + +def main(): + arg_parser = _build_argument_parser() + args = arg_parser.parse_args() + + everest.jobs.well_tools.well_update( + args.well_data, + args.add_data, + args.output, + ) + + +if __name__ == "__main__": + main() diff --git a/src/everest/jobs/templating/__init__.py b/src/everest/jobs/templating/__init__.py new file mode 100644 index 00000000000..299812d9925 --- /dev/null +++ b/src/everest/jobs/templating/__init__.py @@ -0,0 +1,3 @@ +from .render import render + +__all__ = ["render"] diff --git a/src/everest/jobs/templating/render.py b/src/everest/jobs/templating/render.py new file mode 100644 index 00000000000..2b08f765d46 --- /dev/null +++ b/src/everest/jobs/templating/render.py @@ -0,0 +1,49 @@ +import os + +import jinja2 + +import everest + + +def _load_template(template_path): + path, filename = os.path.split(template_path) + return jinja2.Environment( + loader=jinja2.FileSystemLoader(path or "./") + ).get_template(filename) + + +def _generate_file_namespace(filename): + return os.path.splitext(os.path.basename(filename))[0] + + +def _load_input(input_files): + data = {} + for input_file in input_files: + input_namespace = _generate_file_namespace(input_file) + data[input_namespace] = everest.jobs.io.load_data(input_file) + + return data + + +def _assert_input(input_files, template_file, output_file): + for input_file in input_files: + if not os.path.isfile(input_file): + raise ValueError("Input file: %s, does not exist.." % input_file) + + if not os.path.isfile(template_file): + raise ValueError("Template file: %s, does not exist.." % template_file) + + if not isinstance(output_file, str): + raise TypeError("Expected output path to be a string") + + +def render(input_files, template_file, output_file): + if isinstance(input_files, str): + input_files = (input_files,) + _assert_input(input_files, template_file, output_file) + + template = _load_template(template_file) + data = _load_input(input_files) + + with everest.jobs.io.safe_open(output_file, "w") as fout: + fout.write(template.render(**data)) diff --git a/src/everest/jobs/well_tools/__init__.py b/src/everest/jobs/well_tools/__init__.py new file mode 100644 index 00000000000..214572bc8b1 --- /dev/null +++ b/src/everest/jobs/well_tools/__init__.py @@ -0,0 +1,128 @@ +import datetime +import json + +import everest + + +def well_reorder(well_data_file, well_order_file, output_file): + well_data = everest.jobs.io.load_data(well_data_file) + well_order = everest.jobs.io.load_data(well_order_file) + + name = everest.ConfigKeys.NAME + well_data.sort(key=lambda well: well_order.index(well[name])) + + with everest.jobs.io.safe_open(output_file, "w") as fout: + json.dump(well_data, fout) + + +def well_filter(well_data_file, well_filter_file, output_file): + well_data = everest.jobs.io.load_data(well_data_file) + well_filter = everest.jobs.io.load_data(well_filter_file) + + name = everest.ConfigKeys.NAME + well_data = [ + well_entry for well_entry in well_data if well_entry[name] in well_filter + ] + + with everest.jobs.io.safe_open(output_file, "w") as fout: + json.dump(well_data, fout) + + +def well_update(master_data_file, additional_data_files, output_file): + name = everest.ConfigKeys.NAME + well_data = everest.jobs.io.load_data(master_data_file) + + for add_data_file in additional_data_files: + add_data = everest.jobs.io.load_data(add_data_file) + add_data = {well_entry[name]: well_entry for well_entry in add_data} + + for well_entry in well_data: + well_entry.update(add_data[well_entry[name]]) + + with everest.jobs.io.safe_open(output_file, "w") as fout: + json.dump(well_data, fout) + + +def well_set(well_data_file, new_entry_file, output_file): + well_data = everest.jobs.io.load_data(well_data_file) + new_entry = everest.jobs.io.load_data(new_entry_file) + + if len(new_entry) != 1: + err_msg = "Expected there to be exactly one new entry " "in {nef}, was {ne}" + raise ValueError(err_msg.format(nef=new_entry_file, ne=len(new_entry))) + + entry_key = next(iter(new_entry.keys())) + entry_data = new_entry[entry_key] + + if len(well_data) != len(entry_data): + err_msg = f"Expected number of entries in {well_data_file} to be equal " + "the number of entries in {new_entry_file} ({nwell} != {nentry})" + err_msg = err_msg.format( + well_data_file=well_data_file, + new_entry_file=new_entry_file, + nwell=len(well_data), + nwells=len(entry_data), + ) + raise ValueError(err_msg) + + for well_entry, data_elem in zip(well_data, entry_data): + well_entry[entry_key] = data_elem + + with everest.jobs.io.safe_open(output_file, "w") as fout: + json.dump(well_data, fout) + + +def add_completion_date(well_data_file, start_date, output_file): + drill_time_key = everest.ConfigKeys.DRILL_TIME + drill_date_key = everest.ConfigKeys.DRILL_DATE + drill_delay_key = everest.ConfigKeys.DRILL_DELAY + completion_date_key = everest.ConfigKeys.COMPLETION_DATE + + start_date = everest.util.str2date(start_date) + well_data = everest.jobs.io.load_data(well_data_file) + + prev_date = start_date + for well_entry in well_data: + well_start_date = well_entry.get(drill_date_key) + if well_start_date is not None: + well_start_date = everest.util.str2date(well_start_date) + else: + well_start_date = prev_date + + drill_delay = well_entry.get(drill_delay_key, 0) + well_start_date = max( + well_start_date, + prev_date + datetime.timedelta(days=drill_delay), + ) + + drill_time = well_entry.get(drill_time_key, 0) + completion_date = well_start_date + datetime.timedelta(days=drill_time) + well_entry[completion_date_key] = everest.util.date2str(completion_date) + prev_date = completion_date + + with everest.jobs.io.safe_open(output_file, "w") as fout: + json.dump(well_data, fout) + + +def _valid_operational_dates(well_entry, start_date, end_date): + drill_time_key = everest.ConfigKeys.DRILL_TIME + completion_date_key = everest.ConfigKeys.COMPLETION_DATE + + drill_time = well_entry.get(drill_time_key, 0) + compl_date = everest.util.str2date(well_entry[completion_date_key]) + real_drill_date = compl_date - datetime.timedelta(days=drill_time) + + return start_date <= real_drill_date <= compl_date <= end_date + + +def well_opdate_filter(well_data_file, start_date, end_date, output_file): + start_date = everest.util.str2date(start_date) + end_date = everest.util.str2date(end_date) + well_data = everest.jobs.io.load_data(well_data_file) + + # pylint: disable=unnecessary-lambda-assignment + valid = lambda well: _valid_operational_dates(well, start_date, end_date) + well_data = list(filter(valid, well_data)) + + with everest.jobs.io.safe_open(output_file, "w") as fout: + json.dump(well_data, fout) diff --git a/src/everest/loader.py b/src/everest/loader.py new file mode 100644 index 00000000000..1af905b44b8 --- /dev/null +++ b/src/everest/loader.py @@ -0,0 +1,20 @@ +from everest.config import EverestConfig + + +# Can be removed when refs from Everest-models are updated to +# EverestConfig.load_yaml_file +def load(config_path: str) -> EverestConfig: + """ + Static method that receives the path to an ASCII file, + parses it with respect to YAML format and returns a dictionary. + + The method will check if the path is absolute or relative, + and in case it is relative it will consider to be relative to the working folder. + + @:param config_path: path to the ascii file + @:type config_path: str + @:rtype dict + @:raises yaml.YAMLError + """ + + return EverestConfig.load_file(config_path) diff --git a/src/everest/optimizer/__init__.py b/src/everest/optimizer/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/everest/optimizer/everest2ropt.py b/src/everest/optimizer/everest2ropt.py new file mode 100644 index 00000000000..f9b399aa9cd --- /dev/null +++ b/src/everest/optimizer/everest2ropt.py @@ -0,0 +1,524 @@ +import os +from collections import defaultdict +from dataclasses import asdict, dataclass +from typing import ( + Any, + DefaultDict, + Dict, + List, + Optional, + Sequence, + Tuple, + Union, +) + +from ropt.enums import ConstraintType, PerturbationType, VariableType +from typing_extensions import Final, TypeAlias + +from everest.config import ( + ControlConfig, + EverestConfig, + SamplerConfig, +) +from everest.config.control_variable_config import ( + ControlVariableConfig, + ControlVariableGuessListConfig, +) + +VariableName: TypeAlias = Tuple[str, str, int] +ControlName: TypeAlias = Union[Tuple[str, str], VariableName, List[VariableName]] +StrListDict: TypeAlias = DefaultDict[str, list] +IGNORE_KEYS: Final[Tuple[str, ...]] = ( + "enabled", + "scaled_range", + "auto_scale", + "index", + "name", + "perturbation_magnitudes", +) + + +def _collect_sampler( + sampler: Optional[SamplerConfig], + storage: Dict[str, Any], + control_name: Union[List[ControlName], ControlName, None] = None, +) -> Optional[Dict[str, Any]]: + if sampler is None: + return None + map = sampler.model_dump(exclude_none=True, exclude={"backend", "method"}) + map["method"] = sampler.ropt_method + control_names = map.setdefault("control_names", []) + if control_name: + control_names.extend( + control_name if isinstance(control_name, list) else [control_name] + ) + storage.setdefault("samplers", []).append(map) + return map + + +def _scale_translations( + is_scale: bool, + _min: float, + _max: float, + lower_bound: float, + upper_bound: float, + perturbation_type: PerturbationType, +) -> Tuple[float, float, int]: + if not is_scale: + return 1.0, 0.0, perturbation_type.value + scale = (_max - _min) / (upper_bound - lower_bound) + return scale, _min - lower_bound * scale, PerturbationType.SCALED.value + + +@dataclass +class Control: + name: Tuple[str, str] + enabled: bool + lower_bounds: float + upper_bounds: float + perturbation_magnitudes: Optional[float] + initial_values: List[float] + types: VariableType + scaled_range: Tuple[float, float] + auto_scale: bool + index: Optional[int] + scales: float + offsets: float + perturbation_types: int + + +def _resolve_everest_control( + variable: Union[ControlVariableConfig, ControlVariableGuessListConfig], + group: ControlConfig, +) -> Control: + scaled_range = variable.scaled_range or group.scaled_range or (0, 1.0) + auto_scale = variable.auto_scale or group.auto_scale + lower_bound = group.min if variable.min is None else variable.min + upper_bound = group.max if variable.max is None else variable.max + + scale, offset, perturbation_type = _scale_translations( + auto_scale, + lower_bound, # type: ignore + upper_bound, # type: ignore + *scaled_range, + group.ropt_perturbation_type, + ) + return Control( + name=(group.name, variable.name), + enabled=group.enabled if variable.enabled is None else variable.enabled, # type: ignore + lower_bounds=lower_bound, # type: ignore + upper_bounds=upper_bound, # type: ignore + perturbation_magnitudes=group.perturbation_magnitude + if variable.perturbation_magnitude is None + else variable.perturbation_magnitude, + initial_values=group.initial_guess + if variable.initial_guess is None + else variable.initial_guess, # type: ignore + types=group.ropt_control_type + if variable.ropt_control_type is None + else variable.ropt_control_type, + scaled_range=scaled_range, + auto_scale=auto_scale, + index=getattr(variable, "index", None), + scales=scale, + offsets=offset, + perturbation_types=perturbation_type, + ) + + +def _variable_initial_guess_list_injection( + control: Control, + *, + variables: StrListDict, + gradients: StrListDict, +) -> List[VariableName]: + guesses = len(control.initial_values) + ropt_names = [(*control.name, index + 1) for index in range(guesses)] + variables["names"].extend(ropt_names) + variables["initial_values"].extend(control.initial_values) + for key, value in asdict(control).items(): + if key not in (*IGNORE_KEYS, "initial_values"): + (gradients if "perturbation" in key else variables)[key].extend( + [value] * guesses + ) + gradients["perturbation_magnitudes"].extend( + [ + ( + (max(variables["upper_bounds"]) - min(variables["lower_bounds"])) / 10.0 + if control.perturbation_magnitudes is None + else control.perturbation_magnitudes + ) + ] + * guesses + ) + return ropt_names + + +def _variable_initial_guess_injection( + control: Control, + *, + variables: StrListDict, + gradients: StrListDict, +) -> ControlName: + ropt_names: ControlName = ( + control.name if control.index is None else (*control.name, control.index) + ) + variables["names"].append(ropt_names) + for key, value in asdict(control).items(): + if key not in IGNORE_KEYS: + (gradients if "perturbation" in key else variables)[key].append(value) + gradients["perturbation_magnitudes"].append( + (max(variables["upper_bounds"]) - min(variables["lower_bounds"])) / 10.0 + if control.perturbation_magnitudes is None + else control.perturbation_magnitudes + ) + return ropt_names + + +def _parse_controls(controls: Sequence[ControlConfig], ropt_config): + """Extract info from ever_config['controls']""" + enabled = [] + variables: StrListDict = defaultdict(list) + gradients: StrListDict = defaultdict(list) + + for group in controls: + sampler = _collect_sampler(group.sampler, ropt_config) + + for variable in group.variables: + control = _resolve_everest_control(variable, group) + enabled.append(control.enabled) + control_injector = ( + _variable_initial_guess_list_injection + if isinstance(variable.initial_guess, list) + else _variable_initial_guess_injection + ) + ropt_names = control_injector( + control, + variables=variables, + gradients=gradients, + ) + + if ( + _collect_sampler(variable.sampler, ropt_config, ropt_names) is None + and sampler + ): + control_names = sampler["control_names"] + ( + control_names.extend + if isinstance(ropt_names, list) + else control_names.append + )(ropt_names) + + ropt_config["variables"] = dict(variables) + ropt_config["variables"]["indices"] = ( + None if all(enabled) else [idx for idx, item in enumerate(enabled) if item] + ) + ropt_config["variables"]["delimiters"] = ".-" + ropt_config["gradient"] = dict(gradients) + + # The samplers in the list constructed above contain the names of the + # variables they should apply to, but ropt expects a array of indices that + # map variables to the samplers that should apply to them: + if samplers := ropt_config.get("samplers"): + sampler_indices = [0] * len(variables["names"]) + for idx, sampler in enumerate(samplers): + for name in sampler.pop("control_names"): # type: ignore + sampler_indices[variables["names"].index(name)] = idx + ropt_config["gradient"]["samplers"] = sampler_indices + + +def _parse_objectives(ever_config: EverestConfig, ropt_config): + names: List[str] = [] + scales: List[float] = [] + auto_scale: List[bool] = [] + weights: List[float] = [] + transform_indices: List[int] = [] + transforms: List = [] + + ever_objs = ever_config.objective_functions or [] + for objective in ever_objs: + assert isinstance(objective.name, str) + names.append(objective.name) + weights.append(objective.weight or 1.0) + scales.append(1.0 / (objective.normalization or 1.0)) + auto_scale.append(objective.auto_normalize or False) + + # If any objective specifies an objective type, we have to specify + # function transforms in ropt to implement these types. This is done by + # supplying a list of transforms and for each objective an index into + # that list: + objective_type = objective.type + if objective_type is None: + objective_type = "mean" + # Find the transform if it exists: + transform_idx = next( + ( + idx + for idx, transform in enumerate(transforms) + if transform["method"] == objective_type + ), + None, + ) + # If not, make a new transform: + if transform_idx is None: + transform_idx = len(transforms) + transforms.append({"method": objective_type}) + transform_indices.append(transform_idx) + + ropt_config["objective_functions"] = { + "names": names, + "weights": weights, + "scales": scales, + "auto_scale": auto_scale, + } + if transforms: + # Only needed if we specified at least one objective type: + ropt_config["objective_functions"]["function_transforms"] = transform_indices + ropt_config["function_transforms"] = transforms + + +def _parse_input_constraints(ever_config: EverestConfig, ropt_config, formatted_names): + input_constrs = ever_config.input_constraints or None + if input_constrs is None: + return + + coefficients_matrix = [] + rhs_values = [] + types = [] + + def _add_input_constraint(rhs_value, coefficients, constraint_type): + if rhs_value is not None: + coefficients_matrix.append(coefficients) + rhs_values.append(rhs_value) + types.append(constraint_type) + + for constr in input_constrs: + coefficients = [0.0] * len(formatted_names) + for name, value in constr.weights.items(): + coefficients[formatted_names.index(name)] = value + target = constr.target + upper_bound = constr.upper_bound + lower_bound = constr.lower_bound + if target is not None and (upper_bound is not None or lower_bound is not None): + raise RuntimeError( + "input constraint error: target cannot be combined with bounds" + ) + _add_input_constraint(target, coefficients, ConstraintType.EQ) + _add_input_constraint(upper_bound, coefficients, ConstraintType.LE) + _add_input_constraint(lower_bound, coefficients, ConstraintType.GE) + + ropt_config["linear_constraints"] = { + "coefficients": coefficients_matrix, + "rhs_values": rhs_values, + "types": types, + } + + +def _parse_output_constraints(ever_config: EverestConfig, ropt_config): + ever_constrs = ever_config.output_constraints or None + if ever_constrs is None: + return + + names: List[str] = [] + rhs_values: List[float] = [] + scales: List[float] = [] + auto_scale: List[bool] = [] + types: List[ConstraintType] = [] + + def _add_output_constraint( + rhs_value: Optional[float], constraint_type: ConstraintType, suffix=None + ): + if rhs_value is not None: + name = constr.name + names.append(name if suffix is None else f"{name}:{suffix}") + rhs_values.append(rhs_value) + scales.append(constr.scale if constr.scale is not None else 1.0) + auto_scale.append(constr.auto_scale or False) + types.append(constraint_type) + + for constr in ever_constrs: + target = constr.target + upper_bound = constr.upper_bound + lower_bound = constr.lower_bound + if target is not None and (upper_bound is not None or lower_bound is not None): + raise RuntimeError( + "output constraint error: target cannot be combined with bounds" + ) + _add_output_constraint( + target, + ConstraintType.EQ, + ) + _add_output_constraint( + upper_bound, + ConstraintType.LE, + None if lower_bound is None else "upper", + ) + _add_output_constraint( + lower_bound, + ConstraintType.GE, + None if upper_bound is None else "lower", + ) + + ropt_config["nonlinear_constraints"] = { + "names": names, + "rhs_values": rhs_values, + "scales": scales, + "auto_scale": auto_scale, + "types": types, + } + + +def _parse_optimization(ever_config: EverestConfig, ropt_config): + ropt_config["optimizer"] = {} + + ever_opt = ever_config.optimization or None + if ever_opt is None: + return + + ropt_optimizer = ropt_config["optimizer"] + ropt_gradient = ropt_config["gradient"] + + backend = ever_opt.backend or "dakota" + algorithm = ever_opt.algorithm or "default" + ropt_optimizer["method"] = f"{backend}/{algorithm}" + + alg_max_iter = ever_opt.max_iterations + if alg_max_iter: + ropt_optimizer["max_iterations"] = alg_max_iter + + alg_max_eval = ever_opt.max_function_evaluations + if alg_max_eval: + ropt_optimizer["max_functions"] = alg_max_eval + + alg_conv_tol = ever_opt.convergence_tolerance or None + if alg_conv_tol: + ropt_optimizer["tolerance"] = alg_conv_tol + + alg_grad_spec = ever_opt.speculative or None + if alg_grad_spec: + ropt_optimizer["speculative"] = alg_grad_spec + + # Handle the backend options. Due to historical reasons there two keywords: + # "options" is used to pass a list of string, "backend_options" is used to + # pass a dict. These are redirected to the same ropt option: + options = ever_opt.options or [] + backend_options = ever_opt.backend_options or {} + if options and backend_options: + raise RuntimeError("Only one of 'options' and 'backend_options' allowed.") + # The constraint_tolerance option is only used by Dakota: + if backend == "dakota": + output_constraints = ever_config.output_constraints or None + alg_const_tol = ever_opt.constraint_tolerance or None + if output_constraints is not None and alg_const_tol is not None: + options += [f"constraint_tolerance = {alg_const_tol}"] + if options: + ropt_optimizer["options"] = options + if backend_options: + ropt_optimizer["options"] = backend_options + + parallel = True if ever_opt.parallel is None else ever_opt.parallel + ropt_optimizer["parallel"] = True if parallel is None else parallel + + if ever_opt.perturbation_num is not None: + ropt_gradient["number_of_perturbations"] = ever_opt.perturbation_num + # For a single perturbation, use the ensemble for gradient calculation: + ropt_gradient["merge_realizations"] = ( + ropt_gradient["number_of_perturbations"] == 1 + ) + + min_per_succ = ever_opt.min_pert_success + if min_per_succ is not None: + ropt_gradient["perturbation_min_success"] = min_per_succ + + if cvar_opts := ever_opt.cvar or None: + # set up the configuration of the realization filter that implements cvar: + if (percentile := cvar_opts.percentile) is not None: + cvar_config: Dict[str, Any] = { + "method": "cvar-objective", + "options": {"percentile": percentile}, + } + elif (realizations := cvar_opts.number_of_realizations) is not None: + cvar_config = { + "method": "sort-objective", + "options": {"first": 0, "last": realizations - 1}, + } + else: + cvar_config = {} + + if cvar_config: + # Both objective and constraint configurations use an array of + # indices to any realization filters that should be applied. In this + # case, we want all objectives and constraints to refer to the same + # filter implementing cvar: + objective_count = len(ropt_config["objective_functions"]["names"]) + constraint_count = len( + ropt_config.get("nonlinear_constraints", {}).get("names", []) + ) + ropt_config["objective_functions"]["realization_filters"] = ( + objective_count * [0] + ) + if constraint_count > 0: + ropt_config["nonlinear_constraints"]["realization_filters"] = ( + constraint_count * [0] + ) + cvar_config["options"].update({"sort": list(range(objective_count))}) + ropt_config["realization_filters"] = [cvar_config] + # For efficiency, function and gradient evaluations should be split + # so that no unnecessary gradients are calculated: + ropt_optimizer["split_evaluations"] = True + + +def _parse_model(ever_config: EverestConfig, ropt_config): + ever_model = ever_config.model or None + if ever_model is None: + return + + ever_reals = ever_model.realizations or [] + ever_reals_weights = ever_model.realizations_weights + if ever_reals_weights is None: + ever_reals_weights = [1.0 / len(ever_reals)] * len(ever_reals) + + ropt_config["realizations"] = { + "names": ever_reals, + "weights": ever_reals_weights, + } + ever_opt = ever_config.optimization or None + min_real_succ = ever_opt.min_realizations_success if ever_opt is not None else None + if min_real_succ is not None: + ropt_config["realizations"]["realization_min_success"] = min_real_succ + + +def _parse_environment(ever_config: EverestConfig, ropt_config): + ropt_config["optimizer"]["output_dir"] = os.path.abspath( + ever_config.optimization_output_dir + ) + + +def everest2ropt(ever_config: EverestConfig): + """Generate a ropt configuration from an Everest one + + NOTE: This method is a work in progress. So far only the some of + the values are actually extracted, all the others are set to some + more or less reasonable default + """ + ropt_config: Dict[str, Any] = {} + + _parse_controls(ever_config.controls, ropt_config) + + control_names = [ + ( + f"{control_name[0]}.{control_name[1]}-{control_name[2]}" + if len(control_name) > 2 + else f"{control_name[0]}.{control_name[1]}" + ) + for control_name in ropt_config["variables"]["names"] + ] + + _parse_objectives(ever_config, ropt_config) + _parse_input_constraints(ever_config, ropt_config, control_names) + _parse_output_constraints(ever_config, ropt_config) + _parse_optimization(ever_config, ropt_config) + _parse_model(ever_config, ropt_config) + _parse_environment(ever_config, ropt_config) + + return ropt_config diff --git a/src/everest/optimizer/utils.py b/src/everest/optimizer/utils.py new file mode 100644 index 00000000000..dbffd637079 --- /dev/null +++ b/src/everest/optimizer/utils.py @@ -0,0 +1,16 @@ +from ropt.plugins import PluginManager + + +def get_ropt_plugin_manager() -> PluginManager: + # To check the validity of optimization and sampler backends and their + # supported algorithms or methods, an instance of a ropt PluginManager is + # needed. Everest also needs a ropt plugin manager at runtime which may add + # additional optimization and/or sampler backends. To be sure that these + # added backends are detected, all code should use this function to access + # the plugin manager. Any optimizer/sampler plugins that need to be added at + # runtime should be added in this function. + # + # Note: backends can also be added via the Python entrypoints mechanism, + # these are detected by default and do not need to be added here. + + return PluginManager() diff --git a/src/everest/plugins/__init__.py b/src/everest/plugins/__init__.py new file mode 100644 index 00000000000..41e63611afd --- /dev/null +++ b/src/everest/plugins/__init__.py @@ -0,0 +1,10 @@ +import pluggy + +from everest.plugins.plugin_response import plugin_response +from everest.strings import EVEREST + +hookimpl = pluggy.HookimplMarker(EVEREST) +hookspec = pluggy.HookspecMarker(EVEREST) + + +__all__ = ["EVEREST", "plugin_response"] diff --git a/src/everest/plugins/hook_impl.py b/src/everest/plugins/hook_impl.py new file mode 100644 index 00000000000..ca07cc7a0b4 --- /dev/null +++ b/src/everest/plugins/hook_impl.py @@ -0,0 +1,60 @@ +from everest.plugins import hookimpl + + +@hookimpl +def visualize_data(api): + print("No visualization plugin installed!") + + +@hookimpl +def default_site_config_lines(): + return [ + "JOB_SCRIPT job_dispatch.py", + "QUEUE_OPTION LOCAL MAX_RUNNING 1", + "", + ] + + +@hookimpl +def site_config_lines(): + return None + + +@hookimpl +def ecl100_config_path(): + return None + + +@hookimpl +def ecl300_config_path(): + return None + + +@hookimpl +def flow_config_path(): + return None + + +@hookimpl +def get_forward_models(): + return None + + +@hookimpl +def lint_forward_model(): + return None + + +@hookimpl +def parse_forward_model_schema(path, schema): + return None + + +@hookimpl +def get_forward_models_schemas(): + return None + + +@hookimpl +def installable_workflow_jobs(): + return None diff --git a/src/everest/plugins/hook_manager.py b/src/everest/plugins/hook_manager.py new file mode 100644 index 00000000000..dd3b10f2c1b --- /dev/null +++ b/src/everest/plugins/hook_manager.py @@ -0,0 +1,16 @@ +import pluggy + +from everest.plugins import hook_impl, hook_specs +from everest.strings import EVEREST + + +class EverestPluginManager(pluggy.PluginManager): + def __init__(self, plugins=None): + super(EverestPluginManager, self).__init__(EVEREST) + self.add_hookspecs(hook_specs) + if plugins is None: + self.register(hook_impl) + self.load_setuptools_entrypoints(EVEREST) + else: + for plugin in plugins: + self.register(plugin) diff --git a/src/everest/plugins/hook_specs.py b/src/everest/plugins/hook_specs.py new file mode 100644 index 00000000000..303a2a7233e --- /dev/null +++ b/src/everest/plugins/hook_specs.py @@ -0,0 +1,109 @@ +from typing import Sequence, Type, TypeVar + +from everest.plugins import hookspec + +T = TypeVar("T") + + +@hookspec(firstresult=True) +def visualize_data(api): + """ + :param :EverestAPI instance + """ + + +@hookspec(firstresult=True) +def default_site_config_lines(): + """ + :return: List default site config of lines to + :rtype: List of strings + """ + + +@hookspec(firstresult=True) +def install_job_directories(): + """ + :return: List default site config of lines to + :rtype: List of strings + """ + + +@hookspec() +def site_config_lines(): + """ + :return: List of lines to append to site config file + :rtype: PluginResponse with data as list[str] + """ + + +@hookspec(firstresult=True) +def ecl100_config_path(): + """ + :return: Path to ecl100 config file + :rtype: PluginResponse with data as str + """ + + +@hookspec(firstresult=True) +def ecl300_config_path(): + """ + :return: Path to ecl300 config file + :rtype: PluginResponse with data as str + """ + + +@hookspec(firstresult=True) +def flow_config_path(): + """ + :return: Path to flow config file + :rtype: PluginResponse with data as str + """ + + +@hookspec +def get_forward_models(): + """ + Return a list of dicts detailing the names and paths to forward models. + + Example [{"name": "job1", "path":"path1"}, {"name": "job2", "path":"path2"}] + """ + + +@hookspec(firstresult=True) +def lint_forward_model(job: str, args: Sequence[str]): + """ + Return a error string, if forward model job failed to lint. + """ + + +@hookspec +def get_forward_models_schemas(): + """ + Return a dictionary of forward model names and its associated: schemas. + Example {"add_template": {"-c/--config": WellModelConfig}, ...} + """ + + +@hookspec +def parse_forward_model_schema(path: str, schema: Type[T]): + """ + Given a path and schema type, this hook will parse the file. + """ + + +@hookspec +def installable_workflow_jobs(): + """ + :return: dict with workflow job names as keys and path to config as value + :rtype: PluginResponse with data as dict[str,str] + """ + + +@hookspec +def add_log_handle_to_root(): + """ + Create a log handle which will be added to the root logger + in the main entry point. + :return: A log handle that will be added to the root logger + :rtype: logging.Handler + """ diff --git a/src/everest/plugins/plugin_response.py b/src/everest/plugins/plugin_response.py new file mode 100644 index 00000000000..c03be338a0f --- /dev/null +++ b/src/everest/plugins/plugin_response.py @@ -0,0 +1,23 @@ +from decorator import decorator + + +@decorator +def plugin_response(func, plugin_name="", *args, **kwargs): # pylint: disable=keyword-arg-before-vararg + response = func(*args, **kwargs) + return ( + PluginResponse(response, PluginMetadata(plugin_name, func.__name__)) + if response is not None + else None + ) + + +class PluginResponse: + def __init__(self, data, plugin_metadata): + self.data = data + self.plugin_metadata = plugin_metadata + + +class PluginMetadata: + def __init__(self, plugin_name, function_name): + self.plugin_name = plugin_name + self.function_name = function_name diff --git a/src/everest/plugins/site_config_env.py b/src/everest/plugins/site_config_env.py new file mode 100644 index 00000000000..5d90ba4da12 --- /dev/null +++ b/src/everest/plugins/site_config_env.py @@ -0,0 +1,93 @@ +import os +import shutil +import tempfile + +from everest.plugins.hook_manager import EverestPluginManager + + +class PluginSiteConfigEnv: + """ + Allows plugin configuration of site config file. + """ + + def __init__(self): + self.pm = EverestPluginManager() + self.backup_env = os.environ.copy() + self.tmp_dir = None + + def _config_env_vars(self): + config_env_vars = [ + ("ECL100_SITE_CONFIG", self.pm.hook.ecl100_config_path()), + ("ECL300_SITE_CONFIG", self.pm.hook.ecl300_config_path()), + ("FLOW_SITE_CONFIG", self.pm.hook.flow_config_path()), + ] + config_lines = [ + "SETENV {} {}".format(env_var, env_value.data) + for env_var, env_value in config_env_vars + if env_value is not None + ] + + return [*config_lines, ""] + + def _get_temp_site_config_path(self): + self.tmp_dir = tempfile.mkdtemp() + return os.path.join(self.tmp_dir, "site-config") + + def _install_workflow_job_lines(self): + response = self.pm.hook.installable_workflow_jobs() + if response: + job_paths = [] + for item in reversed(response): + job_paths += item.data.values() + return ["LOAD_WORKFLOW_JOB {}".format(path) for path in job_paths] + [""] + return [] + + def _site_config_content(self): + response = self.pm.hook.site_config_lines() + if response: + lines = [] + for item in reversed(response): + lines += item.data + return lines + return None + + def _get_site_config_content(self): + plugin_content = self._site_config_content() + if plugin_content: + site_config_lines = self.pm.hook.default_site_config_lines() + site_config_lines.extend(plugin_content) + site_config_lines.extend(self._config_env_vars()) + site_config_lines.extend(self.pm.hook.install_job_directories() or []) + site_config_lines.extend(self._install_workflow_job_lines()) + + return "\n".join(site_config_lines) + "\n" + return None + + @staticmethod + def _is_site_config_env_set(): + return os.environ.get("ERT_SITE_CONFIG", None) is not None + + @staticmethod + def _write_tmp_site_config_file(path, content): + with open(path, "w", encoding="utf-8") as fh: + fh.write(content) + + def __enter__(self): + if not self._is_site_config_env_set(): + site_config_content = self._get_site_config_content() + if site_config_content is not None: + tmp_site_conf_path = self._get_temp_site_config_path() + self._write_tmp_site_config_file( + tmp_site_conf_path, site_config_content + ) + os.environ["ERT_SITE_CONFIG"] = tmp_site_conf_path + + def __exit__(self, *args): + if ( + self.backup_env.get("ERT_SITE_CONFIG", None) is None + and self._is_site_config_env_set() + ): + del os.environ["ERT_SITE_CONFIG"] + + if self.tmp_dir is not None: + shutil.rmtree(self.tmp_dir) diff --git a/src/everest/queue_driver/__init__.py b/src/everest/queue_driver/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/everest/queue_driver/queue_driver.py b/src/everest/queue_driver/queue_driver.py new file mode 100644 index 00000000000..b4454d4f57c --- /dev/null +++ b/src/everest/queue_driver/queue_driver.py @@ -0,0 +1,69 @@ +from typing import Any, List, Optional, Tuple + +from ert.config import QueueSystem +from everest.config import EverestConfig +from everest.config.simulator_config import SimulatorConfig +from everest.config_keys import ConfigKeys + +_LSF_OPTIONS = [ + (ConfigKeys.CORES, "MAX_RUNNING"), + (ConfigKeys.LSF_QUEUE_NAME, "LSF_QUEUE"), + (ConfigKeys.LSF_SERVER, "LSF_SERVER"), + (ConfigKeys.LSF_OPTIONS, "LSF_RESOURCE"), +] + +_SLURM_OPTIONS = [ + (ConfigKeys.CORES, "MAX_RUNNING"), + (ConfigKeys.SLURM_QUEUE, "PARTITION"), + (ConfigKeys.SLURM_SBATCH, "SBATCH"), + (ConfigKeys.SLURM_SCANCEL, "SCANCEL"), + (ConfigKeys.SLURM_SCONTROL, "SCONTROL"), + (ConfigKeys.SLURM_SQUEUE, "SQUEUE"), + (ConfigKeys.SLURM_MAX_RUNTIME, "MAX_RUNTIME"), + (ConfigKeys.SLURM_MEMORY, "MEMORY"), + (ConfigKeys.SLURM_MEMORY_PER_CPU, "MEMORY_PER_CPU"), + (ConfigKeys.SLURM_SQUEUE_TIMEOUT, "SQUEUE_TIMEOUT"), + (ConfigKeys.SLURM_EXCLUDE_HOST_OPTION, "EXCLUDE_HOST"), + (ConfigKeys.SLURM_INCLUDE_HOST_OPTION, "INCLUDE_HOST"), +] + + +def _extract_ert_queue_options_from_simulator_config( + simulator: Optional[SimulatorConfig], queue_system +) -> List[Tuple[str, str, Any]]: + if simulator is None: + simulator = SimulatorConfig() + + if queue_system == ConfigKeys.LSF: + return simulator.extract_ert_queue_options( + queue_system=QueueSystem.LSF, everest_to_ert_key_tuples=_LSF_OPTIONS + ) + elif queue_system == ConfigKeys.LOCAL: + return [ + ( + QueueSystem.LOCAL, + "MAX_RUNNING", + simulator.cores or 8, + ) + ] + elif queue_system == ConfigKeys.SLURM: + return simulator.extract_ert_queue_options( + queue_system=QueueSystem.SLURM, everest_to_ert_key_tuples=_SLURM_OPTIONS + ) + + raise KeyError( + f"Invalid queue_system: {queue_system}, " + "expected one of: ['lsf', 'local', 'slurm']" + ) + + +def _extract_queue_system(ever_config: EverestConfig, ert_config): + queue_system = ( + ever_config.simulator.queue_system if ever_config.simulator else None + ) or "local" + ert_config["QUEUE_SYSTEM"] = QueueSystem(queue_system.upper()) + ert_config.setdefault("QUEUE_OPTION", []).extend( + _extract_ert_queue_options_from_simulator_config( + ever_config.simulator, queue_system + ) + ) diff --git a/src/everest/simulator/__init__.py b/src/everest/simulator/__init__.py new file mode 100644 index 00000000000..6a7b87b4d26 --- /dev/null +++ b/src/everest/simulator/__init__.py @@ -0,0 +1,115 @@ +from ert.simulator.batch_simulator_context import Status +from everest.simulator.simulator import Simulator + +JOB_SUCCESS = "Success" +JOB_WAITING = "Waiting" +JOB_RUNNING = "Running" +JOB_FAILURE = "Failure" + + +DEFAULT_DATA_SUMMARY_KEYS = ("YEAR", "YEARS" "TCPU", "TCPUDAY", "MONTH", "DAY") + + +DEFAULT_FIELD_SUMMARY_KEYS = ( + "FOPR", + "FOPT", + "FOIR", + "FOIT", + "FWPR", + "FWPT", + "FWIR", + "FWIT", + "FGPR", + "FGPT", + "FGIR", + "FGIT", + "FVPR", + "FVPT", + "FVIR", + "FVIT", + "FWCT", + "FGOR", + "FOIP", + "FOIPL", + "FOIPG", + "FWIP", + "FGIP", + "FGIPL", + "FGIPG", + "FPR", + "FAQR", + "FAQRG", + "FAQT", + "FAQTG", + "FWGR", +) + + +DEFAULT_GROUP_SUMMARY_KEYS = ( + "GOPR", + "GOPT", + "GOIR", + "GOIT", + "GWPR", + "GWPT", + "GWIR", + "GWIT", + "GGPR", + "GGPT", + "GGIR", + "GGIT", + "GVPR", + "GVPT", + "GVIR", + "GVIT", + "GWCT", + "GGOR", + "GWGR", +) + + +_DEFAULT_WELL_SUMMARY_KEYS = ( + "WOPR", + "WOPT", + "WOIR", + "WOIT", + "WWPR", + "WWPT", + "WWIR", + "WWIT", + "WGPR", + "WGPT", + "WGIR", + "WGIT", + "WVPR", + "WVPT", + "WVIR", + "WVIT", + "WWCT", + "WGOR", + "WWGR", + "WBHP", + "WTHP", + "WPI", +) + +_EXCLUDED_TARGET_KEYS = "WGOR" + +_DEFAULT_WELL_TARGET_SUMMARY_KEYS = ( + well_key + "T" + for well_key in _DEFAULT_WELL_SUMMARY_KEYS + if well_key.endswith("R") and well_key not in _EXCLUDED_TARGET_KEYS +) + +DEFAULT_WELL_SUMMARY_KEYS = _DEFAULT_WELL_SUMMARY_KEYS + tuple( + _DEFAULT_WELL_TARGET_SUMMARY_KEYS +) + +__all__ = [ + "JOB_FAILURE", + "JOB_RUNNING", + "JOB_SUCCESS", + "JOB_WAITING", + "Simulator", + "Status", +] diff --git a/src/everest/simulator/everest_to_ert.py b/src/everest/simulator/everest_to_ert.py new file mode 100644 index 00000000000..b15d3c015da --- /dev/null +++ b/src/everest/simulator/everest_to_ert.py @@ -0,0 +1,479 @@ +import collections +import itertools +import json +import logging +import os +from typing import Union + +import everest +from everest.config import EverestConfig +from everest.config.install_data_config import InstallDataConfig +from everest.config.install_job_config import InstallJobConfig +from everest.config.simulator_config import SimulatorConfig +from everest.config_keys import ConfigKeys +from everest.queue_driver.queue_driver import _extract_queue_system +from everest.strings import EVEREST, SIMULATION_DIR, STORAGE_DIR +from everest.util.forward_models import collect_forward_models + + +def _get_datafiles(ever_config: EverestConfig): + ever_model = ever_config.model + data_file = ever_model.data_file + if data_file is None: + return [] + + # Make absolute path + if os.path.relpath(data_file): + config_path = ever_config.config_directory + assert isinstance(config_path, str) + data_file = os.path.join(config_path, data_file) + data_file = os.path.realpath(data_file) + + # Render all iterations + realizations = ever_model.realizations + if not realizations: + return [data_file] + + return [data_file.replace("", str(geo_id)) for geo_id in realizations] + + +def _load_all_groups(data_files): + groups = [] + for data_file in data_files: + groups += everest.util.read_groupnames(data_file) + + return set(groups) + + +def _load_all_wells(data_files): + wells = [] + for data_file in data_files: + wells += everest.util.read_wellnames(data_file) + + return set(wells) + + +def _extract_summary_keys(ever_config: EverestConfig, ert_config): + data_files = _get_datafiles(ever_config) + if len(data_files) == 0: + return + + data_keys = everest.simulator.DEFAULT_DATA_SUMMARY_KEYS + field_keys = everest.simulator.DEFAULT_FIELD_SUMMARY_KEYS + group_sum_keys = everest.simulator.DEFAULT_GROUP_SUMMARY_KEYS + well_sum_keys = everest.simulator.DEFAULT_WELL_SUMMARY_KEYS + user_specified_keys = ( + [] + if ever_config.export is None or ever_config.export.keywords is None + else ever_config.export.keywords + ) + + # Makes it work w/ new config setup, default will be empty list + # when old way of doing it is phased out + if user_specified_keys is None: + user_specified_keys = [] + + try: + groups = _load_all_groups(data_files) + except Exception: + warn_msg = ( + "Failed to load group names from {}. " + "No group summary data will be internalized during run." + ) + logging.getLogger("everest").warning(warn_msg.format(data_files)) + groups = [] + + group_keys = [ + "{sum_key}:{gname}".format(sum_key=sum_key, gname=gname) + for (sum_key, gname) in itertools.product(group_sum_keys, groups) + ] + + try: + data_wells = list(_load_all_wells(data_files)) + except Exception: + warn_msg = ( + "Failed to load well names from {}. " + "Only well data for wells specified in config file will be " + "internalized during run." + ) + logging.getLogger(EVEREST).warning(warn_msg.format(data_files)) + data_wells = [] + + everest_wells = [well.name for well in ever_config.wells] + wells = list(set(data_wells + everest_wells)) + + well_keys = [ + "{sum_key}:{wname}".format(sum_key=sum_key, wname=wname) + for (sum_key, wname) in itertools.product(well_sum_keys, wells) + ] + + all_keys = ( + list(data_keys) + + list(field_keys) + + group_keys + + well_keys + + user_specified_keys + ) + all_keys = list(set(all_keys)) + ert_config["SUMMARY"] = [all_keys] + + +def _extract_environment(ever_config: EverestConfig, ert_config): + simulation_fmt = os.path.join( + "", "geo_realization_", SIMULATION_DIR + ) + + assert ever_config.simulation_dir is not None + simulation_path = os.path.join(ever_config.simulation_dir, simulation_fmt) + # load log configuration data + + assert ever_config.output_dir is not None + default_runpath_file = os.path.join(ever_config.output_dir, ".res_runpath_list") + default_ens_path = os.path.join(ever_config.output_dir, STORAGE_DIR) + + ert_config["RUNPATH"] = simulation_path + ert_config["ENSPATH"] = default_ens_path + ert_config["RUNPATH_FILE"] = default_runpath_file + + +def _inject_simulation_defaults(ert_config, ever_config: EverestConfig): + """ + NOTE: This function is only to live until the effort of centralizing all + default values is taken. + """ + + def inject_default(key, value): + if key not in ert_config: + ert_config[key] = value + + # Until dynamically configurable in res + inject_default("NUM_REALIZATIONS", 10000) + + inject_default( + "ECLBASE", + (ever_config.definitions if ever_config.definitions is not None else {}).get( + ConfigKeys.ECLBASE, "eclipse/ECL" + ), + ) + + +def _extract_simulator(ever_config: EverestConfig, ert_config): + """ + Extracts simulation data from ever_config and injects it into ert_config. + """ + + ever_simulation = ever_config.simulator or SimulatorConfig() + + # Resubmit number (number of submission retries) + resubmit = ever_simulation.resubmit_limit + if resubmit is not None: + ert_config["MAX_SUBMIT"] = resubmit + 1 + + # Maximum number of seconds (MAX_RUNTIME) a forward model is allowed to run + max_runtime = ever_simulation.max_runtime + if max_runtime is not None: + ert_config["MAX_RUNTIME"] = max_runtime or 0 + + # Number of cores reserved on queue nodes (NUM_CPU) + num_fm_cpu = ever_simulation.cores_per_node + if num_fm_cpu is not None: + ert_config["NUM_CPU"] = num_fm_cpu + + _inject_simulation_defaults(ert_config, ever_config) + + +def _fetch_everest_jobs(ever_config: EverestConfig): + """This injects the default Everest jobs when configuring res. In the + future, this should be reviewed when we have proper configuration + mechanisms in place.""" + assert ever_config.output_dir is not None + job_storage = os.path.join(ever_config.output_dir, ".jobs") + logging.getLogger(EVEREST).debug( + "Creating job description files in %s" % job_storage + ) + + if not os.path.isdir(job_storage): + os.makedirs(job_storage) + + ever_jobs = [] + Job = collections.namedtuple("Job", ["name", "source"]) + all_jobs = everest.jobs.script_names + for default_job in all_jobs: + script = everest.jobs.fetch_script(default_job) + job_spec_file = os.path.join(job_storage, "_" + default_job) + with open(job_spec_file, "w", encoding="utf-8") as f: + f.write("EXECUTABLE %s" % script) + + ever_jobs.append(Job(name=default_job, source=job_spec_file)) + for job in collect_forward_models(): + ever_jobs.append(Job(name=job["name"], source=job["path"])) + + return ever_jobs + + +def _job_to_dict(job: Union[dict, InstallJobConfig]) -> Union[dict, InstallJobConfig]: + if type(job) is InstallJobConfig: + return job.model_dump(exclude_none=True) + return job + + +def _extract_jobs(ever_config, ert_config, path): + ever_jobs = [_job_to_dict(j) for j in (ever_config.install_jobs or [])] + + std_ever_jobs = _fetch_everest_jobs(ever_config) + + # Add standard Everest jobs + job_names = [job[ConfigKeys.NAME] for job in ever_jobs] + for default_job in std_ever_jobs: + if default_job.name not in job_names: + ever_jobs.append( + { + ConfigKeys.NAME: default_job.name, + ConfigKeys.SOURCE: default_job.source, + } + ) + + res_jobs = ert_config.get("INSTALL_JOB", []) + for job in ever_jobs: + new_job = ( + job[ConfigKeys.NAME], + os.path.join(path, job[ConfigKeys.SOURCE]), + ) + res_jobs.append(new_job) + + ert_config["INSTALL_JOB"] = res_jobs + + +def _extract_workflow_jobs(ever_config, ert_config, path): + workflow_jobs = [_job_to_dict(j) for j in (ever_config.install_workflow_jobs or [])] + + res_jobs = ert_config.get("LOAD_WORKFLOW_JOB", []) + for job in workflow_jobs: + new_job = ( + os.path.join(path, job[ConfigKeys.SOURCE]), + job[ConfigKeys.NAME], + ) + res_jobs.append(new_job) + + if res_jobs: + ert_config["LOAD_WORKFLOW_JOB"] = res_jobs + + +def _extract_workflows(ever_config, ert_config, path): + trigger2res = { + "pre_simulation": "PRE_SIMULATION", + "post_simulation": "POST_SIMULATION", + } + + res_workflows = ert_config.get("LOAD_WORKFLOW", []) + res_hooks = ert_config.get("HOOK_WORKFLOW", []) + + for ever_trigger, res_trigger in trigger2res.items(): + jobs = getattr(ever_config.workflows, ever_trigger, None) + if jobs is not None: + name = os.path.join(path, f".{ever_trigger}.workflow") + with open(name, "w", encoding="utf-8") as fp: + fp.writelines(jobs) + res_workflows.append((name, ever_trigger)) + res_hooks.append((ever_trigger, res_trigger)) + + if res_workflows: + ert_config["LOAD_WORKFLOW"] = res_workflows + ert_config["HOOK_WORKFLOW"] = res_hooks + + +def _internal_data_files(ever_config: EverestConfig): + assert ever_config.output_dir is not None + data_storage = os.path.join(ever_config.output_dir, ".internal_data") + data_storage = os.path.realpath(data_storage) + logging.getLogger(EVEREST).debug("Storing internal data in %s" % data_storage) + + if not os.path.isdir(data_storage): + os.makedirs(data_storage) + + well_datafile = os.path.join(data_storage, "wells.json") + with open(well_datafile, "w", encoding="utf-8") as fout: + json.dump( + [ + x.model_dump(exclude_none=True, exclude_unset=True) + for x in ever_config.wells or [] + ], + fout, + ) + + return (well_datafile,) + + +def _expand_source_path(source, ever_config: EverestConfig): + """Expands in @source and makes it absolute to config + directory if relative. + """ + assert ever_config.config_directory is not None + config_dir = ever_config.config_directory + source = source.replace("", config_dir) + if not os.path.isabs(source): + source = os.path.join(config_dir, source) + return source + + +def _is_dir_all_geo(source, ever_config: EverestConfig): + """Expands for all realizations and if: + - all are directories, returns True, + - all are files, returns False, + - some are non-existing, raises an AssertionError + """ + realizations = ever_config.model.realizations + if not realizations: + msg = "Expected realizations when analysing data installation source" + raise AssertionError(msg) + + is_dir = [] + for geo_id in realizations: + geo_source = source.replace("", str(geo_id)) + if not os.path.exists(geo_source): + msg = ( + "Expected source to exist for data installation, " + "did not find: {}".format(geo_source) + ) + raise AssertionError(msg) + + is_dir.append(os.path.isdir(geo_source)) + + if set(is_dir) == {True, False}: + msg = "Source: {} represent both files and directories".format(source) + raise ValueError(msg) + + return is_dir[0] + + +def _extract_data_operations(ever_config: EverestConfig): + symlink_fmt = "symlink {source} {link_name}" + copy_dir_fmt = "copy_directory {source} {target}" + copy_file_fmt = "copy_file {source} {target}" + + forward_model = [] + install_data = ever_config.install_data or [] + install_data += [ + InstallDataConfig( + **{ + ConfigKeys.SOURCE: datafile, + ConfigKeys.TARGET: os.path.basename(datafile), + } + ) + for datafile in _internal_data_files(ever_config) + ] + + for data_req in install_data: + target = data_req.target + + source = _expand_source_path(data_req.source, ever_config) + is_dir = _is_dir_all_geo(source, ever_config) + + if data_req.link: + forward_model.append(symlink_fmt.format(source=source, link_name=target)) + elif is_dir: + forward_model.append(copy_dir_fmt.format(source=source, target=target)) + else: + forward_model.append(copy_file_fmt.format(source=source, target=target)) + + return forward_model + + +def _extract_templating(ever_config: EverestConfig): + res_input = [control.name for control in ever_config.controls] + res_input = [fn + ".json" for fn in res_input] + res_input += _internal_data_files(ever_config) + + forward_model = [] + install_templates = ever_config.install_templates or [] + for tmpl_request in install_templates: + # User can define a template w/ extra data to be used with it, + # append file as arg to input_files if declared. + if tmpl_request.extra_data is not None: + res_input.append(tmpl_request.extra_data) + + args = " ".join( + [ + "--output", + tmpl_request.output_file, + "--template", + tmpl_request.template, + "--input_files", + *res_input, + ] + ) + forward_model.append(f"render {args}") + + return forward_model + + +def _insert_strip_dates_job(everest_config: EverestConfig, forward_model): + report_steps = everest_config.model.report_steps + + if report_steps: + simulation_idx = [ + idx + for idx, model in enumerate(forward_model) + if "eclipse" in model.split()[0] or "flow" in model.split()[0] + ] + + strip_dates_job_str = "{job_name} {args}".format( + job_name="strip_dates", + args="--summary {file} --dates {dates}".format( + file=".UNSMRY", dates=" ".join(report_steps) + ), + ) + + for idx in simulation_idx: + forward_model.insert(idx + 1, strip_dates_job_str) + return forward_model + + +def _extract_forward_model(ever_config: EverestConfig, ert_config): + forward_model = _extract_data_operations(ever_config) + forward_model += _extract_templating(ever_config) + forward_model += ever_config.forward_model or [] + forward_model = _insert_strip_dates_job(ever_config, forward_model) + + sim_job = ert_config.get("SIMULATION_JOB", []) + for job in forward_model: + tmp = job.split() + sim_job.append(tuple(tmp)) + + ert_config["SIMULATION_JOB"] = sim_job + + +def _extract_model(ever_config: EverestConfig, ert_config): + _extract_summary_keys(ever_config, ert_config) + + +def _extract_seed(ever_config: EverestConfig, ert_config): + assert ever_config.environment is not None + random_seed = ever_config.environment.random_seed + + if random_seed: + ert_config["RANDOM_SEED"] = random_seed + + +def everest_to_ert_config(ever_config: EverestConfig, site_config=None): + """ + Takes as input an Everest configuration, the site-config and converts them + to a corresponding ert configuration. + """ + ert_config = site_config if site_config is not None else {} + + config_dir = ever_config.config_directory + ert_config["DEFINE"] = [("", config_dir)] + + # Extract simulator and simulation related configs + _extract_simulator(ever_config, ert_config) + _extract_forward_model(ever_config, ert_config) + _extract_environment(ever_config, ert_config) + _extract_jobs(ever_config, ert_config, config_dir) + _extract_workflow_jobs(ever_config, ert_config, config_dir) + _extract_workflows(ever_config, ert_config, config_dir) + _extract_model(ever_config, ert_config) + _extract_queue_system(ever_config, ert_config) + _extract_seed(ever_config, ert_config) + + return ert_config diff --git a/src/everest/simulator/simulator.py b/src/everest/simulator/simulator.py new file mode 100644 index 00000000000..eafe861f317 --- /dev/null +++ b/src/everest/simulator/simulator.py @@ -0,0 +1,292 @@ +import time +from collections import defaultdict +from itertools import count +from typing import Any, DefaultDict, Dict, List, Mapping, Optional, Tuple, Union + +import numpy as np +from numpy import float64 +from numpy._typing import NDArray +from ropt.evaluator import EvaluatorContext, EvaluatorResult + +from ert import BatchSimulator, WorkflowRunner +from ert.config import ErtConfig, HookRuntime +from ert.storage import open_storage +from everest.config import EverestConfig +from everest.config.control_variable_config import ( + ControlVariableConfig, + ControlVariableGuessListConfig, +) +from everest.simulator.everest_to_ert import everest_to_ert_config + + +class Simulator(BatchSimulator): + """Everest simulator: BatchSimulator""" + + def __init__(self, ever_config: EverestConfig, callback=None): + self._ert_config = ErtConfig.with_plugins().from_dict( + config_dict=everest_to_ert_config( + ever_config, site_config=ErtConfig.read_site_config() + ) + ) + controls_def = self._get_controls_def(ever_config) + results_def = self._get_results_def(ever_config) + + super(Simulator, self).__init__( + self._ert_config, controls_def, results_def, callback=callback + ) + + self._batch = 0 + self._cache: Optional[_SimulatorCache] = None + if ever_config.simulator is not None and ever_config.simulator.enable_cache: + self._cache = _SimulatorCache() + + @staticmethod + def _get_variables( + variables: Union[ + List[ControlVariableConfig], List[ControlVariableGuessListConfig] + ], + ) -> Union[List[str], Dict[str, List[str]]]: + if ( + isinstance(variables[0], ControlVariableConfig) + and getattr(variables[0], "index", None) is None + ): + return [var.name for var in variables] + result: DefaultDict[str, list] = defaultdict(list) + for variable in variables: + if isinstance(variable, ControlVariableGuessListConfig): + result[variable.name].extend( + str(index + 1) for index, _ in enumerate(variable.initial_guess) + ) + else: + result[variable.name].append(str(variable.index)) # type: ignore + return dict(result) # { name : [ index ] + + def _get_controls_def( + self, ever_config: EverestConfig + ) -> Dict[str, Union[List[str], Dict[str, List[str]]]]: + controls = ever_config.controls or [] + return { + control.name: self._get_variables(control.variables) for control in controls + } + + def _get_results_def(self, ever_config: EverestConfig): + self._function_aliases = { + objective.name: objective.alias + for objective in ever_config.objective_functions + if objective.alias is not None + } + constraints = ever_config.output_constraints or [] + for constraint in constraints: + if ( + constraint.upper_bound is not None + and constraint.lower_bound is not None + ): + self._function_aliases[f"{constraint.name}:lower"] = constraint.name + self._function_aliases[f"{constraint.name}:upper"] = constraint.name + + objectives_names = [ + objective.name + for objective in ever_config.objective_functions + if objective.name not in self._function_aliases + ] + + constraint_names = [ + constraint.name for constraint in (ever_config.output_constraints or []) + ] + return objectives_names + constraint_names + + def __call__( + self, control_values: NDArray[np.float64], metadata: EvaluatorContext + ) -> EvaluatorResult: + active = ( + np.ones(control_values.shape[0], dtype=np.bool_) + if metadata.active is None + else np.fromiter( + (metadata.active[realization] for realization in metadata.realizations), + dtype=np.bool_, + ) + ) + case_data = [] + cached = {} + assert metadata.config.realizations.names is not None + realization_ids = [ + metadata.config.realizations.names[realization] # type: ignore + for realization in metadata.realizations + ] + + for sim_idx, real_id in enumerate(realization_ids): + if self._cache is not None: + cache_id = self._cache.find_key(real_id, control_values[sim_idx, :]) + if cache_id is not None: + cached[sim_idx] = cache_id + active[sim_idx] = False + + if active[sim_idx]: + controls: DefaultDict[str, Any] = defaultdict(dict) + assert metadata.config.variables.names is not None + for control_name, control_value in zip( + metadata.config.variables.names, # type: ignore + control_values[sim_idx, :], + ): + self._add_control(controls, control_name, control_value) + case_data.append((real_id, controls)) + + with open_storage(self._ert_config.ens_path, "w") as storage: + sim_context = self.start(f"batch_{self._batch}", case_data, storage) + while sim_context.running(): + time.sleep(0.2) + results = sim_context.results() + + # Pre-simulation workflows are run by sim_context, but + # post-stimulation workflows are not, do it here: + ensemble = sim_context.get_ensemble() + for workflow in self.ert_config.hooked_workflows[ + HookRuntime.POST_SIMULATION + ]: + WorkflowRunner( + workflow, storage, ensemble, ert_config=self.ert_config + ).run_blocking() + + for fnc_name, alias in self._function_aliases.items(): + for result in results: + result[fnc_name] = result[alias] + + names = metadata.config.objective_functions.names + objectives = self._get_active_results( + results, + names, # type: ignore + control_values, + active, + ) + + constraints = None + if metadata.config.nonlinear_constraints is not None: + names = metadata.config.nonlinear_constraints.names + assert names is not None + constraints = self._get_active_results( + results, # type: ignore + names, # type: ignore + control_values, + active, + ) + + if self._cache is not None: + for sim_idx, cache_id in cached.items(): + objectives[sim_idx, ...] = self._cache.get_objectives(cache_id) + if constraints is not None: + constraints[sim_idx, ...] = self._cache.get_constraints(cache_id) + + sim_ids = np.empty(control_values.shape[0], dtype=np.intc) + sim_ids.fill(-1) + sim_ids[active] = np.arange(len(results), dtype=np.intc) + + # Note the negative sign for the objective results. Everest aims to do a + # maximization, while the standard practice of minimizing is followed by + # ropt. Therefore we will minimize the negative of the objectives: + result = EvaluatorResult( + batch_id=self._batch, + objectives=-objectives, + constraints=constraints, + evaluation_ids=sim_ids, + ) + + # Add the results from active simulations to the cache: + if self._cache is not None: + for sim_idx, real_id in enumerate(realization_ids): + if active[sim_idx]: + self._cache.add_simulation_results( + sim_idx, real_id, control_values, objectives, constraints + ) + + self._batch += 1 + return result + + @staticmethod + def _add_control( + controls: Mapping[str, Any], control_name: Tuple[Any, ...], control_value: float + ) -> None: + group_name = control_name[0] + variable_name = control_name[1] + group = controls[group_name] + if len(control_name) > 2: + index_name = str(control_name[2]) + if variable_name in group: + group[variable_name][index_name] = control_value + else: + group[variable_name] = {index_name: control_value} + else: + group[variable_name] = control_value + + @staticmethod + def _get_active_results( + results: List[Dict[str, NDArray[np.float64]]], + names: Tuple[str], + controls: NDArray[np.float64], + active: NDArray[np.bool_], + ) -> NDArray[np.float64]: + values = np.zeros((controls.shape[0], len(names)), dtype=float64) + for func_idx, name in enumerate(names): + values[active, func_idx] = np.fromiter( + (np.nan if result is None else result[name][0] for result in results), + dtype=np.float64, + ) + return values + + @property + def number_of_evaluated_batches(self) -> int: + return self._batch + + +# This cache can be used to prevent re-evaluation of forward models. Due to its +# simplicity it has some limitations: +# - There is no limit on the number of cached entries. +# - Searching in the cache is by brute-force, iterating over the entries. +# Both of these should not be an issue for the intended use with cases where the +# forward models are very expensive to compute: The number of cached entries is +# not expected to become prohibitively large. +class _SimulatorCache: + def __init__(self) -> None: + # Stores the realization/controls key, together with an ID. + self._keys: DefaultDict[int, List[Tuple[NDArray[np.float64], int]]] = ( + defaultdict(list) + ) + # Store objectives and constraints by ID: + self._objectives: Dict[int, NDArray[np.float64]] = {} + self._constraints: Dict[int, NDArray[np.float64]] = {} + + # Generate unique ID's: + self._counter = count() + + def add_simulation_results( + self, + sim_idx: int, + real_id: int, + control_values: NDArray[np.float64], + objectives: NDArray[np.float64], + constraints: Optional[NDArray[np.float64]], + ): + cache_id = next(self._counter) + self._keys[real_id].append((control_values[sim_idx, :].copy(), cache_id)) + self._objectives[cache_id] = objectives[sim_idx, ...].copy() + if constraints is not None: + self._constraints[cache_id] = constraints[sim_idx, ...].copy() + + def find_key( + self, real_id: int, control_vector: NDArray[np.float64] + ) -> Optional[int]: + # Brute-force search, premature optimization is the root of all evil: + for cached_vector, cache_id in self._keys.get(real_id, []): + if np.allclose( + control_vector, + cached_vector, + rtol=0.0, + atol=float(np.finfo(np.float32).eps), + ): + return cache_id + return None + + def get_objectives(self, cache_id: int) -> NDArray[np.float64]: + return self._objectives[cache_id] + + def get_constraints(self, cache_id: int) -> NDArray[np.float64]: + return self._constraints[cache_id] diff --git a/src/everest/strings.py b/src/everest/strings.py new file mode 100644 index 00000000000..50be1da326b --- /dev/null +++ b/src/everest/strings.py @@ -0,0 +1,33 @@ +CERTIFICATE_DIR = "cert" + +DATE_FORMAT = "%Y-%m-%d" +DETACHED_NODE_DIR = "detached_node_output" +DEFAULT_OUTPUT_DIR = "everest_output" +DEFAULT_LOGGING_FORMAT = "%(asctime)s %(name)s %(levelname)s: %(message)s" + +EVEREST_SERVER_CONFIG = "everserver_config" +EVEREST = "everest" + +HOSTFILE_NAME = "hostfile" + +NAME = "name" + +OPTIMIZATION_OUTPUT_DIR = "optimization_output" +OPTIMIZATION_LOG_DIR = "logs" +OPT_PROGRESS_ENDPOINT = "opt_progress" +OPT_PROGRESS_ID = "optimization_progress" +OPT_FAILURE_REALIZATIONS = ( + "Optimization failed: not enough successful realizations to proceed." +) + +SESSION_DIR = ".session" +SERVER_STATUS = "status" +SIMULATION = "simulation" +SIMULATION_DIR = "simulation_" +SIMULATOR_START = "start" +SIMULATOR_UPDATE = "update" +SIMULATOR_END = "end" +SIM_PROGRESS_ENDPOINT = "sim_progress" +SIM_PROGRESS_ID = "simulation_progress" +STOP_ENDPOINT = "stop" +STORAGE_DIR = "simulation_results" diff --git a/src/everest/suite.py b/src/everest/suite.py new file mode 100644 index 00000000000..59f6d72f741 --- /dev/null +++ b/src/everest/suite.py @@ -0,0 +1,486 @@ +from __future__ import annotations + +import copy +import datetime +import json +import logging +import os +import random +import re +import shutil +import threading +import time +from functools import partial +from pathlib import Path +from typing import TYPE_CHECKING, Any, Callable, Dict, List, Optional, TypedDict + +from ropt.enums import EventType +from ropt.plan import OptimizationPlanRunner +from seba_sqlite import SqliteStorage + +import everest +from everest.config import EverestConfig +from everest.optimizer.everest2ropt import everest2ropt +from everest.plugins.site_config_env import PluginSiteConfigEnv +from everest.simulator import Simulator +from everest.strings import EVEREST, SIMULATOR_END, SIMULATOR_START, SIMULATOR_UPDATE +from everest.util import makedirs_if_needed + +if TYPE_CHECKING: + from ert.simulator.batch_simulator_context import BatchContext, Status + +# A number of settings for the table reporters: +RESULT_COLUMNS = { + "result_id": "ID", + "batch_id": "Batch", + "functions.weighted_objective": "Total-Objective", + "linear_constraints.violations": "IC-violation", + "nonlinear_constraints.violations": "OC-violation", + "functions.objectives": "Objective", + "functions.constraints": "Constraint", + "evaluations.unscaled_variables": "Control", + "linear_constraints.values": "IC-diff", + "nonlinear_constraints.values": "OC-diff", + "functions.scaled_objectives": "Scaled-Objective", + "functions.scaled_constraints": "Scaled-Constraint", + "evaluations.variables": "Scaled-Control", + "nonlinear_constraints.scaled_values": "Scaled-OC-diff", + "nonlinear_constraints.scaled_violations": "Scaled-OC-violation", + "metadata.restart": "Restart", +} +GRADIENT_COLUMNS = { + "result_id": "ID", + "batch_id": "Batch", + "gradients.weighted_objective": "Total-Gradient", + "gradients.objectives": "Grad-objective", + "gradients.constraints": "Grad-constraint", +} +SIMULATION_COLUMNS = { + "result_id": "ID", + "batch_id": "Batch", + "realization": "Realization", + "evaluations.evaluation_ids": "Simulation", + "evaluations.unscaled_variables": "Control", + "evaluations.objectives": "Objective", + "evaluations.constraints": "Constraint", + "evaluations.variables": "Scaled-Control", + "evaluations.scaled_objectives": "Scaled-Objective", + "evaluations.scaled_constraints": "Scaled-Constraint", +} +PERTURBATIONS_COLUMNS = { + "result_id": "ID", + "batch_id": "Batch", + "realization": "Realization", + "evaluations.perturbed_evaluation_ids": "Simulation", + "evaluations.unscaled_perturbed_variables": "Control", + "evaluations.perturbed_objectives": "Objective", + "evaluations.perturbed_constraints": "Constraint", + "evaluations.perturbed_variables": "Scaled-Control", + "evaluations.scaled_perturbed_objectives": "Scaled-Objective", + "evaluations.scaled_perturbed_constraints": "Scaled-Constraint", +} +MIN_HEADER_LEN = 3 + + +class SimulationStatus(TypedDict): + status: Status + progress: List[List[JobProgress]] + batch_number: int + + +class JobProgress(TypedDict): + name: str + status: str + error: Optional[str] + start_time: Optional[datetime.datetime] + end_time: Optional[datetime.datetime] + realization: str + simulation: str + + +def start_optimization( + config, simulation_callback=None, optimization_callback=None, display_all_jobs=True +): + workflow = _EverestWorkflow( + config, simulation_callback, optimization_callback, display_all_jobs + ) + with PluginSiteConfigEnv(): + res = workflow.start_optimization() + return res + + +def _add_defaults(config: EverestConfig): + """This function exists as a temporary mechanism to default configurations that + needs to be global in the sense that they should carry over both to ropt and ERT. + When the proper mechanism for this is implemented this code + should die. + + """ + defaulted_config = config.copy() + assert defaulted_config.environment is not None + + random_seed = defaulted_config.environment.random_seed + if random_seed is None: + random_seed = random.randint(1, 2**30) + + defaulted_config.environment.random_seed = random_seed + + logging.getLogger(EVEREST).info("Using random seed: %d", random_seed) + logging.getLogger(EVEREST).info( + "To deterministically reproduce this experiment, " + "add the above random seed to your configuration file." + ) + + return defaulted_config + + +class _MonitorThread(threading.Thread): + """Invoke a callback when a sim context status changes. + + This thread will run as long as the given context is running. + If the status of the simulation context changes, the callback + function will be called with the appropriate status change. + + Notice that there are two callbacks at play here. We have one, + EverestWorkflow._simulation_callback, which will notify us whenever a new + simulation batch is starting, and the "user provided" callback, + which will be called from this class whenever the status of the + simulation context changes. + """ + + def __init__( + self, + context: BatchContext, + callback: Optional[Callable[[SimulationStatus], Any]] = None, + error_callback=None, + delete_run_path=False, + display_all_jobs=False, + ): + super(_MonitorThread, self).__init__() + + # temporarily living simulation context + self._context = context + self._callback = callback if callback is not None else lambda *_, **__: None + self._delete_run_path = delete_run_path + self._display_all_jobs = display_all_jobs + self._shutdown_flag = False # used to gracefully shut down this thread + self._error_callback = error_callback + + def _cleanup(self) -> None: + # cleanup + if self._delete_run_path and self._context is not None: + for context_index in range(len(self._context)): + if self._context.is_job_completed(context_index): + path_to_delete = self._context.run_path(context_index) + if os.path.isdir(path_to_delete): + + def onerror(_, path, sys_info): + logging.getLogger(EVEREST).debug( + "Failed to remove {}, {}".format(path, sys_info) + ) + + shutil.rmtree(path_to_delete, onerror=onerror) # pylint: disable=deprecated-argument + + self._context = None + self._callback = lambda *_, **__: None + self._shutdown_flag = True + + @property + def _batch_number(self): + """ + Return the current batch number from context. + + """ + # Get the string name of current case + batch_n_sim_string = self._context.get_ensemble().name + + search = re.search(r"batch_([0-9]+)", batch_n_sim_string) + return search.groups()[-1] if search is not None else "N/A" + + def _simulation_status(self) -> SimulationStatus: + assert self._context is not None + + def extract(path_str, key): + regex = r"/{}_(\d+)/".format(key) + found = next(re.finditer(regex, path_str), None) + return found.group(1) if found is not None else "unknown" + + # if job is waiting, the status returned + # by the job_progress() method is unreliable + jobs_progress: List[List[JobProgress]] = [] + batch_number = self._batch_number + for i in range(len(self._context)): + progress_queue = self._context.job_progress(i) + if self._context.is_job_waiting(i) or progress_queue is None: + jobs_progress.append([]) + else: + jobs: List[JobProgress] = [] + for fms in progress_queue.steps: + if ( + not self._display_all_jobs + and fms.name in everest.jobs.shell_commands + ): + continue + realization = extract(fms.std_out_file, "geo_realization") + simulation = extract(fms.std_out_file, "simulation") + jobs.append( + { + "name": fms.name, + "status": fms.status, + "error": fms.error, + "start_time": fms.start_time, + "end_time": fms.end_time, + "realization": realization, + "simulation": simulation, + } + ) + if fms.error is not None: + self._error_callback( + batch_number, + simulation, + realization, + fms.name, + fms.std_err_file, + ) + jobs_progress.append(jobs) + return { + "status": copy.deepcopy(self._context.status), + "progress": jobs_progress, + "batch_number": batch_number, + } + + def run(self): + if self._context is None: + self._cleanup() + return + try: + status = None + while self._context.running() and not self._shutdown_flag: + newstatus = self._simulation_status() + if status == newstatus: # No change in status + time.sleep(1) + continue + signal = self._callback( + newstatus, + event=SIMULATOR_START if status is None else SIMULATOR_UPDATE, + ) + status = newstatus + if signal == "stop_queue": + self.stop() + self._callback(status, event=SIMULATOR_END) + finally: + self._cleanup() + + def stop(self): + if self._context is not None: + self._context.stop() + self._shutdown_flag = True + + +class _EverestWorkflow(object): + """ + An instance of this class is the main object in everest. + + Through this object an optimization experiment is instantiated and executed/run. + This object will provide access to the entire optimization configuration. + """ + + def __init__( + self, + config: EverestConfig, + simulation_callback=None, + optimization_callback=None, + display_all_jobs=True, + ): + """Will initialize an Everest instance either from a configuration file or + a loaded config. + + @config a dictionary containing the configuration. See everest --doc + for documentation on the config + + @callback a function that will be called whenever changes in the + simulation or optimization routine occur, e.g., when one + realization's simulation completes, the status vector will be + sent, with the event SIMULATOR_UPDATE. + """ + + # Callbacks + self._sim_callback = simulation_callback + self._opt_callback = optimization_callback + + self._monitor_thread = None # Thread for monitoring simulator activity + + self._config = _add_defaults(config) + + makedirs_if_needed(self.config.log_dir) + makedirs_if_needed(self.config.optimization_output_dir) + + self._simulation_delete_run_path = ( + False + if config.simulator is None + else (config.simulator.delete_run_path or False) + ) + + self._display_all_jobs = display_all_jobs + self._fm_errors: Dict[str, Dict[str, Any]] = {} + self._max_batch_num_reached = False + + def _handle_errors(self, batch, simulation, realization, fm_name, error_path): + fm_id = "b_{}_r_{}_s_{}_{}".format(batch, realization, simulation, fm_name) + logger = logging.getLogger("forward_models") + with open(error_path, "r", encoding="utf-8") as errors: + error_str = errors.read() + + error_hash = hash(error_str) + err_msg = "Batch: {} Realization: {} Simulation: {} Job: {} Failed {}".format( + batch, realization, simulation, fm_name, "Error: {}\n {}" + ) + + if error_hash not in self._fm_errors: + error_id = len(self._fm_errors) + logger.error(err_msg.format(error_id, error_str)) + self._fm_errors.update({error_hash: {"error_id": error_id, "ids": [fm_id]}}) + elif fm_id not in self._fm_errors[error_hash]["ids"]: + self._fm_errors[error_hash]["ids"].append(fm_id) + error_id = self._fm_errors[error_hash]["error_id"] + logger.error(err_msg.format(error_id, "")) + + def _simulation_callback(self, *args, **_): + logging.getLogger(EVEREST).debug("Simulation callback called") + ctx = args[0] + if ctx is None: + return + if self._monitor_thread is not None: + self._monitor_thread.stop() + + self._monitor_thread = _MonitorThread( + context=ctx, + error_callback=self._handle_errors, + callback=self._sim_callback, + delete_run_path=self._simulation_delete_run_path, + display_all_jobs=self._display_all_jobs, + ) + self._monitor_thread.start() + + def _ropt_callback(self, event, optimizer, simulator): + logging.getLogger(EVEREST).debug("Optimization callback called") + + if self._config.optimization.max_batch_num is not None and ( + simulator.number_of_evaluated_batches + >= self._config.optimization.max_batch_num + ): + self._max_batch_num_reached = True + logging.getLogger(EVEREST).info("Maximum number of batches reached") + optimizer.abort_optimization() + if ( + self._opt_callback is not None + and self._opt_callback() == "stop_optimization" + ): + logging.getLogger(EVEREST).info("User abort requested.") + optimizer.abort_optimization() + + def start_optimization(self): + """Run an optimization with the current settings. + + This method must be called from the same thread where this + object has been created (probably because of the use of sqlite3 + deeper down). + This method is not thread safe. Multiple overlapping executions + of this method will probably lead to a crash + """ + assert self._monitor_thread is None + + # Initialize the Everest simulator: + simulator = Simulator(self.config, callback=self._simulation_callback) + + # Initialize the ropt optimizer: + optimizer = self._configure_optimizer(simulator) + + # Before each batch evaluation we check if we should abort: + optimizer.add_observer( + EventType.START_EVALUATION, + partial(self._ropt_callback, optimizer=optimizer, simulator=simulator), + ) + + # The SqliteStorage object is used to store optimization results from + # Seba in an sqlite database. It reacts directly to events emitted by + # Seba and is not called by Everest directly. The stored results are + # accessed by Everest via separate SebaSnapshot objects. + # This mechanism is outdated and not supported by the ropt package. It + # is retained for now via the seba_sqlite package. + seba_storage = SqliteStorage(optimizer, self.config.optimization_output_dir) + + # Run the optimization: + exit_code = optimizer.run().exit_code + + # Extract the best result from the storage. + self._result = seba_storage.get_optimal_result() + + if self._monitor_thread is not None: + self._monitor_thread.stop() + self._monitor_thread.join() + self._monitor_thread = None + + return "max_batch_num_reached" if self._max_batch_num_reached else exit_code + + @property + def result(self): + return self._result + + @property + def config(self) -> EverestConfig: + return self._config + + def __repr__(self): + return "EverestWorkflow(config=%s)" % json.dumps( + self.config, sort_keys=True, indent=2 + ) + + def _configure_optimizer(self, simulator: Simulator) -> OptimizationPlanRunner: + optimizer = OptimizationPlanRunner( + enopt_config=everest2ropt(self.config), + evaluator=simulator, + seed=self._config.environment.random_seed, + ) + + # Configure restarting: + if self.config.optimization.restart is not None: + optimizer.repeat( + iterations=self.config.optimization.restart.max_restarts + 1, + restart_from=self.config.optimization.restart.restart_from, + metadata_var="restart", + ) + + # Initialize output tables. `min_header_len` is set to ensure that all + # tables have the same number of header lines, simplifying code that + # reads them as fixed width tables. `maximize` is set because ropt + # reports minimization results, while everest wants maximization + # results, necessitating a conversion step. + ropt_output_folder = Path(self.config.optimization_output_dir) + optimizer.add_table( + columns=RESULT_COLUMNS, + path=ropt_output_folder / "results.txt", + min_header_len=MIN_HEADER_LEN, + maximize=True, + ) + optimizer.add_table( + columns=GRADIENT_COLUMNS, + path=ropt_output_folder / "gradients.txt", + table_type="gradients", + min_header_len=MIN_HEADER_LEN, + maximize=True, + ) + optimizer.add_table( + columns=SIMULATION_COLUMNS, + path=ropt_output_folder / "simulations.txt", + min_header_len=MIN_HEADER_LEN, + maximize=True, + ) + optimizer.add_table( + columns=PERTURBATIONS_COLUMNS, + path=ropt_output_folder / "perturbations.txt", + table_type="gradients", + min_header_len=MIN_HEADER_LEN, + maximize=True, + ) + return optimizer diff --git a/src/everest/templates/__init__.py b/src/everest/templates/__init__.py new file mode 100644 index 00000000000..916a789ab11 --- /dev/null +++ b/src/everest/templates/__init__.py @@ -0,0 +1,11 @@ +import pkg_resources + +template_names = ( + "well_drill.tmpl", + "well_order.tmpl", + "schmerge.tmpl", +) + + +def fetch_template(template_name): + return pkg_resources.resource_filename("everest.templates", template_name) diff --git a/src/everest/templates/schmerge.tmpl b/src/everest/templates/schmerge.tmpl new file mode 100644 index 00000000000..965757c85bc --- /dev/null +++ b/src/everest/templates/schmerge.tmpl @@ -0,0 +1,3 @@ +{%- for well_entry in wells -%} +INSERT {{ well_entry.completion_date }} misc/welopen_format SUB(__NAME__:{{ well_entry.name }}) +{% endfor -%} diff --git a/src/everest/templates/slot_delay.tmpl b/src/everest/templates/slot_delay.tmpl new file mode 100644 index 00000000000..c456552e56a --- /dev/null +++ b/src/everest/templates/slot_delay.tmpl @@ -0,0 +1,3 @@ +{ + "drill_delay": {{ slot_delay | dictsort(false, "key") | map("last") | list | tojson }} +} diff --git a/src/everest/templates/well_delay.tmpl b/src/everest/templates/well_delay.tmpl new file mode 100644 index 00000000000..8ef7311c09d --- /dev/null +++ b/src/everest/templates/well_delay.tmpl @@ -0,0 +1,5 @@ +[ +{% for well_name, well_delay in well_delay.items() -%} +{ "name": {{well_name}}, "drill_delay": {{well_delay}} }, +{% endfor -%} +] diff --git a/src/everest/templates/well_drill.tmpl b/src/everest/templates/well_drill.tmpl new file mode 100644 index 00000000000..a7c80fabc11 --- /dev/null +++ b/src/everest/templates/well_drill.tmpl @@ -0,0 +1 @@ +{{ well_drill.items() | selectattr("1", "greaterthan", 0.5) | map("first") | list | tojson }} diff --git a/src/everest/templates/well_order.tmpl b/src/everest/templates/well_order.tmpl new file mode 100644 index 00000000000..e9061281b48 --- /dev/null +++ b/src/everest/templates/well_order.tmpl @@ -0,0 +1 @@ +{{ well_order | dictsort(false, "value") | map("first") | list | tojson }} diff --git a/src/everest/util/__init__.py b/src/everest/util/__init__.py new file mode 100644 index 00000000000..f2168d37d60 --- /dev/null +++ b/src/everest/util/__init__.py @@ -0,0 +1,133 @@ +import datetime +import logging +import os + +from ropt.version import version as ropt_version + +from ert.shared.version import version as ert_version +from everest.plugins.hook_manager import EverestPluginManager +from everest.strings import DATE_FORMAT, DEFAULT_LOGGING_FORMAT +from everest.util.async_run import async_run # noqa + +try: + import opm.io + from opm.io.ecl_state import EclipseState + from opm.io.schedule import Schedule + + def has_opm(): + return True + +except ImportError: + + def has_opm(): + return False + + +def get_azure_logging_handler(): + pm = EverestPluginManager() + handles = pm.hook.add_log_handle_to_root() + if handles: + return handles[0] + + +def configure_logger( + name=None, + file_path=None, + log_level=None, + formatter=DEFAULT_LOGGING_FORMAT, + log_to_azure=False, +) -> logging.Logger: + logger = logging.getLogger(name) + + logger.setLevel(log_level or logging.INFO) + if file_path is not None: + makedirs_if_needed(os.path.dirname(file_path)) + handler = logging.FileHandler(file_path) + handler.setFormatter(logging.Formatter(formatter)) + logger.addHandler(handler) + + # Setup azure logging if needed + azure_handler = get_azure_logging_handler() + if log_to_azure and azure_handler: + logger.addHandler(azure_handler) + + return logger + + +def version_info(): + return ("everest:'{}'\nropt:'{}'\nert:'{}'").format( + ert_version, ropt_version, ert_version + ) + + +def date2str(date): + return datetime.datetime.strftime(date, DATE_FORMAT) + + +def str2date(date_str): + return datetime.datetime.strptime(date_str, DATE_FORMAT) + + +def makedirs_if_needed(path, roll_if_exists=False): + if os.path.isdir(path): + if not roll_if_exists: + return + _roll_dir(path) # exists and should be rolled + os.makedirs(path) + + +def _roll_dir(old_name): + old_name = os.path.realpath(old_name) + new_name = old_name + datetime.datetime.utcnow().strftime("__%Y-%m-%d_%H.%M.%S.%f") + os.rename(old_name, new_name) + logging.getLogger("everest").info("renamed %s to %s" % (old_name, new_name)) + + +def load_deck(fname): + """Take a .DATA file and return an opm.io.Deck.""" + if not os.path.exists(fname): + raise IOError('No such data file "%s".' % fname) + + if not has_opm(): + raise RuntimeError("Cannot load ECL files, opm could not be imported") + + # OPM parser will fail with different errors on corrupted Eclipse input files. + # We should ignore these as we just want to extract the wells, we don't + # care about anything else in the file (for now). + errors_to_ignore = [ + "INTERNAL_ERROR_UNINITIALIZED_THPRES", + "PARSE_EXTRA_DATA", + "PARSE_MISSING_DIMS_KEYWORD", + "PARSE_MISSING_INCLUDE", + "PARSE_RANDOM_SLASH", + "PARSE_RANDOM_TEXT", + "PARSE_UNKNOWN_KEYWORD", + "SUMMARY_UNKNOWN_GROUP", + "SUMMARY_UNKNOWN_WELL", + "UNSUPPORTED_COMPORD_TYPE", + "UNSUPPORTED_INITIAL_THPRES", + "UNSUPPORTED_SCHEDULE_GEO_MODIFIER", + "UNSUPPORTED_TERMINATE_IF_BHP", + ] + parse_context = opm.io.ParseContext( + [(err_name, opm.io.action.ignore) for err_name in errors_to_ignore] + ) + return opm.io.Parser().parse(fname, parse_context) + + +def read_wellnames(fname): + """Take a .DATA file and return the list of well + names at time the first timestep from deck.""" + deck = load_deck(fname) + state = EclipseState(deck) + schedule = Schedule(deck, state) + return [str(well.name) for well in schedule.get_wells(0)] + + +def read_groupnames(fname): + """Take a .DATA file and return the list of group + names at the first timestep from deck.""" + deck = load_deck(fname) + state = EclipseState(deck) + schedule = Schedule(deck, state) + return [str(group.name) for group in schedule._groups(0)] diff --git a/src/everest/util/async_run.py b/src/everest/util/async_run.py new file mode 100644 index 00000000000..e62550995b9 --- /dev/null +++ b/src/everest/util/async_run.py @@ -0,0 +1,37 @@ +from threading import Thread + + +def async_run(function, on_finished=None, on_error=None): + """Run a function in a separate thread. + + If the function raise an exception, on_error is called, with the + exception as first argument. + When the excecution is finished (either successfully or with an + exception), on_finished is called with: + - first argument is the value returned by the function + - second argument is None if the function completed correctly, or + it is the exception that stopeed the excecution + """ + runner = _AsyncRunner(function, on_finished, on_error) + runner.start() + + +class _AsyncRunner(Thread): + def __init__(self, function=None, on_finished=None, on_error=None): + super(_AsyncRunner, self).__init__() + self._function = function + self._on_finished = on_finished + self._on_error = on_error + + def run(self): + ret = None + error = None + try: + ret = self._function() + except Exception as e: + error = e + if self._on_error is not None: + self._on_error(e) + finally: + if self._on_finished is not None: + self._on_finished(ret, error) diff --git a/src/everest/util/forward_models.py b/src/everest/util/forward_models.py new file mode 100644 index 00000000000..87fea24a29b --- /dev/null +++ b/src/everest/util/forward_models.py @@ -0,0 +1,43 @@ +from itertools import chain +from typing import List, Type, TypeVar + +from pydantic import BaseModel, ValidationError + +from everest.plugins.hook_manager import EverestPluginManager + +pm = EverestPluginManager() +T = TypeVar("T", bound=BaseModel) + + +def collect_forward_models(): + return chain.from_iterable(pm.hook.get_forward_models()) + + +def collect_forward_model_schemas(): + schemas = pm.hook.get_forward_models_schemas() + if schemas: + return schemas.pop() + return {} + + +def lint_forward_model_job(job: str, args) -> List[str]: + return pm.hook.lint_forward_model(job=job, args=args) + + +def parse_forward_model_file(path: str, schema: Type[T], message: str) -> T: + try: + res = pm.hook.parse_forward_model_schema(path=path, schema=schema) + if res: + res.pop() + return res + except ValidationError as ve: + raise ValueError( + message.format( + error="\n\t\t".join( + f"{error['loc'][0]}: {error['input']} -> {error['msg']}" + for error in ve.errors() + ) + ) + ) from ve + except ValueError as ve: + raise ValueError(message.format(error=str(ve))) from ve diff --git a/src/ieverest/__init__.py b/src/ieverest/__init__.py new file mode 100644 index 00000000000..0d8eb491e8a --- /dev/null +++ b/src/ieverest/__init__.py @@ -0,0 +1,4 @@ +from ieverest.ieverest import IEverest + +__author__ = "Equinor ASA and TNO" +__all__ = ["IEverest"] diff --git a/src/ieverest/bin/__init__.py b/src/ieverest/bin/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/src/ieverest/bin/ieverest_script.py b/src/ieverest/bin/ieverest_script.py new file mode 100755 index 00000000000..af2fcae9581 --- /dev/null +++ b/src/ieverest/bin/ieverest_script.py @@ -0,0 +1,58 @@ +#! /usr/bin/env python + +import logging +import sys +from argparse import ArgumentParser + +from qtpy.QtCore import Qt +from qtpy.QtWidgets import QApplication + +from everest.util import version_info +from ieverest import IEverest + + +def ieverest_entry(args=None): + """Entry point for running the graphical version of everest""" + if args is None: + args = sys.argv + + QApplication.setAttribute( + Qt.AA_X11InitThreads + ) # required in order to use threads later on + app = QApplication(args) + app.setOrganizationName("Equinor/TNO") + app.setApplicationName("IEverest") + + parser = _build_args_parser() + options, _ = parser.parse_known_args(args) + if options.debug: + logging.getLogger().setLevel(logging.DEBUG) + # Remove the null handler if set: + logging.getLogger().removeHandler(logging.NullHandler()) + + logging.info(version_info()) + + _keep_in_scope_until_exit = IEverest(config_file=options.config_file) + sys.exit(app.exec_()) + + +def _build_args_parser(): + """Build arg parser""" + arg_parser = ArgumentParser( + description="Everest graphical user interface", + usage="everest gui []", + ) + arg_parser.add_argument( + "--debug", action="store_true", help="Display debug information" + ) + arg_parser.add_argument( + "config_file", + nargs="?", + default=None, + help="Start IEverest with the given configuration file", + ) + return arg_parser + + +if __name__ == "__main__": + ieverest_entry() diff --git a/src/ieverest/config_widget.py b/src/ieverest/config_widget.py new file mode 100644 index 00000000000..a505e3dd4b0 --- /dev/null +++ b/src/ieverest/config_widget.py @@ -0,0 +1,26 @@ +from io import StringIO + +from qtpy.QtWidgets import QWidget +from ruamel.yaml import YAML + +from everest.config import EverestConfig +from ieverest import utils + + +class ConfigWidget(QWidget): + """A widget for setting up an Everest configuration""" + + def __init__(self, parent=None): + super(ConfigWidget, self).__init__(parent) + utils.load_ui("config_widget.ui", self) + + self._config = None + + def set_config(self, config: EverestConfig): + """Set the config to be exposed by this widget.""" + self._config = config + yaml = YAML(typ="safe", pure=True) + yaml.default_flow_style = False + with StringIO() as sio: + yaml.dump(self._config.to_dict(), sio) + self.config_edit.setPlainText(sio.getvalue()) diff --git a/src/ieverest/ieverest.py b/src/ieverest/ieverest.py new file mode 100644 index 00000000000..96208dd2fc0 --- /dev/null +++ b/src/ieverest/ieverest.py @@ -0,0 +1,333 @@ +from pydantic import ValidationError +from qtpy.QtCore import QObject, QThread, Signal +from qtpy.QtWidgets import QFileDialog, QMessageBox, qApp + +from ert.config import ErtConfig +from ert.storage import open_storage +from everest.config import EverestConfig, validation_utils +from everest.detached import ( + ServerStatus, + everserver_status, + generate_everserver_ert_config, + get_opt_status, + get_sim_status, + server_is_running, + start_monitor, + start_server, + stop_server, + wait_for_context, + wait_for_server, + wait_for_server_to_stop, +) +from everest.plugins.site_config_env import PluginSiteConfigEnv +from everest.simulator import Status +from everest.strings import OPT_PROGRESS_ID, SIM_PROGRESS_ID +from everest.util import configure_logger, makedirs_if_needed +from ieverest import settings +from ieverest.io import QtDialogsOut, QtStatusBarOut +from ieverest.main_window import MainWindow +from ieverest.utils import ( + APP_OUT_DIALOGS, + APP_OUT_LOGGER, + APP_OUT_STATUS_BAR, + app_output, +) +from ieverest.widgets import ExportDataDialog + + +class ServerMonitorThread(QThread): + def __init__(self, config: EverestConfig): + self._config = config + super(ServerMonitorThread, self).__init__() + self.stop = False + + progress = Signal(dict) + finished = Signal() + + @staticmethod + def convert(status): + transformed_signal = {} + if SIM_PROGRESS_ID in status: + sim_progress = status[SIM_PROGRESS_ID] + if sim_progress: + sim_progress.update({"status": Status(**sim_progress["status"])}) + transformed_signal.update( + { + "type": SIM_PROGRESS_ID, + "status": sim_progress, + } + ) + + if OPT_PROGRESS_ID in status: + opt_progress = status[OPT_PROGRESS_ID] + if opt_progress: + transformed_signal.update( + { + "type": OPT_PROGRESS_ID, + "progress": opt_progress, + } + ) + + return transformed_signal + + def signal_callback(self, status): + converted_status = self.convert(status) + self.progress.emit(converted_status) + return self.stop + + def run(self): + start_monitor(config=self._config, callback=self.signal_callback) + # Emit finished signal when monitoring is done + self.finished.emit() + + def quit(self): + self.stop = True + super(ServerMonitorThread, self).quit() + + +class IEverest(QObject): + """Main class of the graphical version of Everest. + + This class has the following responsibilities: + - managing an Everest configuration + - setting up the GUI + - controlling the Everest optimization backend + """ + + def __init__(self, config_file=None, parent=None): + super(IEverest, self).__init__(parent) + self._gui = MainWindow() + self._setup_connections() + self._storage = None + aout = app_output() + gui_logger = configure_logger(APP_OUT_LOGGER, log_to_azure=True) + aout.add_output_channel(gui_logger, APP_OUT_LOGGER) + aout.add_output_channel(QtDialogsOut(self._gui), APP_OUT_DIALOGS) + aout.add_output_channel( + QtStatusBarOut(self._gui.statusBar()), APP_OUT_STATUS_BAR + ) + + self._gui.recent_files = settings.recent_files() + self._gui.show() + + self.server_monitor = None + # This needs to be the last part of the IEverest constructor + if config_file is not None: + self.open(config_file) + + @property + def config(self) -> EverestConfig: + return self._gui.get_config() + + @config.setter + def config(self, new_config: EverestConfig): + self._gui.set_config(new_config) + + def _setup_connections(self): + """Connect the signals coming from the GUI to appropriate slots""" + self._gui.export_requested.connect(self.export) + self._gui.open_requested.connect(self.open) + self._gui.quit_requested.connect(self.quit) + + self._gui.monitor_gui.start_opt_requested.connect(self.start_optimization) + self._gui.monitor_gui.stop_opt_requested.connect(self.stop_optimization_prompt) + self._gui.monitor_gui.export_requested.connect(self.export) + + def stop_optimization_prompt(self): + """Executes and returns the user preference with respect to killing the + server""" + status = self.stop_monitoring() + self._gui.monitor_gui.update_status( + workflow_is_running=not status, + ) + return status + + def _update_recent_files(self, filepath): + files = settings.add_recent_file(filepath) + self._gui.recent_files = files + + def export(self): + if server_is_running(self.config): + app_output().info("Cannot export while optimization is running") + return + export_data_dlg = ExportDataDialog(self.config) + export_data_dlg.show() + + def open(self, filename=""): + if server_is_running(self.config) and not self.stop_optimization_prompt(): + return + filename = str(filename) # Convert Qt4 QString to str + if not filename: + selection = QFileDialog.getOpenFileName( + self._gui, + "Open configuration", + ( + str(self.config.config_path) + if self.config.config_path is not None + else "" + ), + "Everest configuration (*.yml);;All files (*.*)", + ) + filename = str(selection[0]) + if not filename: + return # user cancelled + try: + opened_config = EverestConfig.load_file(filename) + except FileNotFoundError: + app_output().critical(f"File not found {filename}") + return + except ValidationError as e: + app_output().critical( + f"Loading config file <{filename}> failed with:\n\n" + f"{validation_utils.format_errors(e)}" + ) + app_output().info(validation_utils.format_errors(e)) + return + self.config = opened_config + self._update_recent_files(filename) + server_state = everserver_status(self.config) + + if server_is_running(self.config): + self._gui.monitor_gui.update_status( + workflow_is_running=True, + ) + ert_config = ErtConfig.with_plugins().from_dict( + generate_everserver_ert_config(self.config) + ) + self._storage = open_storage(ert_config.ens_path) + self.start_monitoring_detached_server(self.update_progress_callback) + + # Detached server found maybe change some buttons + app_output().info("Attaching to optimization session in progress...") + elif server_state["status"] != ServerStatus.never_run: + self._gui.monitor_gui.reset() + self._gui.monitor_gui.update_optimization_progress( + get_opt_status(self.config.optimization_output_dir) + ) + self._gui.monitor_gui.update_status(get_sim_status(self.config)) + + else: + self._gui.monitor_gui.reset() + + def stop_monitoring(self, timeout=60): + msg = """ + A detached optimization is currently running.\n + Do you want to stop it? + {}""".format( + """Press Yes to stop the optimization + Press No to only stop monitoring the optimization + """ + if self.server_monitor is not None + else "" + ) + + answer = QMessageBox.question( + self._gui, + "Stop detached optimization?", + msg, + QMessageBox.Cancel | QMessageBox.No | QMessageBox.Yes, + ) + if answer == QMessageBox.Yes: + if stop_server(self.config): + wait_for_server_to_stop(self.config, timeout) + self.stop_monitoring_detached_server() + return True + return False + if answer == QMessageBox.No: + self.stop_monitoring_detached_server() + return True + return False + + def quit(self): + if not server_is_running(self.config) or self.stop_optimization_prompt(): + qApp.quit() + else: + return + + def update_progress_callback(self, prog): + if not prog or "type" not in prog: + return None + + if prog["type"] == SIM_PROGRESS_ID: + self._gui.monitor_gui.update_status( + workflow_status=prog["status"], + workflow_is_running=self.server_monitor is not None, + ) + else: + assert prog["type"] == OPT_PROGRESS_ID + self._gui.monitor_gui.update_optimization_progress(prog["progress"]) + return True + + def start_optimization(self): + """Run an optimization using the current configuration""" + self._gui.monitor_gui.update_status(workflow_is_running=True) + app_output().info("Starting optimization...") + + config_dict = self.config.to_dict() + app_output().info(f"Running everest with config info\n{config_dict!s}") + for fm_job in self.config.forward_model: + job_name = fm_job.split()[0] + app_output().info(f"Everest forward model contains job {job_name}") + + server_started = self.start_detached_server() + if server_started: + self.start_monitoring_detached_server(self.update_progress_callback) + + def start_detached_server(self): + if not server_is_running(self.config): + app_output().info("Starting optimization session....") + with PluginSiteConfigEnv(): + ert_config = ErtConfig.with_plugins().from_dict( + generate_everserver_ert_config(self.config) + ) + + makedirs_if_needed(self.config.output_dir, roll_if_exists=True) + self._storage = open_storage(ert_config.ens_path, "w") + context = start_server(self.config, ert_config, self._storage) + try: + wait_for_server(self.config, timeout=600, context=context) + except: + app_output().info("Starting session failed!") + return False + return True + + def server_monitoring_finished(self): + wait_for_context() + self._gui.monitor_gui.update_status(workflow_is_running=False) + self.stop_monitoring_detached_server() + server_state = everserver_status(self.config) + + if server_state["status"] == ServerStatus.completed: + self._gui.monitor_gui.reset() + self._gui.monitor_gui.update_optimization_progress( + get_opt_status(self.config.optimization_output_dir) + ) + self._gui.monitor_gui.update_status(get_sim_status(self.config)) + app_output().info("Optimization completed") + elif server_state["status"] == ServerStatus.stopped: + app_output().info("Optimization stopped") + elif server_state["status"] == ServerStatus.failed: + app_output().critical( + "Optimization failed:\n {}".format(server_state["message"]) + ) + + def start_monitoring_detached_server(self, progress_callback): + if self.server_monitor: + self.server_monitor.quit() + + self.server_monitor = ServerMonitorThread(config=self.config) + + # Connect monitoring server thread signals + self.server_monitor.progress.connect(progress_callback) + self.server_monitor.finished.connect(self.server_monitoring_finished) + + self._gui.monitor_gui.reset() + + self.server_monitor.start() + + def stop_monitoring_detached_server(self): + if self.server_monitor is not None: + self.server_monitor.quit() + self.server_monitor = None + if self._storage: + self._storage.close() diff --git a/src/ieverest/io/__init__.py b/src/ieverest/io/__init__.py new file mode 100644 index 00000000000..93ad1c569a1 --- /dev/null +++ b/src/ieverest/io/__init__.py @@ -0,0 +1,5 @@ +from .output_dispatcher import OutputDispatcher +from .qt_dialogs_output import QtDialogsOut +from .qt_status_bar_output import QtStatusBarOut + +__all__ = ["OutputDispatcher", "QtDialogsOut", "QtStatusBarOut"] diff --git a/src/ieverest/io/output_dispatcher.py b/src/ieverest/io/output_dispatcher.py new file mode 100644 index 00000000000..4864a27603e --- /dev/null +++ b/src/ieverest/io/output_dispatcher.py @@ -0,0 +1,48 @@ +import inspect +import logging + + +class OutputDispatcher(object): + """Forward output requests to multiple output channels""" + + def __init__(self, output_channels={}): # noqa B006 + super(OutputDispatcher, self).__init__() + self.output_channels = output_channels + + def add_output_channel(self, channel, channel_id): + self.output_channels[channel_id] = channel + + def _get_out_channels(self, channel_ids=None): + if channel_ids is None: + return self.output_channels + return {k: ch for k, ch in self.output_channels.items() if k in channel_ids} + + def _forward_to_output(self, func_name, message, channels=None, **kwargs): + for k, ch in self._get_out_channels(channels).items(): + try: + func = getattr(ch, func_name) + args, _, has_kwargs, *_ = inspect.getfullargspec(func) + if has_kwargs: + func(message, **kwargs) + else: + filtered_kwargs = {k: v for k, v in kwargs.items() if k in args} + func(message, **filtered_kwargs) + except: + logging.getLogger().debug( + "Can't find function {} on channel {}".format(func_name, k) + ) + + def debug(self, message, channels=None, **kwargs): + self._forward_to_output("debug", message, channels, **kwargs) + + def info(self, message, channels=None, **kwargs): + self._forward_to_output("info", message, channels, **kwargs) + + def warning(self, message, channels=None, **kwargs): + self._forward_to_output("warning", message, channels, **kwargs) + + def _error(self, message, channels=None, **kwargs): + self._forward_to_output("_error", message, channels, **kwargs) + + def critical(self, message, channels=None, **kwargs): + self._forward_to_output("critical", message, channels, **kwargs) diff --git a/src/ieverest/io/qt_dialogs_output.py b/src/ieverest/io/qt_dialogs_output.py new file mode 100644 index 00000000000..deefec7dbe6 --- /dev/null +++ b/src/ieverest/io/qt_dialogs_output.py @@ -0,0 +1,28 @@ +from logging import CRITICAL, DEBUG, INFO, WARNING + +from qtpy.QtWidgets import QMessageBox + + +class QtDialogsOut(object): + """Support output requests through Qt Dialogs""" + + def __init__(self, qt_main_window, log_level=WARNING): + super(QtDialogsOut, self).__init__() + self._main_window = qt_main_window + self.log_level = log_level + + def critical(self, message, force=False): + if self.log_level <= CRITICAL or force: + QMessageBox.critical(self._main_window, "Critical", message) + + def warning(self, message, force=False): + if self.log_level <= WARNING or force: + QMessageBox.warning(self._main_window, "Warning", message) + + def info(self, message, force=False): + if self.log_level <= INFO or force: + QMessageBox.information(self._main_window, "Information", message) + + def debug(self, message, force=False): + if self.log_level <= DEBUG or force: + QMessageBox.information(self._main_window, "Debug", message) diff --git a/src/ieverest/io/qt_status_bar_output.py b/src/ieverest/io/qt_status_bar_output.py new file mode 100644 index 00000000000..96a7207898c --- /dev/null +++ b/src/ieverest/io/qt_status_bar_output.py @@ -0,0 +1,43 @@ +from logging import CRITICAL, DEBUG, ERROR, INFO, WARNING + + +class QtStatusBarOut(object): + """Support output requests through Qt Status Bar""" + + def __init__(self, qt_status_bar, log_level=INFO, default_timeout=2000): + super(QtStatusBarOut, self).__init__() + self._bar = qt_status_bar + self.log_level = log_level + self.default_timeout = default_timeout + + def _show_msg(self, level, message, timeout=None, force=False): + """Show a message on the status bar. + + The message is shown iff its level is greater than self.log_level or if + force is True. If timeout is a positive number, the message disappear + after the given timeout (in ms). If timeout is None, the default_timeout + is used. If timeout is -1, no timeout is set. + """ + if level < self.log_level and not force: + return + if timeout is None: + timeout = self.default_timeout + if timeout < 0: + self._bar.showMessage(message) + else: + self._bar.showMessage(message, timeout) + + def critical(self, message, timeout=None, force=False): + self._show_msg(CRITICAL, message, timeout, force) + + def _error(self, message, timeout=None, force=False): + self._show_msg(ERROR, message, timeout, force) + + def warning(self, message, timeout=None, force=False): + self._show_msg(WARNING, message, timeout, force) + + def info(self, message, timeout=None, force=False): + self._show_msg(INFO, message, timeout, force) + + def debug(self, message, timeout=None, force=False): + self._show_msg(DEBUG, message, timeout, force) diff --git a/src/ieverest/main_window.py b/src/ieverest/main_window.py new file mode 100644 index 00000000000..1804a65b483 --- /dev/null +++ b/src/ieverest/main_window.py @@ -0,0 +1,211 @@ +from functools import partial + +from qtpy.QtCore import Qt, Signal +from qtpy.QtGui import QIcon +from qtpy.QtWidgets import ( + QAction, + QLabel, + QMainWindow, + QMenu, + QPushButton, + QTabWidget, + QVBoxLayout, + QWidget, +) + +from everest import __version__ as everest_version +from everest.config import EverestConfig +from ieverest.config_widget import ConfigWidget +from ieverest.monitor_widget import MonitorWidget +from ieverest.utils import load_ui + + +class MainWindow(QMainWindow): + """The main window of the Everest GUI + + It contains the usual stuff (menus, statusbar, etc) and 3 tabs: one + for setting up a configuration, one for starting and monitoring the + execution, one for processing the results. + """ + + export_requested = Signal() + open_requested = Signal(str) + quit_requested = Signal() + + def __init__(self, parent=None): + self._config = EverestConfig.with_defaults(**{}) + self._actions = {} + self._recent_files = [] + + super(MainWindow, self).__init__(parent) + load_ui("main_window.ui", self) + self.setWindowTitle("IEverest") + + self.tabs = QTabWidget() + self.monitor_gui = MonitorWidget(self.tabs) + self.config_gui = ConfigWidget(self.tabs) + self.tabs.addTab(self.monitor_gui, "Optimization") + self.tabs.addTab(self.config_gui, "Configuration") + self.tabs.setVisible(False) # will be shown when a config is set + + self._init_actions() + self._init_menus() + + self._set_startup_ui() # must be after init_actions and init_menus + + def _init_actions(self): + self.register_action( + "open", + "&Open...", + self, + icon=QIcon.fromTheme("document-open"), + shortcut=Qt.CTRL + Qt.Key_O, + on_triggered=partial(self.open_requested.emit, ""), + ) + self.register_action( + "export", "&Export results...", self, on_triggered=self.export_requested + ) + self.register_action( + "quit", + "&Quit", + self, + icon=QIcon.fromTheme("application-exit"), + on_triggered=self.quit_requested, + ) + + def _init_menus(self): + file_menu = self.menubar.findChildren(QMenu, "menu_file") + assert len(file_menu) == 1 + file_menu = file_menu[0] + recent_menu = QMenu("&Recent", file_menu) + recent_menu.setObjectName("menu_recent_files") + file_menu.addAction(self.actions["open"]) + file_menu.addMenu(recent_menu) + file_menu.addSeparator() + file_menu.addAction(self.actions["export"]) + file_menu.addSeparator() + file_menu.addAction(self.actions["quit"]) + + help_menu = self.menuBar().addMenu("Help") + help_menu.setObjectName("help_menu") + about_action = help_menu.addAction("About") + about_action.setObjectName("about_action") + about_action.triggered.connect(lambda x: self.show_about()) + + self.about_widget = QWidget(self) + self.about_widget.setWindowFlags(Qt.Window) + self.about_widget.setObjectName("about_widget") + + layout = QVBoxLayout(self.about_widget) + layout.addWidget(QLabel("Everest version:<\b>")) + layout.addWidget(QLabel("{version}".format(version=everest_version))) + + github_label = QLabel( + 'Everest GitHub', self + ) + github_label.setOpenExternalLinks(True) + layout.addWidget(github_label) + layout.addStretch(30) + + close_button = QPushButton("Close", self.about_widget) + close_button.setObjectName("button_close_about") + layout.addWidget(close_button) + close_button.clicked.connect(lambda x: self.hide_about()) + + def hide_about(self): + self.about_widget.setVisible(False) + self.about_widget.setWindowModality(Qt.WindowModality.NonModal) + + def show_about(self): + self.about_widget.setWindowModality(Qt.WindowModality.ApplicationModal) + self.about_widget.setVisible(True) + self.about_widget.setWindowTitle("About Everest") + + def _set_startup_ui(self): + self._startup_gui = load_ui("startup_widget.ui") + self._startup_gui.open_btn.clicked.connect(self.actions["open"].triggered.emit) + + recent_menu = self.menubar.findChildren(QMenu, "menu_recent_files") + assert len(recent_menu) == 1 + recent_menu = recent_menu[0] + self._startup_gui.recent_btn.setMenu(recent_menu) + + self.setCentralWidget(self._startup_gui) + + @property + def actions(self): + return self._actions + + @property + def recent_files(self): + return self._recent_files + + @recent_files.setter + def recent_files(self, files): + self._recent_files = files + menu = self.menubar.findChildren(QMenu, "menu_recent_files") + assert len(menu) == 1 + menu = menu[0] + menu.clear() + self._startup_gui.recent_btn.setEnabled(bool(files)) + for rf in files: + act = QAction(rf, menu) + act.triggered.connect(partial(self.open_requested.emit, rf)) + menu.addAction(act) + + def register_action( + self, + action_id, + text, + parent, + icon=None, + enabled=True, + checkable=False, + checked=False, + shortcut=None, + shortcutcontext=None, + on_hovered=None, + on_toggled=None, + on_triggered=None, + ): + act = QAction(icon, text, parent) if icon is not None else QAction(text, parent) + act.setEnabled(enabled) + act.setCheckable(checkable) + act.setChecked(checked) + if shortcut is not None: + act.setShortcut(shortcut) + if shortcutcontext is not None: + act.setShortcutContext(shortcutcontext) + if on_hovered is not None: + act.hovered.connect(on_hovered) + if on_toggled is not None: + act.toggled.connect(on_toggled) + if on_triggered is not None: + act.triggered.connect(on_triggered) + self._actions[action_id] = act + return act + + def set_config(self, config: EverestConfig): + # On first config, enable the "main" ui + if self.centralWidget() is not self.tabs: + self.tabs.setVisible(True) + self.setCentralWidget(self.tabs) + + self._config = config + self.config_gui.set_config(config) + + self.monitor_gui.set_config(config) + self.monitor_gui.create_objective_fn_widgets_from_config() + + self.setWindowTitle(f"IEverest - {self._config.config_path}") + + def get_config(self) -> EverestConfig: + return self._config + + # --- Overridden methods --- + + def closeEvent(self, event): + # event triggered when the user click on the X on the top right + # notify that quitting has been requested and ignore the event + self.quit_requested.emit() + event.ignore() diff --git a/src/ieverest/monitor_widget.py b/src/ieverest/monitor_widget.py new file mode 100644 index 00000000000..ff39259f892 --- /dev/null +++ b/src/ieverest/monitor_widget.py @@ -0,0 +1,260 @@ +from typing import Optional + +import pandas as pd +from dateutil import parser +from qtpy.QtCore import Signal +from qtpy.QtWidgets import QComboBox, QVBoxLayout, QWidget + +from everest.config import EverestConfig +from everest.simulator import JOB_FAILURE, JOB_SUCCESS +from ieverest.utils import load_ui, remove_layout_item +from ieverest.widgets import BatchStatusWidget, PlotWidget +from ieverest.widgets.batch_status_widget import get_job_status + + +class MonitorWidget(QWidget): + """A widget for running and monitoring an Everest configuration""" + + start_opt_requested = Signal() + stop_opt_requested = Signal() + export_requested = Signal() + + def __init__(self, parent=None): + self._config: Optional[EverestConfig] = None + + super(MonitorWidget, self).__init__(parent) + + load_ui("monitor_widget.ui", self) + self.stop_btn.setEnabled(False) + + # Insert stretch so all batches widgets are pushed at the top + self.batches_wdg.layout().insertStretch(0, 10) + + self.start_btn.clicked.connect(self.start_opt_requested) + self.stop_btn.clicked.connect(self.stop_opt_requested) + self.export_btn.clicked.connect(self.export_requested) + + # Individual plots as tabs + self.plot_widget_batch_timings = PlotWidget(parent=self) + + # Tab with combo box and plotwidget + self.vbox_widget = QWidget(parent=self) + vbox_layout = QVBoxLayout() + + self.objective_functions_to_render = {} + self._current_accepted_points = [] + self.combobox_objective_funcs = QComboBox(parent=self) + self.combobox_objective_funcs.currentIndexChanged.connect( + lambda: self.update_objective_plot( + str(self.combobox_objective_funcs.currentText()) + ) + ) + + self.plot_widget_selected_objective = PlotWidget(parent=self) + vbox_layout.addWidget(self.plot_widget_selected_objective) + vbox_layout.addWidget(self.combobox_objective_funcs) + self.vbox_widget.setLayout(vbox_layout) + + self.tabbed_plot_widget.addTab(self.vbox_widget, "Objective Func(s)") + self.tabbed_plot_widget.addTab(self.plot_widget_batch_timings, "Batch Timings") + + @property + def config(self) -> EverestConfig: + assert self._config is not None + assert isinstance(self._config, EverestConfig) + return self._config + + def set_config(self, config: EverestConfig): + self._config = config + + def create_objective_fn_widgets_from_config(self): + _objective_names = [func.name for func in self.config.objective_functions] + _objective_names.append("avg_objective") + + # Create combo box with objective names + the total average + self.combobox_objective_funcs.clear() + self.combobox_objective_funcs.addItems(_objective_names) + self.vbox_widget.update() + + def _add_or_update_batch_widget(self, status): + batch = int(status["batch_number"]) + wdg = self.batches_wdg.findChild(BatchStatusWidget, f"Batch {batch}") + if wdg: + wdg.status = status + else: + wdg = BatchStatusWidget( + batch_name=f"Batch {batch}", parent=self.batches_wdg + ) + wdg.status = status + self.batches_wdg.layout().insertWidget(0, wdg) + + def reset(self): + """Clear the content of the widget + + Call this before a new workflow is started + """ + # Remove all the widgets from the scroll area + while self.batches_wdg.layout().count() > 0: + remove_layout_item(self.batches_wdg.layout(), 0) + self.batches_wdg.layout().insertStretch(0, 10) + self.update_batch_timings_plot() + + self.objective_functions_to_render = {} + + # Force clear plots if they had previous displayed data + self.plot_widget_selected_objective.clear() + self.plot_widget_batch_timings.clear() + + def update_objective_plot(self, selected_name): + """ + Draw updated objectives plot + :param selected_name: current selection from the objective function combo box. + """ + if selected_name in self.objective_functions_to_render: + self.plot_widget_selected_objective.render_line_plot( + name=selected_name, + values=self.objective_functions_to_render[selected_name], + accepted_indices=self._current_accepted_points, + ) + + def update_optimization_progress(self, progress): + """ + Parameters + ---------- + progress: dict + """ + if "objectives_history" not in progress: + return + if not progress["objectives_history"]: + return + + self.objective_functions_to_render = progress["objectives_history"] + self.objective_functions_to_render["avg_objective"] = progress[ + "objective_history" + ] + self._current_accepted_points = progress["accepted_control_indices"] + + # Update the graph + self.update_objective_plot(str(self.combobox_objective_funcs.currentText())) + + def _get_batch_type(self, jobs): + """Determine the type of a batch depending on number of jobs""" + _F = "function evaluation" + _G = "gradient_evaluation" + _FG = "function and gradient" + _U = "unknown" + realizations_num = len(self.config.model.realizations) + sim_per_eval = realizations_num + # 5 is the default value from everest2ropt.py + sim_per_grad = realizations_num * ( + self.config.optimization.perturbation_num or 5 + ) + + if len(jobs) == sim_per_eval + sim_per_grad: + return _FG + if sim_per_eval == sim_per_grad: # can't tell just by using len + return _U + if len(jobs) == sim_per_eval: + return _F + if len(jobs) == sim_per_grad: + return _G + return _U + + def update_batch_timings_plot(self): + """Update the batch timings plot + + The execution time of a batch is deduced by the timing info of the + forward models in each job in the batch + """ + # NOTE: information about batches is stored in batches widget. And it + # is also read out of those widgets to determine timing information for + # the boxplot. This is arguably a bad choice, but that's where we ended + # up via incremental development. + # If we'll ever consider refactoring this, a possible better approach + # can be to have the data stored in this class so that it can be + # accessed directly for constructing the boxplots, and the batch + # widgets should just refer to it. + + batch_widgets = self.batches_wdg.findChildren(BatchStatusWidget) + # Don't bother if user not looking or no data to show + if not batch_widgets: + return + + # Create data frame from batch job timings. + data = {"batch": [], "time": [], "batch_type": []} + for wdg in reversed(batch_widgets): + jobs = wdg.status["progress"] + batch_finished = all( + get_job_status(job) in (JOB_SUCCESS, JOB_FAILURE) for job in jobs + ) + if not batch_finished: + continue # batch still running, no timing info + + batch_type = self._get_batch_type(jobs) + + for job in jobs: + if not job: + continue + start_times = [ + fm["start_time"] + for fm in job + if fm and fm["start_time"] is not None + ] + start_times = [ + parser.parse(time, fuzzy=True) + for time in start_times + if isinstance(time, str) + ] + end_times = [ + fm["end_time"] for fm in job if fm and fm["end_time"] is not None + ] + end_times = [ + parser.parse(time, fuzzy=True) + for time in end_times + if isinstance(time, str) + ] + duration = ( + 0 + if not start_times or not end_times + else (max(end_times) - min(start_times)).total_seconds() + ) + data["batch"].append(wdg.batch_name) + data["time"].append(duration) + data["batch_type"].append(batch_type) + df = pd.DataFrame(data) + + # Set new data & reverse columns to order. Batch 1, Batch 2, ... + df = df.rename( + columns={"batch": "", "time": "Time (sec)", "batch_type": "Type"} + ) + + # Render plot + # TODO: In order to render batch timing boxplots in different colors + # add another column ie. 'Batch Type', with string values indicating + # for example {'gradient', 'function', 'both'} and set the parameter + # 'hue="Batch Type"' in the method below. Now we don't have + # a clean way to get information about the batch type from ropt + self.plot_widget_batch_timings.render_box_plot( + data=df, + x="", + y="Time (sec)", + hue="Type", + ) + + def update_status(self, workflow_status=None, workflow_is_running=None): + """Update the internal status and redraw the ui.""" + if workflow_is_running is not None: + self.start_btn.setEnabled(not workflow_is_running) + self.stop_btn.setEnabled(workflow_is_running) + self.export_btn.setEnabled(not workflow_is_running) + self.repaint() + + if workflow_status is not None: + if isinstance(workflow_status, list): + workflow_status.sort(key=lambda k: k["batch_number"]) + for status in workflow_status: + self._add_or_update_batch_widget(status) + else: + self._add_or_update_batch_widget(workflow_status) + + self.update_batch_timings_plot() diff --git a/src/ieverest/settings.py b/src/ieverest/settings.py new file mode 100644 index 00000000000..703649d5a08 --- /dev/null +++ b/src/ieverest/settings.py @@ -0,0 +1,63 @@ +from contextlib import contextmanager + +from qtpy.QtCore import QSettings + + +@contextmanager +def qsettings_read_array(qsettings, array_name): + count = qsettings.beginReadArray(array_name) + yield count + qsettings.endArray() + + +@contextmanager +def qsettings_write_array(qsettings, array_name): + qsettings.beginWriteArray(array_name) + yield + qsettings.endArray() + + +@contextmanager +def qsettings_group(qsettings, group_name): + qsettings.beginGroup(group_name) + yield + qsettings.endGroup() + + +_RECENT_FILES_KEY = "recent_files" +_MAX_RECENT_FILES_KEY = "max_recent_files" +_PATH_KEY = "path" + + +def max_recent_files(): + settings = QSettings() + return settings.value(_MAX_RECENT_FILES_KEY, 20, type=int) + + +def set_max_recent_files(count): + settings = QSettings() + settings.setValue(_MAX_RECENT_FILES_KEY, count) + + +def recent_files(): + settings = QSettings() + files = [] + with qsettings_read_array(settings, _RECENT_FILES_KEY) as count: + for i in range(count): + settings.setArrayIndex(i) + files.append(settings.value(_PATH_KEY, type=str)) + return files + + +def add_recent_file(filepath): + files = recent_files() + files.insert(0, filepath) + # remove duplicates + seen = set() + files = [f for f in files if not (f in seen or seen.add(f))] + settings = QSettings() + with qsettings_write_array(settings, _RECENT_FILES_KEY): + for i in range(min(max_recent_files(), len(files))): + settings.setArrayIndex(i) + settings.setValue(_PATH_KEY, files[i]) + return files diff --git a/src/ieverest/ui/batch_status_widget.ui b/src/ieverest/ui/batch_status_widget.ui new file mode 100644 index 00000000000..03e2ec3df8a --- /dev/null +++ b/src/ieverest/ui/batch_status_widget.ui @@ -0,0 +1,285 @@ + + + Form + + + + 0 + 0 + 250 + 48 + + + + Form + + + + Qt::AlignRight|Qt::AlignTop|Qt::AlignTrailing + + + 0 + + + + + + 0 + 0 + + + + + 75 + true + + + + Batch # + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter + + + + + + + + + + 0 + 0 + + + + + 20 + 0 + + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 20 + 0 + + + + Waiting + + + 00 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 10 + 0 + + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 20 + 0 + + + + Running + + + 00 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 10 + 0 + + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 20 + 0 + + + + Finished + + + 00 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 10 + 0 + + + + Qt::Horizontal + + + + + + + + 0 + 0 + + + + + 20 + 0 + + + + Failed + + + 00 + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + 10 + 0 + + + + Qt::Horizontal + + + + + + + + + + 0 + 0 + + + + + 0 + 20 + + + + + 0 + + + + + + + + + 0 + 0 + + + + Jobs + + + Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop + + + + + + + + diff --git a/src/ieverest/ui/config_widget.ui b/src/ieverest/ui/config_widget.ui new file mode 100644 index 00000000000..0bdd7f3a225 --- /dev/null +++ b/src/ieverest/ui/config_widget.ui @@ -0,0 +1,62 @@ + + + Form + + + + 0 + 0 + 788 + 647 + + + + Form + + + + + + true + + + + + 0 + 0 + 768 + 627 + + + + + + + Raw config file + + + + + + + 400 + 300 + + + + true + + + + + + + + + + + + + + + diff --git a/src/ieverest/ui/export_dialog.ui b/src/ieverest/ui/export_dialog.ui new file mode 100644 index 00000000000..cc497e23e2b --- /dev/null +++ b/src/ieverest/ui/export_dialog.ui @@ -0,0 +1,156 @@ + + + Dialog + + + Qt::ApplicationModal + + + + 0 + 0 + 446 + 305 + + + + Export data + + + + + 10 + 10 + 431 + 285 + + + + + + + + 12 + 75 + true + + + + Export Eclipse keywords + + + + + + + + + + If left empty, all the keywords will be exported + + + + + + + Separate entries by a comma, wildcards are supported + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + <html><head/><body><p><span style=" font-size:12pt; font-weight:600;">Export batches</span></p></body></html> + + + + + + + + + + If left empty, all batches will be exported + + + + + + + Separate entries by a comma + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + If checked the export will not contain gradient simulations + + + Discard Gradient + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + Export + + + + + + + Cancel + + + + + + + + + + + diff --git a/src/ieverest/ui/main_window.ui b/src/ieverest/ui/main_window.ui new file mode 100644 index 00000000000..8b46a6adcd4 --- /dev/null +++ b/src/ieverest/ui/main_window.ui @@ -0,0 +1,64 @@ + + + EverestMainWindow + + + + 0 + 0 + 800 + 600 + + + + MainWindow + + + + + + + + 0 + 0 + 800 + 22 + + + + + &File + + + + + + + + &Open... + + + + + Recent + + + + + Save + + + + + &About + + + + + &Preferences... + + + + + + diff --git a/src/ieverest/ui/monitor_widget.ui b/src/ieverest/ui/monitor_widget.ui new file mode 100644 index 00000000000..a8fad7ec97f --- /dev/null +++ b/src/ieverest/ui/monitor_widget.ui @@ -0,0 +1,110 @@ + + + Form + + + + 0 + 0 + 429 + 609 + + + + Form + + + + + + + + Start optimization + + + + + + + Stop optimization + + + + + + + Export results + + + + + + + + + Optimization status + + + + + + + 0 + 250 + + + + + + + + + + + + 0 + 10 + + + + Forward model evaluations + + + + + + + 0 + 200 + + + + QFrame::Plain + + + Qt::ScrollBarAlwaysOff + + + true + + + + + 0 + 0 + 383 + 226 + + + + + + + + + + + + + + diff --git a/src/ieverest/ui/startup_widget.ui b/src/ieverest/ui/startup_widget.ui new file mode 100644 index 00000000000..b22bea69433 --- /dev/null +++ b/src/ieverest/ui/startup_widget.ui @@ -0,0 +1,117 @@ + + + Form + + + + 0 + 0 + 356 + 96 + + + + Form + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 78 + 78 + + + + + 64 + 64 + + + + QToolButton::menu-indicator { image: none; } + + + &Recent... + + + + .. + + + + 48 + 48 + + + + QToolButton::InstantPopup + + + Qt::ToolButtonTextUnderIcon + + + + + + + + 78 + 78 + + + + + 64 + 64 + + + + &Open + + + + .. + + + + 48 + 48 + + + + Qt::ToolButtonTextUnderIcon + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + diff --git a/src/ieverest/utils.py b/src/ieverest/utils.py new file mode 100644 index 00000000000..be4a4ebc9a2 --- /dev/null +++ b/src/ieverest/utils.py @@ -0,0 +1,60 @@ +from os import path + +from qtpy import uic + +import ieverest.io.output_dispatcher + +UI_DIRECTORY = path.join(path.dirname(path.realpath(__file__)), "ui") + + +def ui_real_path(ui_file): + return path.realpath(path.join(UI_DIRECTORY, ui_file)) + + +def load_ui(ui_file, baseinstance=None): + return uic.loadUi(ui_real_path(ui_file), baseinstance) + + +def remove_layout_item(layout, index): + """Remove the item at @index from the @layout + + If the index is out of range, the behaviour is undefined. + """ + item = layout.takeAt(index) + + removed_widget = item.widget() + if removed_widget is not None: + removed_widget.setParent(None) + return + layout = item.layout() + if layout is not None: + layout.setParent(None) + # item must be a QSpacerItem, which does not have a parent + + +APP_OUT_LOGGER = "everest_gui_logger" +APP_OUT_DIALOGS = "everest_dialogs" +APP_OUT_STATUS_BAR = "everest_status_bar" + + +def app_output(): + """Return an OutputDispatcher unique for the current application""" + return _ApplicationOutput() + + +class _ApplicationOutputSingleton(type): + _instance = None + + def __call__(cls, *args, **kwargs): + if cls._instance is None: + cls._instance = super(_ApplicationOutputSingleton, cls).__call__( + *args, **kwargs + ) + return cls._instance + + +class _ApplicationOutput(ieverest.io.output_dispatcher.OutputDispatcher): + __metaclass__ = _ApplicationOutputSingleton + + def __init__(self): + super(_ApplicationOutput, self).__init__() diff --git a/src/ieverest/widgets/__init__.py b/src/ieverest/widgets/__init__.py new file mode 100644 index 00000000000..f1009ea8d4e --- /dev/null +++ b/src/ieverest/widgets/__init__.py @@ -0,0 +1,9 @@ +from ieverest.widgets.batch_status_widget import BatchStatusWidget +from ieverest.widgets.export_data_dialog import ExportDataDialog +from ieverest.widgets.plot_widget import PlotWidget + +__all__ = [ + "BatchStatusWidget", + "ExportDataDialog", + "PlotWidget", +] diff --git a/src/ieverest/widgets/batch_status_widget.py b/src/ieverest/widgets/batch_status_widget.py new file mode 100644 index 00000000000..102134f2819 --- /dev/null +++ b/src/ieverest/widgets/batch_status_widget.py @@ -0,0 +1,245 @@ +from typing import ClassVar + +from qtpy.QtCore import QSize, Qt +from qtpy.QtGui import QIcon, QPixmap +from qtpy.QtWidgets import QLabel, QSizePolicy, QSpacerItem, QStyle, QWidget, qApp + +from everest.simulator import JOB_FAILURE, JOB_RUNNING, JOB_SUCCESS, JOB_WAITING +from ieverest.utils import load_ui + + +def get_job_status(job_info): + """Return the job status depending on the forward models. + + job_info is supposed to be a list of dictionaries, where each + dictionary represent a forward model in a job. And each of the + dictionary should have a 'status' key. + """ + # If the list is empty, it means we have no information about + # the job. This is most likely because the job has not started + # yet, so we identify it as "Waiting" + if len(job_info) == 0: + return JOB_WAITING + + states = {fm.get("status") for fm in job_info} + + # at least one failure -> failure + if JOB_FAILURE in states: + return JOB_FAILURE + + # no failure and at least one running -> running + if JOB_RUNNING in states: + return JOB_RUNNING + + # no failure nor running, at least one not recognized -> unknown (None) + if len(states - {JOB_FAILURE, JOB_RUNNING, JOB_SUCCESS, JOB_WAITING}) > 0: + return None + + # no fail/run/unknown, at least one waiting -> waiting + if JOB_WAITING in states: + return JOB_WAITING + + return JOB_SUCCESS + + +class BatchStatusWidget(QWidget): + """A widget monitoring the status of a forward model batch""" + + _ICON_SIZE = QSize(24, 24) + _STATUS_ICONS: ClassVar = { + JOB_SUCCESS: "emblem-default", + JOB_WAITING: "emblem-new", + JOB_RUNNING: "emblem-system", + JOB_FAILURE: "emblem-important", + } + _DEFAULT_STATUS_ICON = "dialog-question" + _STATUS_TEXT: ClassVar = { + JOB_SUCCESS: "v", + JOB_WAITING: "-", + JOB_RUNNING: "*", + JOB_FAILURE: "x", + } + _DEFAULT_STATUS_TEXT = "?" + + def __init__(self, batch_name="", status=None, parent=None): + super(BatchStatusWidget, self).__init__(parent) + + # This needed to be moved before the load_ui call below, a bit unclear + # why, but apparently some signal gets fired during load_ui, which + # accesses status. + self._status = None + + load_ui("batch_status_widget.ui", self) + + self._jobs_wdgs = [] + self._spacer = QSpacerItem(0, 0, hPolicy=QSizePolicy.Expanding) + self._icons_per_row = -1 + self._icons_num = -1 + self._latest_progress = None + self.jobs_wdg.layout().addItem(self._spacer, 0, 0) + + self.setObjectName(batch_name) + self.batch_name = batch_name + self.status = status + + def paintEvent(self, event): + # Need to update the ui whenever a paintEvent occurs (so that we get + # the correct number of icons per row) + super(BatchStatusWidget, self).paintEvent(event) + self.update_ui() + + @property + def batch_name(self): + return str(self.batch_name_lbl.text()) + + @batch_name.setter + def batch_name(self, t): + self.batch_name_lbl.setText(t) + + @property + def status(self): + return self._status + + @status.setter + def status(self, s): + self._status = s + self.update_ui() + + def update_ui(self): + if self._status is None: + self.setEnabled(False) + return + status = self._status.get("status") + progress = self._status.get("progress") + if None in (status, progress): + self.setEnabled(False) + return + self.setEnabled(True) + self._set_status(status) + self._set_progress(progress) + + def _set_status(self, s): + """Update the overview section according to the given data""" + + def _txt(val, color): + if val <= 0: + return str(val) + fmt = '{}' + return fmt.format(600, color, val) + + waiting = s.waiting + s.pending + self.waiting_lbl.setText(_txt(waiting, "#ff7f00")) + self.running_lbl.setText(_txt(s.running, "#377eb8")) + self.finished_lbl.setText(_txt(s.complete, "#4daf4a")) + self.failed_lbl.setText(_txt(s.failed, "#e41a1c")) + + def _set_progress(self, progress): + """Update the details section according to the given data""" + + # Determines the number of icons per row depending on the width of the + # current visible area of the widget (and allow for a scrollbar) + tw = ( + self.jobs_wdg.visibleRegion().boundingRect().width() + - qApp.style().pixelMetric(QStyle.PM_ScrollBarExtent) + ) + iw = self._ICON_SIZE.width() + ih = self._ICON_SIZE.height() + hs = self.jobs_wdg.layout().horizontalSpacing() + vs = self.jobs_wdg.layout().verticalSpacing() + icons_per_row = (tw + hs) / (iw + hs) + + # If nothing has changed do not update the UI + # Some of the calls further down trigger a paintEvent on the parent + # widget. If the update is always done, regardless of the update, + # we get into an infinite loop of paint events + if ( + self._latest_progress == progress + and self._icons_num == len(self._jobs_wdgs) + and self._icons_per_row == icons_per_row + ): + return + + self._latest_progress = progress + self._icons_num = len(self._jobs_wdgs) + self._icons_per_row = icons_per_row + + # create new job buttons if necessary + while len(self._jobs_wdgs) < len(progress): + wdg = QLabel(self.jobs_wdg) + self._jobs_wdgs.append(wdg) + wdg.setFixedSize(self._ICON_SIZE) + + # update the buttons + for wdg, info in zip(self._jobs_wdgs, progress): + job_status = get_job_status(info) + icon_name = self._STATUS_ICONS.get(job_status, self._DEFAULT_STATUS_ICON) + + if QIcon.hasThemeIcon(icon_name): + pixmap = QIcon.fromTheme(icon_name).pixmap(self._ICON_SIZE) + wdg.setPixmap(pixmap) + wdg.setText("") + else: + text = self._STATUS_TEXT.get(job_status, self._DEFAULT_STATUS_TEXT) + wdg.setPixmap(QPixmap()) + wdg.setText(text) + + wdg.setToolTip( + "Status: {status}\n{job_info}".format( + status=job_status, job_info=self._fm_progress_message(info) + ) + ) + + # Remove items from layout + for wdg in self._jobs_wdgs: + self.jobs_wdg.layout().removeWidget(wdg) + self.jobs_wdg.layout().removeItem(self._spacer) + + row = 0 + col = 0 + for wdg in self._jobs_wdgs: + if col == icons_per_row: + col = 0 + row += 1 + self.jobs_wdg.layout().addWidget(wdg, row, col, Qt.AlignTop) + col += 1 + self.jobs_wdg.setMinimumHeight(ih * (row + 1) + vs * row) + + if len(self._jobs_wdgs) < icons_per_row: + # Add a spacer at the end of row 0 to align widgets on the left side + self.jobs_wdg.layout().addItem(self._spacer, 0, col + 1) + + @staticmethod + def _fm_progress_message(fm_info): + if len(fm_info) == 0: + return "No detailed information yet" + first_job = next(iter(fm_info), {}) + + entries = [] + for job in fm_info: + job_name = job.get("name", "unknown") + job_status = job.get("status", "unknown") + job_start = job.get("start_time", "unknown") + job_end = job.get("end_time", "unknown") + base_msg = "- {}: {}".format(job_name, job_status) + + if job_status == JOB_WAITING: + entries.append(base_msg) + continue + + msg_parts = [base_msg, " (start: {}".format(job_start)] + if job_status == JOB_RUNNING: + msg_parts.append(")") + else: + msg_parts.append(", end: {})".format(job_end)) + if job.get("error"): + msg_parts.append("\n {}".format(job["error"])) + entries.append("".join(msg_parts)) + return ( + "Realization: {realization}" + "\nSimulation: {simulation}" + "\nDetails:\n {entries}".format( + realization=first_job.get("realization", "unknown"), + simulation=first_job.get("simulation", "unknown"), + entries="\n".join(entries), + ) + ) diff --git a/src/ieverest/widgets/export_data_dialog.py b/src/ieverest/widgets/export_data_dialog.py new file mode 100644 index 00000000000..8ff16ba625d --- /dev/null +++ b/src/ieverest/widgets/export_data_dialog.py @@ -0,0 +1,62 @@ +import os + +from qtpy.QtWidgets import QDialog, QFileDialog + +from everest.config import EverestConfig +from everest.config.export_config import ExportConfig +from everest.export import export +from ieverest.utils import APP_OUT_DIALOGS, APP_OUT_STATUS_BAR, app_output, load_ui + + +class ExportDataDialog(QDialog): + def __init__(self, config: EverestConfig, parent=None): + super(ExportDataDialog, self).__init__(parent) + self.ui = load_ui("export_dialog.ui", self) + + self.config = config.copy() + + self.export_btn.clicked.connect(self.export_data) + self.cancel_btn.clicked.connect(self.close) + if self.config.export is None: + self.config.export = ExportConfig() + + discard_gradient = self.config.export.discard_gradient or False + + self.discard_gradient_cbx.setChecked(discard_gradient) + + def export_data(self): + filename, _ = QFileDialog.getSaveFileName( + self, + "Export data", + os.path.join(self.config.output_dir, "export.csv"), + "Comma Separated Values (*.csv);;All files (*.*)", + ) + filename = str(filename) + + if filename: + keywords = [ + k.strip() for k in str(self.keywords_txt.text()).split(",") if not k + ] + batches = [int(b) for b in str(self.batches_txt.text()).split(",") if not b] + + if len(batches) == 0: + batches = None + + self.config.export.batches = batches + self.config.export.keywords = keywords + self.config.export.discard_gradient = self.discard_gradient_cbx.isChecked() + + try: + df = export(self.config) + df.to_csv(filename, sep=";", index=False) + except: + app_output().critical("Unable to export data to {}".format(filename)) + raise + + self.close() + + app_output().info( + "Export completed successfully!", + channels=[APP_OUT_DIALOGS, APP_OUT_STATUS_BAR], + force=True, + ) diff --git a/src/ieverest/widgets/plot_widget.py b/src/ieverest/widgets/plot_widget.py new file mode 100644 index 00000000000..af3b98db580 --- /dev/null +++ b/src/ieverest/widgets/plot_widget.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- + +import matplotlib.pyplot as plt +import seaborn as sns +from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas +from matplotlib.backends.backend_qt5agg import ( + NavigationToolbar2QT as NavigationToolbar, +) +from qtpy.QtWidgets import QVBoxLayout, QWidget + +sns.set_style("whitegrid") + + +class PlotWidget(QWidget): + """ + Usage: + - Set widget into UI (ie. ieverest.utils.replace_widget_by_name) + """ + + def __init__(self, parent=None): + """ + Initialize UI objects + """ + super(PlotWidget, self).__init__(parent) + self.fig, self._axes = plt.subplots() + self._canvas = FigureCanvas(self.fig) + self._canvas.setParent(self) + self._toolbar = NavigationToolbar(self._canvas, parent=parent or self) + + self.setLayout(QVBoxLayout()) + self.layout().addWidget(self._toolbar) + self.layout().addWidget(self._canvas) + + def render_box_plot(self, data, **kwargs): + if data.shape[0] > 0: + self._axes.clear() + sns.boxplot(data=data, ax=self._axes, **kwargs) + + self._canvas.draw() + + def render_line_plot(self, name, values, accepted_indices=None): + """ + Display a named data series + :param name: data series name + :param values: data series values + :param accepted_indices: mark the data series values that will be + rendered as part of the line plot. Values corresponding to indices not + part of the accepted_indices will be displayed as scattered points in + the plot. + """ + if accepted_indices is None: + accepted_indices = range(len(values)) + + if len(values) > 0: + accepted = {"index": [], "values": []} + not_accepted = {"index": [], "values": []} + for i, val in enumerate(values): + if i in accepted_indices: + accepted["index"].append(i) + accepted["values"].append(val) + else: + not_accepted["index"].append(i) + not_accepted["values"].append(val) + + self._axes.clear() + self._axes.plot(accepted["index"], accepted["values"], "o-", label=name) + self._axes.plot( + not_accepted["index"], + not_accepted["values"], + "ko", + label=name + " rejected", + ) + + self._axes.legend() + self._canvas.draw() + else: + self.clear() + + def clear(self): + """ + Call when the plot widget needs to be cleared of previous displayed data. + """ + self._axes.clear() + self._canvas.draw() diff --git a/tests/conftest.py b/tests/conftest.py index c9b5742ce62..74aad581eb4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -398,7 +398,7 @@ def _shared_snake_oil_case(request, monkeypatch, source_root): "snake_oil_data" + os.environ.get("PYTEST_XDIST_WORKER", "") ) monkeypatch.chdir(snake_path) - if not os.listdir(snake_path): + if not os.path.exists(snake_path / "test_data"): _run_snake_oil(source_root) else: monkeypatch.chdir("test_data") diff --git a/tests/everest/__init__.py b/tests/everest/__init__.py new file mode 100644 index 00000000000..06b590ab516 --- /dev/null +++ b/tests/everest/__init__.py @@ -0,0 +1,3 @@ +from .utils import tmp + +__all__ = ["tmp"] diff --git a/tests/everest/conftest.py b/tests/everest/conftest.py new file mode 100644 index 00000000000..62dbfbb281e --- /dev/null +++ b/tests/everest/conftest.py @@ -0,0 +1,84 @@ +import os +import shutil +from copy import deepcopy +from pathlib import Path +from typing import Callable, Dict, Iterator, Optional, Union + +import pytest + +from everest.config.control_config import ControlConfig + + +@pytest.fixture(scope="session") +def testdata() -> Path: + return Path(__file__).parent / "test_data" + + +@pytest.fixture +def copy_testdata_tmpdir( + testdata: Path, tmp_path: Path +) -> Iterator[Callable[[Optional[str]], Path]]: + def _copy_tree(path: Optional[str] = None): + path_ = testdata if path is None else testdata / path + shutil.copytree(path_, tmp_path, dirs_exist_ok=True) + return path_ + + cwd = Path.cwd() + os.chdir(tmp_path) + yield _copy_tree + os.chdir(cwd) + + +@pytest.fixture(scope="module") +def control_data_no_variables() -> Dict[str, Union[str, float]]: + return { + "name": "group_0", + "type": "well_control", + "min": 0.0, + "max": 0.1, + "perturbation_magnitude": 0.005, + } + + +@pytest.fixture( + scope="module", + params=( + pytest.param( + [ + {"name": "w00", "initial_guess": 0.0626, "index": 0}, + {"name": "w00", "initial_guess": 0.063, "index": 1}, + {"name": "w00", "initial_guess": 0.0617, "index": 2}, + {"name": "w00", "initial_guess": 0.0621, "index": 3}, + {"name": "w01", "initial_guess": 0.0627, "index": 0}, + {"name": "w01", "initial_guess": 0.0631, "index": 1}, + {"name": "w01", "initial_guess": 0.0618, "index": 2}, + {"name": "w01", "initial_guess": 0.0622, "index": 3}, + {"name": "w02", "initial_guess": 0.0628, "index": 0}, + {"name": "w02", "initial_guess": 0.0632, "index": 1}, + {"name": "w02", "initial_guess": 0.0619, "index": 2}, + {"name": "w02", "initial_guess": 0.0623, "index": 3}, + {"name": "w03", "initial_guess": 0.0629, "index": 0}, + {"name": "w03", "initial_guess": 0.0633, "index": 1}, + {"name": "w03", "initial_guess": 0.062, "index": 2}, + {"name": "w03", "initial_guess": 0.0624, "index": 3}, + ], + id="indexed variables", + ), + pytest.param( + [ + {"name": "w00", "initial_guess": [0.0626, 0.063, 0.0617, 0.0621]}, + {"name": "w01", "initial_guess": [0.0627, 0.0631, 0.0618, 0.0622]}, + {"name": "w02", "initial_guess": [0.0628, 0.0632, 0.0619, 0.0623]}, + {"name": "w03", "initial_guess": [0.0629, 0.0633, 0.062, 0.0624]}, + ], + id="vectored variables", + ), + ), +) +def control_config( + request, + control_data_no_variables: Dict[str, Union[str, float]], +) -> ControlConfig: + config = deepcopy(control_data_no_variables) + config["variables"] = request.param + return ControlConfig.model_validate(config) diff --git a/tests/everest/dialogs_mocker.py b/tests/everest/dialogs_mocker.py new file mode 100644 index 00000000000..5361465ab3d --- /dev/null +++ b/tests/everest/dialogs_mocker.py @@ -0,0 +1,76 @@ +from qtpy.QtWidgets import QFileDialog, QMessageBox + + +def mock_dialogs( + mocker, + existing_dir=None, + open_file_name=None, + open_file_names=None, + save_file_name=None, + information_button=None, + warning_button=None, + critical_button=None, + question_button=None, +): + """Mock some methods that shows modal dialogs in Qt. + + Parameter mocker is expected to be the result of the mocker fixture + from the pytest-mock package. + When testing the Qt GUI, modal dialogs block also the execution of + the test as well. This method mocks some of the methods that open + modal dialogs, and set the given arguments as return values. If the + given argument for a certain method is None, the method is not + mocked. + Other possible workarounds for this problem are discussed at + https://github.com/pytest-dev/pytest-qt/issues/18 + """ + if existing_dir is not None: + mocker.patch.object( + QFileDialog, "getExistingDirectory", return_value=(existing_dir, None) + ) + if open_file_name is not None: + mocker.patch.object( + QFileDialog, "getOpenFileName", return_value=(open_file_name, None) + ) + if open_file_names is not None: + mocker.patch.object( + QFileDialog, "getOpenFileNames", return_value=(open_file_names, None) + ) + if save_file_name is not None: + mocker.patch.object( + QFileDialog, "getSaveFileName", return_value=(save_file_name, None) + ) + + if information_button is not None: + mocker.patch.object(QMessageBox, "information", return_value=information_button) + if warning_button is not None: + mocker.patch.object(QMessageBox, "warning", return_value=warning_button) + if critical_button is not None: + mocker.patch.object(QMessageBox, "critical", return_value=critical_button) + if question_button is not None: + mocker.patch.object(QMessageBox, "question", return_value=question_button) + + +def mock_dialogs_all( + mocker, + existing_dir="", + open_file_name="", + open_file_names="", + save_file_name="", + information_button=QMessageBox.Ok, + warning_button=QMessageBox.Ok, + critical_button=QMessageBox.Ok, + question_button=QMessageBox.Ok | QMessageBox.Yes, +): + """Same as mock_dialog but with some acceptable default""" + mock_dialogs( + mocker, + existing_dir, + open_file_name, + open_file_names, + save_file_name, + information_button, + warning_button, + critical_button, + question_button, + ) diff --git a/tests/everest/entry_points/__init__.py b/tests/everest/entry_points/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/everest/entry_points/test_config_branch_entry.py b/tests/everest/entry_points/test_config_branch_entry.py new file mode 100644 index 00000000000..af1314446c6 --- /dev/null +++ b/tests/everest/entry_points/test_config_branch_entry.py @@ -0,0 +1,108 @@ +import difflib +from os.path import exists +from unittest.mock import PropertyMock, patch + +from seba_sqlite.snapshot import SebaSnapshot + +from everest.bin.config_branch_script import config_branch_entry +from everest.config import EverestConfig +from everest.config_file_loader import load_yaml +from everest.config_keys import ConfigKeys as CK +from tests.everest.utils import relpath, tmpdir + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") +CONFIG_FILE = "config_advanced.yml" +CACHED_SEBA_FOLDER = relpath("test_data", "cached_results_config_advanced") + + +# @patch.object(EverestConfig, "optimization_output_dir", new_callable=PropertyMock) +@patch.object( + EverestConfig, + "optimization_output_dir", + new_callable=PropertyMock, + return_value=CACHED_SEBA_FOLDER, +) +@tmpdir(CONFIG_PATH) +def test_config_branch_entry(get_opt_output_dir_mock): + new_config_file_name = "new_restart_config.yml" + batch_id = 1 + + config_branch_entry([CONFIG_FILE, new_config_file_name, "-b", str(batch_id)]) + + get_opt_output_dir_mock.assert_called_once() + assert exists(new_config_file_name) + + old_config = load_yaml(CONFIG_FILE) + old_controls = old_config[CK.CONTROLS] + + assert CK.INITIAL_GUESS in old_controls[0] + + new_config = load_yaml(new_config_file_name) + new_controls = new_config[CK.CONTROLS] + + assert CK.INITIAL_GUESS not in new_controls[0] + assert len(new_controls) == len(old_controls) + assert len(new_controls[0][CK.VARIABLES]) == len(old_controls[0][CK.VARIABLES]) + + opt_controls = {} + + snapshot = SebaSnapshot(CACHED_SEBA_FOLDER) + for opt_data in snapshot._optimization_data(): + if opt_data.batch_id == batch_id: + opt_controls = opt_data.controls + + new_controls_initial_guesses = { + var[CK.INITIAL_GUESS] for var in new_controls[0][CK.VARIABLES] + } + opt_control_val_for_batch_id = {v for k, v in opt_controls.items()} + + assert new_controls_initial_guesses == opt_control_val_for_batch_id + + +@patch.object( + EverestConfig, + "optimization_output_dir", + new_callable=PropertyMock, + return_value=CACHED_SEBA_FOLDER, +) +@tmpdir(CONFIG_PATH) +def test_config_branch_preserves_config_section_order(get_opt_output_dir_mock): + new_config_file_name = "new_restart_config.yml" + batch_id = 1 + + config_branch_entry([CONFIG_FILE, new_config_file_name, "-b", str(batch_id)]) + + get_opt_output_dir_mock.assert_called_once() + assert exists(new_config_file_name) + + opt_controls = {} + + snapshot = SebaSnapshot(CACHED_SEBA_FOLDER) + for opt_data in snapshot._optimization_data(): + if opt_data.batch_id == batch_id: + opt_controls = opt_data.controls + + opt_control_val_for_batch_id = {v for k, v in opt_controls.items()} + + diff_lines = [] + with open(CONFIG_FILE, "r", encoding="utf-8") as initial_config, open( + new_config_file_name, "r", encoding="utf-8" + ) as branch_config: + diff = difflib.unified_diff( + initial_config.readlines(), + branch_config.readlines(), + n=0, + ) + for line in diff: + if line.startswith("---"): + continue + if line.startswith("+++"): + continue + if line.startswith("@@"): + continue + diff_lines.append(line.replace(" ", "").strip()) + + assert len(diff_lines) == 4 + assert "-initial_guess:0.25" in diff_lines + for control_val in opt_control_val_for_batch_id: + assert f"+initial_guess:{control_val}" in diff_lines diff --git a/tests/everest/entry_points/test_everest_entry.py b/tests/everest/entry_points/test_everest_entry.py new file mode 100644 index 00000000000..3c04b7f784a --- /dev/null +++ b/tests/everest/entry_points/test_everest_entry.py @@ -0,0 +1,517 @@ +import logging +import os +from functools import partial +from unittest.mock import PropertyMock, patch + +import pytest + +from everest.bin.everest_script import everest_entry +from everest.bin.kill_script import kill_entry +from everest.bin.monitor_script import monitor_entry +from everest.config import EverestConfig +from everest.detached import ( + SIM_PROGRESS_ENDPOINT, + ServerStatus, + everserver_status, + update_everserver_status, +) +from everest.jobs import shell_commands +from everest.simulator import JOB_SUCCESS +from ieverest.bin.ieverest_script import ieverest_entry +from tests.everest.utils import capture_streams, relpath, tmpdir + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") +CONFIG_FILE_MINIMAL = "config_minimal.yml" + + +def query_server_mock(cert, auth, endpoint): + url = "localhost" + sim_endpoint = "/".join([url, SIM_PROGRESS_ENDPOINT]) + + def build_job( + status=JOB_SUCCESS, + start_time="begining", + end_time="end", + name="default_job", + error=None, + ): + return { + "status": status, + "start_time": start_time, + "end_time": end_time, + "name": name, + "error": error, + "simulation": 0, + } + + shell_cmd_jobs = [build_job(name=command) for command in shell_commands] + all_jobs = [ + *shell_cmd_jobs, + build_job(name="make_pancakes"), + build_job(name="make_scrambled_eggs"), + ] + if endpoint == sim_endpoint: + return { + "status": { + "failed": 0, + "running": 0, + "complete": 1, + "pending": 0, + "waiting": 0, + }, + "progress": [all_jobs], + "batch_number": "0", + "event": "end", + } + else: + raise Exception("Stop! Hands in the air!") + + +def run_detached_monitor_mock( + config, show_all_jobs=False, status=ServerStatus.completed, error=None +): + update_everserver_status(config, status, message=error) + + +@patch("everest.bin.everest_script.run_detached_monitor") +@patch("everest.bin.everest_script.wait_for_server") +@patch("everest.bin.everest_script.start_server") +@patch( + "everest.bin.everest_script.everserver_status", + return_value={"status": ServerStatus.never_run, "message": None}, +) +@tmpdir(CONFIG_PATH) +def test_everest_entry_debug( + everserver_status_mock, + start_server_mock, + wait_for_server_mock, + start_monitor_mock, + caplog, +): + """Test running everest with --debug""" + with caplog.at_level(logging.DEBUG): + everest_entry([CONFIG_FILE_MINIMAL, "--debug"]) + logstream = "\n".join(caplog.messages) + start_server_mock.assert_called_once() + wait_for_server_mock.assert_called_once() + start_monitor_mock.assert_called_once() + everserver_status_mock.assert_called() + + # the config file itself is dumped at DEBUG level + assert '"controls"' in logstream + assert '"objective_functions"' in logstream + assert '"name": "distance"' in logstream + assert f'"config_path": "{os.getcwd()}/config_minimal.yml"' in logstream + + +@patch("everest.bin.everest_script.run_detached_monitor") +@patch("everest.bin.everest_script.wait_for_server") +@patch("everest.bin.everest_script.start_server") +@patch( + "everest.bin.everest_script.everserver_status", + return_value={"status": ServerStatus.never_run, "message": None}, +) +@tmpdir(CONFIG_PATH) +def test_everest_entry( + everserver_status_mock, + start_server_mock, + wait_for_server_mock, + start_monitor_mock, +): + """Test running everest in detached mode""" + everest_entry([CONFIG_FILE_MINIMAL]) + start_server_mock.assert_called_once() + wait_for_server_mock.assert_called_once() + start_monitor_mock.assert_called_once() + everserver_status_mock.assert_called() + + +@patch("everest.bin.everest_script.server_is_running", return_value=False) +@patch("everest.bin.everest_script.run_detached_monitor") +@patch("everest.bin.everest_script.wait_for_server") +@patch("everest.bin.everest_script.start_server") +@patch( + "everest.bin.everest_script.everserver_status", + return_value={"status": ServerStatus.completed, "message": None}, +) +@tmpdir(CONFIG_PATH) +def test_everest_entry_detached_already_run( + everserver_status_mock, + start_server_mock, + wait_for_server_mock, + start_monitor_mock, + server_is_running_mock, +): + """Test everest detached, when an optimization has already run""" + # optimization already run, notify the user + with capture_streams() as (out, _): + everest_entry([CONFIG_FILE_MINIMAL]) + assert "--new-run" in out.getvalue() + start_server_mock.assert_not_called() + start_monitor_mock.assert_not_called() + wait_for_server_mock.assert_not_called() + server_is_running_mock.assert_called_once() + everserver_status_mock.assert_called() + everserver_status_mock.reset_mock() + + # stopping the server has no effect + kill_entry([CONFIG_FILE_MINIMAL]) + everserver_status_mock.assert_not_called() + + # forcefully re-run the case + everest_entry([CONFIG_FILE_MINIMAL, "--new-run"]) + start_server_mock.assert_called_once() + start_monitor_mock.assert_called_once() + everserver_status_mock.assert_called() + + +@patch("everest.bin.monitor_script.server_is_running", return_value=False) +@patch("everest.bin.monitor_script.run_detached_monitor") +@patch( + "everest.bin.monitor_script.everserver_status", + return_value={"status": ServerStatus.completed, "message": None}, +) +@tmpdir(CONFIG_PATH) +def test_everest_entry_detached_already_run_monitor( + everserver_status_mock, + start_monitor_mock, + server_is_running_mock, +): + """Test everest detached, when an optimization has already run""" + # optimization already run, notify the user + with capture_streams() as (out, _): + monitor_entry([CONFIG_FILE_MINIMAL]) + assert "--new-run" in out.getvalue() + start_monitor_mock.assert_not_called() + server_is_running_mock.assert_called_once() + everserver_status_mock.assert_called() + everserver_status_mock.reset_mock() + + +@patch("everest.bin.everest_script.server_is_running", return_value=True) +@patch("everest.bin.kill_script.server_is_running", return_value=True) +@patch("everest.bin.everest_script.run_detached_monitor") +@patch("everest.bin.everest_script.wait_for_server") +@patch("everest.bin.everest_script.start_server") +@patch("everest.bin.kill_script.stop_server", return_value=True) +@patch("everest.bin.kill_script.wait_for_server_to_stop") +@patch( + "everest.bin.everest_script.everserver_status", + return_value={"status": ServerStatus.completed, "message": None}, +) +@tmpdir(CONFIG_PATH) +def test_everest_entry_detached_running( + everserver_status_mock, + wait_for_server_to_stop_mock, + stop_server_mock, + start_server_mock, + wait_for_server_mock, + start_monitor_mock, + server_is_running_mock_kill_script, + server_is_running_mock_everest_script, +): + """Test everest detached, optimization is running""" + # can't start a new run if one is already running + with capture_streams() as (out, _): + everest_entry([CONFIG_FILE_MINIMAL, "--new-run"]) + assert "everest kill" in out.getvalue() + assert "everest monitor" in out.getvalue() + start_server_mock.assert_not_called() + start_monitor_mock.assert_not_called() + wait_for_server_mock.assert_not_called() + server_is_running_mock_everest_script.assert_called_once() + server_is_running_mock_everest_script.reset_mock() + everserver_status_mock.assert_called_once() + everserver_status_mock.reset_mock() + + # stop the server + kill_entry([CONFIG_FILE_MINIMAL]) + stop_server_mock.assert_called_once() + wait_for_server_to_stop_mock.assert_called_once() + wait_for_server_mock.assert_not_called() + server_is_running_mock_kill_script.assert_called_once() + server_is_running_mock_kill_script.reset_mock() + everserver_status_mock.assert_not_called() + + # if already running, nothing happens + assert "everest kill" in out.getvalue() + assert "everest monitor" in out.getvalue() + everest_entry([CONFIG_FILE_MINIMAL]) + start_server_mock.assert_not_called() + server_is_running_mock_everest_script.assert_called_once() + everserver_status_mock.assert_called() + + +@patch("everest.bin.monitor_script.server_is_running", return_value=True) +@patch("everest.bin.monitor_script.run_detached_monitor") +@patch( + "everest.bin.monitor_script.everserver_status", + return_value={"status": ServerStatus.completed, "message": None}, +) +@tmpdir(CONFIG_PATH) +def test_everest_entry_detached_running_monitor( + everserver_status_mock, + start_monitor_mock, + server_is_running_mock, +): + """Test everest detached, optimization is running, monitoring""" + # Attach to a running optimization. + with capture_streams(): + monitor_entry([CONFIG_FILE_MINIMAL]) + start_monitor_mock.assert_called_once() + server_is_running_mock.assert_called_once() + everserver_status_mock.assert_called() + + +@patch("everest.bin.monitor_script.server_is_running", return_value=False) +@patch("everest.bin.monitor_script.run_detached_monitor") +@patch( + "everest.bin.monitor_script.everserver_status", + return_value={"status": ServerStatus.completed, "message": None}, +) +@tmpdir(CONFIG_PATH) +def test_everest_entry_monitor_no_run( + everserver_status_mock, + start_monitor_mock, + server_is_running_mock, +): + """Test everest detached, optimization is running, monitoring""" + # Attach to a running optimization. + with capture_streams() as (out, _): + monitor_entry([CONFIG_FILE_MINIMAL]) + assert "everest run" in out.getvalue() + start_monitor_mock.assert_not_called() + server_is_running_mock.assert_called_once() + everserver_status_mock.assert_called() + + +@patch("everest.bin.everest_script.server_is_running", return_value=False) +@patch("everest.bin.everest_script.wait_for_server") +@patch("everest.bin.everest_script.start_server") +@patch("everest.detached._query_server", side_effect=query_server_mock) +@patch.object( + EverestConfig, + "server_context", + new_callable=PropertyMock, + return_value=("localhost", "", ""), +) +@patch("everest.detached.get_opt_status", return_value={}) +@patch( + "everest.bin.everest_script.everserver_status", + return_value={"status": ServerStatus.never_run, "message": None}, +) +@tmpdir(CONFIG_PATH) +def test_everest_entry_show_all_jobs( + everserver_status_mock, + get_opt_status_mock, + get_server_context_mock, + query_server_mock, + start_server_mock, + wait_for_server_mock, + server_is_running_mock, +): + """Test running everest with --show-all-jobs""" + + # Test when --show-all-jobs flag is given shell command are in the list + # of forward model jobs + with capture_streams() as (out, _): + everest_entry([CONFIG_FILE_MINIMAL, "--show-all-jobs"]) + for cmd in shell_commands: + assert cmd in out.getvalue() + + +@patch("everest.bin.everest_script.server_is_running", return_value=False) +@patch("everest.bin.everest_script.wait_for_server") +@patch("everest.bin.everest_script.start_server") +@patch("everest.detached._query_server", side_effect=query_server_mock) +@patch.object( + EverestConfig, + "server_context", + new_callable=PropertyMock, + return_value=("localhost", "", ""), +) +@patch("everest.detached.get_opt_status", return_value={}) +@patch( + "everest.bin.everest_script.everserver_status", + return_value={"status": ServerStatus.never_run, "message": None}, +) +@tmpdir(CONFIG_PATH) +def test_everest_entry_no_show_all_jobs( + everserver_status_mock, + get_opt_status_mock, + get_server_context_mock, + query_server_mock, + start_server_mock, + wait_for_server_mock, + server_is_running_mock, +): + """Test running everest without --show-all-jobs""" + + # Test when --show-all-jobs flag is not given the shell command are not + # in the list of forward model jobs + with capture_streams() as (out, _): + everest_entry([CONFIG_FILE_MINIMAL]) + for cmd in shell_commands: + assert cmd not in out.getvalue() + + # Check the other jobs are still there + assert "make_pancakes" in out.getvalue() + assert "make_scrambled_eggs" in out.getvalue() + + +@patch("everest.bin.monitor_script.server_is_running", return_value=True) +@patch("everest.detached._query_server", side_effect=query_server_mock) +@patch.object( + EverestConfig, + "server_context", + new_callable=PropertyMock, + return_value=("localhost", "", ""), +) +@patch("everest.detached.get_opt_status", return_value={}) +@patch( + "everest.bin.monitor_script.everserver_status", + return_value={"status": ServerStatus.never_run, "message": None}, +) +@tmpdir(CONFIG_PATH) +def test_monitor_entry_show_all_jobs( + everserver_status_mock, + get_opt_status_mock, + get_server_context_mock, + query_server_mock, + server_is_running_mock, +): + """Test running everest with and without --show-all-jobs""" + + # Test when --show-all-jobs flag is given shell command are in the list + # of forward model jobs + + with capture_streams() as (out, _): + monitor_entry([CONFIG_FILE_MINIMAL, "--show-all-jobs"]) + for cmd in shell_commands: + assert cmd in out.getvalue() + + +@patch("everest.bin.monitor_script.server_is_running", return_value=True) +@patch("everest.detached._query_server", side_effect=query_server_mock) +@patch.object( + EverestConfig, + "server_context", + new_callable=PropertyMock, + return_value=("localhost", "", ""), +) +@patch("everest.detached.get_opt_status", return_value={}) +@patch( + "everest.bin.monitor_script.everserver_status", + return_value={"status": ServerStatus.never_run, "message": None}, +) +@tmpdir(CONFIG_PATH) +def test_monitor_entry_no_show_all_jobs( + everserver_status_mock, + get_opt_status_mock, + get_server_context_mock, + query_server_mock, + server_is_running_mock, +): + """Test running everest without --show-all-jobs""" + + # Test when --show-all-jobs flag is not given the shell command are not + # in the list of forward model jobs + with capture_streams() as (out, _): + monitor_entry([CONFIG_FILE_MINIMAL]) + for cmd in shell_commands: + assert cmd not in out.getvalue() + + # Check the other jobs are still there + assert "make_pancakes" in out.getvalue() + assert "make_scrambled_eggs" in out.getvalue() + + +@patch( + "everest.bin.everest_script.run_detached_monitor", + side_effect=partial( + run_detached_monitor_mock, + status=ServerStatus.failed, + error="Reality was ripped to shreds!", + ), +) +@patch("everest.bin.everest_script.wait_for_server") +@patch("everest.bin.everest_script.start_server") +@tmpdir(CONFIG_PATH) +def test_exception_raised_when_server_run_fails( + start_server_mock, wait_for_server_mock, start_monitor_mock +): + with pytest.raises(SystemExit, match="Reality was ripped to shreds!"): + everest_entry([CONFIG_FILE_MINIMAL]) + + +@patch("everest.bin.monitor_script.server_is_running", return_value=True) +@patch( + "everest.bin.monitor_script.run_detached_monitor", + side_effect=partial( + run_detached_monitor_mock, + status=ServerStatus.failed, + error="Reality was ripped to shreds!", + ), +) +@tmpdir(CONFIG_PATH) +def test_exception_raised_when_server_run_fails_monitor( + start_monitor_mock, server_is_running_mock +): + with pytest.raises(SystemExit, match="Reality was ripped to shreds!"): + monitor_entry([CONFIG_FILE_MINIMAL]) + + +@patch( + "everest.bin.everest_script.run_detached_monitor", + side_effect=run_detached_monitor_mock, +) +@patch("everest.bin.everest_script.wait_for_server") +@patch("everest.bin.everest_script.start_server") +@tmpdir(CONFIG_PATH) +def test_complete_status_for_normal_run( + start_server_mock, wait_for_server_mock, start_monitor_mock +): + everest_entry([CONFIG_FILE_MINIMAL]) + config = EverestConfig.load_file(CONFIG_FILE_MINIMAL) + status = everserver_status(config) + expected_status = ServerStatus.completed + expected_error = None + + assert expected_status == status["status"] + assert expected_error == status["message"] + + +@patch("everest.bin.monitor_script.server_is_running", return_value=True) +@patch( + "everest.bin.monitor_script.run_detached_monitor", + side_effect=run_detached_monitor_mock, +) +@tmpdir(CONFIG_PATH) +def test_complete_status_for_normal_run_monitor( + start_monitor_mock, server_is_running_mock +): + monitor_entry([CONFIG_FILE_MINIMAL]) + config = EverestConfig.load_file(CONFIG_FILE_MINIMAL) + status = everserver_status(config) + expected_status = ServerStatus.completed + expected_error = None + + assert expected_status == status["status"] + assert expected_error == status["message"] + + +@pytest.mark.ui_test +# Application initializes correctly with default arguments +@patch("ieverest.bin.ieverest_script.QApplication") +@patch("ieverest.bin.ieverest_script.IEverest") +@patch("ieverest.bin.ieverest_script.sys.exit") +def test_ieverest_entry(exit_mock, ieverest_mock, q_app_mock): + ieverest_entry(["config.yml"]) + + q_app_mock.assert_called_once_with(["config.yml"]) + app_mock = q_app_mock.return_value + app_mock.setOrganizationName.assert_called_once_with("Equinor/TNO") + app_mock.setApplicationName.assert_called_once_with("IEverest") + app_mock.exec_.assert_called_once() + ieverest_mock.assert_called_once_with(config_file="config.yml") + exit_mock.assert_called_once() diff --git a/tests/everest/entry_points/test_everexport.py b/tests/everest/entry_points/test_everexport.py new file mode 100644 index 00000000000..d562cb0cf4e --- /dev/null +++ b/tests/everest/entry_points/test_everexport.py @@ -0,0 +1,341 @@ +import logging +import os +import shutil +from unittest.mock import patch + +import pandas as pd +import pytest + +from everest import ConfigKeys as CK +from everest import MetaDataColumnNames as MDCN +from everest.bin.everexport_script import everexport_entry +from everest.bin.utils import ProgressBar +from everest.config import EverestConfig +from tests.everest.utils import ( + create_cached_mocked_test_case, + relpath, + satisfy, + satisfy_callable, + tmpdir, +) + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") +CONFIG_FILE_MINIMAL = "config_minimal.yml" + +CONFIG_FILE_MOCKED_TEST_CASE = "mocked_multi_batch.yml" +CONFIG_PATH_MOCKED_TEST_CASE = relpath("test_data", "mocked_test_case") + +pytestmark = pytest.mark.xdist_group(name="starts_everest") + +TEST_DATA = pd.DataFrame( + columns=[ + MDCN.BATCH, + MDCN.SIMULATION, + MDCN.IS_GRADIENT, + MDCN.START_TIME, + ], + data=[ + [0, 0, False, 0.0], # First func evaluation on 2 realizations + [0, 1, False, 0.0], + [0, 2, True, 0.0], # First grad evaluation 2 perts per real + [0, 3, True, 0.1], + [0, 4, True, 0.1], + [0, 5, True, 0.1], + [1, 0, False, 0.3], + [1, 1, False, 0.32], + [2, 0, True, 0.5], + [2, 1, True, 0.5], + [2, 2, True, 0.5], + [2, 3, True, 0.6], + ], +) + + +def export_mock(config, export_ecl=True, progress_callback=lambda _: None): + progress_callback(1.0) + return TEST_DATA + + +def empty_mock(config, export_ecl=True, progress_callback=lambda _: None): + progress_callback(1.0) + return pd.DataFrame() + + +def validate_export_mock(config): + return ([], True) + + +@pytest.fixture() +def cache_dir(request, monkeypatch): + return create_cached_mocked_test_case(request, monkeypatch) + + +@patch("everest.bin.utils.export_with_progress", side_effect=export_mock) +@tmpdir(CONFIG_PATH) +def test_everexport_entry_run(mocked_func): + """Test running everexport with not flags""" + # NOTE: there is probably a bug concerning output folders. Everexport + # seems to assume that the folder where the file will be saved exists. + config = EverestConfig.load_file(CONFIG_FILE_MINIMAL) + export_file_path = config.export_path + assert not os.path.isfile(export_file_path) + + everexport_entry([CONFIG_FILE_MINIMAL]) + + assert os.path.isfile(export_file_path) + df = pd.read_csv(export_file_path, sep=";") + assert df.equals(TEST_DATA) + + +@patch("everest.bin.utils.export_with_progress", side_effect=empty_mock) +@tmpdir(CONFIG_PATH) +def test_everexport_entry_empty(mocked_func): + """Test running everexport with no data""" + # NOTE: When there is no data (ie, the optimization has not yet run) + # the current behavior is to create an empty .csv file. It is arguable + # whether that is really the desired behavior, but for now we assume + # it is and we test against that expected behavior. + config = EverestConfig.load_file(CONFIG_FILE_MINIMAL) + export_file_path = config.export_path + assert not os.path.isfile(export_file_path) + + everexport_entry([CONFIG_FILE_MINIMAL]) + + assert os.path.isfile(export_file_path) + with open(export_file_path, "r", encoding="utf-8") as f: + content = f.read() + assert not content.strip() + + +@patch( + "everest.bin.everexport_script.validate_export", + side_effect=validate_export_mock, +) +@patch("everest.bin.utils.export") +@tmpdir(CONFIG_PATH) +@pytest.mark.fails_on_macos_github_workflow +def test_everexport_entry_batches(mocked_func, validate_export_mock): + """Test running everexport with the --batches flag""" + everexport_entry([CONFIG_FILE_MINIMAL, "--batches", "0", "2"]) + + def check_export_batches(config: EverestConfig): + batches = ( + config.export.batches if config.export is not None else None + ) or False + return set(batches) == {0, 2} + + if ProgressBar: # different calls if ProgressBar available or not + mocked_func.assert_called_once_with( + config=satisfy(check_export_batches), + export_ecl=True, + progress_callback=satisfy_callable(), + ) + else: + mocked_func.assert_called_once_with(config=satisfy(check_export_batches)) + + +@patch("everest.bin.everexport_script.export_to_csv") +@tmpdir(CONFIG_PATH) +def test_everexport_entry_no_export(mocked_func): + """Test running everexport on config file with skip_export flag + set to true""" + + # Add export section to config file and set run_export flag to false + with open(CONFIG_FILE_MINIMAL, "a", encoding="utf-8") as f: + f.write( + "{export}:\n {skip}: True".format(export=CK.EXPORT, skip=CK.SKIP_EXPORT) + ) + + config = EverestConfig.load_file(CONFIG_FILE_MINIMAL) + export_file_path = config.export_path + assert not os.path.isfile(export_file_path) + + everexport_entry([CONFIG_FILE_MINIMAL]) + # Check export to csv is called even if the skip_export entry is in the + # config file + mocked_func.assert_called_once() + + +@patch("everest.bin.everexport_script.export_to_csv") +@tmpdir(CONFIG_PATH) +def test_everexport_entry_empty_export(mocked_func): + """Test running everexport on config file with empty export section""" + + # Add empty export section to config file + with open(CONFIG_FILE_MINIMAL, "a", encoding="utf-8") as f: + f.write(f"{CK.EXPORT}:\n") + + everexport_entry([CONFIG_FILE_MINIMAL]) + # Check export to csv is called even if export section is empty + mocked_func.assert_called_once() + + +@patch("everest.bin.utils.export") +@tmpdir(CONFIG_PATH_MOCKED_TEST_CASE) +@pytest.mark.fails_on_macos_github_workflow +def test_everexport_entry_no_usr_def_ecl_keys(mocked_func): + """Test running everexport with config file containing only the + keywords label without any list of keys""" + + # Add export section to config file and set run_export flag to false + with open(CONFIG_FILE_MOCKED_TEST_CASE, "a", encoding="utf-8") as f: + f.write( + "{export}:\n {keywords}:".format( + export=CK.EXPORT, + keywords=CK.KEYWORDS, + ) + ) + + everexport_entry([CONFIG_FILE_MOCKED_TEST_CASE]) + + def condition(config: EverestConfig): + batches = config.export.batches if config.export is not None else None + keys = config.export.keywords if config.export is not None else None + return batches is None and keys is None + + if ProgressBar: + mocked_func.assert_called_once_with( + config=satisfy(condition), + export_ecl=True, + progress_callback=satisfy_callable(), + ) + else: + mocked_func.assert_called_once_with(config=satisfy(condition), export_ecl=True) + + +@patch("everest.bin.utils.export") +@tmpdir(CONFIG_PATH_MOCKED_TEST_CASE) +@pytest.mark.fails_on_macos_github_workflow +def test_everexport_entry_internalized_usr_def_ecl_keys(mocked_func, cache_dir): + """Test running everexport with config file containing a key in the + list of user defined ecl keywords, that has been internalized on + a previous run""" + + shutil.copytree( + cache_dir / "mocked_multi_batch_output", + "mocked_multi_batch_output", + dirs_exist_ok=True, + ) + + user_def_keys = ["FOPT"] + + # Add export section to config file and set run_export flag to false + with open(CONFIG_FILE_MOCKED_TEST_CASE, "a", encoding="utf-8") as f: + f.write( + "{export}:\n {keywords}: {keys}".format( + export=CK.EXPORT, keywords=CK.KEYWORDS, keys=user_def_keys + ) + ) + + everexport_entry([CONFIG_FILE_MOCKED_TEST_CASE]) + + def condition(config: EverestConfig): + batches = config.export.batches if config.export is not None else None + keys = config.export.keywords if config.export is not None else None + + return batches is None and keys == user_def_keys + + if ProgressBar: + mocked_func.assert_called_once_with( + config=satisfy(condition), + export_ecl=True, + progress_callback=satisfy_callable(), + ) + else: + mocked_func.assert_called_once_with(config=satisfy(condition), export_ecl=True) + + +@patch("everest.bin.utils.export") +@tmpdir(CONFIG_PATH_MOCKED_TEST_CASE) +@pytest.mark.fails_on_macos_github_workflow +def test_everexport_entry_non_int_usr_def_ecl_keys(mocked_func, cache_dir, caplog): + """Test running everexport when config file contains non internalized + ecl keys in the user defined keywords list""" + + shutil.copytree( + cache_dir / "mocked_multi_batch_output", + "mocked_multi_batch_output", + dirs_exist_ok=True, + ) + + non_internalized_key = "KEY" + user_def_keys = ["FOPT", non_internalized_key] + + # Add export section to config file and set run_export flag to false + with open(CONFIG_FILE_MOCKED_TEST_CASE, "a", encoding="utf-8") as f: + f.write( + "{export}:\n {keywords}: {keys}".format( + export=CK.EXPORT, keywords=CK.KEYWORDS, keys=user_def_keys + ) + ) + + with caplog.at_level(logging.DEBUG): + everexport_entry([CONFIG_FILE_MOCKED_TEST_CASE]) + + assert ( + f"Non-internalized ecl keys selected for export '{non_internalized_key}'" + in "\n".join(caplog.messages) + ) + + def condition(config: EverestConfig): + batches = config.export.batches if config.export is not None else None + keys = config.export.keywords if config.export is not None else None + + return batches is None and keys == user_def_keys + + if ProgressBar: + mocked_func.assert_called_once_with( + config=satisfy(condition), + export_ecl=False, + progress_callback=satisfy_callable(), + ) + else: + mocked_func.assert_called_once_with(config=satisfy(condition), export_ecl=False) + + +@patch("everest.bin.utils.export") +@tmpdir(CONFIG_PATH_MOCKED_TEST_CASE) +@pytest.mark.fails_on_macos_github_workflow +def test_everexport_entry_not_available_batches(mocked_func, cache_dir, caplog): + """Test running everexport when config file contains non existing + batch numbers in the list of user defined batches""" + + shutil.copytree( + cache_dir / "mocked_multi_batch_output", + "mocked_multi_batch_output", + dirs_exist_ok=True, + ) + + na_batch = 42 + user_def_batches = [0, na_batch] + mocked_test_config_file = "mocked_multi_batch.yml" + + # Add export section to config file and set run_export flag to false + with open(mocked_test_config_file, "a", encoding="utf-8") as f: + f.write( + "{export}:\n {batch_key}: {batches}".format( + export=CK.EXPORT, batch_key=CK.BATCHES, batches=user_def_batches + ) + ) + + with caplog.at_level(logging.DEBUG): + everexport_entry([mocked_test_config_file]) + + assert ( + f"Batch {na_batch} not found in optimization results." + f" Skipping for current export" in "\n".join(caplog.messages) + ) + + def condition(config: EverestConfig): + batches = config.export.batches if config.export is not None else None + keys = config.export.keywords if config.export is not None else None + return batches == [0] and keys is None + + if ProgressBar: + mocked_func.assert_called_once_with( + config=satisfy(condition), + export_ecl=True, + progress_callback=satisfy_callable(), + ) + else: + mocked_func.assert_called_once_with(config=satisfy(condition), export_ecl=True) diff --git a/tests/everest/entry_points/test_visualization_entry.py b/tests/everest/entry_points/test_visualization_entry.py new file mode 100644 index 00000000000..b0e9e067795 --- /dev/null +++ b/tests/everest/entry_points/test_visualization_entry.py @@ -0,0 +1,32 @@ +import sys +from unittest.mock import PropertyMock, patch + +import pytest + +from everest.bin.visualization_script import visualization_entry +from everest.config import EverestConfig +from everest.detached import ServerStatus +from tests.everest.utils import capture_streams, relpath + +CONFIG_PATH = relpath("..", "..", "examples", "math_func", "config_advanced.yml") +CACHED_SEBA_FOLDER = relpath("test_data", "cached_results_config_advanced") + + +@patch.object( + EverestConfig, + "optimization_output_dir", + new_callable=PropertyMock, + return_value=CACHED_SEBA_FOLDER, +) +@patch( + "everest.bin.visualization_script.everserver_status", + return_value={"status": ServerStatus.completed}, +) +@pytest.mark.skipif(sys.version_info.major < 3, reason="requires python3 or higher") +def test_visualization_entry( + opt_dir_mock, + server_status_mock, +): + with capture_streams() as (out, _): + visualization_entry([CONFIG_PATH]) + assert "No visualization plugin installed!" in out.getvalue() diff --git a/tests/everest/functional/test_main_everest_entry.py b/tests/everest/functional/test_main_everest_entry.py new file mode 100644 index 00000000000..27fecc4f224 --- /dev/null +++ b/tests/everest/functional/test_main_everest_entry.py @@ -0,0 +1,193 @@ +import os +from textwrap import dedent + +import pytest +from ruamel.yaml import YAML +from seba_sqlite.snapshot import SebaSnapshot +from tests.everest.utils import ( + capture_streams, + relpath, + skipif_no_everest_models, + tmpdir, +) + +from everest import __version__ as everest_version +from everest.bin.main import start_everest +from everest.config import EverestConfig +from everest.detached import ( + ServerStatus, + context_stop_and_wait, + everserver_status, + wait_for_context, +) + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") +CONFIG_FILE_MINIMAL = "config_minimal.yml" + +EGG_CONFIG_PATH = relpath("..", "..", "examples", "egg") +WELL_ORDER = "everest/model/config.yml" + +pytestmark = pytest.mark.xdist_group(name="starts_everest") + + +def test_everest_entry_docs(): + """Test calling everest with --docs + + Note that the correctness of the information printed out is checked by + other tests. Here we just check that the entry point triggers the + correct execution paths in the applcation + """ + with capture_streams() as (out, err), pytest.raises( + SystemExit + ): # there is a call to sys.exit + start_everest(["everest", "--docs"]) + lines = [line.strip() for line in out.getvalue().split("\n")] + assert "wells (optional)" in lines + assert "controls (required)" in lines + assert "objective_functions (required)" in lines + assert "definitions (optional)" in lines + assert not err.getvalue() + + +def test_everest_entry_manual(): + """Test calling everest with --manual""" + with capture_streams() as (out, err), pytest.raises(SystemExit): + start_everest(["everest", "--manual"]) + lines = [line.strip() for line in out.getvalue().split("\n")] + assert "wells (optional)" in lines + assert "controls (required)" in lines + assert "objective_functions (required)" in lines + assert "definitions (optional)" in lines + + doc_lines = [line for line in lines if line.startswith("| Documentation:")] + assert doc_lines != [] + assert not err.getvalue() + + +def test_everest_entry_version(): + """Test calling everest with --version""" + with capture_streams() as (out, err), pytest.raises(SystemExit): + start_everest(["everest", "--version"]) + + channels = [err.getvalue(), out.getvalue()] + assert any(everest_version in channel for channel in channels) + + +def test_everest_main_entry_bad_command(): + # Setup command line arguments for the test + with capture_streams() as (_, err), pytest.raises(SystemExit): + start_everest(["everest", "bad_command"]) + lines = [line.strip() for line in err.getvalue().split("\n")] + # Check everest run fails and correct err msg is displayed + assert "The most commonly used everest commands are:" in lines + assert "Run everest --help for more information on a command" in lines + + +@pytest.mark.flaky(reruns=5) +@tmpdir(CONFIG_PATH) +@pytest.mark.fails_on_macos_github_workflow +def test_everest_entry_run(): + wait_for_context() + # Setup command line arguments + with capture_streams(): + start_everest(["everest", "run", CONFIG_FILE_MINIMAL]) + + config = EverestConfig.load_file(CONFIG_FILE_MINIMAL) + status = everserver_status(config) + + assert status["status"] == ServerStatus.completed + + snapshot = SebaSnapshot(config.optimization_output_dir).get_snapshot() + + best_settings = snapshot.optimization_data[-1] + assert best_settings.controls["point_x"] == pytest.approx(0.5, abs=0.05) + assert best_settings.controls["point_y"] == pytest.approx(0.5, abs=0.05) + assert best_settings.controls["point_z"] == pytest.approx(0.5, abs=0.05) + + assert best_settings.objective_value == pytest.approx(0.0, abs=0.0005) + + context_stop_and_wait() + + with capture_streams(): + start_everest(["everest", "monitor", CONFIG_FILE_MINIMAL]) + + config = EverestConfig.load_file(CONFIG_FILE_MINIMAL) + status = everserver_status(config) + + assert status["status"] == ServerStatus.completed + + context_stop_and_wait() + + +@tmpdir(CONFIG_PATH) +def test_everest_entry_monitor_no_run(): + with capture_streams(): + start_everest(["everest", "monitor", CONFIG_FILE_MINIMAL]) + + config = EverestConfig.load_file(CONFIG_FILE_MINIMAL) + status = everserver_status(config) + + assert status["status"] == ServerStatus.never_run + + context_stop_and_wait() + + +@tmpdir(CONFIG_PATH) +def test_everest_main_export_entry(): + # Setup command line arguments + with capture_streams(): + start_everest(["everest", "export", CONFIG_FILE_MINIMAL]) + assert os.path.exists(os.path.join("everest_output", "config_minimal.csv")) + + +@tmpdir(CONFIG_PATH) +def test_everest_main_lint_entry(): + # Setup command line arguments + with capture_streams() as (out, err): + start_everest(["everest", "lint", CONFIG_FILE_MINIMAL]) + assert "config_minimal.yml is valid" in out.getvalue() + + # Make the config invalid + with open(CONFIG_FILE_MINIMAL, encoding="utf-8") as f: + raw_config = YAML(typ="safe", pure=True).load(f) + raw_config["controls"][0]["initial_guess"] = "invalid" + with open(CONFIG_FILE_MINIMAL, "w", encoding="utf-8") as f: + yaml = YAML(typ="safe", pure=True) + yaml.indent = 2 + yaml.default_flow_style = False + yaml.dump(raw_config, f) + + with capture_streams() as (out, err), pytest.raises(SystemExit): + start_everest(["everest", "lint", CONFIG_FILE_MINIMAL]) + + _type = "(type=float_parsing)" + validation_msg = dedent( + f"""Loading config file failed with: +Found 1 validation error: + +controls -> 0 -> initial_guess + * Input should be a valid number, unable to parse string as a number {_type} +""" + ) + assert validation_msg in err.getvalue() + + +@tmpdir(EGG_CONFIG_PATH) +@pytest.mark.fails_on_macos_github_workflow +@skipif_no_everest_models +@pytest.mark.everest_models_test +def test_everest_main_configdump_entry(): + # Setup command line arguments + with capture_streams() as (out, _): + start_everest(["everest", "render", WELL_ORDER]) + yaml = YAML(typ="safe", pure=True) + render_dict = yaml.load(out.getvalue()) + + # Test whether the config file is correctly rendered with jinja + data_file = ( + "everest/model/../../eclipse/include/realizations/" + "realization-/eclipse/model/EGG.DATA" + ) + assert render_dict["definitions"]["data_file"] == os.path.join( + os.getcwd(), data_file + ) diff --git a/tests/everest/functional/test_ui.py b/tests/everest/functional/test_ui.py new file mode 100644 index 00000000000..d35e2ad1375 --- /dev/null +++ b/tests/everest/functional/test_ui.py @@ -0,0 +1,67 @@ +import pytest +from PyQt5.QtWidgets import QAction, QPushButton, QWidget +from qtpy.QtCore import Qt +from seba_sqlite.snapshot import SebaSnapshot +from tests.everest.dialogs_mocker import mock_dialogs_all +from tests.everest.utils import relpath, tmpdir + +from everest.config import EverestConfig +from everest.detached import ( + ServerStatus, + context_stop_and_wait, + everserver_status, + wait_for_context, +) +from ieverest import IEverest + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") +CONFIG_FILE_MINIMAL = "config_minimal.yml" + + +@pytest.mark.flaky(reruns=5) +@tmpdir(CONFIG_PATH) +@pytest.mark.ui_test +@pytest.mark.xdist_group(name="starts_everest") +def test_ui_optimization(qapp, qtbot, mocker): + """Load a configuration and run it from the UI""" + + wait_for_context() + + ieverest = IEverest() + + # Load the configuration + mock_dialogs_all(mocker, open_file_name=CONFIG_FILE_MINIMAL) + + # check that about dialog can be opened + about_action = ieverest._gui.findChild(QAction, "about_action") + about_action.trigger() + + qtbot.waitUntil(lambda: ieverest._gui.about_widget is not None) + msgbox = ieverest._gui.findChild(QWidget, "about_widget") + assert msgbox.windowTitle() == "About Everest" + + close_button = msgbox.findChild(QPushButton, "button_close_about") + qtbot.mouseClick(close_button, Qt.LeftButton) + + qtbot.mouseClick(ieverest._gui._startup_gui.open_btn, Qt.LeftButton) + # Start the mocked optimization + qtbot.mouseClick(ieverest._gui.monitor_gui.start_btn, Qt.LeftButton) + qtbot.waitUntil(lambda: ieverest.server_monitor is not None, timeout=10 * 1e6) + qtbot.waitUntil(lambda: ieverest.server_monitor is None, timeout=10 * 1e6) + + config = EverestConfig.load_file(CONFIG_FILE_MINIMAL) + status = everserver_status(config) + + assert status["status"] == ServerStatus.completed + assert status["message"] == "Maximum number of batches reached." + + snapshot = SebaSnapshot(config.optimization_output_dir).get_snapshot() + + best_settings = snapshot.optimization_data[-1] + assert abs(best_settings.controls["point_x"] - 0.5) <= 0.05 + assert abs(best_settings.controls["point_y"] - 0.5) <= 0.05 + assert abs(best_settings.controls["point_z"] - 0.5) <= 0.05 + + assert abs(best_settings.objective_value) <= 0.0005 + + context_stop_and_wait() diff --git a/tests/everest/snapshots/test_egg_simulation/test_egg_snapshot/egg.csv b/tests/everest/snapshots/test_egg_simulation/test_egg_snapshot/egg.csv new file mode 100644 index 00000000000..7611ceaebf7 --- /dev/null +++ b/tests/everest/snapshots/test_egg_simulation/test_egg_snapshot/egg.csv @@ -0,0 +1,55 @@ +,simulation,sim_date,DAY,FGIP,FGIR,FGIT,FGOR,FGPR,FGPT,FOIP,FOPR,FOPT,FPR,FVIR,FVPR,FVPT,FWCT,FWGR,FWIP,FWIR,FWIT,FWPR,FWPT,GGIR:INJECT,GGIR:PRODUC,GGOR:INJECT,GGOR:PRODUC,GGPR:INJECT,GGPR:PRODUC,GGPT:INJECT,GGPT:PRODUC,GOPR:INJECT,GOPR:PRODUC,GOPT:INJECT,GOPT:PRODUC,GVIR:INJECT,GVIR:PRODUC,GVPR:INJECT,GVPR:PRODUC,GVPT:INJECT,GVPT:PRODUC,GWCT:INJECT,GWCT:PRODUC,GWGR:INJECT,GWGR:PRODUC,GWIR:INJECT,GWIR:PRODUC,GWPR:INJECT,GWPR:PRODUC,GWPT:INJECT,GWPT:PRODUC,MONTH,WBHP:INJECT1,WBHP:INJECT2,WBHP:INJECT3,WBHP:INJECT4,WBHP:INJECT5,WBHP:INJECT6,WBHP:INJECT7,WBHP:INJECT8,WBHP:PROD1,WBHP:PROD2,WBHP:PROD3,WBHP:PROD4,WGIR:INJECT1,WGIR:INJECT2,WGIR:INJECT3,WGIR:INJECT4,WGIR:INJECT5,WGIR:INJECT6,WGIR:INJECT7,WGIR:INJECT8,WGIR:PROD1,WGIR:PROD2,WGIR:PROD3,WGIR:PROD4,WGIT:INJECT1,WGIT:INJECT2,WGIT:INJECT3,WGIT:INJECT4,WGIT:INJECT5,WGIT:INJECT6,WGIT:INJECT7,WGIT:INJECT8,WGIT:PROD1,WGIT:PROD2,WGIT:PROD3,WGIT:PROD4,WGOR:INJECT1,WGOR:INJECT2,WGOR:INJECT3,WGOR:INJECT4,WGOR:INJECT5,WGOR:INJECT6,WGOR:INJECT7,WGOR:INJECT8,WGOR:PROD1,WGOR:PROD2,WGOR:PROD3,WGOR:PROD4,WGPR:INJECT1,WGPR:INJECT2,WGPR:INJECT3,WGPR:INJECT4,WGPR:INJECT5,WGPR:INJECT6,WGPR:INJECT7,WGPR:INJECT8,WGPR:PROD1,WGPR:PROD2,WGPR:PROD3,WGPR:PROD4,WGPT:INJECT1,WGPT:INJECT2,WGPT:INJECT3,WGPT:INJECT4,WGPT:INJECT5,WGPT:INJECT6,WGPT:INJECT7,WGPT:INJECT8,WGPT:PROD1,WGPT:PROD2,WGPT:PROD3,WGPT:PROD4,WOPR:INJECT1,WOPR:INJECT2,WOPR:INJECT3,WOPR:INJECT4,WOPR:INJECT5,WOPR:INJECT6,WOPR:INJECT7,WOPR:INJECT8,WOPR:PROD1,WOPR:PROD2,WOPR:PROD3,WOPR:PROD4,WOPT:INJECT1,WOPT:INJECT2,WOPT:INJECT3,WOPT:INJECT4,WOPT:INJECT5,WOPT:INJECT6,WOPT:INJECT7,WOPT:INJECT8,WOPT:PROD1,WOPT:PROD2,WOPT:PROD3,WOPT:PROD4,WPI:INJECT1,WPI:INJECT2,WPI:INJECT3,WPI:INJECT4,WPI:INJECT5,WPI:INJECT6,WPI:INJECT7,WPI:INJECT8,WPI:PROD1,WPI:PROD2,WPI:PROD3,WPI:PROD4,WTHP:INJECT1,WTHP:INJECT2,WTHP:INJECT3,WTHP:INJECT4,WTHP:INJECT5,WTHP:INJECT6,WTHP:INJECT7,WTHP:INJECT8,WTHP:PROD1,WTHP:PROD2,WTHP:PROD3,WTHP:PROD4,WVPR:INJECT1,WVPR:INJECT2,WVPR:INJECT3,WVPR:INJECT4,WVPR:INJECT5,WVPR:INJECT6,WVPR:INJECT7,WVPR:INJECT8,WVPR:PROD1,WVPR:PROD2,WVPR:PROD3,WVPR:PROD4,WWCT:INJECT1,WWCT:INJECT2,WWCT:INJECT3,WWCT:INJECT4,WWCT:INJECT5,WWCT:INJECT6,WWCT:INJECT7,WWCT:INJECT8,WWCT:PROD1,WWCT:PROD2,WWCT:PROD3,WWCT:PROD4,WWIR:INJECT1,WWIR:INJECT2,WWIR:INJECT3,WWIR:INJECT4,WWIR:INJECT5,WWIR:INJECT6,WWIR:INJECT7,WWIR:INJECT8,WWIR:PROD1,WWIR:PROD2,WWIR:PROD3,WWIR:PROD4,WWIT:INJECT1,WWIT:INJECT2,WWIT:INJECT3,WWIT:INJECT4,WWIT:INJECT5,WWIT:INJECT6,WWIT:INJECT7,WWIT:INJECT8,WWIT:PROD1,WWIT:PROD2,WWIT:PROD3,WWIT:PROD4,WWPR:INJECT1,WWPR:INJECT2,WWPR:INJECT3,WWPR:INJECT4,WWPR:INJECT5,WWPR:INJECT6,WWPR:INJECT7,WWPR:INJECT8,WWPR:PROD1,WWPR:PROD2,WWPR:PROD3,WWPR:PROD4,WWPT:INJECT1,WWPT:INJECT2,WWPT:INJECT3,WWPT:INJECT4,WWPT:INJECT5,WWPT:INJECT6,WWPT:INJECT7,WWPT:INJECT8,WWPT:PROD1,WWPT:PROD2,WWPT:PROD3,WWPT:PROD4,YEAR,batch,sim_avg_obj,is_gradient,realization,success,realization_weight,rf,rf_norm,rf_weighted_norm,well_rate_PROD1-1,well_rate_PROD2-1,well_rate_PROD3-1,well_rate_PROD4-1,well_rate_INJECT1-1,well_rate_INJECT2-1,well_rate_INJECT3-1,well_rate_INJECT4-1,well_rate_INJECT5-1,well_rate_INJECT6-1,well_rate_INJECT7-1,well_rate_INJECT8-1,real_avg_obj,increased_merit,gradient-rf-well_rate_PROD1-1,gradient-rf-well_rate_PROD2-1,gradient-rf-well_rate_PROD3-1,gradient-rf-well_rate_PROD4-1,gradient-rf-well_rate_INJECT1-1,gradient-rf-well_rate_INJECT2-1,gradient-rf-well_rate_INJECT3-1,gradient-rf-well_rate_INJECT4-1,gradient-rf-well_rate_INJECT5-1,gradient-rf-well_rate_INJECT6-1,gradient-rf-well_rate_INJECT7-1,gradient-rf-well_rate_INJECT8-1 +0,0,2014-05-30,30.0,55692340.0,0.0,0.0,0.0,0.0,53667256.0,488557.06,0.0,105788.55,100.38799,0.0,0.0,431142.84,0.0,0.0,46183.973,0.0,0.0,0.0,101.93049,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667256.0,0.0,0.0,0.0,105788.55,0.0,0.0,0.0,0.0,0.0,431142.84,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93049,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,9350951.0,17149078.0,8947489.0,18219742.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18279.744,34102.047,18191.682,35215.08,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.927376,31.981276,17.909327,34.11251,2014.0,0,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +1,0,2014-08-28,28.0,55692340.0,0.0,0.0,0.0,0.0,53667256.0,488557.06,0.0,105788.55,100.38799,0.0,0.0,431142.84,0.0,0.0,46183.973,0.0,0.0,0.0,101.93049,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667256.0,0.0,0.0,0.0,105788.55,0.0,0.0,0.0,0.0,0.0,431142.84,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93049,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,9350951.0,17149078.0,8947489.0,18219742.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18279.744,34102.047,18191.682,35215.08,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.927376,31.981276,17.909327,34.11251,2014.0,0,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +2,0,2014-11-26,26.0,55692340.0,0.0,0.0,0.0,0.0,53667256.0,488557.06,0.0,105788.55,100.38799,0.0,0.0,431142.84,0.0,0.0,46183.973,0.0,0.0,0.0,101.93049,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667256.0,0.0,0.0,0.0,105788.55,0.0,0.0,0.0,0.0,0.0,431142.84,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93049,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,9350951.0,17149078.0,8947489.0,18219742.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18279.744,34102.047,18191.682,35215.08,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.927376,31.981276,17.909327,34.11251,2014.0,0,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +3,0,2015-02-24,24.0,55692340.0,0.0,0.0,0.0,0.0,53667256.0,488557.06,0.0,105788.55,100.38799,0.0,0.0,431142.84,0.0,0.0,46183.973,0.0,0.0,0.0,101.93049,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667256.0,0.0,0.0,0.0,105788.55,0.0,0.0,0.0,0.0,0.0,431142.84,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93049,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,9350951.0,17149078.0,8947489.0,18219742.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18279.744,34102.047,18191.682,35215.08,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.927376,31.981276,17.909327,34.11251,2015.0001,0,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +4,0,2015-05-25,25.0,55692340.0,0.0,0.0,0.0,0.0,53667256.0,488557.06,0.0,105788.55,100.38799,0.0,0.0,431142.84,0.0,0.0,46183.973,0.0,0.0,0.0,101.93049,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667256.0,0.0,0.0,0.0,105788.55,0.0,0.0,0.0,0.0,0.0,431142.84,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93049,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,9350951.0,17149078.0,8947489.0,18219742.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18279.744,34102.047,18191.682,35215.08,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.927376,31.981276,17.909327,34.11251,2015.0001,0,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +5,0,2015-08-23,23.0,55692340.0,0.0,0.0,0.0,0.0,53667256.0,488557.06,0.0,105788.55,100.38799,0.0,0.0,431142.84,0.0,0.0,46183.973,0.0,0.0,0.0,101.93049,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667256.0,0.0,0.0,0.0,105788.55,0.0,0.0,0.0,0.0,0.0,431142.84,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93049,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,9350951.0,17149078.0,8947489.0,18219742.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18279.744,34102.047,18191.682,35215.08,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.927376,31.981276,17.909327,34.11251,2015.0001,0,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +6,0,2015-11-21,21.0,55692340.0,0.0,0.0,0.0,0.0,53667256.0,488557.06,0.0,105788.55,100.38799,0.0,0.0,431142.84,0.0,0.0,46183.973,0.0,0.0,0.0,101.93049,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667256.0,0.0,0.0,0.0,105788.55,0.0,0.0,0.0,0.0,0.0,431142.84,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93049,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,9350951.0,17149078.0,8947489.0,18219742.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18279.744,34102.047,18191.682,35215.08,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.927376,31.981276,17.909327,34.11251,2015.0001,0,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +7,0,2016-02-19,19.0,55692340.0,0.0,0.0,0.0,0.0,53667256.0,488557.06,0.0,105788.55,100.38799,0.0,0.0,431142.84,0.0,0.0,46183.973,0.0,0.0,0.0,101.93049,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667256.0,0.0,0.0,0.0,105788.55,0.0,0.0,0.0,0.0,0.0,431142.84,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93049,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,9350951.0,17149078.0,8947489.0,18219742.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18279.744,34102.047,18191.682,35215.08,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.927376,31.981276,17.909327,34.11251,2016.0,0,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +8,0,2016-05-19,19.0,55692340.0,0.0,0.0,0.0,0.0,53667256.0,488557.06,0.0,105788.55,100.38799,0.0,0.0,431142.84,0.0,0.0,46183.973,0.0,0.0,0.0,101.93049,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667256.0,0.0,0.0,0.0,105788.55,0.0,0.0,0.0,0.0,0.0,431142.84,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93049,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,9350951.0,17149078.0,8947489.0,18219742.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18279.744,34102.047,18191.682,35215.08,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.927376,31.981276,17.909327,34.11251,2016.0,0,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +9,1,2014-05-30,30.0,55646470.0,0.0,0.0,0.0,0.0,53713124.0,490011.0,0.0,104334.63,100.42443,0.0,0.0,428795.47,0.0,0.0,46189.875,0.0,0.0,0.0,96.0257,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713124.0,0.0,0.0,0.0,104334.63,0.0,0.0,0.0,0.0,0.0,428795.47,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.0257,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,10150948.0,16735974.0,9785029.0,17041174.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18420.705,33734.54,18231.738,33947.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.468056,30.36768,17.113255,31.076715,2014.0,0,0.175545,0,1,1,0.333333,0.175545,0.175545,0.175545,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +10,1,2014-08-28,28.0,55646470.0,0.0,0.0,0.0,0.0,53713124.0,490011.0,0.0,104334.63,100.42443,0.0,0.0,428795.47,0.0,0.0,46189.875,0.0,0.0,0.0,96.0257,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713124.0,0.0,0.0,0.0,104334.63,0.0,0.0,0.0,0.0,0.0,428795.47,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.0257,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,10150948.0,16735974.0,9785029.0,17041174.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18420.705,33734.54,18231.738,33947.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.468056,30.36768,17.113255,31.076715,2014.0,0,0.175545,0,1,1,0.333333,0.175545,0.175545,0.175545,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +11,1,2014-11-26,26.0,55646470.0,0.0,0.0,0.0,0.0,53713124.0,490011.0,0.0,104334.63,100.42443,0.0,0.0,428795.47,0.0,0.0,46189.875,0.0,0.0,0.0,96.0257,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713124.0,0.0,0.0,0.0,104334.63,0.0,0.0,0.0,0.0,0.0,428795.47,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.0257,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,10150948.0,16735974.0,9785029.0,17041174.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18420.705,33734.54,18231.738,33947.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.468056,30.36768,17.113255,31.076715,2014.0,0,0.175545,0,1,1,0.333333,0.175545,0.175545,0.175545,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +12,1,2015-02-24,24.0,55646470.0,0.0,0.0,0.0,0.0,53713124.0,490011.0,0.0,104334.63,100.42443,0.0,0.0,428795.47,0.0,0.0,46189.875,0.0,0.0,0.0,96.0257,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713124.0,0.0,0.0,0.0,104334.63,0.0,0.0,0.0,0.0,0.0,428795.47,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.0257,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,10150948.0,16735974.0,9785029.0,17041174.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18420.705,33734.54,18231.738,33947.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.468056,30.36768,17.113255,31.076715,2015.0001,0,0.175545,0,1,1,0.333333,0.175545,0.175545,0.175545,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +13,1,2015-05-25,25.0,55646470.0,0.0,0.0,0.0,0.0,53713124.0,490011.0,0.0,104334.63,100.42443,0.0,0.0,428795.47,0.0,0.0,46189.875,0.0,0.0,0.0,96.0257,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713124.0,0.0,0.0,0.0,104334.63,0.0,0.0,0.0,0.0,0.0,428795.47,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.0257,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,10150948.0,16735974.0,9785029.0,17041174.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18420.705,33734.54,18231.738,33947.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.468056,30.36768,17.113255,31.076715,2015.0001,0,0.175545,0,1,1,0.333333,0.175545,0.175545,0.175545,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +14,1,2015-08-23,23.0,55646470.0,0.0,0.0,0.0,0.0,53713124.0,490011.0,0.0,104334.63,100.42443,0.0,0.0,428795.47,0.0,0.0,46189.875,0.0,0.0,0.0,96.0257,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713124.0,0.0,0.0,0.0,104334.63,0.0,0.0,0.0,0.0,0.0,428795.47,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.0257,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,10150948.0,16735974.0,9785029.0,17041174.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18420.705,33734.54,18231.738,33947.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.468056,30.36768,17.113255,31.076715,2015.0001,0,0.175545,0,1,1,0.333333,0.175545,0.175545,0.175545,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +15,1,2015-11-21,21.0,55646470.0,0.0,0.0,0.0,0.0,53713124.0,490011.0,0.0,104334.63,100.42443,0.0,0.0,428795.47,0.0,0.0,46189.875,0.0,0.0,0.0,96.0257,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713124.0,0.0,0.0,0.0,104334.63,0.0,0.0,0.0,0.0,0.0,428795.47,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.0257,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,10150948.0,16735974.0,9785029.0,17041174.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18420.705,33734.54,18231.738,33947.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.468056,30.36768,17.113255,31.076715,2015.0001,0,0.175545,0,1,1,0.333333,0.175545,0.175545,0.175545,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +16,1,2016-02-19,19.0,55646470.0,0.0,0.0,0.0,0.0,53713124.0,490011.0,0.0,104334.63,100.42443,0.0,0.0,428795.47,0.0,0.0,46189.875,0.0,0.0,0.0,96.0257,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713124.0,0.0,0.0,0.0,104334.63,0.0,0.0,0.0,0.0,0.0,428795.47,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.0257,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,10150948.0,16735974.0,9785029.0,17041174.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18420.705,33734.54,18231.738,33947.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.468056,30.36768,17.113255,31.076715,2016.0,0,0.175545,0,1,1,0.333333,0.175545,0.175545,0.175545,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +17,1,2016-05-19,19.0,55646470.0,0.0,0.0,0.0,0.0,53713124.0,490011.0,0.0,104334.63,100.42443,0.0,0.0,428795.47,0.0,0.0,46189.875,0.0,0.0,0.0,96.0257,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713124.0,0.0,0.0,0.0,104334.63,0.0,0.0,0.0,0.0,0.0,428795.47,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.0257,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,10150948.0,16735974.0,9785029.0,17041174.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18420.705,33734.54,18231.738,33947.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.468056,30.36768,17.113255,31.076715,2016.0,0,0.175545,0,1,1,0.333333,0.175545,0.175545,0.175545,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +18,2,2014-05-30,30.0,55656456.0,0.0,0.0,0.0,0.0,53703136.0,489761.47,0.0,104584.16,100.42231,0.0,0.0,430863.6,0.0,0.0,46187.156,0.0,0.0,0.0,98.74653,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703136.0,0.0,0.0,0.0,104584.16,0.0,0.0,0.0,0.0,0.0,430863.6,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74653,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,8798321.0,18508422.0,10059403.0,16336993.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17527.844,35060.547,18532.336,33463.434,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.369572,33.224785,18.03602,31.116156,2014.0,0,0.175965,0,2,1,0.333333,0.175965,0.175965,0.175965,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +19,2,2014-08-28,28.0,55656456.0,0.0,0.0,0.0,0.0,53703136.0,489761.47,0.0,104584.16,100.42231,0.0,0.0,430863.6,0.0,0.0,46187.156,0.0,0.0,0.0,98.74653,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703136.0,0.0,0.0,0.0,104584.16,0.0,0.0,0.0,0.0,0.0,430863.6,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74653,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,8798321.0,18508422.0,10059403.0,16336993.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17527.844,35060.547,18532.336,33463.434,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.369572,33.224785,18.03602,31.116156,2014.0,0,0.175965,0,2,1,0.333333,0.175965,0.175965,0.175965,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +20,2,2014-11-26,26.0,55656456.0,0.0,0.0,0.0,0.0,53703136.0,489761.47,0.0,104584.16,100.42231,0.0,0.0,430863.6,0.0,0.0,46187.156,0.0,0.0,0.0,98.74653,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703136.0,0.0,0.0,0.0,104584.16,0.0,0.0,0.0,0.0,0.0,430863.6,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74653,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,8798321.0,18508422.0,10059403.0,16336993.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17527.844,35060.547,18532.336,33463.434,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.369572,33.224785,18.03602,31.116156,2014.0,0,0.175965,0,2,1,0.333333,0.175965,0.175965,0.175965,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +21,2,2015-02-24,24.0,55656456.0,0.0,0.0,0.0,0.0,53703136.0,489761.47,0.0,104584.16,100.42231,0.0,0.0,430863.6,0.0,0.0,46187.156,0.0,0.0,0.0,98.74653,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703136.0,0.0,0.0,0.0,104584.16,0.0,0.0,0.0,0.0,0.0,430863.6,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74653,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,8798321.0,18508422.0,10059403.0,16336993.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17527.844,35060.547,18532.336,33463.434,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.369572,33.224785,18.03602,31.116156,2015.0001,0,0.175965,0,2,1,0.333333,0.175965,0.175965,0.175965,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +22,2,2015-05-25,25.0,55656456.0,0.0,0.0,0.0,0.0,53703136.0,489761.47,0.0,104584.16,100.42231,0.0,0.0,430863.6,0.0,0.0,46187.156,0.0,0.0,0.0,98.74653,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703136.0,0.0,0.0,0.0,104584.16,0.0,0.0,0.0,0.0,0.0,430863.6,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74653,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,8798321.0,18508422.0,10059403.0,16336993.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17527.844,35060.547,18532.336,33463.434,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.369572,33.224785,18.03602,31.116156,2015.0001,0,0.175965,0,2,1,0.333333,0.175965,0.175965,0.175965,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +23,2,2015-08-23,23.0,55656456.0,0.0,0.0,0.0,0.0,53703136.0,489761.47,0.0,104584.16,100.42231,0.0,0.0,430863.6,0.0,0.0,46187.156,0.0,0.0,0.0,98.74653,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703136.0,0.0,0.0,0.0,104584.16,0.0,0.0,0.0,0.0,0.0,430863.6,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74653,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,8798321.0,18508422.0,10059403.0,16336993.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17527.844,35060.547,18532.336,33463.434,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.369572,33.224785,18.03602,31.116156,2015.0001,0,0.175965,0,2,1,0.333333,0.175965,0.175965,0.175965,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +24,2,2015-11-21,21.0,55656456.0,0.0,0.0,0.0,0.0,53703136.0,489761.47,0.0,104584.16,100.42231,0.0,0.0,430863.6,0.0,0.0,46187.156,0.0,0.0,0.0,98.74653,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703136.0,0.0,0.0,0.0,104584.16,0.0,0.0,0.0,0.0,0.0,430863.6,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74653,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,8798321.0,18508422.0,10059403.0,16336993.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17527.844,35060.547,18532.336,33463.434,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.369572,33.224785,18.03602,31.116156,2015.0001,0,0.175965,0,2,1,0.333333,0.175965,0.175965,0.175965,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +25,2,2016-02-19,19.0,55656456.0,0.0,0.0,0.0,0.0,53703136.0,489761.47,0.0,104584.16,100.42231,0.0,0.0,430863.6,0.0,0.0,46187.156,0.0,0.0,0.0,98.74653,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703136.0,0.0,0.0,0.0,104584.16,0.0,0.0,0.0,0.0,0.0,430863.6,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74653,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,8798321.0,18508422.0,10059403.0,16336993.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17527.844,35060.547,18532.336,33463.434,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.369572,33.224785,18.03602,31.116156,2016.0,0,0.175965,0,2,1,0.333333,0.175965,0.175965,0.175965,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +26,2,2016-05-19,19.0,55656456.0,0.0,0.0,0.0,0.0,53703136.0,489761.47,0.0,104584.16,100.42231,0.0,0.0,430863.6,0.0,0.0,46187.156,0.0,0.0,0.0,98.74653,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703136.0,0.0,0.0,0.0,104584.16,0.0,0.0,0.0,0.0,0.0,430863.6,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74653,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,8798321.0,18508422.0,10059403.0,16336993.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17527.844,35060.547,18532.336,33463.434,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,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.369572,33.224785,18.03602,31.116156,2016.0,0,0.175965,0,2,1,0.333333,0.175965,0.175965,0.175965,0.2,0.6,0.2,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.6,0.176501,1,-0.000131,0.000109,-2.1e-05,-0.000128,-9.2e-05,-0.000187,-6.2e-05,0.000158,-0.000214,-0.000235,-9.1e-05,0.000241 +27,0,2014-05-30,30.0,55692344.0,0.0,0.0,0.0,0.0,53667250.0,488556.9,0.0,105788.73,100.38799,0.0,0.0,431141.56,0.0,0.0,46183.973,0.0,0.0,0.0,101.93032,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667250.0,0.0,0.0,0.0,105788.73,0.0,0.0,0.0,0.0,0.0,431141.56,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93032,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,9350340.0,17150190.0,8947552.0,18219166.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18278.383,34104.664,18191.855,35213.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.926174,31.98338,17.909454,34.111317,2014.0,1,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +28,0,2014-08-28,28.0,55692344.0,0.0,0.0,0.0,0.0,53667250.0,488556.9,0.0,105788.73,100.38799,0.0,0.0,431141.56,0.0,0.0,46183.973,0.0,0.0,0.0,101.93032,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667250.0,0.0,0.0,0.0,105788.73,0.0,0.0,0.0,0.0,0.0,431141.56,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93032,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,9350340.0,17150190.0,8947552.0,18219166.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18278.383,34104.664,18191.855,35213.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.926174,31.98338,17.909454,34.111317,2014.0,1,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +29,0,2014-11-26,26.0,55692344.0,0.0,0.0,0.0,0.0,53667250.0,488556.9,0.0,105788.73,100.38799,0.0,0.0,431141.56,0.0,0.0,46183.973,0.0,0.0,0.0,101.93032,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667250.0,0.0,0.0,0.0,105788.73,0.0,0.0,0.0,0.0,0.0,431141.56,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93032,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,9350340.0,17150190.0,8947552.0,18219166.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18278.383,34104.664,18191.855,35213.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.926174,31.98338,17.909454,34.111317,2014.0,1,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +30,0,2015-02-24,24.0,55692344.0,0.0,0.0,0.0,0.0,53667250.0,488556.9,0.0,105788.73,100.38799,0.0,0.0,431141.56,0.0,0.0,46183.973,0.0,0.0,0.0,101.93032,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667250.0,0.0,0.0,0.0,105788.73,0.0,0.0,0.0,0.0,0.0,431141.56,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93032,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,9350340.0,17150190.0,8947552.0,18219166.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18278.383,34104.664,18191.855,35213.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.926174,31.98338,17.909454,34.111317,2015.0001,1,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +31,0,2015-05-25,25.0,55692344.0,0.0,0.0,0.0,0.0,53667250.0,488556.9,0.0,105788.73,100.38799,0.0,0.0,431141.56,0.0,0.0,46183.973,0.0,0.0,0.0,101.93032,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667250.0,0.0,0.0,0.0,105788.73,0.0,0.0,0.0,0.0,0.0,431141.56,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93032,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,9350340.0,17150190.0,8947552.0,18219166.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18278.383,34104.664,18191.855,35213.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.926174,31.98338,17.909454,34.111317,2015.0001,1,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +32,0,2015-08-23,23.0,55692344.0,0.0,0.0,0.0,0.0,53667250.0,488556.9,0.0,105788.73,100.38799,0.0,0.0,431141.56,0.0,0.0,46183.973,0.0,0.0,0.0,101.93032,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667250.0,0.0,0.0,0.0,105788.73,0.0,0.0,0.0,0.0,0.0,431141.56,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93032,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,9350340.0,17150190.0,8947552.0,18219166.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18278.383,34104.664,18191.855,35213.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.926174,31.98338,17.909454,34.111317,2015.0001,1,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +33,0,2015-11-21,21.0,55692344.0,0.0,0.0,0.0,0.0,53667250.0,488556.9,0.0,105788.73,100.38799,0.0,0.0,431141.56,0.0,0.0,46183.973,0.0,0.0,0.0,101.93032,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667250.0,0.0,0.0,0.0,105788.73,0.0,0.0,0.0,0.0,0.0,431141.56,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93032,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,9350340.0,17150190.0,8947552.0,18219166.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18278.383,34104.664,18191.855,35213.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.926174,31.98338,17.909454,34.111317,2015.0001,1,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +34,0,2016-02-19,19.0,55692344.0,0.0,0.0,0.0,0.0,53667250.0,488556.9,0.0,105788.73,100.38799,0.0,0.0,431141.56,0.0,0.0,46183.973,0.0,0.0,0.0,101.93032,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667250.0,0.0,0.0,0.0,105788.73,0.0,0.0,0.0,0.0,0.0,431141.56,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93032,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,9350340.0,17150190.0,8947552.0,18219166.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18278.383,34104.664,18191.855,35213.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.926174,31.98338,17.909454,34.111317,2016.0,1,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +35,0,2016-05-19,19.0,55692344.0,0.0,0.0,0.0,0.0,53667250.0,488556.9,0.0,105788.73,100.38799,0.0,0.0,431141.56,0.0,0.0,46183.973,0.0,0.0,0.0,101.93032,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53667250.0,0.0,0.0,0.0,105788.73,0.0,0.0,0.0,0.0,0.0,431141.56,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,101.93032,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,9350340.0,17150190.0,8947552.0,18219166.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18278.383,34104.664,18191.855,35213.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,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17.926174,31.98338,17.909454,34.111317,2016.0,1,0.177992,0,0,1,0.333333,0.177992,0.177992,0.177992,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +36,1,2014-05-30,30.0,55646510.0,0.0,0.0,0.0,0.0,53713090.0,490010.4,0.0,104335.2,100.42446,0.0,0.0,428795.88,0.0,0.0,46189.875,0.0,0.0,0.0,96.025604,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713090.0,0.0,0.0,0.0,104335.2,0.0,0.0,0.0,0.0,0.0,428795.88,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.025604,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,10150674.0,16736793.0,9785355.0,17040266.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18419.715,33736.996,18232.209,33946.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,0.0,0.0,17.467487,30.36922,17.113867,31.075039,2014.0,1,0.175546,0,1,1,0.333333,0.175546,0.175546,0.175546,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +37,1,2014-08-28,28.0,55646510.0,0.0,0.0,0.0,0.0,53713090.0,490010.4,0.0,104335.2,100.42446,0.0,0.0,428795.88,0.0,0.0,46189.875,0.0,0.0,0.0,96.025604,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713090.0,0.0,0.0,0.0,104335.2,0.0,0.0,0.0,0.0,0.0,428795.88,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.025604,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,10150674.0,16736793.0,9785355.0,17040266.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18419.715,33736.996,18232.209,33946.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,0.0,0.0,17.467487,30.36922,17.113867,31.075039,2014.0,1,0.175546,0,1,1,0.333333,0.175546,0.175546,0.175546,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +38,1,2014-11-26,26.0,55646510.0,0.0,0.0,0.0,0.0,53713090.0,490010.4,0.0,104335.2,100.42446,0.0,0.0,428795.88,0.0,0.0,46189.875,0.0,0.0,0.0,96.025604,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713090.0,0.0,0.0,0.0,104335.2,0.0,0.0,0.0,0.0,0.0,428795.88,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.025604,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,10150674.0,16736793.0,9785355.0,17040266.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18419.715,33736.996,18232.209,33946.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,0.0,0.0,17.467487,30.36922,17.113867,31.075039,2014.0,1,0.175546,0,1,1,0.333333,0.175546,0.175546,0.175546,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +39,1,2015-02-24,24.0,55646510.0,0.0,0.0,0.0,0.0,53713090.0,490010.4,0.0,104335.2,100.42446,0.0,0.0,428795.88,0.0,0.0,46189.875,0.0,0.0,0.0,96.025604,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713090.0,0.0,0.0,0.0,104335.2,0.0,0.0,0.0,0.0,0.0,428795.88,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.025604,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,10150674.0,16736793.0,9785355.0,17040266.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18419.715,33736.996,18232.209,33946.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,0.0,0.0,17.467487,30.36922,17.113867,31.075039,2015.0001,1,0.175546,0,1,1,0.333333,0.175546,0.175546,0.175546,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +40,1,2015-05-25,25.0,55646510.0,0.0,0.0,0.0,0.0,53713090.0,490010.4,0.0,104335.2,100.42446,0.0,0.0,428795.88,0.0,0.0,46189.875,0.0,0.0,0.0,96.025604,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713090.0,0.0,0.0,0.0,104335.2,0.0,0.0,0.0,0.0,0.0,428795.88,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.025604,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,10150674.0,16736793.0,9785355.0,17040266.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18419.715,33736.996,18232.209,33946.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,0.0,0.0,17.467487,30.36922,17.113867,31.075039,2015.0001,1,0.175546,0,1,1,0.333333,0.175546,0.175546,0.175546,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +41,1,2015-08-23,23.0,55646510.0,0.0,0.0,0.0,0.0,53713090.0,490010.4,0.0,104335.2,100.42446,0.0,0.0,428795.88,0.0,0.0,46189.875,0.0,0.0,0.0,96.025604,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713090.0,0.0,0.0,0.0,104335.2,0.0,0.0,0.0,0.0,0.0,428795.88,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.025604,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,10150674.0,16736793.0,9785355.0,17040266.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18419.715,33736.996,18232.209,33946.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,0.0,0.0,17.467487,30.36922,17.113867,31.075039,2015.0001,1,0.175546,0,1,1,0.333333,0.175546,0.175546,0.175546,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +42,1,2015-11-21,21.0,55646510.0,0.0,0.0,0.0,0.0,53713090.0,490010.4,0.0,104335.2,100.42446,0.0,0.0,428795.88,0.0,0.0,46189.875,0.0,0.0,0.0,96.025604,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713090.0,0.0,0.0,0.0,104335.2,0.0,0.0,0.0,0.0,0.0,428795.88,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.025604,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,10150674.0,16736793.0,9785355.0,17040266.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18419.715,33736.996,18232.209,33946.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,0.0,0.0,17.467487,30.36922,17.113867,31.075039,2015.0001,1,0.175546,0,1,1,0.333333,0.175546,0.175546,0.175546,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +43,1,2016-02-19,19.0,55646510.0,0.0,0.0,0.0,0.0,53713090.0,490010.4,0.0,104335.2,100.42446,0.0,0.0,428795.88,0.0,0.0,46189.875,0.0,0.0,0.0,96.025604,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713090.0,0.0,0.0,0.0,104335.2,0.0,0.0,0.0,0.0,0.0,428795.88,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.025604,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,10150674.0,16736793.0,9785355.0,17040266.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18419.715,33736.996,18232.209,33946.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,0.0,0.0,17.467487,30.36922,17.113867,31.075039,2016.0,1,0.175546,0,1,1,0.333333,0.175546,0.175546,0.175546,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +44,1,2016-05-19,19.0,55646510.0,0.0,0.0,0.0,0.0,53713090.0,490010.4,0.0,104335.2,100.42446,0.0,0.0,428795.88,0.0,0.0,46189.875,0.0,0.0,0.0,96.025604,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53713090.0,0.0,0.0,0.0,104335.2,0.0,0.0,0.0,0.0,0.0,428795.88,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,96.025604,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,10150674.0,16736793.0,9785355.0,17040266.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,18419.715,33736.996,18232.209,33946.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,0.0,0.0,17.467487,30.36922,17.113867,31.075039,2016.0,1,0.175546,0,1,1,0.333333,0.175546,0.175546,0.175546,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +45,2,2014-05-30,30.0,55656464.0,0.0,0.0,0.0,0.0,53703130.0,489761.25,0.0,104584.36,100.42231,0.0,0.0,430863.7,0.0,0.0,46187.156,0.0,0.0,0.0,98.74634,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703130.0,0.0,0.0,0.0,104584.36,0.0,0.0,0.0,0.0,0.0,430863.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74634,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,8797675.0,18509862.0,10059274.0,16336319.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17526.477,35063.414,18532.344,33462.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.0,0.0,16.368338,33.22736,18.035791,31.114845,2014.0,1,0.175966,0,2,1,0.333333,0.175966,0.175966,0.175966,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +46,2,2014-08-28,28.0,55656464.0,0.0,0.0,0.0,0.0,53703130.0,489761.25,0.0,104584.36,100.42231,0.0,0.0,430863.7,0.0,0.0,46187.156,0.0,0.0,0.0,98.74634,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703130.0,0.0,0.0,0.0,104584.36,0.0,0.0,0.0,0.0,0.0,430863.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74634,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,8797675.0,18509862.0,10059274.0,16336319.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17526.477,35063.414,18532.344,33462.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.0,0.0,16.368338,33.22736,18.035791,31.114845,2014.0,1,0.175966,0,2,1,0.333333,0.175966,0.175966,0.175966,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +47,2,2014-11-26,26.0,55656464.0,0.0,0.0,0.0,0.0,53703130.0,489761.25,0.0,104584.36,100.42231,0.0,0.0,430863.7,0.0,0.0,46187.156,0.0,0.0,0.0,98.74634,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703130.0,0.0,0.0,0.0,104584.36,0.0,0.0,0.0,0.0,0.0,430863.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74634,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,8797675.0,18509862.0,10059274.0,16336319.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17526.477,35063.414,18532.344,33462.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.0,0.0,16.368338,33.22736,18.035791,31.114845,2014.0,1,0.175966,0,2,1,0.333333,0.175966,0.175966,0.175966,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +48,2,2015-02-24,24.0,55656464.0,0.0,0.0,0.0,0.0,53703130.0,489761.25,0.0,104584.36,100.42231,0.0,0.0,430863.7,0.0,0.0,46187.156,0.0,0.0,0.0,98.74634,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703130.0,0.0,0.0,0.0,104584.36,0.0,0.0,0.0,0.0,0.0,430863.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74634,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,8797675.0,18509862.0,10059274.0,16336319.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17526.477,35063.414,18532.344,33462.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.0,0.0,16.368338,33.22736,18.035791,31.114845,2015.0001,1,0.175966,0,2,1,0.333333,0.175966,0.175966,0.175966,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +49,2,2015-05-25,25.0,55656464.0,0.0,0.0,0.0,0.0,53703130.0,489761.25,0.0,104584.36,100.42231,0.0,0.0,430863.7,0.0,0.0,46187.156,0.0,0.0,0.0,98.74634,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703130.0,0.0,0.0,0.0,104584.36,0.0,0.0,0.0,0.0,0.0,430863.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74634,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,8797675.0,18509862.0,10059274.0,16336319.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17526.477,35063.414,18532.344,33462.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.0,0.0,16.368338,33.22736,18.035791,31.114845,2015.0001,1,0.175966,0,2,1,0.333333,0.175966,0.175966,0.175966,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +50,2,2015-08-23,23.0,55656464.0,0.0,0.0,0.0,0.0,53703130.0,489761.25,0.0,104584.36,100.42231,0.0,0.0,430863.7,0.0,0.0,46187.156,0.0,0.0,0.0,98.74634,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703130.0,0.0,0.0,0.0,104584.36,0.0,0.0,0.0,0.0,0.0,430863.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74634,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,8797675.0,18509862.0,10059274.0,16336319.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17526.477,35063.414,18532.344,33462.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.0,0.0,16.368338,33.22736,18.035791,31.114845,2015.0001,1,0.175966,0,2,1,0.333333,0.175966,0.175966,0.175966,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +51,2,2015-11-21,21.0,55656464.0,0.0,0.0,0.0,0.0,53703130.0,489761.25,0.0,104584.36,100.42231,0.0,0.0,430863.7,0.0,0.0,46187.156,0.0,0.0,0.0,98.74634,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703130.0,0.0,0.0,0.0,104584.36,0.0,0.0,0.0,0.0,0.0,430863.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74634,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,8797675.0,18509862.0,10059274.0,16336319.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17526.477,35063.414,18532.344,33462.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.0,0.0,16.368338,33.22736,18.035791,31.114845,2015.0001,1,0.175966,0,2,1,0.333333,0.175966,0.175966,0.175966,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +52,2,2016-02-19,19.0,55656464.0,0.0,0.0,0.0,0.0,53703130.0,489761.25,0.0,104584.36,100.42231,0.0,0.0,430863.7,0.0,0.0,46187.156,0.0,0.0,0.0,98.74634,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703130.0,0.0,0.0,0.0,104584.36,0.0,0.0,0.0,0.0,0.0,430863.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74634,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,8797675.0,18509862.0,10059274.0,16336319.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17526.477,35063.414,18532.344,33462.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.0,0.0,16.368338,33.22736,18.035791,31.114845,2016.0,1,0.175966,0,2,1,0.333333,0.175966,0.175966,0.175966,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 +53,2,2016-05-19,19.0,55656464.0,0.0,0.0,0.0,0.0,53703130.0,489761.25,0.0,104584.36,100.42231,0.0,0.0,430863.7,0.0,0.0,46187.156,0.0,0.0,0.0,98.74634,0.0,0.0,0.0,0.0,0.0,0.0,0.0,53703130.0,0.0,0.0,0.0,104584.36,0.0,0.0,0.0,0.0,0.0,430863.7,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,98.74634,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,8797675.0,18509862.0,10059274.0,16336319.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,17526.477,35063.414,18532.344,33462.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.0,0.0,16.368338,33.22736,18.035791,31.114845,2016.0,1,0.175966,0,2,1,0.333333,0.175966,0.175966,0.175966,0.199869,0.600109,0.199979,0.599872,0.599908,0.599813,0.599938,0.600158,0.599786,0.599765,0.599909,0.600241,0.176501,1,-5.3e-05,-0.000112,-0.000697,-0.000453,0.000104,-1.7e-05,0.000114,-0.000365,5e-05,0.000161,2e-05,-4.3e-05 diff --git a/tests/everest/test_api.py b/tests/everest/test_api.py new file mode 100644 index 00000000000..c6b51599b54 --- /dev/null +++ b/tests/everest/test_api.py @@ -0,0 +1,558 @@ +import os +from unittest.mock import MagicMock, PropertyMock, patch + +import pandas as pd +import pytest +from pandas import Timestamp +from seba_sqlite.database import ControlDefinition, Function +from seba_sqlite.snapshot import Metadata, OptimizationInfo, SimulationInfo, Snapshot + +from everest.api import EverestDataAPI +from everest.config import EverestConfig +from everest.detached import ServerStatus +from tests.everest.utils import relpath, tmpdir + +# Global values used to create the mock snapshot. +_functions = ["f0", "f1"] +_output_constraints = [("c0", "lower_bound", 1.0), ("c1", None, None)] +_batch_ids = [0, 2] +_merit_flags = [True, False] +_obj_values = [24, 42] +_controls = [("x0", 0.1, 1.0), ("x1", None, None)] +_realizations = [1, 2, 3, 4] +_simulations = [10, 20, 30, 40, 11, 22, 33, 44] +_is_gradient = 4 * [False] + 4 * [True] + 4 * [False] + 4 * [True] +_control_values = [{"x0": 10 * sim, "x1": 20 * sim} for sim in 2 * _simulations] +_function_values = [{"f0": 100 * sim, "f1": 200 * sim} for sim in 2 * _simulations] +_dates = [Timestamp("2020-01-01"), Timestamp("2020-02-01"), Timestamp("2020-03-01")] +_weights = {"f0": 0.25, "f1": 0.75} +_norms = {"f0": 0.2, "f1": 1.5} +_gradient_info = [ + {"f0": {"x0": 10 * sim, "x1": 20 * sim}, "f1": {"x0": 30 * sim, "x1": 40 * sim}} + for sim in 2 * _simulations +] + +CONFIG_MULTIOBJ_CACHE_PATH = relpath("test_data", "cached_results_config_multiobj") +CONFIG_PATH = relpath("..", "..", "examples", "math_func", "config_multiobj.yml") +expected_objective_values = [-0.75, -4.75, -0.765651, -4.70363, -0.507788, -4.47678] + +expected_control_values = [ + 0.0, + 0.0, + 0.0, + -0.0042039049387002465, + -0.011301358892103368, + 1.0, + -0.00210164760474425, + -0.0056498598784414, + 0.499927480613782, +] + +expected_single_objective_values = [-2.333333333333333, -2.333527666666667, -2.000048] + + +def _make_mock(mock_SebaSnapshot): + # Build the arguments for the Snapshot constructor. + objectives = { + fid: Function( + {}, + function_id=fid, + name=fname, + weight=_weights[fname], + normalization=_norms[fname], + ) + for fid, fname in enumerate(_functions) + } + output_constraints = { + fid: Function( + {}, + function_id=fid, + name=fnc[0], + function_type="CONSTRAINT", + constraint_type=fnc[1], + rhs_value=fnc[2], + ) + for fid, fnc in enumerate(_output_constraints) + } + controls = { + cid: ControlDefinition( + {}, control_id=cid, name=name, min_value=min, max_value=max + ) + for cid, (name, min, max) in enumerate(_controls) + } + functions = { + fid: Function( + {}, + name=name, + weight=_weights[name], + normalization=_norms[name], + function_type=Function.FUNCTION_OBJECTIVE_TYPE, + ) + for fid, name in enumerate(_functions) + } + metadata = Metadata( + realizations={}, + functions=functions, + objectives=objectives, + constraints=output_constraints, + controls=controls, + ) + optimization_data = [ + OptimizationInfo( + batch_id=bid, + controls=None, + objective_value=obj_val, + merit_flag=mf, + gradient_info=grad_val, + ) + for bid, mf, obj_val, grad_val in zip( + _batch_ids, _merit_flags, _obj_values, _gradient_info + ) + ] + simulation_data = [ + SimulationInfo( + batch=bid, + objectives=fv, + constraints=None, + controls=con, + sim_avg_obj=None, + is_gradient=ig, + realization=rea, + start_time=None, + end_time=None, + success=None, + realization_weight=1 / len(_realizations), + simulation=sim, + ) + for rea, sim, ig, bid, con, fv in zip( + 4 * _realizations, + 2 * _simulations, + _is_gradient, + 8 * [_batch_ids[0]] + 8 * [_batch_ids[1]], + _control_values, + _function_values, + ) + ] + + # Create the reference snapshot. + snapshot = Snapshot( + metadata, + [sim for sim in simulation_data if not sim.is_gradient], + optimization_data, + ) + snapshot_gradient = Snapshot(metadata, simulation_data, optimization_data) + + def _get_snapshot(filter_out_gradient): + if filter_out_gradient: + return snapshot + else: + return snapshot_gradient + + # Make sure the mocked get_snapshot method returns the reference snapshot. + mock_SebaSnapshot.return_value.get_snapshot.side_effect = _get_snapshot + + +def _mock_summary_collector(batch): + """ + Creates a dummy dataframe where one row contains NaN, and one column + contains NaN. Should be filtered out before the API returns them. + """ + simulations = [r for r in _simulations for d in _dates] + dates = [d for r in _simulations for d in _dates] + key1 = [batch * v for v in range(len(dates))] + [None] + key2 = [10 * batch * v for v in range(len(dates))] + [None] + missing_data = 25 * [None] + dates += [Timestamp("1969-01-01")] + simulations += [1] + df = pd.DataFrame.from_dict( + { + "Realization": simulations, + "Date": dates, + "key1": key1, + "key2": key2, + "missing_data": missing_data, + } + ) + return df.set_index(["Realization", "Date"]) + + +def mock_facade(): + facade = MagicMock() + facade.enspath = "mock_path" + return facade + + +def mock_storage(batches): + storage = MagicMock() + data = MagicMock() + data.load_all_summary_data.side_effect = [ + _mock_summary_collector(i) for i in batches + ] + experiment = storage.get_experiment_by_name.return_value + experiment.get_ensemble_by_name.return_value = data + return storage + + +@pytest.fixture +@patch.object(EverestConfig, "optimization_output_dir", new_callable=PropertyMock) +@patch("everest.api.everest_data_api.SebaSnapshot") +def api(mock_SebaSnapshot, mock_get_optimization_output_dir): + _make_mock(mock_SebaSnapshot) + return EverestDataAPI(EverestConfig.with_defaults(), filter_out_gradient=False) + + +@pytest.fixture +@patch.object(EverestConfig, "optimization_output_dir", new_callable=PropertyMock) +@patch("everest.api.everest_data_api.SebaSnapshot") +def api_no_gradient(mock_SebaSnapshot, mock_get_optimization_output_dir): + _make_mock(mock_SebaSnapshot) + return EverestDataAPI(EverestConfig.with_defaults()) + + +def test_batches(api_no_gradient, api): + assert api_no_gradient.batches == _batch_ids + assert api.batches == _batch_ids + + +def test_accepted_batches(api_no_gradient, api): + expected_result = [bid for bid, mf in zip(_batch_ids, _merit_flags) if mf] + assert api_no_gradient.accepted_batches == expected_result + assert api.accepted_batches == expected_result + + +def test_function_names(api_no_gradient, api): + assert api_no_gradient.objective_function_names == _functions + assert api.objective_function_names == _functions + + +def test_output_constraint_names(api_no_gradient, api): + expected_result = [oc[0] for oc in _output_constraints] + assert api_no_gradient.output_constraint_names == expected_result + assert api.output_constraint_names == expected_result + + +def test_input_constraints(api_no_gradient, api): + for control in _controls: + expected_result = {"min": control[1], "max": control[2]} + result = api_no_gradient.input_constraint(control[0]) + assert result == expected_result + assert api.input_constraint(control[0]) == expected_result + + +def test_output_constraints(api_no_gradient, api): + for constraint in _output_constraints: + expected_result = {"type": constraint[1], "right_hand_side": constraint[2]} + result = api_no_gradient.output_constraint(constraint[0]) + assert result == expected_result + assert api.output_constraint(constraint[0]) == expected_result + + +def test_realizations(api_no_gradient, api): + assert api_no_gradient.realizations == _realizations + assert api.realizations == _realizations + + +def test_simulations(api_no_gradient, api): + expected_result = [s for s, g in zip(_simulations, _is_gradient) if not g] + assert api_no_gradient.simulations == expected_result + assert api.simulations == _simulations + + +def test_control_names(api_no_gradient, api): + expected_result = [con[0] for con in _controls] + assert api_no_gradient.control_names == expected_result + assert api.control_names == expected_result + + +def test_control_values(api_no_gradient, api): + control_names = api_no_gradient.control_names + expected_result = [ + {"batch": bid, "control": name, "value": con[name]} + for bid, con in zip(8 * [_batch_ids[0]] + 8 * [_batch_ids[1]], _control_values) + for name in control_names + ] + for res, er in zip(api.control_values, expected_result): + assert res == er + is_gradient = [ig for ig in _is_gradient for name in control_names] + expected_result = [tv for tv, ig in zip(expected_result, is_gradient) if not ig] + for res, er in zip(api_no_gradient.control_values, expected_result): + assert res == er + + +def test_objective_values(api_no_gradient, api): + function_names = api_no_gradient.objective_function_names + expected_result = [ + { + "batch": bid, + "realization": rea, + "function": name, + "value": fnc[name], + "simulation": sim, + "weight": _weights[name], + "norm": _norms[name], + } + for rea, sim, bid, fnc in zip( + 4 * _realizations, + 2 * _simulations, + 8 * [_batch_ids[0]] + 8 * [_batch_ids[1]], + _function_values, + ) + for name in function_names + ] + for res, er in zip(api.objective_values, expected_result): + assert res == er + is_gradient = [ig for ig in _is_gradient for name in function_names] + expected_result = [tv for tv, ig in zip(expected_result, is_gradient) if not ig] + for res, er in zip(api_no_gradient.objective_values, expected_result): + assert res == er + + +def test_single_objective_values(api_no_gradient): + function_data = [ + (rea, bid, fv) + for rea, ig, bid, fv in zip( + 4 * _realizations, + _is_gradient, + 8 * [_batch_ids[0]] + 8 * [_batch_ids[1]], + _function_values, + ) + if not ig + ] + expected_objectives = {b: {} for b in _batch_ids} + realization_weight = 1 / len(_realizations) + for _r, b, f in function_data: + for name in _functions: + factor = realization_weight * _weights[name] * _norms[name] + if expected_objectives[b].get(name, None) is None: + expected_objectives[b].update({name: f[name] * factor}) + else: + expected_objectives[b][name] += f[name] * factor + + expected_result = [ + {"accepted": m, "batch": b, "objective": v, **expected_objectives[b]} + for b, v, m in zip(_batch_ids, _obj_values, _merit_flags) + ] + + result = api_no_gradient.single_objective_values + assert result == expected_result + + +def test_gradient_values(api_no_gradient): + expected_result = [ + {"batch": bid, "function": func, "control": ctrl, "value": val} + for bid, grad_info in zip(_batch_ids, _gradient_info) + for func, info in grad_info.items() + for ctrl, val in info.items() + ] + assert api_no_gradient.gradient_values == expected_result + + +@patch.object( + EverestConfig, + "optimization_output_dir", + new_callable=PropertyMock, + return_value=CONFIG_MULTIOBJ_CACHE_PATH, +) +def test_ropt_integration(mock_get_optimization_output_dir): + config = EverestConfig.load_file(CONFIG_PATH) + api = EverestDataAPI(config) + + expected_objectives = [ + {"name": f.name, "weight": f.weight, "norm": f.normalization} + for f in config.objective_functions + ] + expected_objective_names = [objective["name"] for objective in expected_objectives] + assert expected_objective_names == api.objective_function_names + + expected_weight = [objective["weight"] for objective in expected_objectives] + weight_sum = sum(expected_weight) + if weight_sum != 1: + for obj in expected_objectives: + obj["weight"] /= weight_sum + + for obj in api.objective_values: + res = { + "name": obj["function"], + "weight": obj["weight"], + "norm": obj["norm"], + } + assert res in expected_objectives + + batches = [0, 1, 2] + assert batches == api.batches + + accepted_batches = [0, 2] + assert accepted_batches == api.accepted_batches + + assert api.output_constraint_names == [] + + realizations = config.model.realizations + assert realizations == api.realizations + + expected_control_names = [] + for control in config.controls: + expected_control_names += [ + f"{control.name}_{var.name}" for var in control.variables + ] + assert expected_control_names == api.control_names + + expected_control_constraint = {"min": -1.0, "max": 1.0} + for name in expected_control_names: + assert expected_control_constraint == api.input_constraint(name) + + for name in {c["control"] for c in api.control_values}: + assert name in expected_control_names + + for value in [c["value"] for c in api.control_values]: + assert value in expected_control_values + + expected_batches = [0, 1, 2] + assert expected_batches == list({c["batch"] for c in api.control_values}) + + for name in {f["function"] for f in api.objective_values}: + assert name in expected_objective_names + + result = list({f["batch"] for f in api.objective_values}) + + assert expected_batches == result + + for value in [f["value"] for f in api.objective_values]: + assert value in expected_objective_values + + for value in [f["objective"] for f in api.single_objective_values]: + assert value in expected_single_objective_values + + assert batches == [obj["batch"] for obj in api.single_objective_values] + + +@patch("everest.api.everest_data_api.open_storage", return_value=mock_storage((0, 2))) +def test_get_summary_keys(_, api_no_gradient): + # Retrieve the pandas data frame with mocked values. + summary_values = api_no_gradient.summary_values() + # Check some data frame properties. + assert set(summary_values.columns) == { + "realization", + "simulation", + "batch", + "date", + "key1", + "key2", + } + assert summary_values.shape[0] == len(_realizations) * len(_batch_ids) * len(_dates) + assert set(summary_values["batch"]) == set(_batch_ids) + assert set(summary_values["realization"]) == set(_realizations) + non_gradient_simulations = [s for s, g in zip(_simulations, _is_gradient) if not g] + assert set(summary_values["simulation"]) == set(non_gradient_simulations) + assert set(summary_values["date"]) == set(_dates) + # Check key values. + for batch_id in _batch_ids: + batch = summary_values.loc[summary_values["batch"] == batch_id] + assert batch["key1"].to_list() == [batch_id * v for v in range(batch.shape[0])] + + +@patch("everest.api.everest_data_api.open_storage", return_value=mock_storage((0, 2))) +def test_get_summary_keys_gradient(_, api): + # Retrieve the pandas data frame with mocked values. + summary_values = api.summary_values() + # Check some data frame properties. + assert set(summary_values.columns) == { + "realization", + "simulation", + "batch", + "date", + "key1", + "key2", + } + assert summary_values.shape[0] == len(_simulations) * len(_batch_ids) * len(_dates) + assert set(summary_values["batch"]) == set(_batch_ids) + assert set(summary_values["realization"]) == set(_realizations) + assert set(summary_values["simulation"]) == set(_simulations) + assert set(summary_values["date"]) == set(_dates) + # Check key values. + for batch_id in _batch_ids: + batch = summary_values.loc[summary_values["batch"] == batch_id] + assert batch["key1"].to_list() == [batch_id * v for v in range(batch.shape[0])] + + +@patch("everest.api.everest_data_api.open_storage", return_value=mock_storage([2])) +def test_get_summary_keys_single_batch(_, api_no_gradient): + # Retrieve the pandas data frame with mocked values. + summary_values = api_no_gradient.summary_values(batches=[2]) + # Check some data frame properties. + assert set(summary_values.columns) == { + "realization", + "simulation", + "batch", + "date", + "key1", + "key2", + } + assert summary_values.shape[0] == len(_realizations) * len(_dates) + assert summary_values["batch"].iloc[0] == 2 + assert set(summary_values["realization"]) == set(_realizations) + non_gradient_simulations = [s for s, g in zip(_simulations, _is_gradient) if not g] + assert set(summary_values["simulation"]) == set(non_gradient_simulations) + assert set(summary_values["date"]) == set(_dates) + + # Check key values. + batch = summary_values.loc[summary_values["batch"] == 2] + assert batch["key1"].to_list() == [2 * v for v in range(batch.shape[0])] + assert batch["key2"].to_list() == [20 * v for v in range(batch.shape[0])] + + +@patch("everest.api.everest_data_api.open_storage", return_value=mock_storage((0, 2))) +def test_get_summary_keys_single_key(_, api_no_gradient): + # Retrieve the pandas data frame with mocked values. + summary_values = api_no_gradient.summary_values(keys=["key2"]) + # Check some data frame properties. + assert set(summary_values.columns) == { + "realization", + "simulation", + "batch", + "date", + "key2", + } + assert summary_values.shape[0] == len(_realizations) * len(_batch_ids) * len(_dates) + assert set(summary_values["batch"]) == set(_batch_ids) + assert set(summary_values["realization"]) == set(_realizations) + non_gradient_simulations = [s for s, g in zip(_simulations, _is_gradient) if not g] + assert set(summary_values["simulation"]) == set(non_gradient_simulations) + assert set(summary_values["date"]) == set(_dates) + # Check key values. + for batch_id in _batch_ids: + batch = summary_values.loc[summary_values["batch"] == batch_id] + assert batch["key2"].to_list() == [ + 10 * batch_id * v for v in range(batch.shape[0]) + ] + + +@patch.object(EverestConfig, "optimization_output_dir", new_callable=PropertyMock) +@patch("everest.api.everest_data_api.SebaSnapshot") +@patch("everest.api.everest_data_api.SebaSnapshot.get_snapshot") +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_output_folder(_1, _2, _3): + config_file = "config_multiobj.yml" + config = EverestConfig.load_file(config_file) + assert config.environment is not None + expected = config.environment.output_folder + api = EverestDataAPI(config) + assert expected == os.path.basename(api.output_folder) + + +@patch.object(EverestConfig, "optimization_output_dir", new_callable=PropertyMock) +@patch("everest.api.everest_data_api.SebaSnapshot") +@patch("everest.api.everest_data_api.SebaSnapshot.get_snapshot") +@patch( + "everest.api.everest_data_api.everserver_status", + return_value={"status": ServerStatus.completed}, +) +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_everest_csv(everserver_status_mock, _1, _2, _3): + config_file = "config_multiobj.yml" + config = EverestConfig.load_file(config_file) + expected = config.export_path + api = EverestDataAPI(config) + assert expected == api.everest_csv + + everserver_status_mock.return_value = {"status": ServerStatus.running} + assert api.everest_csv is None diff --git a/tests/everest/test_async_run.py b/tests/everest/test_async_run.py new file mode 100644 index 00000000000..307e6543ef8 --- /dev/null +++ b/tests/everest/test_async_run.py @@ -0,0 +1,41 @@ +from functools import partial +from time import sleep + +from everest.util import async_run + + +def workflow_good(): + sleep(0.1) + + +def workflow_bad(): + sleep(0.1) + raise RuntimeError("I am a failure") + + +def _on_runner_error(error, expected_error): + # Compare repr since we can't compare RuntimeErrors directly + assert repr(error) == repr(expected_error) + + +def _on_runner_finished(_, error, expected_error): + # Compare repr since we can't compare RuntimeErrors directly + assert repr(error) == repr(expected_error) + + +def test_async_run(): + # test successful run + expected_error = None + async_run( + workflow_good, + on_error=partial(_on_runner_error, expected_error=expected_error), + on_finished=partial(_on_runner_finished, expected_error=expected_error), + ) + + # test failing run + expected_error = RuntimeError("I am a failure") + async_run( + workflow_bad, + on_error=partial(_on_runner_error, expected_error=expected_error), + on_finished=partial(_on_runner_finished, expected_error=expected_error), + ) diff --git a/tests/everest/test_cache.py b/tests/everest/test_cache.py new file mode 100644 index 00000000000..a2e129e7d75 --- /dev/null +++ b/tests/everest/test_cache.py @@ -0,0 +1,56 @@ +import numpy as np + +from everest.config import EverestConfig +from everest.simulator import Simulator +from everest.suite import _EverestWorkflow +from tests.everest.utils import relpath, tmp + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") +CONFIG_FILE_RESTART = "config_restart.yml" + + +def test_cache_optimizer(monkeypatch): + cached = False + original_call = Simulator.__call__ + + def new_call(*args): + nonlocal cached + result = original_call(*args) + # Without caching there should be 10 evaluations: + if (result.evaluation_ids >= 0).sum() < 10: + cached = True + return result + + monkeypatch.setattr(Simulator, "__call__", new_call) + + with tmp(CONFIG_PATH): + config = EverestConfig.load_file(CONFIG_FILE_RESTART) + config.simulator.enable_cache = False + + workflow = _EverestWorkflow(config) + assert workflow is not None + workflow.start_optimization() + + x1 = np.fromiter( + (workflow.result.controls["point_" + p] for p in ["x-0", "x-1", "x-2"]), + dtype=np.float64, + ) + + assert not cached + assert np.allclose(x1, [0.1, 0.0, 0.4], atol=0.02) + + with tmp(CONFIG_PATH): + config = EverestConfig.load_file(CONFIG_FILE_RESTART) + config.simulator.enable_cache = True + + workflow = _EverestWorkflow(config) + assert workflow is not None + workflow.start_optimization() + + x2 = np.fromiter( + (workflow.result.controls["point_" + p] for p in ["x-0", "x-1", "x-2"]), + dtype=np.float64, + ) + + assert cached + assert np.allclose(x1, x2, atol=np.finfo(np.float64).eps) diff --git a/tests/everest/test_config_branch.py b/tests/everest/test_config_branch.py new file mode 100644 index 00000000000..5dec49844c0 --- /dev/null +++ b/tests/everest/test_config_branch.py @@ -0,0 +1,69 @@ +import pytest + +from everest.bin.config_branch_script import ( + _updated_initial_guess, + opt_controls_by_batch, +) +from everest.config_file_loader import load_yaml +from everest.config_keys import ConfigKeys as CK +from tests.everest.utils import relpath, tmpdir + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") +CONFIG_FILE = "config_advanced.yml" +CACHED_SEBA_FOLDER = relpath("test_data", "cached_results_config_advanced") + + +@tmpdir(CONFIG_PATH) +def test_get_controls_for_batch(): + assert opt_controls_by_batch(CACHED_SEBA_FOLDER, 1) is not None + + assert opt_controls_by_batch(CACHED_SEBA_FOLDER, 42) is None + + opt_controls = opt_controls_by_batch(CACHED_SEBA_FOLDER, 1) + control_names = set(opt_controls.keys()) + expected_control_names = {"point_x-0", "point_x-1", "point_x-2"} + + assert control_names == expected_control_names + + expected_control_values = { + 0.172, + 0.258, + 0.139, + } + + control_values = {v for k, v in opt_controls.items()} + + assert sorted(control_values) == pytest.approx( + sorted(expected_control_values), rel=1e-2 + ) + + +@tmpdir(CONFIG_PATH) +def test_update_controls_initial_guess(): + old_controls = load_yaml(CONFIG_FILE)[CK.CONTROLS] + + assert len(old_controls) == 1 + + old_ctrl = next(iter(old_controls), None) + + assert old_ctrl is not None + assert CK.INITIAL_GUESS in old_ctrl + + for var in old_ctrl[CK.VARIABLES]: + assert CK.INITIAL_GUESS not in var + + opt_controls = opt_controls_by_batch(CACHED_SEBA_FOLDER, 1) + updated_controls = _updated_initial_guess(old_controls, opt_controls) + updated_ctl = next(iter(updated_controls), None) + + assert len(updated_controls) == len(old_controls) + assert updated_ctl is not None + + for var in updated_ctl[CK.VARIABLES]: + assert CK.INITIAL_GUESS in var + + opt_ctrl_values = {v for k, v in opt_controls.items()} + updated_initial_guesses = { + var[CK.INITIAL_GUESS] for var in updated_ctl[CK.VARIABLES] + } + assert opt_ctrl_values == updated_initial_guesses diff --git a/tests/everest/test_config_file_loader.py b/tests/everest/test_config_file_loader.py new file mode 100644 index 00000000000..b13f9ff4bde --- /dev/null +++ b/tests/everest/test_config_file_loader.py @@ -0,0 +1,137 @@ +import os +import string +from unittest.mock import patch + +import pytest +from pydantic_core import ValidationError +from ruamel.yaml import YAML + +from everest import ConfigKeys as CK +from everest import config_file_loader as loader +from everest.config import EverestConfig +from tests.everest.utils import relpath, tmpdir + +mocked_root = relpath(os.path.join("test_data", "mocked_test_case")) + + +def test_load_yaml(): + config_file = os.path.join(mocked_root, "mocked_test_case.yml") + configuration = loader.load_yaml(config_file) + assert configuration is not None + assert configuration[CK.DEFINITIONS] is not None + + +@patch.dict("os.environ", {"USER": "NO_USERNAME_ENV_SET"}) +def test_load_yaml_preprocess(): + config_file = os.path.join(mocked_root, "mocked_test_case.yml") + configuration = EverestConfig.load_file(config_file) + username = os.environ.get("USER") + folder = configuration.environment.simulation_folder + assert f"simulations_{username}" == folder + + +def test_get_definitions(): + config_file = os.path.join(mocked_root, "mocked_test_case.yml") + configuration = loader.load_yaml(config_file) + definitions = loader._get_definitions( + configuration=configuration, + configpath=os.path.dirname(os.path.abspath(config_file)), + ) + assert definitions is not None + defs = { + "case": "MOCKED_TEST_CASE", + "configpath": os.path.dirname(os.path.abspath(config_file)), + "runpath_file": "", + "eclbase": "eclipse/ECL", + "numeric_key": 1, + "bool_key": True, + "realization": "", + } + + assert defs == definitions + + +def test_load_config_as_yaml(): + config_file = os.path.join(mocked_root, "mocked_test_case.yml") + rendered_template = EverestConfig.load_file(config_file) + assert rendered_template is not None + + +@tmpdir(mocked_root) +def test_configpath_in_defs(): + config_file = "mocked_multi_batch.yml" + config = EverestConfig.load_file(config_file) + + defs = { + "numeric_key": 1, + "bool_key": True, + "eclbase": "MOCKED_TEST_CASE", + "local_jobs_folder": os.path.join(os.getcwd(), "jobs"), + "refcase_folder": os.path.join(os.getcwd(), "eclipse/refcase"), + "spe1_datafile": os.path.join(os.getcwd(), "eclipse/refcase/SPE1.DATA"), + } + assert defs == config.definitions + + +@tmpdir(mocked_root) +def test_dependent_definitions(): + config_file = "mocked_multi_batch.yml" + with open(config_file, encoding="utf-8") as f: + raw_config = YAML(typ="safe", pure=True).load(f) + + conseq_chars = zip(string.ascii_lowercase[:-1], string.ascii_lowercase[1:]) + for c, cdef in [*list(conseq_chars), (string.ascii_lowercase[-1], "configpath")]: + raw_config[CK.DEFINITIONS][c] = "r{{{{ {} }}}}".format(cdef) + + with open(config_file, "w", encoding="utf-8") as f: + yaml = YAML(typ="safe", pure=True) + yaml.indent = 2 + yaml.default_flow_style = False + yaml.dump(raw_config, f) + + config = EverestConfig.load_file(config_file) + + defs = { + "numeric_key": 1, + "bool_key": True, + "eclbase": "MOCKED_TEST_CASE", + "local_jobs_folder": os.path.join(os.getcwd(), "jobs"), + "refcase_folder": os.path.join(os.getcwd(), "eclipse/refcase"), + "spe1_datafile": os.path.join(os.getcwd(), "eclipse/refcase/SPE1.DATA"), + } + defs.update({x: os.getcwd() for x in string.ascii_lowercase}) + assert defs == config.definitions + + +@tmpdir(mocked_root) +def test_dependent_definitions_value_error(): + config_file = "mocked_multi_batch.yml" + with open(config_file, encoding="utf-8") as f: + raw_config = YAML(typ="safe", pure=True).load(f) + + raw_config[CK.DEFINITIONS]["a"] = "r{{ b }}" + raw_config[CK.DEFINITIONS]["b"] = "r{{ a }}" + + with open(config_file, "w", encoding="utf-8") as f: + yaml = YAML(typ="safe", pure=True) + yaml.indent = 2 + yaml.default_flow_style = False + yaml.dump(raw_config, f) + with pytest.raises(ValueError): + EverestConfig.load_file(config_file) + + +@tmpdir(mocked_root) +def test_load_empty_configuration(): + with open("empty_config.yml", mode="w", encoding="utf-8") as fh: + fh.writelines("") + with pytest.raises(ValidationError, match="missing"): + EverestConfig.load_file("empty_config.yml") + + +@tmpdir(mocked_root) +def test_load_invalid_configuration(): + with open("invalid_config.yml", mode="w", encoding="utf-8") as fh: + fh.writelines("asdf") + with pytest.raises(ValidationError, match="missing"): + EverestConfig.load_file("invalid_config.yml") diff --git a/tests/everest/test_config_validation.py b/tests/everest/test_config_validation.py new file mode 100644 index 00000000000..9df62fc872a --- /dev/null +++ b/tests/everest/test_config_validation.py @@ -0,0 +1,953 @@ +import os +import pathlib +import re +from pathlib import Path +from typing import Any, Dict, List, Union + +import pytest +from pydantic import ValidationError + +from everest.config import EverestConfig, ModelConfig +from everest.config.control_variable_config import ControlVariableConfig +from everest.config.sampler_config import SamplerConfig +from tests.everest.utils import tmpdir + + +def has_error(error: Union[ValidationError, List[dict]], match: str): + messages = ( + [error_dict["msg"] for error_dict in error.errors()] + if isinstance(error, ValidationError) + else [e["msg"] for e in error] + ) + pattern = re.compile(f"(.*){match}") + return any(re.match(pattern, m) for m in messages) + + +def all_errors(error: ValidationError, match: str): + messages = [error_dict["msg"] for error_dict in error.errors()] + instances = [] + for m in messages: + instances.extend(re.findall(match, m)) + return instances + + +def test_that_sampler_config_with_wrong_method(): + with pytest.raises(ValueError) as e: + SamplerConfig(backend="scipy", method="hey") + + assert has_error(e.value, match="Sampler (.*) not found") + + +def test_that_duplicate_well_names_raise_error(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + wells=[ + {"name": "w110"}, + {"name": "w08"}, + {"name": "w10"}, + {"name": "w10"}, + {"name": "w09"}, + {"name": "w00"}, + {"name": "w01"}, + {"name": "w01"}, + {"name": "w01"}, + ], + ) + + assert has_error(e.value, match="Well names must be unique") + + +def test_that_dot_in_well_name_raises_error(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + wells=[ + {"name": "w.110"}, + {"name": "w.08"}, + ] + ) + + assert has_error( + e.value, + match="(.*)can not contain any dots", + ) + + +def test_that_negative_drill_time_raises_error(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + wells=[ + {"name": "w110", "drill_time": -1}, + ] + ) + + assert has_error( + e.value, + match="(.*)must be a positive number", + ) + + +def test_that_cvar_attrs_are_mutex(): + cvar = {"percentile": 0.1, "number_of_realizations": 3} + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults(**{"optimization": {"cvar": cvar}}) + + assert has_error(e.value, match="Invalid CVaR section") + + +@pytest.mark.parametrize("nreals", [-1, 0, 8]) +def test_that_cvar_nreals_interval_outside_range_errors(nreals): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + **{ + "optimization": { + "cvar": { + "number_of_realizations": nreals, + } + }, + "model": {"realizations": [1, 2, 3, 4, 5, 6]}, + } + ) + + assert has_error( + e.value, + match=f"number_of_realizations: \\(got {nreals}", + ) + + +@pytest.mark.parametrize("nreals", [1, 2, 3, 4, 5]) +def test_that_cvar_nreals_valid_doesnt_error(nreals): + EverestConfig.with_defaults( + **{ + "optimization": { + "cvar": { + "number_of_realizations": nreals, + } + }, + "model": {"realizations": [1, 2, 3, 4, 5, 6]}, + } + ) + + +def test_that_max_runtime_errors_only_on_negative(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults(simulator={"max_runtime": -1}) + + EverestConfig.with_defaults(simulator={"max_runtime": 0}) + + assert has_error(e.value, match=".*greater than or equal to 0") + + +def test_that_invalid_queue_system_errors(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults(simulator={"queue_system": "docal"}) + + assert has_error(e.value, match="Input should be 'lsf', 'local' or 'slurm'") + + EverestConfig.with_defaults(simulator={"queue_system": "local"}) + EverestConfig.with_defaults(simulator={"queue_system": "lsf"}) + EverestConfig.with_defaults(simulator={"queue_system": "slurm"}) + + +@pytest.mark.parametrize( + ["cores", "expected_error"], [(0, True), (-1, True), (1, False)] +) +def test_that_cores_errors_only_on_lt0(cores, expected_error): + if expected_error: + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults(simulator={"cores": cores}) + + assert has_error(e.value, match=".*greater than 0") + + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults(simulator={"cores_per_node": cores}) + + assert has_error(e.value, match=".*greater than 0") + else: + EverestConfig.with_defaults(simulator={"cores": cores}) + EverestConfig.with_defaults(simulator={"cores_per_node": cores}) + + +def test_that_duplicate_control_names_raise_error(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + controls=[ + { + "name": "group_0", + "type": "well_control", + "min": 0, + "max": 0.1, + "variables": [ + {"name": "w00", "initial_guess": 0.06}, + ], + }, + { + "name": "group_0", + "type": "well_control", + "min": 0, + "max": 0.1, + "variables": [ + {"name": "w01", "initial_guess": 0.09}, + ], + }, + ], + ) + + assert has_error(e.value, match="(.*)`name` must be unique") + + +def test_that_dot_not_in_control_names(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + controls=[ + { + "name": "group_0.2", + "type": "well_control", + "min": 0, + "max": 0.1, + "variables": [ + {"name": "w00", "initial_guess": 0.06}, + {"name": "w01", "initial_guess": 0.09}, + ], + } + ] + ) + + assert has_error( + e.value, + match="(.*)can not contain any dots", + ) + + +def test_that_scaled_range_is_valid_range(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + controls=[ + { + "name": "group_0", + "type": "well_control", + "min": 0, + "max": 0.1, + "scaled_range": [2, 1], + "variables": [ + {"name": "w00", "initial_guess": 0.06}, + {"name": "w01", "initial_guess": 0.09}, + ], + } + ] + ) + + assert has_error( + e.value, + match=r"(.*)must be a valid range \[a, b\], where a < b.", + ) + + +@pytest.mark.parametrize( + "variables, count", + ( + pytest.param( + [ + { # upper bound (max) + "name": "w00", + "min": 0, + "max": 0.1, + "initial_guess": 1.09, + }, + { # lower bound (min) + "name": "w01", + "min": 0.5, + "max": 1, + "initial_guess": 0.29, + }, + ], + 2, + id="value", + ), + pytest.param( + [ + { + "name": "w00", + "min": 0, + "max": 0.1, + "initial_guess": [1.09, 0.29], + }, + ], + 1, + id="vector", + ), + ), +) +def test_that_invalid_control_initial_guess_outside_bounds( + variables: List[Dict[str, Any]], count: int +): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + controls=[ + {"name": "group_0", "type": "well_control", "variables": variables} + ] + ) + + assert ( + len( + all_errors( + e.value, + match=r"must respect \d\.\d <= initial_guess <= \d\.\d", + ) + ) + == count + ) + + +@pytest.mark.parametrize( + "variables, unique_key", + ( + pytest.param( + [ + {"name": "w00", "initial_guess": 0.05}, + {"name": "w00", "initial_guess": 0.09}, + ], + "name-index", + id="name no index", + ), + pytest.param( + [ + {"name": "w00", "index": 1, "initial_guess": 0.05}, + {"name": "w00", "index": 1, "initial_guess": 0.09}, + ], + "name-index", + id="name and index", + ), + pytest.param( + [ + {"name": "w00", "initial_guess": [0.05, 0.09]}, + {"name": "w00", "initial_guess": [0.03, 0.07]}, + ], + "name", + id="vector", + ), + ), +) +def test_that_invalid_control_unique_entry(variables, unique_key): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + controls=[ + { + "name": "group_0", + "type": "well_control", + "max": 0, + "min": 0.1, + "variables": variables, + } + ] + ) + + assert has_error( + e.value, + match=f"(.*)`{unique_key}` must be unique", + ) + + +def test_that_invalid_control_undefined_fields(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + controls=[ + { + "name": "group_0", + "type": "well_control", + "variables": [ + {"name": "w00"}, + ], + } + ] + ) + + for case in ["min", "max", "initial_guess"]: + assert has_error( + e.value, + match=f"(.*)must define {case} value either at control level or variable", + ) + + +def test_that_control_variables_index_is_defined_for_all_variables(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + controls=[ + { + "name": "group_0", + "type": "well_control", + "min": 0, + "max": 0.1, + "variables": [ + {"name": "w01", "initial_guess": 0.06, "index": 0}, + {"name": "w00", "initial_guess": 0.09}, + ], + } + ] + ) + + assert has_error( + e.value, + match="(.*)given either for all of the variables or for none of them", + ) + + +def test_that_duplicate_output_constraint_names_raise_error(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + output_constraints=[ + {"target": 0.3, "name": "c110"}, + {"target": 0.3, "name": "c08"}, + {"target": 0.3, "name": "c10"}, + {"target": 0.3, "name": "c10"}, + {"target": 0.3, "name": "c09"}, + {"target": 0.3, "name": "c00"}, + {"target": 0.3, "name": "c01"}, + {"target": 0.3, "name": "c01"}, + {"target": 0.3, "name": "c01"}, + ], + ) + + assert has_error(e.value, match="Output constraint names must be unique") + + +def test_that_output_constraints_bounds_are_mutex(): + output_constraint = { + "name": "w110", + } + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults(output_constraints=[output_constraint]) + + assert has_error( + e.value, match="Output constraints must have only one of the following" + ) + + output_constraint["target"] = 1.0 + EverestConfig.with_defaults(output_constraints=[output_constraint]) + + output_constraint["upper_bound"] = 2.0 + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults(output_constraints=[output_constraint]) + + assert has_error( + e.value, match="Output constraints must have only one of the following" + ) + + output_constraint["lower_bound"] = 0.5 + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults(output_constraints=[output_constraint]) + + assert has_error( + e.value, match="Output constraints must have only one of the following" + ) + + del output_constraint["upper_bound"] + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults(output_constraints=[output_constraint]) + + assert has_error( + e.value, match="Output constraints must have only one of the following" + ) + del output_constraint["target"] + EverestConfig.with_defaults(output_constraints=[output_constraint]) + + del output_constraint["lower_bound"] + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults(output_constraints=[output_constraint]) + + assert has_error( + e.value, match="Output constraints must have only one of the following" + ) + + +def test_that_variable_name_does_not_contain_dots(): + with pytest.raises(ValueError) as e: + ControlVariableConfig(name="invalid.name") + assert has_error(e.value, match="(.*)can not contain any dots") + + +@pytest.mark.parametrize( + ["index_val", "expected_error"], [(0, False), (-1, True), (1, False)] +) +def test_that_variable_index_is_non_negative(index_val, expected_error): + if expected_error: + with pytest.raises(ValueError) as e: + ControlVariableConfig(name="var", index=index_val) + assert has_error( + e.value, match="(.*)Input should be greater than or equal to 0" + ) + else: + ControlVariableConfig(name="var", index=index_val) + + +@pytest.mark.parametrize( + ["perturbation", "expected_error"], [(0.0, True), (-1.0, True), (0.1, False)] +) +def test_that_variable_perturbation_is_positive(perturbation, expected_error): + if expected_error: + with pytest.raises(ValueError) as e: + ControlVariableConfig(name="var", perturbation_magnitude=perturbation) + assert has_error(e.value, match="(.*)Input should be greater than 0") + else: + ControlVariableConfig(name="var", perturbation_magnitude=perturbation) + + +def test_that_model_realizations_accept_only_positive_ints(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults(**{"model": {"realizations": [-1, 1, 2, 3]}}) + + assert has_error(e.value, match="Input should be greater than or equal to 0") + + EverestConfig.with_defaults(**{"model": {"realizations": [0, 1, 2, 3]}}) + + +def test_that_model_realizations_weights_must_correspond_to_realizations(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + **{"model": {"realizations": [1, 2, 3], "realizations_weights": [1, 2]}} + ) + assert has_error( + e.value, match="Specified realizations_weights must have one weight per" + ) + + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + **{ + "model": { + "realizations": [1, 2, 3], + "realizations_weights": [1, 2, 3, 4], + } + } + ) + assert has_error( + e.value, match="Specified realizations_weights must have one weight per" + ) + + EverestConfig.with_defaults(**{"model": {"realizations": [1, 2, 3]}}) + EverestConfig.with_defaults( + **{"model": {"realizations": [1, 2, 3], "realizations_weights": [5, 5, -5]}} + ) + + +def test_that_missing_optimization_algorithm_errors(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults(**{"optimization": {"algorithm": "ddlygldt"}}) + + assert has_error(e.value, match="Optimizer algorithm 'dakota/ddlygldt' not found") + + +@pytest.mark.parametrize( + "optimizer_attr", + [ + "perturbation_num", + "max_iterations", + "max_function_evaluations", + "max_batch_num", + "min_pert_success", + ], +) +def test_that_some_optimization_attrs_must_be_positive(optimizer_attr): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults(**{"optimization": {optimizer_attr: -1}}) + + assert has_error(e.value, match="(.*)Input should be greater than 0") + + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults(**{"optimization": {optimizer_attr: 0}}) + + assert has_error(e.value, match="(.*)Input should be greater than 0") + + EverestConfig.with_defaults(**{"optimization": {optimizer_attr: 1}}) + + +def test_that_min_realizations_success_is_nonnegative(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + **{"optimization": {"min_realizations_success": -1}} + ) + + assert has_error(e.value, match="(.*)Input should be greater than or equal to 0") + + EverestConfig.with_defaults(**{"optimization": {"min_realizations_success": 0}}) + + +@pytest.mark.parametrize( + ["target", "link"], + [ + (".", True), + ("./", True), + (".", False), + ("./", False), + ], +) +@tmpdir(None) +def test_that_install_data_allows_runpath_root_as_target(target, link): + data = {"source": "relative/path_", "target": target, "link": link} + os.makedirs("config_dir/relative/path_0") + with open("config_dir/test.yml", "w", encoding="utf-8") as f: + f.write(" ") + config = EverestConfig.with_defaults( + install_data=[data], + config_path=Path("config_dir/test.yml"), + model=ModelConfig(realizations=[0]), + ) + + for install_data_config in config.install_data: + assert install_data_config.target == Path(data["source"]).name + + +@tmpdir(None) +def test_that_install_data_source_exists(): + data = { + "source": "relative/path", + "target": "xxx", + } + os.makedirs("config_dir") + with open("config_dir/test.yml", "w", encoding="utf-8") as f: + f.write(" ") + + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + install_data=[data], + config_path=Path("config_dir/test.yml"), + ) + assert has_error(e.value, match="No such file or directory") + + os.makedirs("config_dir/relative/path") + EverestConfig.with_defaults( + install_data=[data], + config_path=Path("config_dir/test.yml"), + ) + + +@tmpdir(None) +def test_that_model_data_file_exists(): + os.makedirs("config_dir") + with open("config_dir/test.yml", "w", encoding="utf-8") as f: + f.write(" ") + + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + model={"realizations": [1, 2, 3], "data_file": "relative/path"}, + config_path=Path("config_dir/test.yml"), + ) + + assert has_error(e.value, match="No such file or directory") + + os.makedirs("config_dir/relative/path") + + EverestConfig.with_defaults( + model={"realizations": [1, 2, 3], "data_file": "relative/path"}, + config_path=Path("config_dir/test.yml"), + ) + + +@tmpdir(None) +def test_that_model_report_steps_invalid_dates_errors(): + os.makedirs("config_dir/relative/path") + with open("config_dir/test.yml", "w", encoding="utf-8") as f: + f.write(" ") + + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + model={ + "realizations": [1, 2, 3], + "report_steps": ["2022-02-02", "hey", "yo", "sup", "ma", "dawg"], + "data_file": "relative/path", + }, + config_path=Path("config_dir/test.yml"), + ) + + assert has_error(e.value, "malformed dates: hey, yo, sup, ma, dawg") + + EverestConfig.with_defaults( + model={ + "realizations": [1, 2, 3], + "report_steps": ["2022-01-01", "2022-01-03", "2022-01-05"], + "data_file": "relative/path", + }, + config_path=Path("config_dir/test.yml"), + ) + + +@pytest.mark.parametrize( + ["install_keyword"], + [ + ("install_jobs",), + ("install_workflow_jobs",), + ], +) +@tmpdir(None) +def test_that_non_existing_install_job_errors(install_keyword): + os.makedirs("config_dir") + with open("config_dir/test.yml", "w", encoding="utf-8") as f: + f.write(" ") + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + model={ + "realizations": [1, 2, 3], + }, + config_path=Path("config_dir/test.yml"), + **{install_keyword: [{"name": "test", "source": "non_existing"}]}, + ) + + assert has_error(e.value, "No such file or directory") + + +@pytest.mark.parametrize( + ["install_keyword"], + [ + ("install_jobs",), + ("install_workflow_jobs",), + ], +) +@tmpdir(None) +def test_that_existing_install_job_with_malformed_executable_errors(install_keyword): + with open("malformed.ert", "w+", encoding="utf-8") as f: + f.write( + """EXECUTABLE + """ + ) + with open("malformed2.ert", "w+", encoding="utf-8") as f: + f.write( + """EXECUTABLE 1 two 3 + EXECUTABLE one two + """ + ) + + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + model={ + "realizations": [1, 2, 3], + }, + config_path=Path("."), + **{ + install_keyword: [ + {"name": "test", "source": "malformed.ert"}, + {"name": "test2", "source": "malformed2.ert"}, + ] + }, + ) + + assert has_error(e.value, "malformed EXECUTABLE in malformed.ert") + assert has_error(e.value, "malformed EXECUTABLE in malformed2.ert") + + +@pytest.mark.parametrize( + ["install_keyword"], + [ + ("install_jobs",), + ("install_workflow_jobs",), + ], +) +@tmpdir(None) +def test_that_existing_install_job_with_non_executable_executable_errors( + install_keyword, +): + with open("exec.ert", "w+", encoding="utf-8") as f: + f.write( + """EXECUTABLE non_executable + """ + ) + + with open("non_executable", "w+", encoding="utf-8") as f: + f.write("bla") + + os.chmod("non_executable", os.stat("non_executable").st_mode & ~0o111) + assert not os.access("non_executable", os.X_OK) + + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + model={ + "realizations": [1, 2, 3], + }, + config_path=Path("."), + **{ + install_keyword: [ + {"name": "test", "source": "exec.ert"}, + ] + }, + ) + + assert has_error(e.value, ".*non_executable is not executable") + + +@pytest.mark.parametrize( + ["install_keyword"], + [ + ("install_jobs",), + ("install_workflow_jobs",), + ], +) +@tmpdir(None) +def test_that_existing_install_job_with_non_existing_executable_errors(install_keyword): + with open("exec.ert", "w+", encoding="utf-8") as f: + f.write( + """EXECUTABLE non_existing + """ + ) + + assert not os.access("non_executable", os.X_OK) + + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + model={ + "realizations": [1, 2, 3], + }, + config_path=Path("."), + **{ + install_keyword: [ + {"name": "test", "source": "exec.ert"}, + ] + }, + ) + + assert has_error(e.value, "No such executable non_existing") + + +@pytest.mark.parametrize( + ["key", "value", "expected_error"], + [ + ("weight", 0.0, "(.*)Input should be greater than 0"), + ("weight", -1.0, "(.*)Input should be greater than 0"), + ("weight", 0.1, None), + ("normalization", 0.0, "(.*) value cannot be zero"), + ("normalization", -1.0, None), + ("normalization", 0.1, None), + ], +) +def test_that_objective_function_attrs_are_valid(key, value, expected_error): + if expected_error: + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + objective_functions=[{"name": "npv", key: value}] + ) + assert has_error(e.value, expected_error) + else: + EverestConfig.with_defaults(objective_functions=[{"name": "npv", key: value}]) + + +def test_that_objective_function_weight_defined_for_all_or_no_function(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + objective_functions=[ + {"name": "npv", "weight": 0.7}, + {"name": "npv2"}, + ] + ) + assert has_error( + e.value, "(.*) either for all of the objectives or for none of them" + ) + + EverestConfig.with_defaults( + objective_functions=[ + {"name": "npv", "weight": 0.7}, + {"name": "npv2", "weight": 0.3}, + ] + ) + + +def test_that_objective_function_aliases_are_consistent(): + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + objective_functions=[ + {"name": "npv"}, + {"name": "npv2", "alias": "bad_one"}, + ] + ) + assert has_error(e.value, "Invalid alias (.*)") + + EverestConfig.with_defaults( + objective_functions=[ + {"name": "npv"}, + {"name": "npv2", "alias": "npv"}, + ] + ) + + +@tmpdir(None) +def test_that_install_templates_must_have_unique_names(): + for f in ["hey", "hesy", "heyyy"]: + pathlib.Path(f).write_text(f, encoding="utf-8") + + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + install_templates=[ + {"template": "heyyy", "output_file": "outputf"}, + {"template": "hey", "output_file": "outputf"}, + ] + ) + + assert has_error( + e.value, + match="Install_templates output_files " + "must be unique. (.*) outputf \\(2 occurrences\\)", + ) + print("Install_templates templates must be unique") + + EverestConfig.with_defaults( + install_templates=[ + {"template": "hey", "output_file": "outputf"}, + {"template": "hesy", "output_file": "outputff"}, + ] + ) + + +@tmpdir(None) +def test_that_install_template_template_must_be_existing_file(): + os.makedirs("config_dir") + with open("config_dir/test.yml", "w", encoding="utf-8") as f: + f.write(" ") + with pytest.raises(ValueError) as e: + EverestConfig.with_defaults( + install_templates=[ + {"template": "hello", "output_file": "output"}, + {"template": "hey", "output_file": "outputf"}, + ], + config_path=Path("config_dir/test.yml"), + ) + + assert has_error(e.value, "No such file or directory.*hey") + assert has_error(e.value, "No such file or directory.*hello") + + +def test_that_missing_required_fields_cause_error(): + with pytest.raises(ValidationError) as e: + EverestConfig(**{}) + + error_dicts = e.value.errors() + + # Expect missing error for: + # controls, objective_functions, optimization, + # model, environment, config_path, + assert len(error_dicts) == 6 + + config_with_defaults = EverestConfig.with_defaults() + config_args = {} + required_argnames = [ + "controls", + "objective_functions", + "optimization", + "model", + "environment", + "config_path", + ] + + for key in required_argnames: + with pytest.raises(ValidationError) as e: + EverestConfig(**config_args) + + assert len(e.value.errors()) == len(required_argnames) - len(config_args) + config_args[key] = getattr(config_with_defaults, key) + + +def test_that_non_existing_workflow_jobs_cause_error(): + with pytest.raises(ValidationError, match="No such file or directory (.*)jobs/JOB"): + EverestConfig.with_defaults( + install_workflow_jobs=[{"name": "job0", "source": "jobs/JOB"}], + workflows={ + "pre_simulation": [ + "job0 -i in -o out", + "job1 -i out -o result", + ] + }, + ) diff --git a/tests/everest/test_controls.py b/tests/everest/test_controls.py new file mode 100644 index 00000000000..90650632122 --- /dev/null +++ b/tests/everest/test_controls.py @@ -0,0 +1,282 @@ +import itertools +import numbers +import os +from copy import deepcopy +from typing import List + +import pytest +from pydantic import ValidationError + +from everest import ConfigKeys +from everest.config import EverestConfig +from everest.config.control_config import ControlConfig +from everest.config.control_variable_config import ( + ControlVariableConfig, + ControlVariableGuessListConfig, +) +from everest.config.input_constraint_config import InputConstraintConfig +from everest.config.well_config import WellConfig +from tests.everest.utils import relpath, tmp, tmpdir + +cfg_dir = relpath("test_data", "mocked_test_case") +mocked_config = relpath(cfg_dir, "mocked_test_case.yml") + + +def test_controls_initialization(): + exp_grp_name = "group" + + config = EverestConfig.load_file(mocked_config) + assert config.controls is not None + group = config.controls[0] + assert group.variables is not None + + assert exp_grp_name == group.name + + for c in group.variables: + assert isinstance(c.name, str) + assert isinstance(c.initial_guess, numbers.Number) + + a_ctrl_name = group.variables[0].name + config.controls.append( + ControlConfig( + name=exp_grp_name, + type=ConfigKeys.WELL_CONTROL, + variables=[ + ControlVariableConfig( + name=a_ctrl_name, + min=0, + max=1, + initial_guess=0.5, + ) + ], + ) + ) + with pytest.raises( + ValidationError, + match=r"Subfield\(s\) `name` must be unique", + ): + EverestConfig.model_validate(config.model_dump(exclude_none=True)) + + config.controls[1].name = exp_grp_name + "_new" + EverestConfig.model_validate(config.model_dump(exclude_none=True)) + + +def _perturb_control_zero( + config: EverestConfig, gmin, gmax, ginit, fill +) -> List[ControlVariableConfig]: + """Perturbs the variable range of the first control to create + interesting configurations. + """ + control_zero = config.controls[0] + variable_names = [var.name for var in control_zero.variables] + revised_control_zero = None + + exp_var_def = [] + for idx, var_name in enumerate(variable_names): + var_config = ControlVariableConfig.model_validate({"name": var_name}) + + if idx % 2 == 0 or fill: + var_config.min = gmin - 0.3 if gmin else 0.13 + if idx % 3 == 0 or fill: + var_config.max = gmax + 1.2 if gmax else 2.64 + if idx % 4 == 0 or fill: + var_max = var_config.max if var_config.max is not None else gmax + var_min = var_config.min if var_config.min is not None else gmin + if var_min and var_max: + var_config.initial_guess = (var_min + var_max) / 2.0 + if revised_control_zero is None: + revised_control_zero = ControlConfig( + name=control_zero.name, + type=control_zero.type, + min=gmin, + max=gmax, + initial_guess=ginit, + variables=[var_config], + ) + else: + revised_control_zero.variables.append(var_config) + + exp_var_def.append( + ControlVariableConfig( + name=var_name, + min=var_config.min if var_config.min is not None else gmin, + max=var_config.max if var_config.max is not None else gmax, + initial_guess=( + var_config.initial_guess + if var_config.initial_guess is not None + else ginit + ), + ) + ) + + config.controls[0] = revised_control_zero + + return exp_var_def + + +@tmpdir(relpath("test_data")) +def test_variable_name_index_validation(): + config = EverestConfig.load_file( + os.path.join("mocked_test_case", "mocked_test_case.yml") + ) + + # Not valid equal names + config.controls[0].variables[1].name = "w00" + with pytest.raises( + ValidationError, match=r"Subfield\(s\) `name-index` must be unique" + ): + EverestConfig.model_validate(config.model_dump(exclude_none=True)) + # Not valid index inconsistency + config.controls[0].variables[1].name = "w01" + config.controls[0].variables[1].index = 0 + with pytest.raises( + ValidationError, match="for all of the variables or for none of them" + ): + EverestConfig.model_validate(config.model_dump(exclude_none=True)) + + # Index and name not unique + config.controls[0].variables[1].name = "w00" + for v in config.controls[0].variables: + v.index = 0 + with pytest.raises( + ValidationError, match=r"Subfield\(s\) `name-index` must be unique" + ): + EverestConfig.model_validate(config.model_dump(exclude_none=True)) + + # Index and name unique and valid, but input constraints are not + # specifying index + + config.controls[0].variables[1].name = "w01" + input_constraints = [ + InputConstraintConfig.model_validate( + {"upper_bound": 1, "lower_bound": 0, "weights": {"group.w00": 0.1}} + ) + ] + + config.input_constraints = input_constraints + with pytest.raises( + ValidationError, + match="does not match any instance of " + "control_name.variable_name-variable_index", + ): + EverestConfig.model_validate(config.model_dump(exclude_none=True)) + + # Index and name unique and valid and input constraints are specifying + # index + input_constraints = [ + InputConstraintConfig( + **{"upper_bound": 1, "lower_bound": 0, "weights": {"group.w00-0": 0.1}} + ) + ] + + config.input_constraints = input_constraints + EverestConfig.model_validate(config.model_dump(exclude_none=True)) + + +@pytest.mark.integration_test +def test_individual_control_variable_config(): + config_file = os.path.join("mocked_test_case", "config_input_constraints.yml") + + global_min = (0, 0.7, 1.3, None) + global_max = (0.5, 1, 3, None) + global_init = (0.3, 0.6, 1.1, None) + fill_missing = (True, False) + test_base = (global_min, global_max, global_init, fill_missing) + + for gmin, gmax, ginit, fill in itertools.product(*test_base): + with tmp(relpath("test_data")): + config = EverestConfig.load_file(config_file) + exp_var_def = _perturb_control_zero(config, gmin, gmax, ginit, fill) + + # Not complete configuration + if None in [gmin, gmax, ginit] and not fill: + with pytest.raises(expected_exception=ValidationError): + EverestConfig.model_validate(config.to_dict()) + continue + + # Invalid parameters + def valid_control(var: ControlVariableConfig) -> bool: + return var.min <= var.initial_guess <= var.max + + if not all(map(valid_control, exp_var_def)): + with pytest.raises(expected_exception=ValidationError): + EverestConfig.model_validate(config.to_dict()) + continue + + EverestConfig.model_validate(config.to_dict()) + + +def test_control_variable_name(): + """We would potentially like to support variable names with + underscores, but currently Seba is using this as a separator between + the group name and the variable name in such a way that having an + underscore in a variable name will not behave nicely.. + """ + config = EverestConfig.load_file(mocked_config) + EverestConfig.model_validate(config.model_dump(exclude_none=True)) + + illegal_name = "illegal.name.due.to.dots" + config.controls[0].variables[0].name = illegal_name + with pytest.raises( + ValidationError, + match="Variable name can not contain any dots", + ): + EverestConfig.model_validate(config.model_dump(exclude_none=True)) + + weirdo_name = "something/with-symbols_=/()*&%$#!" + new_config = EverestConfig.load_file(mocked_config) + new_config.wells.append(WellConfig(name=weirdo_name)) + new_config.controls[0].variables[0].name = weirdo_name + EverestConfig.model_validate(new_config.model_dump(exclude_none=True)) + + +def test_control_none_well_variable_name(): + config = EverestConfig.load_file(mocked_config) + EverestConfig.model_validate(config.to_dict()) + + illegal_name = "nowell4sure" + config.controls[0].variables[0].name = illegal_name + with pytest.raises( + ValidationError, + match="Variable name does not match any well name", + ): + EverestConfig.model_validate(config.to_dict()) + + +def test_control_variable_types(control_config: ControlConfig): + if isinstance(control_config.variables[0], ControlVariableConfig): + assert all( + isinstance(variable, ControlVariableConfig) + for variable in control_config.variables + ) + else: + assert all( + isinstance(variable, ControlVariableGuessListConfig) + for variable in control_config.variables + ) + + +@pytest.mark.parametrize( + "variables", + ( + pytest.param( + [ + {"name": "w00", "initial_guess": 0.0626, "index": 0}, + {"name": "w00", "initial_guess": [0.063, 0.0617, 0.0621]}, + ], + id="same name", + ), + pytest.param( + [ + {"name": "w00", "initial_guess": 0.0626, "index": 0}, + {"name": "w01", "initial_guess": [0.0627, 0.0631, 0.0618, 0.0622]}, + ], + id="different name", + ), + ), +) +def test_control_bad_variables(variables, control_data_no_variables: dict): + data = deepcopy(control_data_no_variables) + data["variables"] = variables + with pytest.raises(ValidationError, match="3 validation errors"): + ControlConfig.model_validate(data) diff --git a/tests/everest/test_cvar.py b/tests/everest/test_cvar.py new file mode 100644 index 00000000000..3a365bc0466 --- /dev/null +++ b/tests/everest/test_cvar.py @@ -0,0 +1,28 @@ +import pytest + +from everest.config import EverestConfig +from everest.suite import _EverestWorkflow +from tests.everest.utils import relpath, tmpdir + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") +CONFIG_FILE_CVAR = "config_cvar.yml" + + +@tmpdir(CONFIG_PATH) +def test_mathfunc_cvar(): + config = EverestConfig.load_file(CONFIG_FILE_CVAR) + + workflow = _EverestWorkflow(config) + assert workflow is not None + workflow.start_optimization() + + # Check resulting points + x0, x1, x2 = (workflow.result.controls["point_" + p] for p in ["x", "y", "z"]) + + assert x0 == pytest.approx(0.5, 0.05) + assert x1 == pytest.approx(0.5, 0.05) + assert x2 == pytest.approx(0.5, 0.05) + + total_objective = workflow.result.total_objective + assert total_objective <= 0.001 + assert total_objective >= -0.001 diff --git a/tests/everest/test_data/README.md b/tests/everest/test_data/README.md new file mode 100644 index 00000000000..d0f23cd3b44 --- /dev/null +++ b/tests/everest/test_data/README.md @@ -0,0 +1,12 @@ +This folder contains configuration files and data used by the tests in Everest. + +Some optimization cases have been run in advance and the resulting data has been included here in order to make the tests faster. +In particular: +- folders called `cached_results_XXX` typically a `seba.db` file that was generated running case `XXX.yml`. The naming convention is not always very strict, but it should be obvious what configuration file was used to generate the cached results. +- folders called `something_something_output` are copies of the output folders (possibly stripped down) created when running a certain case. The name of the folder matches the entry `environment/output_folder` given in the config file. And usually the `something_something` part of the name makes it clear what config file this output refers to. + +For example, in the `mocked_test_case` folder we have: +- a `cached_results_multi_objectives` folder which contains a `seba.db` file generated by running Everest on `mocked_test_case/config_multi_objectives.yml`. It is used by the `TestMultiobjectives` test case +- a `mocked_multi_batch_output` folder which is a cleaned copy of the output folder generated by running Everest on `mocked_test_case/mocked_multi_batch.yml`. + +If Everest is modified in a way that would affect the outcome of running test cases, please make sure that the pre-computed results are updated accordingly. diff --git a/tests/everest/test_data/cached_results_config_advanced/seba.db b/tests/everest/test_data/cached_results_config_advanced/seba.db new file mode 100644 index 00000000000..d5cb7fb9476 Binary files /dev/null and b/tests/everest/test_data/cached_results_config_advanced/seba.db differ diff --git a/tests/everest/test_data/cached_results_config_multiobj/seba.db b/tests/everest/test_data/cached_results_config_multiobj/seba.db new file mode 100644 index 00000000000..a48addd5af2 Binary files /dev/null and b/tests/everest/test_data/cached_results_config_multiobj/seba.db differ diff --git a/tests/everest/test_data/detached/error_file.0 b/tests/everest/test_data/detached/error_file.0 new file mode 100644 index 00000000000..5ba44e0814c --- /dev/null +++ b/tests/everest/test_data/detached/error_file.0 @@ -0,0 +1,20 @@ +INFO:everest:everest 0.10a1 +seba 3.0.0 +libres 2.6.3. +INFO:everest:Using random seed: 999 +INFO:everest:To deterministically reproduce this experiment, add the above random seed to your configuration file. +INFO:everest:output directory: /equinor/config_folder/everest_output +INFO:werkzeug: * Running on https://0.0.0.0:5001/ (Press CTRL+C to quit) +INFO:everest:Starting optimization ... + 00: Error when parsing config_file:"DISTANCE3" Keyword:ARGLIST must have at least 1 arguments. +** Warning: job: 'distance3' not available ... + +Error message: ext_joblist_get_job_copy: asked for job:distance3 which does not exist + +See file: /tmp/ert_abort_dump.20200127-111217.log for more details of the crash. +Setting the environment variable "ERT_SHOW_BACKTRACE" will show the backtrace on stderr. + +Error message: Program received signal:6 + +See file: /tmp/ert_abort_dump.20200127-111217.log for more details of the crash. +Setting the environment variable "ERT_SHOW_BACKTRACE" will show the backtrace on stderr. diff --git a/tests/everest/test_data/detached/valid_yaml_config.yml b/tests/everest/test_data/detached/valid_yaml_config.yml new file mode 100644 index 00000000000..45913340bcc --- /dev/null +++ b/tests/everest/test_data/detached/valid_yaml_config.yml @@ -0,0 +1,31 @@ +controls: + - + name: not_really_important_for_this_test + type: generic_control + min: -1.0 + max: 1.0 + initial_guess: 0 + variables: + - name: x + +objective_functions: + - + name: not_really_important_for_this_test + +optimization: + algorithm: optpp_q_newton + + +model: + realizations: [0] + +forward_model: + - make_directory created_test_folder + - copy_directory created_test_folder test_folder_copy + - copy_file new_test_file.txt created_test_folder/new_test_file_copy.txt + - move_file new_test_file.txt created_test_folder/new_test_file.txt + - symlink created_test_folder/new_test_file.txt sym_link + +environment: + simulation_folder: sim_output + log_level: debug diff --git a/tests/everest/test_data/eclipse/NORNE_ATW2013.SMSPEC b/tests/everest/test_data/eclipse/NORNE_ATW2013.SMSPEC new file mode 100644 index 00000000000..fc6002267d6 Binary files /dev/null and b/tests/everest/test_data/eclipse/NORNE_ATW2013.SMSPEC differ diff --git a/tests/everest/test_data/eclipse/NORNE_ATW2013.UNSMRY b/tests/everest/test_data/eclipse/NORNE_ATW2013.UNSMRY new file mode 100644 index 00000000000..db631e0057c Binary files /dev/null and b/tests/everest/test_data/eclipse/NORNE_ATW2013.UNSMRY differ diff --git a/tests/everest/test_data/eclipse/SPE1.DATA b/tests/everest/test_data/eclipse/SPE1.DATA new file mode 100644 index 00000000000..164fec27856 --- /dev/null +++ b/tests/everest/test_data/eclipse/SPE1.DATA @@ -0,0 +1,438 @@ +-- This reservoir simulation deck is made available under the Open Database +-- License: http://opendatacommons.org/licenses/odbl/1.0/. Any rights in +-- individual contents of the database are licensed under the Database Contents +-- License: http://opendatacommons.org/licenses/dbcl/1.0/ + +-- Copyright (C) 2019 Equinor + +-- This simulation is based on the data given in +-- 'Comparison of Solutions to a Three-Dimensional +-- Black-Oil Reservoir Simulation Problem' by Aziz S. Odeh, +-- Journal of Petroleum Technology, January 1981 + +--------------------------------------------------------------------------- +------------------------ SPE1 - CASE 2 ------------------------------------ +--------------------------------------------------------------------------- + +RUNSPEC +-- ------------------------------------------------------------------------- + +TITLE + SPE1 - CASE 2 + +DIMENS + 10 10 3 / + +-- The number of equilibration regions is inferred from the EQLDIMS +-- keyword. +EQLDIMS +/ + +-- The number of PVTW tables is inferred from the TABDIMS keyword; +-- when no data is included in the keyword the default values are used. +TABDIMS +/ + + +OIL +GAS +WATER +DISGAS +-- As seen from figure 4 in Odeh, GOR is increasing with time, +-- which means that dissolved gas is present + + +FIELD + +START + 1 'JAN' 2015 / + +WELLDIMS +-- Item 1: maximum number of wells in the model +-- - there are two wells in the problem; injector and producer +-- Item 2: maximum number of grid blocks connected to any one well +-- - must be one as the wells are located at specific grid blocks +-- Item 3: maximum number of groups in the model +-- - we are dealing with only one 'group' +-- Item 4: maximum number of wells in any one group +-- - there must be two wells in a group as there are two wells in total + 2 1 1 2 / + +UNIFOUT + +GRID + +-- The INIT keyword is used to request an .INIT file. The .INIT file +-- is written before the simulation actually starts, and contains grid +-- properties and saturation tables as inferred from the input +-- deck. There are no other keywords which can be used to configure +-- exactly what is written to the .INIT file. +INIT + +-- ------------------------------------------------------------------------- +NOECHO + +DX +-- There are in total 300 cells with length 1000ft in x-direction + 300*1000 / +DY +-- There are in total 300 cells with length 1000ft in y-direction + 300*1000 / +DZ +-- The layers are 20, 30 and 50 ft thick, in each layer there are 100 cells + 100*20 100*30 100*50 / + +TOPS +-- The depth of the top of each grid block + 100*8325 / + +PORO +-- Constant porosity of 0.3 throughout all 300 grid cells + 300*0.3 / + +PERMX +-- The layers have perm. 500mD, 50mD and 200mD, respectively. + 100*500 100*50 100*200 / + +PERMY +-- Equal to PERMX + 100*500 100*50 100*200 / + +PERMZ +-- Cannot find perm. in z-direction in Odeh's paper +-- For the time being, we will assume PERMZ equal to PERMX and PERMY: + 100*500 100*50 100*200 / +ECHO + +PROPS +-- ------------------------------------------------------------------------- + +PVTW +-- Item 1: pressure reference (psia) +-- Item 2: water FVF (rb per bbl or rb per stb) +-- Item 3: water compressibility (psi^{-1}) +-- Item 4: water viscosity (cp) +-- Item 5: water 'viscosibility' (psi^{-1}) + +-- Using values from Norne: +-- In METRIC units: +-- 277.0 1.038 4.67E-5 0.318 0.0 / +-- In FIELD units: + 4017.55 1.038 3.22E-6 0.318 0.0 / + +ROCK +-- Item 1: reference pressure (psia) +-- Item 2: rock compressibility (psi^{-1}) + +-- Using values from table 1 in Odeh: + 14.7 3E-6 / + +SWOF +-- Column 1: water saturation +-- - this has been set to (almost) equally spaced values from 0.12 to 1 +-- Column 2: water relative permeability +-- - generated from the Corey-type approx. formula +-- the coeffisient is set to 10e-5, S_{orw}=0 and S_{wi}=0.12 +-- Column 3: oil relative permeability when only oil and water are present +-- - we will use the same values as in column 3 in SGOF. +-- This is not really correct, but since only the first +-- two values are of importance, this does not really matter +-- Column 4: corresponding water-oil capillary pressure (psi) + +0.12 0 1 0 +0.18 4.64876033057851E-008 1 0 +0.24 0.000000186 0.997 0 +0.3 4.18388429752066E-007 0.98 0 +0.36 7.43801652892562E-007 0.7 0 +0.42 1.16219008264463E-006 0.35 0 +0.48 1.67355371900826E-006 0.2 0 +0.54 2.27789256198347E-006 0.09 0 +0.6 2.97520661157025E-006 0.021 0 +0.66 3.7654958677686E-006 0.01 0 +0.72 4.64876033057851E-006 0.001 0 +0.78 0.000005625 0.0001 0 +0.84 6.69421487603306E-006 0 0 +0.91 8.05914256198347E-006 0 0 +1 0.00001 0 0 / + + +SGOF +-- Column 1: gas saturation +-- Column 2: gas relative permeability +-- Column 3: oil relative permeability when oil, gas and connate water are present +-- Column 4: oil-gas capillary pressure (psi) +-- - stated to be zero in Odeh's paper + +-- Values in column 1-3 are taken from table 3 in Odeh's paper: +0 0 1 0 +0.001 0 1 0 +0.02 0 0.997 0 +0.05 0.005 0.980 0 +0.12 0.025 0.700 0 +0.2 0.075 0.350 0 +0.25 0.125 0.200 0 +0.3 0.190 0.090 0 +0.4 0.410 0.021 0 +0.45 0.60 0.010 0 +0.5 0.72 0.001 0 +0.6 0.87 0.0001 0 +0.7 0.94 0.000 0 +0.85 0.98 0.000 0 +0.88 0.984 0.000 0 / +--1.00 1.0 0.000 0 / +-- Warning from Eclipse: first sat. value in SWOF + last sat. value in SGOF +-- must not be greater than 1, but Eclipse still runs +-- Flow needs the sum to be excactly 1 so I added a row with gas sat. = 0.88 +-- The corresponding krg value was estimated by assuming linear rel. between +-- gas sat. and krw. between gas sat. 0.85 and 1.00 (the last two values given) + +DENSITY +-- Density (lb per ft³) at surface cond. of +-- oil, water and gas, respectively (in that order) + +-- Using values from Norne: +-- In METRIC units: +-- 859.5 1033.0 0.854 / +-- In FIELD units: + 53.66 64.49 0.0533 / + +PVDG +-- Column 1: gas phase pressure (psia) +-- Column 2: gas formation volume factor (rb per Mscf) +-- - in Odeh's paper the units are said to be given in rb per bbl, +-- but this is assumed to be a mistake: FVF-values in Odeh's paper +-- are given in rb per scf, not rb per bbl. This will be in +-- agreement with conventions +-- Column 3: gas viscosity (cP) + +-- Using values from lower right table in Odeh's table 2: +14.700 166.666 0.008000 +264.70 12.0930 0.009600 +514.70 6.27400 0.011200 +1014.7 3.19700 0.014000 +2014.7 1.61400 0.018900 +2514.7 1.29400 0.020800 +3014.7 1.08000 0.022800 +4014.7 0.81100 0.026800 +5014.7 0.64900 0.030900 +9014.7 0.38600 0.047000 / + +PVTO +-- Column 1: dissolved gas-oil ratio (Mscf per stb) +-- Column 2: bubble point pressure (psia) +-- Column 3: oil FVF for saturated oil (rb per stb) +-- Column 4: oil viscosity for saturated oil (cP) + +-- Use values from top left table in Odeh's table 2: +0.0010 14.7 1.0620 1.0400 / +0.0905 264.7 1.1500 0.9750 / +0.1800 514.7 1.2070 0.9100 / +0.3710 1014.7 1.2950 0.8300 / +0.6360 2014.7 1.4350 0.6950 / +0.7750 2514.7 1.5000 0.6410 / +0.9300 3014.7 1.5650 0.5940 / +1.2700 4014.7 1.6950 0.5100 + 9014.7 1.5790 0.7400 / +1.6180 5014.7 1.8270 0.4490 + 9014.7 1.7370 0.6310 / +-- It is required to enter data for undersaturated oil for the highest GOR +-- (i.e. the last row) in the PVTO table. +-- In order to fulfill this requirement, values for oil FVF and viscosity +-- at 9014.7psia and GOR=1.618 for undersaturated oil have been approximated: +-- It has been assumed that there is a linear relation between the GOR +-- and the FVF when keeping the pressure constant at 9014.7psia. +-- From Odeh we know that (at 9014.7psia) the FVF is 2.357 at GOR=2.984 +-- for saturated oil and that the FVF is 1.579 at GOR=1.27 for undersaturated oil, +-- so it is possible to use the assumption described above. +-- An equivalent approximation for the viscosity has been used. +/ + +SOLUTION +-- ------------------------------------------------------------------------- + +EQUIL +-- Item 1: datum depth (ft) +-- Item 2: pressure at datum depth (psia) +-- - Odeh's table 1 says that initial reservoir pressure is +-- 4800 psi at 8400ft, which explains choice of item 1 and 2 +-- Item 3: depth of water-oil contact (ft) +-- - chosen to be directly under the reservoir +-- Item 4: oil-water capillary pressure at the water oil contact (psi) +-- - given to be 0 in Odeh's paper +-- Item 5: depth of gas-oil contact (ft) +-- - chosen to be directly above the reservoir +-- Item 6: gas-oil capillary pressure at gas-oil contact (psi) +-- - given to be 0 in Odeh's paper +-- Item 7: RSVD-table +-- Item 8: RVVD-table +-- Item 9: Set to 0 as this is the only value supported by OPM + +-- Item #: 1 2 3 4 5 6 7 8 9 + 8400 4800 8450 0 8300 0 1 0 0 / + +RSVD +-- Dissolved GOR is initially constant with depth through the reservoir. +-- The reason is that the initial reservoir pressure given is higher +---than the bubble point presssure of 4014.7psia, meaning that there is no +-- free gas initially present. +8300 1.270 +8450 1.270 / + +SUMMARY +-- ------------------------------------------------------------------------- + +FOE + +-- 1a) Oil rate vs time +FOPR +-- Field Oil Production Rate + +-- 1b) GOR vs time +WGOR +-- Well Gas-Oil Ratio + 'PROD' +/ +-- Using FGOR instead of WGOR:PROD results in the same graph +FGOR + +-- 2a) Pressures of the cell where the injector and producer are located +BPR +1 1 1 / +10 10 3 / +/ + +-- 2b) Gas saturation at grid points given in Odeh's paper +BGSAT +1 1 1 / +1 1 2 / +1 1 3 / +10 1 1 / +10 1 2 / +10 1 3 / +10 10 1 / +10 10 2 / +10 10 3 / +/ + +-- In order to compare Eclipse with Flow: +WBHP + 'INJ' + 'PROD' +/ +WGIR + 'INJ' + 'PROD' +/ +WGIT + 'INJ' + 'PROD' +/ +WGPR + 'INJ' + 'PROD' +/ +WGPT + 'INJ' + 'PROD' +/ +WOIR + 'INJ' + 'PROD' +/ +WOIT + 'INJ' + 'PROD' +/ +WOPR + 'INJ' + 'PROD' +/ +WOPT + 'INJ' + 'PROD' +/ +WWIR + 'INJ' + 'PROD' +/ +WWIT + 'INJ' + 'PROD' +/ +WWPR + 'INJ' + 'PROD' +/ +WWPT + 'INJ' + 'PROD' +/ +SCHEDULE +-- ------------------------------------------------------------------------- +RPTSCHED + 'PRES' 'SGAS' 'RS' 'WELLS' / + +RPTRST + 'BASIC=1' / + + +-- If no resolution (i.e. case 1), the two following lines must be added: +--DRSDT +-- 0 / +-- Since this is Case 2, the two lines above have been commented out. +-- if DRSDT is set to 0, GOR cannot rise and free gas does not +-- dissolve in undersaturated oil -> constant bubble point pressure + +WELSPECS +-- Item #: 1 2 3 4 5 6 + 'PROD' 'G1' 10 10 8400 'OIL' / + 'INJ' 'G1' 1 1 8335 'GAS' / +/ +-- Coordinates in item 3-4 are retrieved from Odeh's figure 1 and 2 +-- Note that the depth at the midpoint of the well grid blocks +-- has been used as reference depth for bottom hole pressure in item 5 + +COMPDAT +-- Item #: 1 2 3 4 5 6 7 8 9 + 'PROD' 10 10 3 3 'OPEN' 1* 1* 0.5 / + 'INJ' 1 1 1 1 'OPEN' 1* 1* 0.5 / +/ +-- Coordinates in item 2-5 are retreived from Odeh's figure 1 and 2 +-- Item 9 is the well bore internal diameter, +-- the radius is given to be 0.25ft in Odeh's paper + + +WCONPROD +-- Item #:1 2 3 4 5 9 + 'PROD' 'OPEN' 'ORAT' 20000 4* 1000 / +/ +-- It is stated in Odeh's paper that the maximum oil prod. rate +-- is 20 000stb per day which explains the choice of value in item 4. +-- The items > 4 are defaulted with the exception of item 9, +-- the BHP lower limit, which is given to be 1000psia in Odeh's paper + +WCONINJE +-- Item #:1 2 3 4 5 6 7 + 'INJ' 'GAS' 'OPEN' 'RATE' 100000 1* 9014 / +/ +-- Stated in Odeh that gas inj. rate (item 5) is 100MMscf per day +-- BHP upper limit (item 7) should not be exceeding the highest +-- pressure in the PVT table=9014.7psia (default is 100 000psia) + +TSTEP +--Advance the simulater once a month for TEN years: +31 28 31 30 31 30 31 31 30 31 30 31 +31 28 31 30 31 30 31 31 30 31 30 31 +31 28 31 30 31 30 31 31 30 31 30 31 +31 28 31 30 31 30 31 31 30 31 30 31 +31 28 31 30 31 30 31 31 30 31 30 31 +31 28 31 30 31 30 31 31 30 31 30 31 +31 28 31 30 31 30 31 31 30 31 30 31 +31 28 31 30 31 30 31 31 30 31 30 31 +31 28 31 30 31 30 31 31 30 31 30 31 +31 28 31 30 31 30 31 31 30 31 30 31 / + +--Advance the simulator once a year for TEN years: +--10*365 / + +END diff --git a/tests/everest/test_data/mocked_test_case/cached_results_multi_objectives/seba.db b/tests/everest/test_data/mocked_test_case/cached_results_multi_objectives/seba.db new file mode 100644 index 00000000000..eba831d3a38 Binary files /dev/null and b/tests/everest/test_data/mocked_test_case/cached_results_multi_objectives/seba.db differ diff --git a/tests/everest/test_data/mocked_test_case/cached_results_output_constraints/seba.db b/tests/everest/test_data/mocked_test_case/cached_results_output_constraints/seba.db new file mode 100644 index 00000000000..e534ac3324c Binary files /dev/null and b/tests/everest/test_data/mocked_test_case/cached_results_output_constraints/seba.db differ diff --git a/tests/everest/test_data/mocked_test_case/cached_results_test_case/seba.db b/tests/everest/test_data/mocked_test_case/cached_results_test_case/seba.db new file mode 100644 index 00000000000..9a17680f0cc Binary files /dev/null and b/tests/everest/test_data/mocked_test_case/cached_results_test_case/seba.db differ diff --git a/tests/everest/test_data/mocked_test_case/config_fail_simulation.yml b/tests/everest/test_data/mocked_test_case/config_fail_simulation.yml new file mode 100644 index 00000000000..2ea9a63689e --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/config_fail_simulation.yml @@ -0,0 +1,46 @@ +wells: + - { name: w00} + + +controls: + - + name: group + type: well_control + min: 0 + max: 0.1 + perturbation_magnitude : 0.005 + perturbation_type : absolute + variables: + - { name: w00, initial_guess: 0.0626 } + + +objective_functions: + - + name: mock_objective + +optimization: + algorithm: optpp_q_newton + min_realizations_success: 1 + min_pert_success: 1 + max_iterations: 1 + perturbation_num: 1 + +install_jobs: + - + name: failure_filter + source: jobs/FAILURE_FILTER + + +model: + realizations: [0, 1] + + +forward_model: + - failure_filter 1 + + +environment: + output_folder: everest_output + simulation_folder: simulations + log_level: debug + random_seed: 999 diff --git a/tests/everest/test_data/mocked_test_case/config_full_gradient_info.yml b/tests/everest/test_data/mocked_test_case/config_full_gradient_info.yml new file mode 100644 index 00000000000..21659a17cbe --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/config_full_gradient_info.yml @@ -0,0 +1,60 @@ +# Config file that is only targeting the optimization section. +wells: + - {name: w00} + - {name: w01} + +controls: + - + name: group + type: well_control + min: 0 + max: 0.1 + variables: + - + name: w00 + initial_guess: 0.0626 + - + name: w01 + initial_guess: 0.0624 + +objective_functions: + - + name: npv_function + +install_jobs: + - + name: well_order + source: jobs/WELL_ORDER_MOCK + - + name: npv_function + source: jobs/NPV_FUNCTION_MOCK + - + name: res_mock + source: jobs/RES_MOCK + +optimization: + algorithm: conmin_mfd + perturbation_num: 20 + max_iterations: 10 + max_function_evaluations: 1000 + convergence_tolerance: 1.0e-7 + constraint_tolerance: 1.0e-7 + speculative: false + max_batch_num: 10 + options: + - '131.3 = No' + - 'LOG HIGH' + - 'Dostuff: 1' + - speculate + +environment: + random_seed: 1234 + simulation_folder: full_gradient/simulations + +model: + realizations: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] + +forward_model: + - well_order well_order.json SCHEDULE.INC ordered_wells.json + - res_mock MOCKED_TEST_CASE + - npv_function MOCKED_TEST_CASE npv_function diff --git a/tests/everest/test_data/mocked_test_case/config_input_constraints.yml b/tests/everest/test_data/mocked_test_case/config_input_constraints.yml new file mode 100644 index 00000000000..914e37e5a61 --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/config_input_constraints.yml @@ -0,0 +1,95 @@ +wells: + - { name: w00} + - { name: w01} + - { name: w02} + - { name: w03} + - { name: w04} + - { name: w05} + - { name: w06} + - { name: w07} + - { name: w08} + - { name: w09} + - { name: w10} + - { name: w11} + - { name: w12} + - { name: w13} + - { name: w14} + - { name: w15} + + +controls: + - + name: group + type: well_control + min: 0 + max: 0.1 + variables: + - { name: w00, initial_guess: 0.0626 } + - { name: w01, initial_guess: 0.0627 } + - { name: w02, initial_guess: 0.0628 } + - { name: w03, initial_guess: 0.0629 } + - { name: w04, initial_guess: 0.0630 } + - { name: w05, initial_guess: 0.0631 } + - { name: w06, initial_guess: 0.0632 } + - { name: w07, initial_guess: 0.0633 } + - { name: w08, initial_guess: 0.0617 } + - { name: w09, initial_guess: 0.0618 } + - { name: w10, initial_guess: 0.0619 } + - { name: w11, initial_guess: 0.0620 } + - { name: w12, initial_guess: 0.0621 } + - { name: w13, initial_guess: 0.0622 } + - { name: w14, initial_guess: 0.0623 } + - { name: w15, initial_guess: 0.0624 } + + +objective_functions: + - + name: npv_function + + +optimization: + algorithm: optpp_q_newton + max_iterations: 2 + max_function_evaluations: 2 + perturbation_num: 2 + + +install_jobs: + - + name: well_order + source: jobs/WELL_ORDER_MOCK + - + name: res_mock + source: jobs/RES_MOCK + - + name: npv_function + source: jobs/NPV_FUNCTION_MOCK + + +model: + realizations: [0, 1] + +forward_model: + - well_order well_order.json SCHEDULE.INC ordered_wells.json + - res_mock MOCKED_TEST_CASE + - npv_function MOCKED_TEST_CASE npv_function + +environment: + output_folder: everest_output + simulation_folder: tutorial_simulations + random_seed: 999 + +input_constraints: + - + upper_bound: 1 + lower_bound: 0 + weights: + group.w00: 0.1 + group.w01: 0.2 + group.w02: 0.3 + - + target: 1 + weights: + group.w10: 1.0 + group.w11: 1.0 + group.w12: 1.0 diff --git a/tests/everest/test_data/mocked_test_case/config_multi_objectives.yml b/tests/everest/test_data/mocked_test_case/config_multi_objectives.yml new file mode 100644 index 00000000000..3b083d8134f --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/config_multi_objectives.yml @@ -0,0 +1,88 @@ +wells: + - { name: w00} + - { name: w01} + - { name: w02} + - { name: w03} + - { name: w04} + - { name: w05} + - { name: w06} + - { name: w07} + - { name: w08} + - { name: w09} + - { name: w10} + - { name: w11} + - { name: w12} + - { name: w13} + - { name: w14} + - { name: w15} + +controls: + - + name: group + type: well_control + min: 0 + max: 0.1 + perturbation_magnitude : 0.005 + perturbation_type : absolute + variables: + - { name: w00, initial_guess: 0.0626 } + - { name: w01, initial_guess: 0.0627 } + - { name: w02, initial_guess: 0.0628 } + - { name: w03, initial_guess: 0.0629 } + - { name: w04, initial_guess: 0.0630 } + - { name: w05, initial_guess: 0.0631 } + - { name: w06, initial_guess: 0.0632 } + - { name: w07, initial_guess: 0.0633 } + - { name: w08, initial_guess: 0.0617 } + - { name: w09, initial_guess: 0.0618 } + - { name: w10, initial_guess: 0.0619 } + - { name: w11, initial_guess: 0.0620 } + - { name: w12, initial_guess: 0.0621 } + - { name: w13, initial_guess: 0.0622 } + - { name: w14, initial_guess: 0.0623 } + - { name: w15, initial_guess: 0.0624 } + + +objective_functions: + - + name: npv_function + - + name: out_fpr_diff + + +optimization: + algorithm: optpp_q_newton + max_iterations: 2 + max_function_evaluations: 2 + perturbation_num: 2 + + +install_jobs: + - + name: well_order + source: jobs/WELL_ORDER_MOCK + - + name: res_mock + source: jobs/RES_MOCK + - + name: npv_function + source: jobs/NPV_FUNCTION_MOCK + - + name: fpr_diff + source: jobs/FPR_DIFF_MOCK + + +model: + realizations: [0, 1] + +forward_model: + - well_order well_order.json SCHEDULE.INC ordered_wells.json + - res_mock MOCKED_TEST_CASE + - npv_function MOCKED_TEST_CASE npv_function + - fpr_diff MOCKED_TEST_CASE out_fpr_diff + +environment: + output_folder: everest_output + simulation_folder: simulations + log_level: warning + random_seed: 743 diff --git a/tests/everest/test_data/mocked_test_case/config_output_constraints.yml b/tests/everest/test_data/mocked_test_case/config_output_constraints.yml new file mode 100644 index 00000000000..96dd8b87627 --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/config_output_constraints.yml @@ -0,0 +1,161 @@ +# Version of mocked test case with with output constraints. + +wells: + - { name: w00} + - { name: w01} + - { name: w02} + - { name: w03} + - { name: w04} + - { name: w05} + - { name: w06} + - { name: w07} + - { name: w08} + - { name: w09} + - { name: w10} + - { name: w11} + - { name: w12} + - { name: w13} + - { name: w14} + - { name: w15} + +controls: + - + name: group + type: well_control + min: 0 + max: 0.1 + perturbation_magnitude : 0.005 + variables: + - { name: w00, initial_guess: 0.0626 } + - { name: w01, initial_guess: 0.0627 } + - { name: w02, initial_guess: 0.0628 } + - { name: w03, initial_guess: 0.0629 } + - { name: w04, initial_guess: 0.0630 } + - { name: w05, initial_guess: 0.0631 } + - { name: w06, initial_guess: 0.0632 } + - { name: w07, initial_guess: 0.0633 } + - { name: w08, initial_guess: 0.0617 } + - { name: w09, initial_guess: 0.0618 } + - { name: w10, initial_guess: 0.0619 } + - { name: w11, initial_guess: 0.0620 } + - { name: w12, initial_guess: 0.0621 } + - { name: w13, initial_guess: 0.0622 } + - { name: w14, initial_guess: 0.0623 } + - { name: w15, initial_guess: 0.0624 } + +output_constraints: + - + name: oil_prod_rate_000 + upper_bound: 5000 + scale: 7500 + # time : 35 + - + name: oil_prod_rate_001 + upper_bound: 5000 + scale: 7500 + # time : 70 + - + name: oil_prod_rate_002 + upper_bound: 5000 + scale: 7500 + # time : 105 + - + name: oil_prod_rate_003 + upper_bound: 5000 + scale: 7500 + # time : 140 + - + name: oil_prod_rate_004 + upper_bound: 5000 + scale: 7500 + # time : 175 + - + name: oil_prod_rate_005 + upper_bound: 5000 + scale: 7500 + # time : 210 + - + name: oil_prod_rate_006 + upper_bound: 5000 + scale: 7500 + # time : 245 + - + name: oil_prod_rate_007 + upper_bound: 5000 + scale: 7500 + # time : 280 + - + name: oil_prod_rate_008 + upper_bound: 5000 + scale: 7500 + # time : 315 + - + name: oil_prod_rate_009 + upper_bound: 5000 + scale: 7500 + # time : 350 + - + name: oil_prod_rate_010 + upper_bound: 5000 + scale: 7500 + # time : 385 + - + name: oil_prod_rate_011 + upper_bound: 5000 + scale: 7500 + # time : 420 + - + name: oil_prod_rate_012 + upper_bound: 5000 + scale: 7500 + # time : 455 + - + name: oil_prod_rate_013 + upper_bound: 5000 + scale: 7500 + # time : 490 + - + name: oil_prod_rate_014 + upper_bound: 5000 + scale: 7500 + # time : 525 + - + name: oil_prod_rate_015 + upper_bound: 5000 + scale: 7500 + # time : 645 + +objective_functions: + - + name: npv_function + + +install_jobs: + - + name: well_order + source: jobs/WELL_ORDER_MOCK + - + name: npv_function + source: jobs/NPV_FUNCTION_MOCK + - + name: oil_prod_rate + source: jobs/OIL_PROD_RATE_MOCK + + +optimization: + algorithm: conmin_mfd + max_iterations: 2 + max_function_evaluations: 2 + perturbation_num: 2 + +environment: + simulation_folder: simulations + random_seed: 954 + +model: + realizations: [0, 1] + +forward_model: + - well_order well_order.json SCHEDULE.INC ordered_wells.json + - npv_function MOCKED_TEST_CASE npv_function + - oil_prod_rate MOCKED_TEST_CASE 35 70 105 140 175 210 245 280 315 350 385 420 455 490 525 645 diff --git a/tests/everest/test_data/mocked_test_case/config_samplers.yml b/tests/everest/test_data/mocked_test_case/config_samplers.yml new file mode 100644 index 00000000000..d57fe3b97e9 --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/config_samplers.yml @@ -0,0 +1,100 @@ +# Config file that is only targeting the optimization section. +wells: + - {name: w00} + - {name: w01} + +controls: + - + name: group + type: well_control + min: 0 + max: 0.1 + sampler: + backend: scipy + method: norm + variables: + - + name: w00 + initial_guess: 0.0626 + - + name: w01 + initial_guess: 0.0624 + - + name: group_1 + type: well_control + min: 0 + max: 0.1 + variables: + - + name: w00 + initial_guess: 0.0626 + sampler: + backend: scipy + method: norm + shared: True + - + name: w01 + initial_guess: 0.0624 + sampler: + backend: scipy + method: uniform + - + name: group_2 + type: well_control + min: 0 + max: 0.1 + sampler: + backend: scipy + method: norm + variables: + - + name: w00 + initial_guess: 0.0626 + - + name: w01 + initial_guess: 0.0624 + sampler: + backend: scipy + method: uniform + +objective_functions: + - + name: npv_function + +install_jobs: + - + name: well_order + source: jobs/WELL_ORDER_MOCK + - + name: npv_function + source: jobs/NPV_FUNCTION_MOCK + - + name: res_mock + source: jobs/RES_MOCK + +optimization: + algorithm: conmin_mfd + perturbation_num: 20 + max_iterations: 10 + max_function_evaluations: 1000 + convergence_tolerance: 1.0e-7 + constraint_tolerance: 1.0e-7 + speculative: false + max_batch_num: 10 + options: + - '131.3 = No' + - 'LOG HIGH' + - 'Dostuff: 1' + - speculate + +environment: + random_seed: 1234 + simulation_folder: full_gradient/simulations + +model: + realizations: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] + +forward_model: + - well_order well_order.json SCHEDULE.INC ordered_wells.json + - res_mock MOCKED_TEST_CASE + - npv_function MOCKED_TEST_CASE npv_function diff --git a/tests/everest/test_data/mocked_test_case/config_workflow.yml b/tests/everest/test_data/mocked_test_case/config_workflow.yml new file mode 100644 index 00000000000..f4f274abddb --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/config_workflow.yml @@ -0,0 +1,55 @@ +wells: + - { name: w00} + + +controls: + - + name: group + type: well_control + min: 0 + max: 0.1 + perturbation_magnitude : 0.005 + perturbation_type : absolute + variables: + - { name: w00, initial_guess: 0.0626 } + + +objective_functions: + - + name: mock_objective + +optimization: + algorithm: optpp_q_newton + min_realizations_success: 1 + min_pert_success: 1 + max_batch_num: 1 + perturbation_num: 1 + +install_jobs: + - + name: failure_filter + source: jobs/FAILURE_FILTER + +install_workflow_jobs: + - + name: test_wf + source: jobs/TEST_WF + +model: + realizations: [0, 1] + +forward_model: + - failure_filter 1 + +workflows: + pre_simulation: + - test_wf -o r{{ configpath }}/pre_simulation.txt -m r{{ runpath_file }} + post_simulation: + - test_wf -o r{{ configpath }}/post_simulation.txt -m r{{ runpath_file }} + + +environment: + output_folder: everest_output + simulation_folder: simulations + log_level: debug + random_seed: 999 diff --git a/tests/everest/test_data/mocked_test_case/eclipse/refcase/SPE1.DATA b/tests/everest/test_data/mocked_test_case/eclipse/refcase/SPE1.DATA new file mode 120000 index 00000000000..93fdb5ca713 --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/eclipse/refcase/SPE1.DATA @@ -0,0 +1 @@ +../../../eclipse/SPE1.DATA \ No newline at end of file diff --git a/tests/everest/test_data/mocked_test_case/eclipse/refcase/TNO_REEK.SMSPEC b/tests/everest/test_data/mocked_test_case/eclipse/refcase/TNO_REEK.SMSPEC new file mode 100755 index 00000000000..0381a5754f9 Binary files /dev/null and b/tests/everest/test_data/mocked_test_case/eclipse/refcase/TNO_REEK.SMSPEC differ diff --git a/tests/everest/test_data/mocked_test_case/jobs/CONTROLS_SUM b/tests/everest/test_data/mocked_test_case/jobs/CONTROLS_SUM new file mode 100644 index 00000000000..506fbd904cb --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/CONTROLS_SUM @@ -0,0 +1,4 @@ +EXECUTABLE controls_sum.py + +MIN_ARG 1 +MAX_ARG 1 diff --git a/tests/everest/test_data/mocked_test_case/jobs/FAILURE_FILTER b/tests/everest/test_data/mocked_test_case/jobs/FAILURE_FILTER new file mode 100755 index 00000000000..fc6d2f21467 --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/FAILURE_FILTER @@ -0,0 +1 @@ +EXECUTABLE failure_filter.py diff --git a/tests/everest/test_data/mocked_test_case/jobs/FPR_DIFF_MOCK b/tests/everest/test_data/mocked_test_case/jobs/FPR_DIFF_MOCK new file mode 100755 index 00000000000..0e3bf029b5e --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/FPR_DIFF_MOCK @@ -0,0 +1,7 @@ +EXECUTABLE fpr_diff_mock.py +STDOUT FPR_DIFF.stdout +STDERR FPR_DIFF.stderr + +TARGET_FILE out_fpr_diff +MIN_ARG 2 +MAX_ARG 2 diff --git a/tests/everest/test_data/mocked_test_case/jobs/NPV_FUNCTION_MOCK b/tests/everest/test_data/mocked_test_case/jobs/NPV_FUNCTION_MOCK new file mode 100755 index 00000000000..82975380df5 --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/NPV_FUNCTION_MOCK @@ -0,0 +1,7 @@ +EXECUTABLE npv_function_mock.py +STDOUT OBJECT_FUNCTION.stdout +STDERR OBJECT_FUNCTION.stderr + +TARGET_FILE npv_function +MIN_ARG 2 +MAX_ARG 2 diff --git a/tests/everest/test_data/mocked_test_case/jobs/OIL_PROD_RATE_MOCK b/tests/everest/test_data/mocked_test_case/jobs/OIL_PROD_RATE_MOCK new file mode 100755 index 00000000000..c7ca17bde7b --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/OIL_PROD_RATE_MOCK @@ -0,0 +1,5 @@ +EXECUTABLE oil_prod_rate_mock.py +STDOUT OIL_PROD_RATE.stdout +STDERR OIL_PROD_RATE.stderr + +TARGET_FILE OIL_PROD_RATE_OK diff --git a/tests/everest/test_data/mocked_test_case/jobs/RES_MOCK b/tests/everest/test_data/mocked_test_case/jobs/RES_MOCK new file mode 100644 index 00000000000..d5b2f534964 --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/RES_MOCK @@ -0,0 +1,6 @@ +EXECUTABLE res_mock.py +STDOUT RES_MOCK.stdout +STDERR RES_MOCK.stderr + +MIN_ARG 1 +MAX_ARG 1 diff --git a/tests/everest/test_data/mocked_test_case/jobs/TEST_WF b/tests/everest/test_data/mocked_test_case/jobs/TEST_WF new file mode 100644 index 00000000000..dd8971fd2e6 --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/TEST_WF @@ -0,0 +1 @@ +EXECUTABLE test_wf.py diff --git a/tests/everest/test_data/mocked_test_case/jobs/WELL_ORDER_MOCK b/tests/everest/test_data/mocked_test_case/jobs/WELL_ORDER_MOCK new file mode 100755 index 00000000000..44f9a05bb39 --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/WELL_ORDER_MOCK @@ -0,0 +1,7 @@ +EXECUTABLE well_order_mock.py +STDOUT WELL_ORDER.stdout +STDERR WELL_ORDER.stderr + +TARGET_FILE SCHEDULE.INC +MIN_ARG 4 +MAX_ARG 4 diff --git a/tests/everest/test_data/mocked_test_case/jobs/controls_sum.py b/tests/everest/test_data/mocked_test_case/jobs/controls_sum.py new file mode 100755 index 00000000000..6c6018ae49f --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/controls_sum.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +import json +import sys + + +def main(control_group_name): + with open(control_group_name + ".json", encoding="utf-8") as f: + control_group = json.load(f) + + with open(control_group_name + "_sum", "w", encoding="utf-8") as f_out: + f_out.write("%f" % sum(control_group.values())) + + +if __name__ == "__main__": + main(sys.argv[1]) diff --git a/tests/everest/test_data/mocked_test_case/jobs/failure_filter.py b/tests/everest/test_data/mocked_test_case/jobs/failure_filter.py new file mode 100755 index 00000000000..4ccf120b469 --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/failure_filter.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python + +import sys + + +def main(argv): + simulation_id = argv[0] + failures = argv[1:] + + # Generate the objective function file + with open("mock_objective", "w", encoding="utf-8") as f: + f.write("0") + + if simulation_id in failures: + sys.exit("You asked for failure..") + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/tests/everest/test_data/mocked_test_case/jobs/fpr_diff_mock.py b/tests/everest/test_data/mocked_test_case/jobs/fpr_diff_mock.py new file mode 100755 index 00000000000..c5ce129a88f --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/fpr_diff_mock.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python +import sys + +sum_mock = {} +sum_mock["FPR"] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] +sum_mock["TIME"] = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, +] + + +def compute_fpr_diff(summary): + fpr = summary.get("FPR") + return fpr[-1] - fpr[0] + + +def main(argv): + _ = argv[0] # input file + target_file = argv[1] + + diff = compute_fpr_diff(sum_mock) + with open(target_file, "w", encoding="utf-8") as out: + out.write("{} \n".format(diff)) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/tests/everest/test_data/mocked_test_case/jobs/npv_function_mock.py b/tests/everest/test_data/mocked_test_case/jobs/npv_function_mock.py new file mode 100755 index 00000000000..a7c3a476d3f --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/npv_function_mock.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python +import sys + +sum_mock = {} +sum_mock["FOPT"] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] +sum_mock["FWPT"] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] +sum_mock["FGPT"] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] +sum_mock["FWIT"] = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] +sum_mock["TIME"] = [ + 10, + 20, + 30, + 40, + 50, + 60, + 70, + 80, + 90, + 100, + 110, + 120, + 130, + 140, + 150, + 160, +] + + +def compute_npv(sum): + fopt = sum.get("FOPT") + fwpt = sum.get("FWPT") + fgpt = sum.get("FGPT") + fwit = sum.get("FWIT") + elapsedtime = sum.get("TIME") + + with open("debug.txt", "w", encoding="utf-8") as f: + DCF = compute_dcf(fopt[0], fwpt[0], fgpt[0], fwit[0], elapsedtime[0]) + f.write( + "%f\t%f\t%f\t%f\t%f\t%f\n" + % (elapsedtime[0], fopt[0], fwpt[0], fgpt[0], fwit[0], DCF) + ) + NPV = DCF + + for i in range(1, len(fopt)): + DCF = compute_dcf( + fopt[i] - fopt[i - 1], + fwpt[i] - fwpt[i - 1], + fgpt[i] - fgpt[i - 1], + fwit[i] - fwit[i - 1], + elapsedtime[i], + ) + NPV += DCF + f.write( + "%f\t%f\t%f\t%f\t%f\t%f\n" + % (elapsedtime[i], fopt[i], fwpt[i], fgpt[i], fwit[i], DCF) + ) + + return NPV + + +def compute_dcf(voilp, vwaterp, vgasp, vwateri, elapsedtime): + """ + Function for computing the discounted cash flow + """ + OILPRICE = 150 + WATERPRICE = -25 + GASPRICE = 0.000001 + WATERINJPRICE = -5 + DISCOUNTRATE = 0.08 + + return ( + voilp * OILPRICE + + vwaterp * WATERPRICE + + vgasp * GASPRICE + + vwateri * WATERINJPRICE + ) / pow((1 + DISCOUNTRATE), (elapsedtime / 365.25)) + + +def save_object_value(object_value, target_file): + with open(target_file, "w", encoding="utf-8") as f: + f.write("%g \n" % object_value) + + +def main(argv): + # start main script + target_file = sys.argv[2] + + npv_value = compute_npv(sum_mock) + save_object_value(npv_value, target_file) + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/tests/everest/test_data/mocked_test_case/jobs/oil_prod_rate_mock.py b/tests/everest/test_data/mocked_test_case/jobs/oil_prod_rate_mock.py new file mode 100755 index 00000000000..c216c11672a --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/oil_prod_rate_mock.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python +import sys + + +def save_return_value(return_value, target_file): + """ + Save to file + :param return_value: + :param target_file: + :return: + """ + with open(target_file, "w", encoding="utf-8") as f: + f.write("%g \n" % (1.0 * return_value)) + + +def main(argv): + # Main script starts here + times = sys.argv[2:] + + sum = {} + sum["FOPR"] = 17 * [6000] + + for i in range(0, len(times)): + val = sum.get("FOPR")[i] + save_return_value(val, "oil_prod_rate_%03d" % i) + + with open("OIL_PROD_RATE_OK", "w", encoding="utf-8") as f: + f.write("Everything went fine here!") + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/tests/everest/test_data/mocked_test_case/jobs/res_mock.py b/tests/everest/test_data/mocked_test_case/jobs/res_mock.py new file mode 100755 index 00000000000..4b0e49712ac --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/res_mock.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python +import sys + +from resdata.util.test.mock import createSummary + + +def dump_summary_mock(case_name): + case = createSummary( + case_name, [("FOPT", None, 0, "SM3"), ("FOPR", None, 0, "SM3/DAY")] + ) + case.fwrite() + + +if __name__ == "__main__": + name = sys.argv[1] + dump_summary_mock(name) diff --git a/tests/everest/test_data/mocked_test_case/jobs/test_wf.py b/tests/everest/test_data/mocked_test_case/jobs/test_wf.py new file mode 100755 index 00000000000..07ea7f8f744 --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/test_wf.py @@ -0,0 +1,19 @@ +#!/usr/bin/env python + +import argparse +import sys + + +def main(argv): + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument("-o", "--out", type=str, required=True) + arg_parser.add_argument("-m", "--message", type=str) + options, _ = arg_parser.parse_known_args(args=argv) + + msg = options.message if options.message else "test" + with open(options.out, "w", encoding="utf-8") as f: + f.write(f"{msg}\n") + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/tests/everest/test_data/mocked_test_case/jobs/well_order_mock.py b/tests/everest/test_data/mocked_test_case/jobs/well_order_mock.py new file mode 100755 index 00000000000..09cd37c8d56 --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/jobs/well_order_mock.py @@ -0,0 +1,67 @@ +#!/usr/bin/env python +import json +import re +import sys +from collections import OrderedDict + + +def create_file(order, template_file, target_file): + with open(target_file, "w", encoding="utf-8") as writeH, open( + template_file, encoding="utf-8" + ) as readH: + for line in readH.readlines(): + match_obj = re.search("(__[A-Z]+_[0-9]__)", line) + if match_obj: + new_well = order.popitem(False)[0] + line = line.replace(match_obj.group(1), new_well) + writeH.write(line) + + +def well_value(w): + return -w[1] + + +def load_well_order(well_order_file): + well_list = [] + with open(well_order_file, encoding="utf-8") as f: + for line in f.readlines(): + well, rest = line.split() + well_list.append((well, float(rest))) + + well_list.sort(key=well_value) + well_order = OrderedDict() + for well, value in well_list: + well_order[well] = value + return well_order + + +def create_well_order(well_list_file, well_order_file): + with open(well_order_file, "w", encoding="utf-8") as writeH: + well_list = [] + with open(well_list_file, encoding="utf-8") as f: + data = json.load(f) + + for well in data: + well_list.append((well, float(data[well]))) + + well_list.sort(key=well_value) + for well, _value in well_list: + writeH.write(well + "\n") + + +def main(argv): + # schedule_inc + target_file = sys.argv[2] + + # Commented out since this is not clear anymore - should be correct later + # create_well_order(well_order_file, ordered_wells) + # well_order = load_well_order(well_order_file) + # create_file(well_order, template_file, target_file) + + # just create the target file to get the forward model going + with open(target_file, "w", encoding="utf-8"): + pass + + +if __name__ == "__main__": + main(sys.argv[1:]) diff --git a/tests/everest/test_data/mocked_test_case/mocked_multi_batch.yml b/tests/everest/test_data/mocked_test_case/mocked_multi_batch.yml new file mode 100644 index 00000000000..86b0487c90d --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/mocked_multi_batch.yml @@ -0,0 +1,78 @@ +definitions: + numeric_key: 1 + bool_key: True + eclbase: MOCKED_TEST_CASE + local_jobs_folder: r{{configpath}}/jobs + refcase_folder: r{{configpath}}/eclipse/refcase + spe1_datafile: r{{refcase_folder}}/SPE1.DATA + +wells: + - { name: w00} + - { name: w01} + - { name: w02} + - { name: w03} + +controls: + - + name: group + type: well_control + min: 0 + max: 0.1 + perturbation_magnitude : 0.005 + perturbation_type : absolute + variables: + - { name: w00, initial_guess: 0.0626 } + - { name: w01, initial_guess: 0.0627 } + - { name: w02, initial_guess: 0.0628 } + - { name: w03, initial_guess: 0.0629 } + + +objective_functions: + - + name: npv_function + - + name: group_sum + normalization: 1000 + + +optimization: + algorithm: optpp_q_newton + perturbation_num: 2 + convergence_tolerance: 1 + + +install_jobs: + - + name: well_order + source: r{{local_jobs_folder}}/WELL_ORDER_MOCK + - + name: res_mock + source: r{{local_jobs_folder}}/RES_MOCK + - + name: npv_function + source: r{{local_jobs_folder}}/NPV_FUNCTION_MOCK + - + name: controls_sum + source: r{{local_jobs_folder}}/CONTROLS_SUM + +simulator: + max_runtime: 3600 + +model: + realizations: r{{ range(2) | list() }} + # NOTE: This is not a related datafile, just needed one to get eclipse + # export in tests. Can be replaced by any other datafile of your preferance. + data_file: r{{spe1_datafile}} + + +forward_model: + - well_order well_order.json SCHEDULE.INC ordered_wells.json + - res_mock r{{ eclbase }} + - npv_function r{{ eclbase }} npv_function + - controls_sum group + +environment: + simulation_folder: sim_folder + output_folder: mocked_multi_batch_output + log_level: warning + random_seed: 123456 diff --git a/tests/everest/test_data/mocked_test_case/mocked_test_case.yml b/tests/everest/test_data/mocked_test_case/mocked_test_case.yml new file mode 100644 index 00000000000..3ac6efa265f --- /dev/null +++ b/tests/everest/test_data/mocked_test_case/mocked_test_case.yml @@ -0,0 +1,92 @@ +definitions: + case: MOCKED_TEST_CASE + numeric_key: 1 + bool_key: True + +export: + keywords: ['FOIP', 'FOPT'] + csv_output_filepath: path/to/relative/folder + +wells: + - { name: w00} + - { name: w01} + - { name: w02} + - { name: w03} + - { name: w04} + - { name: w05} + - { name: w06} + - { name: w07} + - { name: w08} + - { name: w09} + - { name: w10} + - { name: w11} + - { name: w12} + - { name: w13} + - { name: w14} + - { name: w15} + +controls: + - + name: group + type: well_control + min: 0 + max: 0.1 + perturbation_magnitude : 0.005 + perturbation_type : absolute + variables: + - { name: w00, initial_guess: 0.0626 } + - { name: w01, initial_guess: 0.0627 } + - { name: w02, initial_guess: 0.0628 } + - { name: w03, initial_guess: 0.0629 } + - { name: w04, initial_guess: 0.0630 } + - { name: w05, initial_guess: 0.0631 } + - { name: w06, initial_guess: 0.0632 } + - { name: w07, initial_guess: 0.0633 } + - { name: w08, initial_guess: 0.0617 } + - { name: w09, initial_guess: 0.0618 } + - { name: w10, initial_guess: 0.0619 } + - { name: w11, initial_guess: 0.0620 } + - { name: w12, initial_guess: 0.0621 } + - { name: w13, initial_guess: 0.0622 } + - { name: w14, initial_guess: 0.0623 } + - { name: w15, initial_guess: 0.0624 } + + +objective_functions: + - + name: npv_function + + +optimization: + algorithm: optpp_q_newton + max_iterations: 2 + max_function_evaluations: 5 + perturbation_num: 2 + +install_jobs: + - + name: well_order + source: jobs/WELL_ORDER_MOCK + - + name: res_mock + source: jobs/RES_MOCK + - + name: npv_function + source: jobs/NPV_FUNCTION_MOCK + +simulator: + max_runtime: 3600 + +model: + realizations: r{{ range(2) | list() }} + +forward_model: + - well_order well_order.json SCHEDULE.INC ordered_wells.json + - res_mock r{{ case }} + - npv_function r{{ case }} npv_function + +environment: + output_folder: everest_output + simulation_folder: simulations_r{{ os.USER }} + log_level: warning + random_seed: 999 diff --git a/tests/everest/test_data/mocked_test_case/test_output/seba.db b/tests/everest/test_data/mocked_test_case/test_output/seba.db new file mode 100644 index 00000000000..cd71d56dbb4 Binary files /dev/null and b/tests/everest/test_data/mocked_test_case/test_output/seba.db differ diff --git a/tests/everest/test_data/open_shut_state_modifier/eclipse/model/EXPECTED.SCH b/tests/everest/test_data/open_shut_state_modifier/eclipse/model/EXPECTED.SCH new file mode 100644 index 00000000000..8ec2ec855f4 --- /dev/null +++ b/tests/everest/test_data/open_shut_state_modifier/eclipse/model/EXPECTED.SCH @@ -0,0 +1,201 @@ +WCONPROD + WELL-1 SHUT BHP 5* 100 / + WELL-2 SHUT BHP 5* 100 / + WELL-3 SHUT BHP 5* 100 / + WELL-4 SHUT BHP 5* 100 / + WELL-5 SHUT BHP 5* 100 / +/ + +-- MODIFIED by schmerge forward model + +DATES + 1 JAN 2022 / +/ + +DATES + 01 JUN 2022 / --ADDED +/ + +--start templates/welopen.jinja + +WELOPEN + 'WELL-1' 'OPEN' / +/ + +--end templates/welopen.jinja + +--start templates/welshut.jinja + +WELOPEN + 'WELL-2' 'SHUT' / +/ + +--end templates/welshut.jinja + +--start templates/welopen.jinja + +WELOPEN + 'WELL-3' 'OPEN' / +/ + +--end templates/welopen.jinja + +--start templates/welopen.jinja + +WELOPEN + 'WELL-4' 'OPEN' / +/ + +--end templates/welopen.jinja + +--start templates/welshut.jinja + +WELOPEN + 'WELL-5' 'SHUT' / +/ + +--end templates/welshut.jinja + +DATES + 1 JAN 2023 / +/ + +DATES + 06 FEB 2023 / --ADDED +/ + +--start templates/welshut.jinja + +WELOPEN + 'WELL-1' 'SHUT' / +/ + +--end templates/welshut.jinja + +--start templates/welopen.jinja + +WELOPEN + 'WELL-2' 'OPEN' / +/ + +--end templates/welopen.jinja + +--start templates/welshut.jinja + +WELOPEN + 'WELL-3' 'SHUT' / +/ + +--end templates/welshut.jinja + +--start templates/welopen.jinja + +WELOPEN + 'WELL-4' 'OPEN' / +/ + +--end templates/welopen.jinja + +--start templates/welshut.jinja + +WELOPEN + 'WELL-5' 'SHUT' / +/ + +--end templates/welshut.jinja + +DATES + 14 OCT 2023 / --ADDED +/ + +--start templates/welshut.jinja + +WELOPEN + 'WELL-1' 'SHUT' / +/ + +--end templates/welshut.jinja + +--start templates/welopen.jinja + +WELOPEN + 'WELL-2' 'OPEN' / +/ + +--end templates/welopen.jinja + +--start templates/welopen.jinja + +WELOPEN + 'WELL-3' 'OPEN' / +/ + +--end templates/welopen.jinja + +--start templates/welshut.jinja + +WELOPEN + 'WELL-4' 'SHUT' / +/ + +--end templates/welshut.jinja + +--start templates/welshut.jinja + +WELOPEN + 'WELL-5' 'SHUT' / +/ + +--end templates/welshut.jinja + +DATES + 1 JAN 2024 / +/ + +DATES + 20 JUN 2024 / --ADDED +/ + +--start templates/welshut.jinja + +WELOPEN + 'WELL-1' 'SHUT' / +/ + +--end templates/welshut.jinja + +--start templates/welshut.jinja + +WELOPEN + 'WELL-2' 'SHUT' / +/ + +--end templates/welshut.jinja + +--start templates/welshut.jinja + +WELOPEN + 'WELL-3' 'SHUT' / +/ + +--end templates/welshut.jinja + +--start templates/welopen.jinja + +WELOPEN + 'WELL-4' 'OPEN' / +/ + +--end templates/welopen.jinja + +--start templates/welshut.jinja + +WELOPEN + 'WELL-5' 'SHUT' / +/ + +--end templates/welshut.jinja + +DATES + 1 JAN 2025 / +/ diff --git a/tests/everest/test_data/open_shut_state_modifier/eclipse/model/INIT.SCH b/tests/everest/test_data/open_shut_state_modifier/eclipse/model/INIT.SCH new file mode 100644 index 00000000000..4e9d71a744c --- /dev/null +++ b/tests/everest/test_data/open_shut_state_modifier/eclipse/model/INIT.SCH @@ -0,0 +1,23 @@ +WCONPROD + WELL-1 SHUT BHP 5* 100 / + WELL-2 SHUT BHP 5* 100 / + WELL-3 SHUT BHP 5* 100 / + WELL-4 SHUT BHP 5* 100 / + WELL-5 SHUT BHP 5* 100 / +/ + +DATES + 1 JAN 2022 / +/ + +DATES + 1 JAN 2023 / +/ + +DATES + 1 JAN 2024 / +/ + +DATES + 1 JAN 2025 / +/ diff --git a/tests/everest/test_data/open_shut_state_modifier/eclipse/realizations/real-1/R1_ECL_MODEL.DATA b/tests/everest/test_data/open_shut_state_modifier/eclipse/realizations/real-1/R1_ECL_MODEL.DATA new file mode 100644 index 00000000000..e69de29bb2d diff --git a/tests/everest/test_data/open_shut_state_modifier/everest/input/files/add_templates.yml b/tests/everest/test_data/open_shut_state_modifier/everest/input/files/add_templates.yml new file mode 100644 index 00000000000..5a601f23cd6 --- /dev/null +++ b/tests/everest/test_data/open_shut_state_modifier/everest/input/files/add_templates.yml @@ -0,0 +1,7 @@ +templates: + - file: "./templates/welopen.jinja" + keys: + opname: open + - file: "./templates/welshut.jinja" + keys: + opname: shut diff --git a/tests/everest/test_data/open_shut_state_modifier/everest/input/files/well_swap_config.yml b/tests/everest/test_data/open_shut_state_modifier/everest/input/files/well_swap_config.yml new file mode 100644 index 00000000000..9f97d388f16 --- /dev/null +++ b/tests/everest/test_data/open_shut_state_modifier/everest/input/files/well_swap_config.yml @@ -0,0 +1,16 @@ +constraints: + state_duration: + scaling: + source: [0.0, 1.0] + target: [0, 500] + +start_date: 2022-06-01 + +state: + hierarchy: + - label: open + quotas: [3, 2, 2, 1] + - label: shut + actions: + - [shut, open] + - [open, shut] diff --git a/tests/everest/test_data/open_shut_state_modifier/everest/input/templates/welopen.jinja b/tests/everest/test_data/open_shut_state_modifier/everest/input/templates/welopen.jinja new file mode 100755 index 00000000000..05702862430 --- /dev/null +++ b/tests/everest/test_data/open_shut_state_modifier/everest/input/templates/welopen.jinja @@ -0,0 +1,3 @@ +WELOPEN + '{{ name }}' 'OPEN' / +/ diff --git a/tests/everest/test_data/open_shut_state_modifier/everest/input/templates/welshut.jinja b/tests/everest/test_data/open_shut_state_modifier/everest/input/templates/welshut.jinja new file mode 100755 index 00000000000..e01deb136ab --- /dev/null +++ b/tests/everest/test_data/open_shut_state_modifier/everest/input/templates/welshut.jinja @@ -0,0 +1,3 @@ +WELOPEN + '{{ name }}' 'SHUT' / +/ diff --git a/tests/everest/test_data/open_shut_state_modifier/everest/model/array.yml b/tests/everest/test_data/open_shut_state_modifier/everest/model/array.yml new file mode 100644 index 00000000000..4d3d3312563 --- /dev/null +++ b/tests/everest/test_data/open_shut_state_modifier/everest/model/array.yml @@ -0,0 +1,88 @@ +# example configuration file for well swapping optimization: +# 5 wells + 4 swapping periods (3 wells selected to be open at each period) + +definitions: + eclbase: eclipse/model/r{{case_name}} + ecl_initial_data: r{{configpath}}/../../eclipse/realizations/real-r{{realization}}/Rr{{realization}}_ECL_MODEL # MIGHT NEED TO BE ADJUSTED WITH DUMMY MODEL + user_shortname: well_swapping_shortname + case_name: WELL_SWAPPING + realization_folder: r{{configpath}}/../../eclipse/realizations/real-r{{realization}} + +environment: + simulation_folder: r{{configpath}}/../output/r{{case_name}}/sim_output + output_folder: r{{configpath}}/../output/r{{case_name}} + random_seed: 32142021 + +wells: + - { name: WELL-1 } + - { name: WELL-2 } + - { name: WELL-3 } + - { name: WELL-4 } + - { name: WELL-5 } + +controls: + - name: well_priorities + type: well_control + min: 0.0 + max: 1.0 + perturbation_magnitude: 0.05 + variables: + - { name: WELL-1, initial_guess: [0.58, 0.54, 0.50, 0.52] } + - { name: WELL-2, initial_guess: [0.50, 0.58, 0.56, 0.54] } + - { name: WELL-3, initial_guess: [0.56, 0.52, 0.58, 0.50] } + - { name: WELL-4, initial_guess: [0.54, 0.56, 0.54, 0.58] } + - { name: WELL-5, initial_guess: [0.52, 0.50, 0.52, 0.56] } + + - name: swapping_constraints + type: generic_control + min: 0.0 + max: 1.0 + perturbation_magnitude: 0.05 + variables: + - { name: state_duration, initial_guess: [0.5, 0.5, 0.5, 0.5] } + +objective_functions: + - name: npv + weight: 1 + normalization: 0.000000001 + +optimization: + backend: scipy + algorithm: SLSQP + convergence_tolerance: 0.001 + constraint_tolerance: 0.001 + perturbation_num: 2 + speculative: True + max_batch_num: 2 + backend_options: + maxiter: 100 + +model: + realizations: [1] + +install_data: + - link: True + source: r{{configpath}}/../input/files/ + target: files + - link: True + source: r{{configpath}}/../input/templates/ + target: templates + +forward_model: + - well_swapping --priorities well_priorities.json --constraints swapping_constraints.json --cases wells.json --output well_swap_output.json --config files/well_swap_config.yml + + #################################### + # FROM HERE ON, NOTHING NEW... + #################################### + - add_templates --input well_swap_output.json --config files/add_templates.yml --output schmerge_input.json + - schmerge --schedule r{{configpath}}/../../eclipse/model/INIT.SCH --input schmerge_input.json --output RESULT.SCH + + #################################### + # FROM HERE ON, RUN SIMULATION + #################################### +# # Run Simulation +# - eclipse100 --version 2021.3 r{{eclbase}}.DATA +# +# # Calculate the objective function +# - npv -s r{{eclbase}}.UNSMRY -o npv -c files/prices.yml -i swap_dates.json -sd 2022-06-01 -ed 2042-01-01 +# - rf -s r{{eclbase}}.UNSMRY -o rf -pk FOPT -tvk FOIP -sd 2022-06-01 -ed 2042-01-01 diff --git a/tests/everest/test_data/open_shut_state_modifier/everest/model/index.yml b/tests/everest/test_data/open_shut_state_modifier/everest/model/index.yml new file mode 100644 index 00000000000..6db082dba6f --- /dev/null +++ b/tests/everest/test_data/open_shut_state_modifier/everest/model/index.yml @@ -0,0 +1,106 @@ +# example configuration file for well swapping optimization: +# 5 wells + 4 swapping periods (3 wells selected to be open at each period) + +definitions: + eclbase: eclipse/model/r{{case_name}} + ecl_initial_data: r{{configpath}}/../../eclipse/realizations/real-r{{realization}}/Rr{{realization}}_ECL_MODEL # MIGHT NEED TO BE ADJUSTED WITH DUMMY MODEL + user_shortname: well_swapping_shortname + case_name: WELL_SWAPPING + realization_folder: r{{configpath}}/../../eclipse/realizations/real-r{{realization}} + +environment: + simulation_folder: r{{configpath}}/../output/r{{case_name}}/sim_output + output_folder: r{{configpath}}/../output/r{{case_name}} + random_seed: 32142021 + +wells: + - { name: WELL-1 } + - { name: WELL-2 } + - { name: WELL-3 } + - { name: WELL-4 } + - { name: WELL-5 } + +controls: + - name: well_priorities + type: well_control + min: 0.0 + max: 1.0 + perturbation_magnitude: 0.05 + variables: + - { name: WELL-1, index: 1, initial_guess: 0.58 } + - { name: WELL-2, index: 1, initial_guess: 0.50 } + - { name: WELL-3, index: 1, initial_guess: 0.56 } + - { name: WELL-4, index: 1, initial_guess: 0.54 } + - { name: WELL-5, index: 1, initial_guess: 0.52 } + - { name: WELL-1, index: 2, initial_guess: 0.54 } + - { name: WELL-2, index: 2, initial_guess: 0.58 } + - { name: WELL-3, index: 2, initial_guess: 0.52 } + - { name: WELL-4, index: 2, initial_guess: 0.56 } + - { name: WELL-5, index: 2, initial_guess: 0.50 } + - { name: WELL-1, index: 3, initial_guess: 0.50 } + - { name: WELL-2, index: 3, initial_guess: 0.56 } + - { name: WELL-3, index: 3, initial_guess: 0.58 } + - { name: WELL-4, index: 3, initial_guess: 0.54 } + - { name: WELL-5, index: 3, initial_guess: 0.52 } + - { name: WELL-1, index: 4, initial_guess: 0.52 } + - { name: WELL-2, index: 4, initial_guess: 0.54 } + - { name: WELL-3, index: 4, initial_guess: 0.50 } + - { name: WELL-4, index: 4, initial_guess: 0.58 } + - { name: WELL-5, index: 4, initial_guess: 0.56 } + + - name: swapping_constraints + type: generic_control + min: 0.0 + max: 1.0 + perturbation_magnitude: 0.05 + variables: + - { name: state_duration, index: 1, initial_guess: 0.5 } + - { name: state_duration, index: 2, initial_guess: 0.5 } + - { name: state_duration, index: 3, initial_guess: 0.5 } + - { name: state_duration, index: 4, initial_guess: 0.5 } + +objective_functions: + - name: npv + weight: 1 + normalization: 0.000000001 + +optimization: + backend: scipy + algorithm: SLSQP + convergence_tolerance: 0.001 + constraint_tolerance: 0.001 + perturbation_num: 2 + speculative: True + max_batch_num: 2 + backend_options: + maxiter: 100 + +model: + realizations: [1] + +install_data: + - link: True + source: r{{configpath}}/../input/files/ + target: files + - link: True + source: r{{configpath}}/../input/templates/ + target: templates + +forward_model: + - well_swapping --priorities well_priorities.json --constraints swapping_constraints.json --cases wells.json --output well_swap_output.json --config files/well_swap_config.yml + + #################################### + # FROM HERE ON, NOTHING NEW... + #################################### + - add_templates --input well_swap_output.json --config files/add_templates.yml --output schmerge_input.json + - schmerge --schedule r{{configpath}}/../../eclipse/model/INIT.SCH --input schmerge_input.json --output RESULT.SCH + + #################################### + # FROM HERE ON, RUN SIMULATION + #################################### +# # Run Simulation +# - eclipse100 --version 2021.3 r{{eclbase}}.DATA +# +# # Calculate the objective function +# - npv -s r{{eclbase}}.UNSMRY -o npv -c files/prices.yml -i swap_dates.json -sd 2022-06-01 -ed 2042-01-01 +# - rf -s r{{eclbase}}.UNSMRY -o rf -pk FOPT -tvk FOIP -sd 2022-06-01 -ed 2042-01-01 diff --git a/tests/everest/test_data/shell_commands/CREATE_FILE b/tests/everest/test_data/shell_commands/CREATE_FILE new file mode 100755 index 00000000000..37d792474bf --- /dev/null +++ b/tests/everest/test_data/shell_commands/CREATE_FILE @@ -0,0 +1 @@ +EXECUTABLE create_file.py diff --git a/tests/everest/test_data/shell_commands/config_shell_commands.yml b/tests/everest/test_data/shell_commands/config_shell_commands.yml new file mode 100644 index 00000000000..a2d1451b9cb --- /dev/null +++ b/tests/everest/test_data/shell_commands/config_shell_commands.yml @@ -0,0 +1,36 @@ +controls: + - + name: not_really_important_for_this_test + type: generic_control + min: -1.0 + max: 1.0 + initial_guess: 0 + variables: + - name: x + +objective_functions: + - + name: not_really_important_for_this_test + +optimization: + algorithm: optpp_q_newton + +install_jobs: + - + name: create_file + source: CREATE_FILE + +model: + realizations: [0] + +forward_model: + - create_file -n new_test_file.txt + - make_directory created_test_folder + - copy_directory created_test_folder test_folder_copy + - copy_file new_test_file.txt created_test_folder/new_test_file_copy.txt + - move_file new_test_file.txt created_test_folder/new_test_file.txt + - symlink created_test_folder/new_test_file.txt sym_link + +environment: + simulation_folder: sim_output + log_level: debug diff --git a/tests/everest/test_data/shell_commands/create_file.py b/tests/everest/test_data/shell_commands/create_file.py new file mode 100755 index 00000000000..57b0b7335f1 --- /dev/null +++ b/tests/everest/test_data/shell_commands/create_file.py @@ -0,0 +1,16 @@ +#!/usr/bin/env python + +import argparse + + +def main(): + arg_parser = argparse.ArgumentParser() + arg_parser.add_argument("--name", "-n", type=str, required=True) + options = arg_parser.parse_args() + + with open(options.name, "w", encoding="utf-8") as f: + f.write("Let there be a file!") + + +if __name__ == "__main__": + main() diff --git a/tests/everest/test_data/snake_oil/eclipse/include/grid/CASE.EGRID b/tests/everest/test_data/snake_oil/eclipse/include/grid/CASE.EGRID new file mode 100644 index 00000000000..33da9f7a70e Binary files /dev/null and b/tests/everest/test_data/snake_oil/eclipse/include/grid/CASE.EGRID differ diff --git a/tests/everest/test_data/snake_oil/eclipse/model/SNAKE_OIL.DATA b/tests/everest/test_data/snake_oil/eclipse/model/SNAKE_OIL.DATA new file mode 100644 index 00000000000..e0a2329dda4 --- /dev/null +++ b/tests/everest/test_data/snake_oil/eclipse/model/SNAKE_OIL.DATA @@ -0,0 +1,4 @@ +START + +-- DAY MONTH YEAR + 1 'JAN' 2017 / diff --git a/tests/everest/test_data/snake_oil/everest/bin/workflows/MAGIC_PRINT b/tests/everest/test_data/snake_oil/everest/bin/workflows/MAGIC_PRINT new file mode 100644 index 00000000000..2d64d86805a --- /dev/null +++ b/tests/everest/test_data/snake_oil/everest/bin/workflows/MAGIC_PRINT @@ -0,0 +1 @@ +MAGIC_PRINT magic-list.txt __MAGIC__ diff --git a/tests/everest/test_data/snake_oil/everest/bin/workflows/workflowjobs/UBER_PRINT b/tests/everest/test_data/snake_oil/everest/bin/workflows/workflowjobs/UBER_PRINT new file mode 100644 index 00000000000..66f9f577efb --- /dev/null +++ b/tests/everest/test_data/snake_oil/everest/bin/workflows/workflowjobs/UBER_PRINT @@ -0,0 +1,3 @@ +INTERNAL False +EXECUTABLE bin/uber_print.py +MIN_ARG 1 diff --git a/tests/everest/test_data/snake_oil/everest/bin/workflows/workflowjobs/bin/uber_print.py b/tests/everest/test_data/snake_oil/everest/bin/workflows/workflowjobs/bin/uber_print.py new file mode 100755 index 00000000000..c212e3ae739 --- /dev/null +++ b/tests/everest/test_data/snake_oil/everest/bin/workflows/workflowjobs/bin/uber_print.py @@ -0,0 +1,6 @@ +#!/usr/bin/env python +import sys + +with open(sys.argv[1], "w", encoding="utf-8") as fileH: + for arg in sys.argv[2:]: + fileH.write("%s\n" % arg) diff --git a/tests/everest/test_data/snake_oil/everest/input/distributions/sigma.dist b/tests/everest/test_data/snake_oil/everest/input/distributions/sigma.dist new file mode 100755 index 00000000000..044a56347be --- /dev/null +++ b/tests/everest/test_data/snake_oil/everest/input/distributions/sigma.dist @@ -0,0 +1 @@ +SIGMA LOGUNIF 0.01 100 diff --git a/tests/everest/test_data/snake_oil/everest/input/observations/obsfiles/observations.txt b/tests/everest/test_data/snake_oil/everest/input/observations/obsfiles/observations.txt new file mode 100644 index 00000000000..4fa6494dcb4 --- /dev/null +++ b/tests/everest/test_data/snake_oil/everest/input/observations/obsfiles/observations.txt @@ -0,0 +1,56 @@ +HISTORY_OBSERVATION FOPR; + +SUMMARY_OBSERVATION WOPR_OP1_9 +{ + VALUE = 0.1; + ERROR = 0.05; + RESTART = 9; + KEY = WOPR:OP1; +}; + +SUMMARY_OBSERVATION WOPR_OP1_36 +{ + VALUE = 0.7; + ERROR = 0.07; + RESTART = 36; + KEY = WOPR:OP1; +}; + +SUMMARY_OBSERVATION WOPR_OP1_72 +{ + VALUE = 0.5; + ERROR = 0.05; + RESTART = 72; + KEY = WOPR:OP1; +}; + +SUMMARY_OBSERVATION WOPR_OP1_108 +{ + VALUE = 0.3; + ERROR = 0.075; + RESTART = 108; + KEY = WOPR:OP1; +}; + +SUMMARY_OBSERVATION WOPR_OP1_144 +{ + VALUE = 0.2; + ERROR = 0.035; + RESTART = 144; + KEY = WOPR:OP1; +}; + +SUMMARY_OBSERVATION WOPR_OP1_190 +{ + VALUE = 0.015; + ERROR = 0.01; + RESTART = 190; + KEY = WOPR:OP1; +}; + +GENERAL_OBSERVATION WPR_DIFF_1 { + DATA = SNAKE_OIL_WPR_DIFF; + INDEX_LIST = 400,800,1200,1800; + RESTART = 199; + OBS_FILE = observations/wpr_diff_obs.txt; +}; diff --git a/tests/everest/test_data/snake_oil/everest/input/refcase/SNAKE_OIL_FIELD.SMSPEC b/tests/everest/test_data/snake_oil/everest/input/refcase/SNAKE_OIL_FIELD.SMSPEC new file mode 100644 index 00000000000..5a29e043b2d Binary files /dev/null and b/tests/everest/test_data/snake_oil/everest/input/refcase/SNAKE_OIL_FIELD.SMSPEC differ diff --git a/tests/everest/test_data/snake_oil/everest/input/refcase/SNAKE_OIL_FIELD.UNSMRY b/tests/everest/test_data/snake_oil/everest/input/refcase/SNAKE_OIL_FIELD.UNSMRY new file mode 100644 index 00000000000..dfa04f80027 Binary files /dev/null and b/tests/everest/test_data/snake_oil/everest/input/refcase/SNAKE_OIL_FIELD.UNSMRY differ diff --git a/tests/everest/test_data/snake_oil/everest/input/refcase/time_map.txt b/tests/everest/test_data/snake_oil/everest/input/refcase/time_map.txt new file mode 100644 index 00000000000..d54b4293aec --- /dev/null +++ b/tests/everest/test_data/snake_oil/everest/input/refcase/time_map.txt @@ -0,0 +1,2000 @@ +01/01/2010 +02/01/2010 +03/01/2010 +04/01/2010 +05/01/2010 +06/01/2010 +07/01/2010 +08/01/2010 +09/01/2010 +10/01/2010 +11/01/2010 +12/01/2010 +13/01/2010 +14/01/2010 +15/01/2010 +16/01/2010 +17/01/2010 +18/01/2010 +19/01/2010 +20/01/2010 +21/01/2010 +22/01/2010 +23/01/2010 +24/01/2010 +25/01/2010 +26/01/2010 +27/01/2010 +28/01/2010 +29/01/2010 +30/01/2010 +31/01/2010 +01/02/2010 +02/02/2010 +03/02/2010 +04/02/2010 +05/02/2010 +06/02/2010 +07/02/2010 +08/02/2010 +09/02/2010 +10/02/2010 +11/02/2010 +12/02/2010 +13/02/2010 +14/02/2010 +15/02/2010 +16/02/2010 +17/02/2010 +18/02/2010 +19/02/2010 +20/02/2010 +21/02/2010 +22/02/2010 +23/02/2010 +24/02/2010 +25/02/2010 +26/02/2010 +27/02/2010 +28/02/2010 +01/03/2010 +02/03/2010 +03/03/2010 +04/03/2010 +05/03/2010 +06/03/2010 +07/03/2010 +08/03/2010 +09/03/2010 +10/03/2010 +11/03/2010 +12/03/2010 +13/03/2010 +14/03/2010 +15/03/2010 +16/03/2010 +17/03/2010 +18/03/2010 +19/03/2010 +20/03/2010 +21/03/2010 +22/03/2010 +23/03/2010 +24/03/2010 +25/03/2010 +26/03/2010 +27/03/2010 +28/03/2010 +29/03/2010 +30/03/2010 +31/03/2010 +01/04/2010 +02/04/2010 +03/04/2010 +04/04/2010 +05/04/2010 +06/04/2010 +07/04/2010 +08/04/2010 +09/04/2010 +10/04/2010 +11/04/2010 +12/04/2010 +13/04/2010 +14/04/2010 +15/04/2010 +16/04/2010 +17/04/2010 +18/04/2010 +19/04/2010 +20/04/2010 +21/04/2010 +22/04/2010 +23/04/2010 +24/04/2010 +25/04/2010 +26/04/2010 +27/04/2010 +28/04/2010 +29/04/2010 +30/04/2010 +01/05/2010 +02/05/2010 +03/05/2010 +04/05/2010 +05/05/2010 +06/05/2010 +07/05/2010 +08/05/2010 +09/05/2010 +10/05/2010 +11/05/2010 +12/05/2010 +13/05/2010 +14/05/2010 +15/05/2010 +16/05/2010 +17/05/2010 +18/05/2010 +19/05/2010 +20/05/2010 +21/05/2010 +22/05/2010 +23/05/2010 +24/05/2010 +25/05/2010 +26/05/2010 +27/05/2010 +28/05/2010 +29/05/2010 +30/05/2010 +31/05/2010 +01/06/2010 +02/06/2010 +03/06/2010 +04/06/2010 +05/06/2010 +06/06/2010 +07/06/2010 +08/06/2010 +09/06/2010 +10/06/2010 +11/06/2010 +12/06/2010 +13/06/2010 +14/06/2010 +15/06/2010 +16/06/2010 +17/06/2010 +18/06/2010 +19/06/2010 +20/06/2010 +21/06/2010 +22/06/2010 +23/06/2010 +24/06/2010 +25/06/2010 +26/06/2010 +27/06/2010 +28/06/2010 +29/06/2010 +30/06/2010 +01/07/2010 +02/07/2010 +03/07/2010 +04/07/2010 +05/07/2010 +06/07/2010 +07/07/2010 +08/07/2010 +09/07/2010 +10/07/2010 +11/07/2010 +12/07/2010 +13/07/2010 +14/07/2010 +15/07/2010 +16/07/2010 +17/07/2010 +18/07/2010 +19/07/2010 +20/07/2010 +21/07/2010 +22/07/2010 +23/07/2010 +24/07/2010 +25/07/2010 +26/07/2010 +27/07/2010 +28/07/2010 +29/07/2010 +30/07/2010 +31/07/2010 +01/08/2010 +02/08/2010 +03/08/2010 +04/08/2010 +05/08/2010 +06/08/2010 +07/08/2010 +08/08/2010 +09/08/2010 +10/08/2010 +11/08/2010 +12/08/2010 +13/08/2010 +14/08/2010 +15/08/2010 +16/08/2010 +17/08/2010 +18/08/2010 +19/08/2010 +20/08/2010 +21/08/2010 +22/08/2010 +23/08/2010 +24/08/2010 +25/08/2010 +26/08/2010 +27/08/2010 +28/08/2010 +29/08/2010 +30/08/2010 +31/08/2010 +01/09/2010 +02/09/2010 +03/09/2010 +04/09/2010 +05/09/2010 +06/09/2010 +07/09/2010 +08/09/2010 +09/09/2010 +10/09/2010 +11/09/2010 +12/09/2010 +13/09/2010 +14/09/2010 +15/09/2010 +16/09/2010 +17/09/2010 +18/09/2010 +19/09/2010 +20/09/2010 +21/09/2010 +22/09/2010 +23/09/2010 +24/09/2010 +25/09/2010 +26/09/2010 +27/09/2010 +28/09/2010 +29/09/2010 +30/09/2010 +01/10/2010 +02/10/2010 +03/10/2010 +04/10/2010 +05/10/2010 +06/10/2010 +07/10/2010 +08/10/2010 +09/10/2010 +10/10/2010 +11/10/2010 +12/10/2010 +13/10/2010 +14/10/2010 +15/10/2010 +16/10/2010 +17/10/2010 +18/10/2010 +19/10/2010 +20/10/2010 +21/10/2010 +22/10/2010 +23/10/2010 +24/10/2010 +25/10/2010 +26/10/2010 +27/10/2010 +28/10/2010 +29/10/2010 +30/10/2010 +31/10/2010 +01/11/2010 +02/11/2010 +03/11/2010 +04/11/2010 +05/11/2010 +06/11/2010 +07/11/2010 +08/11/2010 +09/11/2010 +10/11/2010 +11/11/2010 +12/11/2010 +13/11/2010 +14/11/2010 +15/11/2010 +16/11/2010 +17/11/2010 +18/11/2010 +19/11/2010 +20/11/2010 +21/11/2010 +22/11/2010 +23/11/2010 +24/11/2010 +25/11/2010 +26/11/2010 +27/11/2010 +28/11/2010 +29/11/2010 +30/11/2010 +01/12/2010 +02/12/2010 +03/12/2010 +04/12/2010 +05/12/2010 +06/12/2010 +07/12/2010 +08/12/2010 +09/12/2010 +10/12/2010 +11/12/2010 +12/12/2010 +13/12/2010 +14/12/2010 +15/12/2010 +16/12/2010 +17/12/2010 +18/12/2010 +19/12/2010 +20/12/2010 +21/12/2010 +22/12/2010 +23/12/2010 +24/12/2010 +25/12/2010 +26/12/2010 +27/12/2010 +28/12/2010 +29/12/2010 +30/12/2010 +31/12/2010 +01/01/2011 +02/01/2011 +03/01/2011 +04/01/2011 +05/01/2011 +06/01/2011 +07/01/2011 +08/01/2011 +09/01/2011 +10/01/2011 +11/01/2011 +12/01/2011 +13/01/2011 +14/01/2011 +15/01/2011 +16/01/2011 +17/01/2011 +18/01/2011 +19/01/2011 +20/01/2011 +21/01/2011 +22/01/2011 +23/01/2011 +24/01/2011 +25/01/2011 +26/01/2011 +27/01/2011 +28/01/2011 +29/01/2011 +30/01/2011 +31/01/2011 +01/02/2011 +02/02/2011 +03/02/2011 +04/02/2011 +05/02/2011 +06/02/2011 +07/02/2011 +08/02/2011 +09/02/2011 +10/02/2011 +11/02/2011 +12/02/2011 +13/02/2011 +14/02/2011 +15/02/2011 +16/02/2011 +17/02/2011 +18/02/2011 +19/02/2011 +20/02/2011 +21/02/2011 +22/02/2011 +23/02/2011 +24/02/2011 +25/02/2011 +26/02/2011 +27/02/2011 +28/02/2011 +01/03/2011 +02/03/2011 +03/03/2011 +04/03/2011 +05/03/2011 +06/03/2011 +07/03/2011 +08/03/2011 +09/03/2011 +10/03/2011 +11/03/2011 +12/03/2011 +13/03/2011 +14/03/2011 +15/03/2011 +16/03/2011 +17/03/2011 +18/03/2011 +19/03/2011 +20/03/2011 +21/03/2011 +22/03/2011 +23/03/2011 +24/03/2011 +25/03/2011 +26/03/2011 +27/03/2011 +28/03/2011 +29/03/2011 +30/03/2011 +31/03/2011 +01/04/2011 +02/04/2011 +03/04/2011 +04/04/2011 +05/04/2011 +06/04/2011 +07/04/2011 +08/04/2011 +09/04/2011 +10/04/2011 +11/04/2011 +12/04/2011 +13/04/2011 +14/04/2011 +15/04/2011 +16/04/2011 +17/04/2011 +18/04/2011 +19/04/2011 +20/04/2011 +21/04/2011 +22/04/2011 +23/04/2011 +24/04/2011 +25/04/2011 +26/04/2011 +27/04/2011 +28/04/2011 +29/04/2011 +30/04/2011 +01/05/2011 +02/05/2011 +03/05/2011 +04/05/2011 +05/05/2011 +06/05/2011 +07/05/2011 +08/05/2011 +09/05/2011 +10/05/2011 +11/05/2011 +12/05/2011 +13/05/2011 +14/05/2011 +15/05/2011 +16/05/2011 +17/05/2011 +18/05/2011 +19/05/2011 +20/05/2011 +21/05/2011 +22/05/2011 +23/05/2011 +24/05/2011 +25/05/2011 +26/05/2011 +27/05/2011 +28/05/2011 +29/05/2011 +30/05/2011 +31/05/2011 +01/06/2011 +02/06/2011 +03/06/2011 +04/06/2011 +05/06/2011 +06/06/2011 +07/06/2011 +08/06/2011 +09/06/2011 +10/06/2011 +11/06/2011 +12/06/2011 +13/06/2011 +14/06/2011 +15/06/2011 +16/06/2011 +17/06/2011 +18/06/2011 +19/06/2011 +20/06/2011 +21/06/2011 +22/06/2011 +23/06/2011 +24/06/2011 +25/06/2011 +26/06/2011 +27/06/2011 +28/06/2011 +29/06/2011 +30/06/2011 +01/07/2011 +02/07/2011 +03/07/2011 +04/07/2011 +05/07/2011 +06/07/2011 +07/07/2011 +08/07/2011 +09/07/2011 +10/07/2011 +11/07/2011 +12/07/2011 +13/07/2011 +14/07/2011 +15/07/2011 +16/07/2011 +17/07/2011 +18/07/2011 +19/07/2011 +20/07/2011 +21/07/2011 +22/07/2011 +23/07/2011 +24/07/2011 +25/07/2011 +26/07/2011 +27/07/2011 +28/07/2011 +29/07/2011 +30/07/2011 +31/07/2011 +01/08/2011 +02/08/2011 +03/08/2011 +04/08/2011 +05/08/2011 +06/08/2011 +07/08/2011 +08/08/2011 +09/08/2011 +10/08/2011 +11/08/2011 +12/08/2011 +13/08/2011 +14/08/2011 +15/08/2011 +16/08/2011 +17/08/2011 +18/08/2011 +19/08/2011 +20/08/2011 +21/08/2011 +22/08/2011 +23/08/2011 +24/08/2011 +25/08/2011 +26/08/2011 +27/08/2011 +28/08/2011 +29/08/2011 +30/08/2011 +31/08/2011 +01/09/2011 +02/09/2011 +03/09/2011 +04/09/2011 +05/09/2011 +06/09/2011 +07/09/2011 +08/09/2011 +09/09/2011 +10/09/2011 +11/09/2011 +12/09/2011 +13/09/2011 +14/09/2011 +15/09/2011 +16/09/2011 +17/09/2011 +18/09/2011 +19/09/2011 +20/09/2011 +21/09/2011 +22/09/2011 +23/09/2011 +24/09/2011 +25/09/2011 +26/09/2011 +27/09/2011 +28/09/2011 +29/09/2011 +30/09/2011 +01/10/2011 +02/10/2011 +03/10/2011 +04/10/2011 +05/10/2011 +06/10/2011 +07/10/2011 +08/10/2011 +09/10/2011 +10/10/2011 +11/10/2011 +12/10/2011 +13/10/2011 +14/10/2011 +15/10/2011 +16/10/2011 +17/10/2011 +18/10/2011 +19/10/2011 +20/10/2011 +21/10/2011 +22/10/2011 +23/10/2011 +24/10/2011 +25/10/2011 +26/10/2011 +27/10/2011 +28/10/2011 +29/10/2011 +30/10/2011 +31/10/2011 +01/11/2011 +02/11/2011 +03/11/2011 +04/11/2011 +05/11/2011 +06/11/2011 +07/11/2011 +08/11/2011 +09/11/2011 +10/11/2011 +11/11/2011 +12/11/2011 +13/11/2011 +14/11/2011 +15/11/2011 +16/11/2011 +17/11/2011 +18/11/2011 +19/11/2011 +20/11/2011 +21/11/2011 +22/11/2011 +23/11/2011 +24/11/2011 +25/11/2011 +26/11/2011 +27/11/2011 +28/11/2011 +29/11/2011 +30/11/2011 +01/12/2011 +02/12/2011 +03/12/2011 +04/12/2011 +05/12/2011 +06/12/2011 +07/12/2011 +08/12/2011 +09/12/2011 +10/12/2011 +11/12/2011 +12/12/2011 +13/12/2011 +14/12/2011 +15/12/2011 +16/12/2011 +17/12/2011 +18/12/2011 +19/12/2011 +20/12/2011 +21/12/2011 +22/12/2011 +23/12/2011 +24/12/2011 +25/12/2011 +26/12/2011 +27/12/2011 +28/12/2011 +29/12/2011 +30/12/2011 +31/12/2011 +01/01/2012 +02/01/2012 +03/01/2012 +04/01/2012 +05/01/2012 +06/01/2012 +07/01/2012 +08/01/2012 +09/01/2012 +10/01/2012 +11/01/2012 +12/01/2012 +13/01/2012 +14/01/2012 +15/01/2012 +16/01/2012 +17/01/2012 +18/01/2012 +19/01/2012 +20/01/2012 +21/01/2012 +22/01/2012 +23/01/2012 +24/01/2012 +25/01/2012 +26/01/2012 +27/01/2012 +28/01/2012 +29/01/2012 +30/01/2012 +31/01/2012 +01/02/2012 +02/02/2012 +03/02/2012 +04/02/2012 +05/02/2012 +06/02/2012 +07/02/2012 +08/02/2012 +09/02/2012 +10/02/2012 +11/02/2012 +12/02/2012 +13/02/2012 +14/02/2012 +15/02/2012 +16/02/2012 +17/02/2012 +18/02/2012 +19/02/2012 +20/02/2012 +21/02/2012 +22/02/2012 +23/02/2012 +24/02/2012 +25/02/2012 +26/02/2012 +27/02/2012 +28/02/2012 +29/02/2012 +01/03/2012 +02/03/2012 +03/03/2012 +04/03/2012 +05/03/2012 +06/03/2012 +07/03/2012 +08/03/2012 +09/03/2012 +10/03/2012 +11/03/2012 +12/03/2012 +13/03/2012 +14/03/2012 +15/03/2012 +16/03/2012 +17/03/2012 +18/03/2012 +19/03/2012 +20/03/2012 +21/03/2012 +22/03/2012 +23/03/2012 +24/03/2012 +25/03/2012 +26/03/2012 +27/03/2012 +28/03/2012 +29/03/2012 +30/03/2012 +31/03/2012 +01/04/2012 +02/04/2012 +03/04/2012 +04/04/2012 +05/04/2012 +06/04/2012 +07/04/2012 +08/04/2012 +09/04/2012 +10/04/2012 +11/04/2012 +12/04/2012 +13/04/2012 +14/04/2012 +15/04/2012 +16/04/2012 +17/04/2012 +18/04/2012 +19/04/2012 +20/04/2012 +21/04/2012 +22/04/2012 +23/04/2012 +24/04/2012 +25/04/2012 +26/04/2012 +27/04/2012 +28/04/2012 +29/04/2012 +30/04/2012 +01/05/2012 +02/05/2012 +03/05/2012 +04/05/2012 +05/05/2012 +06/05/2012 +07/05/2012 +08/05/2012 +09/05/2012 +10/05/2012 +11/05/2012 +12/05/2012 +13/05/2012 +14/05/2012 +15/05/2012 +16/05/2012 +17/05/2012 +18/05/2012 +19/05/2012 +20/05/2012 +21/05/2012 +22/05/2012 +23/05/2012 +24/05/2012 +25/05/2012 +26/05/2012 +27/05/2012 +28/05/2012 +29/05/2012 +30/05/2012 +31/05/2012 +01/06/2012 +02/06/2012 +03/06/2012 +04/06/2012 +05/06/2012 +06/06/2012 +07/06/2012 +08/06/2012 +09/06/2012 +10/06/2012 +11/06/2012 +12/06/2012 +13/06/2012 +14/06/2012 +15/06/2012 +16/06/2012 +17/06/2012 +18/06/2012 +19/06/2012 +20/06/2012 +21/06/2012 +22/06/2012 +23/06/2012 +24/06/2012 +25/06/2012 +26/06/2012 +27/06/2012 +28/06/2012 +29/06/2012 +30/06/2012 +01/07/2012 +02/07/2012 +03/07/2012 +04/07/2012 +05/07/2012 +06/07/2012 +07/07/2012 +08/07/2012 +09/07/2012 +10/07/2012 +11/07/2012 +12/07/2012 +13/07/2012 +14/07/2012 +15/07/2012 +16/07/2012 +17/07/2012 +18/07/2012 +19/07/2012 +20/07/2012 +21/07/2012 +22/07/2012 +23/07/2012 +24/07/2012 +25/07/2012 +26/07/2012 +27/07/2012 +28/07/2012 +29/07/2012 +30/07/2012 +31/07/2012 +01/08/2012 +02/08/2012 +03/08/2012 +04/08/2012 +05/08/2012 +06/08/2012 +07/08/2012 +08/08/2012 +09/08/2012 +10/08/2012 +11/08/2012 +12/08/2012 +13/08/2012 +14/08/2012 +15/08/2012 +16/08/2012 +17/08/2012 +18/08/2012 +19/08/2012 +20/08/2012 +21/08/2012 +22/08/2012 +23/08/2012 +24/08/2012 +25/08/2012 +26/08/2012 +27/08/2012 +28/08/2012 +29/08/2012 +30/08/2012 +31/08/2012 +01/09/2012 +02/09/2012 +03/09/2012 +04/09/2012 +05/09/2012 +06/09/2012 +07/09/2012 +08/09/2012 +09/09/2012 +10/09/2012 +11/09/2012 +12/09/2012 +13/09/2012 +14/09/2012 +15/09/2012 +16/09/2012 +17/09/2012 +18/09/2012 +19/09/2012 +20/09/2012 +21/09/2012 +22/09/2012 +23/09/2012 +24/09/2012 +25/09/2012 +26/09/2012 +27/09/2012 +28/09/2012 +29/09/2012 +30/09/2012 +01/10/2012 +02/10/2012 +03/10/2012 +04/10/2012 +05/10/2012 +06/10/2012 +07/10/2012 +08/10/2012 +09/10/2012 +10/10/2012 +11/10/2012 +12/10/2012 +13/10/2012 +14/10/2012 +15/10/2012 +16/10/2012 +17/10/2012 +18/10/2012 +19/10/2012 +20/10/2012 +21/10/2012 +22/10/2012 +23/10/2012 +24/10/2012 +25/10/2012 +26/10/2012 +27/10/2012 +28/10/2012 +29/10/2012 +30/10/2012 +31/10/2012 +01/11/2012 +02/11/2012 +03/11/2012 +04/11/2012 +05/11/2012 +06/11/2012 +07/11/2012 +08/11/2012 +09/11/2012 +10/11/2012 +11/11/2012 +12/11/2012 +13/11/2012 +14/11/2012 +15/11/2012 +16/11/2012 +17/11/2012 +18/11/2012 +19/11/2012 +20/11/2012 +21/11/2012 +22/11/2012 +23/11/2012 +24/11/2012 +25/11/2012 +26/11/2012 +27/11/2012 +28/11/2012 +29/11/2012 +30/11/2012 +01/12/2012 +02/12/2012 +03/12/2012 +04/12/2012 +05/12/2012 +06/12/2012 +07/12/2012 +08/12/2012 +09/12/2012 +10/12/2012 +11/12/2012 +12/12/2012 +13/12/2012 +14/12/2012 +15/12/2012 +16/12/2012 +17/12/2012 +18/12/2012 +19/12/2012 +20/12/2012 +21/12/2012 +22/12/2012 +23/12/2012 +24/12/2012 +25/12/2012 +26/12/2012 +27/12/2012 +28/12/2012 +29/12/2012 +30/12/2012 +31/12/2012 +01/01/2013 +02/01/2013 +03/01/2013 +04/01/2013 +05/01/2013 +06/01/2013 +07/01/2013 +08/01/2013 +09/01/2013 +10/01/2013 +11/01/2013 +12/01/2013 +13/01/2013 +14/01/2013 +15/01/2013 +16/01/2013 +17/01/2013 +18/01/2013 +19/01/2013 +20/01/2013 +21/01/2013 +22/01/2013 +23/01/2013 +24/01/2013 +25/01/2013 +26/01/2013 +27/01/2013 +28/01/2013 +29/01/2013 +30/01/2013 +31/01/2013 +01/02/2013 +02/02/2013 +03/02/2013 +04/02/2013 +05/02/2013 +06/02/2013 +07/02/2013 +08/02/2013 +09/02/2013 +10/02/2013 +11/02/2013 +12/02/2013 +13/02/2013 +14/02/2013 +15/02/2013 +16/02/2013 +17/02/2013 +18/02/2013 +19/02/2013 +20/02/2013 +21/02/2013 +22/02/2013 +23/02/2013 +24/02/2013 +25/02/2013 +26/02/2013 +27/02/2013 +28/02/2013 +01/03/2013 +02/03/2013 +03/03/2013 +04/03/2013 +05/03/2013 +06/03/2013 +07/03/2013 +08/03/2013 +09/03/2013 +10/03/2013 +11/03/2013 +12/03/2013 +13/03/2013 +14/03/2013 +15/03/2013 +16/03/2013 +17/03/2013 +18/03/2013 +19/03/2013 +20/03/2013 +21/03/2013 +22/03/2013 +23/03/2013 +24/03/2013 +25/03/2013 +26/03/2013 +27/03/2013 +28/03/2013 +29/03/2013 +30/03/2013 +31/03/2013 +01/04/2013 +02/04/2013 +03/04/2013 +04/04/2013 +05/04/2013 +06/04/2013 +07/04/2013 +08/04/2013 +09/04/2013 +10/04/2013 +11/04/2013 +12/04/2013 +13/04/2013 +14/04/2013 +15/04/2013 +16/04/2013 +17/04/2013 +18/04/2013 +19/04/2013 +20/04/2013 +21/04/2013 +22/04/2013 +23/04/2013 +24/04/2013 +25/04/2013 +26/04/2013 +27/04/2013 +28/04/2013 +29/04/2013 +30/04/2013 +01/05/2013 +02/05/2013 +03/05/2013 +04/05/2013 +05/05/2013 +06/05/2013 +07/05/2013 +08/05/2013 +09/05/2013 +10/05/2013 +11/05/2013 +12/05/2013 +13/05/2013 +14/05/2013 +15/05/2013 +16/05/2013 +17/05/2013 +18/05/2013 +19/05/2013 +20/05/2013 +21/05/2013 +22/05/2013 +23/05/2013 +24/05/2013 +25/05/2013 +26/05/2013 +27/05/2013 +28/05/2013 +29/05/2013 +30/05/2013 +31/05/2013 +01/06/2013 +02/06/2013 +03/06/2013 +04/06/2013 +05/06/2013 +06/06/2013 +07/06/2013 +08/06/2013 +09/06/2013 +10/06/2013 +11/06/2013 +12/06/2013 +13/06/2013 +14/06/2013 +15/06/2013 +16/06/2013 +17/06/2013 +18/06/2013 +19/06/2013 +20/06/2013 +21/06/2013 +22/06/2013 +23/06/2013 +24/06/2013 +25/06/2013 +26/06/2013 +27/06/2013 +28/06/2013 +29/06/2013 +30/06/2013 +01/07/2013 +02/07/2013 +03/07/2013 +04/07/2013 +05/07/2013 +06/07/2013 +07/07/2013 +08/07/2013 +09/07/2013 +10/07/2013 +11/07/2013 +12/07/2013 +13/07/2013 +14/07/2013 +15/07/2013 +16/07/2013 +17/07/2013 +18/07/2013 +19/07/2013 +20/07/2013 +21/07/2013 +22/07/2013 +23/07/2013 +24/07/2013 +25/07/2013 +26/07/2013 +27/07/2013 +28/07/2013 +29/07/2013 +30/07/2013 +31/07/2013 +01/08/2013 +02/08/2013 +03/08/2013 +04/08/2013 +05/08/2013 +06/08/2013 +07/08/2013 +08/08/2013 +09/08/2013 +10/08/2013 +11/08/2013 +12/08/2013 +13/08/2013 +14/08/2013 +15/08/2013 +16/08/2013 +17/08/2013 +18/08/2013 +19/08/2013 +20/08/2013 +21/08/2013 +22/08/2013 +23/08/2013 +24/08/2013 +25/08/2013 +26/08/2013 +27/08/2013 +28/08/2013 +29/08/2013 +30/08/2013 +31/08/2013 +01/09/2013 +02/09/2013 +03/09/2013 +04/09/2013 +05/09/2013 +06/09/2013 +07/09/2013 +08/09/2013 +09/09/2013 +10/09/2013 +11/09/2013 +12/09/2013 +13/09/2013 +14/09/2013 +15/09/2013 +16/09/2013 +17/09/2013 +18/09/2013 +19/09/2013 +20/09/2013 +21/09/2013 +22/09/2013 +23/09/2013 +24/09/2013 +25/09/2013 +26/09/2013 +27/09/2013 +28/09/2013 +29/09/2013 +30/09/2013 +01/10/2013 +02/10/2013 +03/10/2013 +04/10/2013 +05/10/2013 +06/10/2013 +07/10/2013 +08/10/2013 +09/10/2013 +10/10/2013 +11/10/2013 +12/10/2013 +13/10/2013 +14/10/2013 +15/10/2013 +16/10/2013 +17/10/2013 +18/10/2013 +19/10/2013 +20/10/2013 +21/10/2013 +22/10/2013 +23/10/2013 +24/10/2013 +25/10/2013 +26/10/2013 +27/10/2013 +28/10/2013 +29/10/2013 +30/10/2013 +31/10/2013 +01/11/2013 +02/11/2013 +03/11/2013 +04/11/2013 +05/11/2013 +06/11/2013 +07/11/2013 +08/11/2013 +09/11/2013 +10/11/2013 +11/11/2013 +12/11/2013 +13/11/2013 +14/11/2013 +15/11/2013 +16/11/2013 +17/11/2013 +18/11/2013 +19/11/2013 +20/11/2013 +21/11/2013 +22/11/2013 +23/11/2013 +24/11/2013 +25/11/2013 +26/11/2013 +27/11/2013 +28/11/2013 +29/11/2013 +30/11/2013 +01/12/2013 +02/12/2013 +03/12/2013 +04/12/2013 +05/12/2013 +06/12/2013 +07/12/2013 +08/12/2013 +09/12/2013 +10/12/2013 +11/12/2013 +12/12/2013 +13/12/2013 +14/12/2013 +15/12/2013 +16/12/2013 +17/12/2013 +18/12/2013 +19/12/2013 +20/12/2013 +21/12/2013 +22/12/2013 +23/12/2013 +24/12/2013 +25/12/2013 +26/12/2013 +27/12/2013 +28/12/2013 +29/12/2013 +30/12/2013 +31/12/2013 +01/01/2014 +02/01/2014 +03/01/2014 +04/01/2014 +05/01/2014 +06/01/2014 +07/01/2014 +08/01/2014 +09/01/2014 +10/01/2014 +11/01/2014 +12/01/2014 +13/01/2014 +14/01/2014 +15/01/2014 +16/01/2014 +17/01/2014 +18/01/2014 +19/01/2014 +20/01/2014 +21/01/2014 +22/01/2014 +23/01/2014 +24/01/2014 +25/01/2014 +26/01/2014 +27/01/2014 +28/01/2014 +29/01/2014 +30/01/2014 +31/01/2014 +01/02/2014 +02/02/2014 +03/02/2014 +04/02/2014 +05/02/2014 +06/02/2014 +07/02/2014 +08/02/2014 +09/02/2014 +10/02/2014 +11/02/2014 +12/02/2014 +13/02/2014 +14/02/2014 +15/02/2014 +16/02/2014 +17/02/2014 +18/02/2014 +19/02/2014 +20/02/2014 +21/02/2014 +22/02/2014 +23/02/2014 +24/02/2014 +25/02/2014 +26/02/2014 +27/02/2014 +28/02/2014 +01/03/2014 +02/03/2014 +03/03/2014 +04/03/2014 +05/03/2014 +06/03/2014 +07/03/2014 +08/03/2014 +09/03/2014 +10/03/2014 +11/03/2014 +12/03/2014 +13/03/2014 +14/03/2014 +15/03/2014 +16/03/2014 +17/03/2014 +18/03/2014 +19/03/2014 +20/03/2014 +21/03/2014 +22/03/2014 +23/03/2014 +24/03/2014 +25/03/2014 +26/03/2014 +27/03/2014 +28/03/2014 +29/03/2014 +30/03/2014 +31/03/2014 +01/04/2014 +02/04/2014 +03/04/2014 +04/04/2014 +05/04/2014 +06/04/2014 +07/04/2014 +08/04/2014 +09/04/2014 +10/04/2014 +11/04/2014 +12/04/2014 +13/04/2014 +14/04/2014 +15/04/2014 +16/04/2014 +17/04/2014 +18/04/2014 +19/04/2014 +20/04/2014 +21/04/2014 +22/04/2014 +23/04/2014 +24/04/2014 +25/04/2014 +26/04/2014 +27/04/2014 +28/04/2014 +29/04/2014 +30/04/2014 +01/05/2014 +02/05/2014 +03/05/2014 +04/05/2014 +05/05/2014 +06/05/2014 +07/05/2014 +08/05/2014 +09/05/2014 +10/05/2014 +11/05/2014 +12/05/2014 +13/05/2014 +14/05/2014 +15/05/2014 +16/05/2014 +17/05/2014 +18/05/2014 +19/05/2014 +20/05/2014 +21/05/2014 +22/05/2014 +23/05/2014 +24/05/2014 +25/05/2014 +26/05/2014 +27/05/2014 +28/05/2014 +29/05/2014 +30/05/2014 +31/05/2014 +01/06/2014 +02/06/2014 +03/06/2014 +04/06/2014 +05/06/2014 +06/06/2014 +07/06/2014 +08/06/2014 +09/06/2014 +10/06/2014 +11/06/2014 +12/06/2014 +13/06/2014 +14/06/2014 +15/06/2014 +16/06/2014 +17/06/2014 +18/06/2014 +19/06/2014 +20/06/2014 +21/06/2014 +22/06/2014 +23/06/2014 +24/06/2014 +25/06/2014 +26/06/2014 +27/06/2014 +28/06/2014 +29/06/2014 +30/06/2014 +01/07/2014 +02/07/2014 +03/07/2014 +04/07/2014 +05/07/2014 +06/07/2014 +07/07/2014 +08/07/2014 +09/07/2014 +10/07/2014 +11/07/2014 +12/07/2014 +13/07/2014 +14/07/2014 +15/07/2014 +16/07/2014 +17/07/2014 +18/07/2014 +19/07/2014 +20/07/2014 +21/07/2014 +22/07/2014 +23/07/2014 +24/07/2014 +25/07/2014 +26/07/2014 +27/07/2014 +28/07/2014 +29/07/2014 +30/07/2014 +31/07/2014 +01/08/2014 +02/08/2014 +03/08/2014 +04/08/2014 +05/08/2014 +06/08/2014 +07/08/2014 +08/08/2014 +09/08/2014 +10/08/2014 +11/08/2014 +12/08/2014 +13/08/2014 +14/08/2014 +15/08/2014 +16/08/2014 +17/08/2014 +18/08/2014 +19/08/2014 +20/08/2014 +21/08/2014 +22/08/2014 +23/08/2014 +24/08/2014 +25/08/2014 +26/08/2014 +27/08/2014 +28/08/2014 +29/08/2014 +30/08/2014 +31/08/2014 +01/09/2014 +02/09/2014 +03/09/2014 +04/09/2014 +05/09/2014 +06/09/2014 +07/09/2014 +08/09/2014 +09/09/2014 +10/09/2014 +11/09/2014 +12/09/2014 +13/09/2014 +14/09/2014 +15/09/2014 +16/09/2014 +17/09/2014 +18/09/2014 +19/09/2014 +20/09/2014 +21/09/2014 +22/09/2014 +23/09/2014 +24/09/2014 +25/09/2014 +26/09/2014 +27/09/2014 +28/09/2014 +29/09/2014 +30/09/2014 +01/10/2014 +02/10/2014 +03/10/2014 +04/10/2014 +05/10/2014 +06/10/2014 +07/10/2014 +08/10/2014 +09/10/2014 +10/10/2014 +11/10/2014 +12/10/2014 +13/10/2014 +14/10/2014 +15/10/2014 +16/10/2014 +17/10/2014 +18/10/2014 +19/10/2014 +20/10/2014 +21/10/2014 +22/10/2014 +23/10/2014 +24/10/2014 +25/10/2014 +26/10/2014 +27/10/2014 +28/10/2014 +29/10/2014 +30/10/2014 +31/10/2014 +01/11/2014 +02/11/2014 +03/11/2014 +04/11/2014 +05/11/2014 +06/11/2014 +07/11/2014 +08/11/2014 +09/11/2014 +10/11/2014 +11/11/2014 +12/11/2014 +13/11/2014 +14/11/2014 +15/11/2014 +16/11/2014 +17/11/2014 +18/11/2014 +19/11/2014 +20/11/2014 +21/11/2014 +22/11/2014 +23/11/2014 +24/11/2014 +25/11/2014 +26/11/2014 +27/11/2014 +28/11/2014 +29/11/2014 +30/11/2014 +01/12/2014 +02/12/2014 +03/12/2014 +04/12/2014 +05/12/2014 +06/12/2014 +07/12/2014 +08/12/2014 +09/12/2014 +10/12/2014 +11/12/2014 +12/12/2014 +13/12/2014 +14/12/2014 +15/12/2014 +16/12/2014 +17/12/2014 +18/12/2014 +19/12/2014 +20/12/2014 +21/12/2014 +22/12/2014 +23/12/2014 +24/12/2014 +25/12/2014 +26/12/2014 +27/12/2014 +28/12/2014 +29/12/2014 +30/12/2014 +31/12/2014 +01/01/2015 +02/01/2015 +03/01/2015 +04/01/2015 +05/01/2015 +06/01/2015 +07/01/2015 +08/01/2015 +09/01/2015 +10/01/2015 +11/01/2015 +12/01/2015 +13/01/2015 +14/01/2015 +15/01/2015 +16/01/2015 +17/01/2015 +18/01/2015 +19/01/2015 +20/01/2015 +21/01/2015 +22/01/2015 +23/01/2015 +24/01/2015 +25/01/2015 +26/01/2015 +27/01/2015 +28/01/2015 +29/01/2015 +30/01/2015 +31/01/2015 +01/02/2015 +02/02/2015 +03/02/2015 +04/02/2015 +05/02/2015 +06/02/2015 +07/02/2015 +08/02/2015 +09/02/2015 +10/02/2015 +11/02/2015 +12/02/2015 +13/02/2015 +14/02/2015 +15/02/2015 +16/02/2015 +17/02/2015 +18/02/2015 +19/02/2015 +20/02/2015 +21/02/2015 +22/02/2015 +23/02/2015 +24/02/2015 +25/02/2015 +26/02/2015 +27/02/2015 +28/02/2015 +01/03/2015 +02/03/2015 +03/03/2015 +04/03/2015 +05/03/2015 +06/03/2015 +07/03/2015 +08/03/2015 +09/03/2015 +10/03/2015 +11/03/2015 +12/03/2015 +13/03/2015 +14/03/2015 +15/03/2015 +16/03/2015 +17/03/2015 +18/03/2015 +19/03/2015 +20/03/2015 +21/03/2015 +22/03/2015 +23/03/2015 +24/03/2015 +25/03/2015 +26/03/2015 +27/03/2015 +28/03/2015 +29/03/2015 +30/03/2015 +31/03/2015 +01/04/2015 +02/04/2015 +03/04/2015 +04/04/2015 +05/04/2015 +06/04/2015 +07/04/2015 +08/04/2015 +09/04/2015 +10/04/2015 +11/04/2015 +12/04/2015 +13/04/2015 +14/04/2015 +15/04/2015 +16/04/2015 +17/04/2015 +18/04/2015 +19/04/2015 +20/04/2015 +21/04/2015 +22/04/2015 +23/04/2015 +24/04/2015 +25/04/2015 +26/04/2015 +27/04/2015 +28/04/2015 +29/04/2015 +30/04/2015 +01/05/2015 +02/05/2015 +03/05/2015 +04/05/2015 +05/05/2015 +06/05/2015 +07/05/2015 +08/05/2015 +09/05/2015 +10/05/2015 +11/05/2015 +12/05/2015 +13/05/2015 +14/05/2015 +15/05/2015 +16/05/2015 +17/05/2015 +18/05/2015 +19/05/2015 +20/05/2015 +21/05/2015 +22/05/2015 +23/05/2015 +24/05/2015 +25/05/2015 +26/05/2015 +27/05/2015 +28/05/2015 +29/05/2015 +30/05/2015 +31/05/2015 +01/06/2015 +02/06/2015 +03/06/2015 +04/06/2015 +05/06/2015 +06/06/2015 +07/06/2015 +08/06/2015 +09/06/2015 +10/06/2015 +11/06/2015 +12/06/2015 +13/06/2015 +14/06/2015 +15/06/2015 +16/06/2015 +17/06/2015 +18/06/2015 +19/06/2015 +20/06/2015 +21/06/2015 +22/06/2015 +23/06/2015 diff --git a/tests/everest/test_data/snake_oil/everest/input/rng/SEED b/tests/everest/test_data/snake_oil/everest/input/rng/SEED new file mode 100644 index 00000000000..11050e0f2e6 --- /dev/null +++ b/tests/everest/test_data/snake_oil/everest/input/rng/SEED @@ -0,0 +1 @@ +67 -110 42 -42 106 34 96 0 18 42 76 -69 44 -40 -78 -61 diff --git a/tests/everest/test_data/snake_oil/everest/input/templates/seed_template.txt b/tests/everest/test_data/snake_oil/everest/input/templates/seed_template.txt new file mode 100644 index 00000000000..ffb09e75fa4 --- /dev/null +++ b/tests/everest/test_data/snake_oil/everest/input/templates/seed_template.txt @@ -0,0 +1 @@ +SEED: diff --git a/tests/everest/test_data/snake_oil/everest/input/templates/sigma.tmpl b/tests/everest/test_data/snake_oil/everest/input/templates/sigma.tmpl new file mode 100755 index 00000000000..c74ab800ed0 --- /dev/null +++ b/tests/everest/test_data/snake_oil/everest/input/templates/sigma.tmpl @@ -0,0 +1,2 @@ +SIGMA + / diff --git a/tests/everest/test_data/snake_oil/everest/model/snake_oil.yml b/tests/everest/test_data/snake_oil/everest/model/snake_oil.yml new file mode 100644 index 00000000000..edea5f042aa --- /dev/null +++ b/tests/everest/test_data/snake_oil/everest/model/snake_oil.yml @@ -0,0 +1,60 @@ +definitions: + eclbase: eclipse/ECL + +wells: + - {name: W1} + - {name: W2} + - {name: W3} + - {name: W4} + +controls: + - + name: group + type: well_control + min: 0 + max: 1 + variables: + - + name: W1 + initial_guess: 0 + - + name: W2 + initial_guess: 0 + - + name: W3 + initial_guess: 1 + - + name: W4 + initial_guess: 1 + +objective_functions: + - + name: snake_oil_nvp + +install_jobs: + - + name: snake_oil_diff + source: ../../jobs/SNAKE_OIL_DIFF + - + name: snake_oil_simulator + source: ../../jobs/SNAKE_OIL_SIMULATOR + - + name: snake_oil_npv + source: ../../jobs/SNAKE_OIL_NPV + +optimization: + algorithm: optpp_q_newton + +simulator: + max_runtime: 3600 + +environment: + simulation_folder: simulations + +model: + realizations: [0] + +forward_model: + - snake_oil_simulator + - snake_oil_npv + - snake_oil_diff diff --git a/tests/everest/test_data/snake_oil/everest/model/snake_oil_all.yml b/tests/everest/test_data/snake_oil/everest/model/snake_oil_all.yml new file mode 100644 index 00000000000..b85ff6305da --- /dev/null +++ b/tests/everest/test_data/snake_oil/everest/model/snake_oil_all.yml @@ -0,0 +1,93 @@ +# A version of snake_oil.yml where all level one keys are added +definitions: + scratch: /tmp/everest/super/scratch + eclbase: model/SNAKE_OIL + +wells: + - {name: W1} + - {name: W2} + - {name: W3} + - {name: W4} + +controls: + - + name: group + type: well_control + min: 0 + max: 1 + variables: + - + name: W1 + initial_guess: 0 + - + name: W2 + initial_guess: 0 + - + name: W3 + initial_guess: 1 + - + name: W4 + initial_guess: 1 + - + name: super_scalars + type: generic_control + variables: + - + name: gravity + initial_guess: 9.81 + min: 0 + max: 1000 + +objective_functions: + - + name: snake_oil_nvp + +input_constraints: + - + target: 1.0 + weights: + group.W1: 1 + group.W2: 1 + group.W3: 1 + group.W4: 1 + +install_jobs: + - + name: snake_oil_diff + source: ../../jobs/SNAKE_OIL_DIFF + - + name: snake_oil_simulator + source: ../../jobs/SNAKE_OIL_SIMULATOR + - + name: snake_oil_npv + source: ../../jobs/SNAKE_OIL_NPV + +install_data: + - + source: ../../eclipse/include/grid/CASE.EGRID + target: MY_GRID.EGRID + - + source: ../../eclipse/model/SNAKE_OIL.DATA + target: SNAKE_OIL.DATA + +optimization: + algorithm: optpp_q_newton + +environment: + simulation_folder: r{{ scratch }}/simulations + +simulator: + queue_system: lsf + cores: 3 + name: mr + resubmit_limit: 17 + options: span = 1 && select[x86 and GNU/Linux] + server: lx-fastserver01 + +model: + realizations: [0, 1, 2] + +forward_model: + - snake_oil_simulator + - snake_oil_npv + - snake_oil_diff diff --git a/tests/everest/test_data/snake_oil/everest/model/snake_oil_slurm.yml b/tests/everest/test_data/snake_oil/everest/model/snake_oil_slurm.yml new file mode 100644 index 00000000000..650c460a9c9 --- /dev/null +++ b/tests/everest/test_data/snake_oil/everest/model/snake_oil_slurm.yml @@ -0,0 +1,65 @@ +definitions: + eclbase: eclipse/ECL + +wells: + - {name: W1} + - {name: W2} + - {name: W3} + - {name: W4} + +controls: + - + name: group + type: well_control + min: 0 + max: 1 + variables: + - + name: W1 + initial_guess: 0 + - + name: W2 + initial_guess: 0 + - + name: W3 + initial_guess: 1 + - + name: W4 + initial_guess: 1 + +objective_functions: + - + name: snake_oil_nvp + +install_jobs: + - + name: snake_oil_diff + source: ../../jobs/SNAKE_OIL_DIFF + - + name: snake_oil_simulator + source: ../../jobs/SNAKE_OIL_SIMULATOR + - + name: snake_oil_npv + source: ../../jobs/SNAKE_OIL_NPV + +optimization: + algorithm: optpp_q_newton + +simulator: + max_runtime: 3600 + queue_system: slurm + name: default-queue + max_memory: 1000M + exclude_host: "host1,host2,host3,host4" + include_host: "host5,host6,host7,host8" + +environment: + simulation_folder: simulations + +model: + realizations: [0] + +forward_model: + - snake_oil_simulator + - snake_oil_npv + - snake_oil_diff diff --git a/tests/everest/test_data/snake_oil/jobs/SNAKE_OIL_DIFF b/tests/everest/test_data/snake_oil/jobs/SNAKE_OIL_DIFF new file mode 100755 index 00000000000..9f85b01110f --- /dev/null +++ b/tests/everest/test_data/snake_oil/jobs/SNAKE_OIL_DIFF @@ -0,0 +1,4 @@ +STDOUT snake_oil_diff.stdout +STDERR snake_oil_diff.stderr + +EXECUTABLE snake_oil_diff.py diff --git a/tests/everest/test_data/snake_oil/jobs/SNAKE_OIL_NPV b/tests/everest/test_data/snake_oil/jobs/SNAKE_OIL_NPV new file mode 100755 index 00000000000..7ba667a9c55 --- /dev/null +++ b/tests/everest/test_data/snake_oil/jobs/SNAKE_OIL_NPV @@ -0,0 +1,4 @@ +STDOUT snake_oil_npv.stdout +STDERR snake_oil_npv.stderr + +EXECUTABLE snake_oil_npv.py diff --git a/tests/everest/test_data/snake_oil/jobs/SNAKE_OIL_SIMULATOR b/tests/everest/test_data/snake_oil/jobs/SNAKE_OIL_SIMULATOR new file mode 100755 index 00000000000..5eaab974f5f --- /dev/null +++ b/tests/everest/test_data/snake_oil/jobs/SNAKE_OIL_SIMULATOR @@ -0,0 +1,4 @@ +STDOUT snake_oil.stdout +STDERR snake_oil.stderr + +EXECUTABLE snake_oil_simulator.py diff --git a/tests/everest/test_data/snake_oil/jobs/seed.txt b/tests/everest/test_data/snake_oil/jobs/seed.txt new file mode 100644 index 00000000000..a88ef2a30dd --- /dev/null +++ b/tests/everest/test_data/snake_oil/jobs/seed.txt @@ -0,0 +1 @@ +SEED:268776 diff --git a/tests/everest/test_data/snake_oil/jobs/snake_oil_diff.py b/tests/everest/test_data/snake_oil/jobs/snake_oil_diff.py new file mode 100755 index 00000000000..2bf3c2cc092 --- /dev/null +++ b/tests/everest/test_data/snake_oil/jobs/snake_oil_diff.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python +from resdata.summary import Summary + + +def writeDiff(filename, vector1, vector2): + with open(filename, "w", encoding="utf-8") as f: + for index in range(len(vector1)): + node1 = vector1[index] + node2 = vector2[index] + + diff = node1.value - node2.value + f.write("%f\n" % diff) + + +if __name__ == "__main__": + summary = Summary("SNAKE_OIL_FIELD") + + report_step = 199 + writeDiff( + "snake_oil_opr_diff_%d.txt" % report_step, + summary["WOPR:OP1"], + summary["WOPR:OP2"], + ) + writeDiff( + "snake_oil_wpr_diff_%d.txt" % report_step, + summary["WWPR:OP1"], + summary["WWPR:OP2"], + ) + writeDiff( + "snake_oil_gpr_diff_%d.txt" % report_step, + summary["WGPR:OP1"], + summary["WGPR:OP2"], + ) diff --git a/tests/everest/test_data/snake_oil/jobs/snake_oil_npv.py b/tests/everest/test_data/snake_oil/jobs/snake_oil_npv.py new file mode 100755 index 00000000000..fb6ef338e55 --- /dev/null +++ b/tests/everest/test_data/snake_oil/jobs/snake_oil_npv.py @@ -0,0 +1,104 @@ +#!/usr/bin/env python +from resdata.summary import Summary + +OIL_PRICES = { + "2010-01-01": 78.33, + "2010-02-01": 76.39, + "2010-03-01": 81.20, + "2010-04-01": 84.29, + "2010-05-01": 73.74, + "2010-06-01": 75.34, + "2010-07-01": 76.32, + "2010-08-01": 76.60, + "2010-09-01": 75.24, + "2010-10-01": 81.89, + "2010-11-01": 84.25, + "2010-12-01": 89.15, + "2011-01-01": 89.17, + "2011-02-01": 88.58, + "2011-03-01": 102.86, + "2011-04-01": 109.53, + "2011-05-01": 100.90, + "2011-06-01": 96.26, + "2011-07-01": 97.30, + "2011-08-01": 86.33, + "2011-09-01": 85.52, + "2011-10-01": 86.32, + "2011-11-01": 97.16, + "2011-12-01": 98.56, + "2012-01-01": 100.27, + "2012-02-01": 102.20, + "2012-03-01": 106.16, + "2012-04-01": 103.32, + "2012-05-01": 94.65, + "2012-06-01": 82.30, + "2012-07-01": 87.90, + "2012-08-01": 94.13, + "2012-09-01": 94.51, + "2012-10-01": 89.49, + "2012-11-01": 86.53, + "2012-12-01": 87.86, + "2013-01-01": 94.76, + "2013-02-01": 95.31, + "2013-03-01": 92.94, + "2013-04-01": 92.02, + "2013-05-01": 94.51, + "2013-06-01": 95.77, + "2013-07-01": 104.67, + "2013-08-01": 106.57, + "2013-09-01": 106.29, + "2013-10-01": 100.54, + "2013-11-01": 93.86, + "2013-12-01": 97.63, + "2014-01-01": 94.62, + "2014-02-01": 100.82, + "2014-03-01": 100.80, + "2014-04-01": 102.07, + "2014-05-01": 102.18, + "2014-06-01": 105.79, + "2014-07-01": 103.59, + "2014-08-01": 96.54, + "2014-09-01": 93.21, + "2014-10-01": 84.40, + "2014-11-01": 75.79, + "2014-12-01": 59.29, + "2015-01-01": 47.22, + "2015-02-01": 50.58, + "2015-03-01": 47.82, + "2015-04-01": 54.45, + "2015-05-01": 59.27, + "2015-06-01": 59.82, + "2015-07-01": 50.90, + "2015-08-01": 42.87, + "2015-09-01": 45.48, +} + +if __name__ == "__main__": + summary = Summary("SNAKE_OIL_FIELD") + start_time = summary.get_start_time() + date_ranges = summary.time_range(start_time, interval="1M") + production_sums = summary.blocked_production("FOPT", date_ranges) + + npv = 0.0 + for index in range(0, len(date_ranges) - 1): + date = date_ranges[index + 1] # end of period + production_sum = production_sums[index] + + oil_price = OIL_PRICES[date.date().strftime("%Y-%m-%d")] + + production_value = oil_price * production_sum + npv += production_value + + with open("snake_oil_npv.txt", "w", encoding="utf-8") as output_file: + output_file.write("NPV %s\n" % npv) + + if npv < 80000: + rating = "POOR" + elif 80000 <= npv < 100000: + rating = "AVERAGE" + elif 100000 <= npv < 120000: + rating = "GOOD" + else: + rating = "EXCELLENT" + + output_file.write("RATING %s\n" % rating) diff --git a/tests/everest/test_data/snake_oil/jobs/snake_oil_params.txt b/tests/everest/test_data/snake_oil/jobs/snake_oil_params.txt new file mode 100644 index 00000000000..3868522924c --- /dev/null +++ b/tests/everest/test_data/snake_oil/jobs/snake_oil_params.txt @@ -0,0 +1,10 @@ +OP1_PERSISTENCE:0.15 +OP1_OCTAVES:4 +OP1_DIVERGENCE_SCALE:0.5 +OP1_OFFSET:0.0 +OP2_PERSISTENCE:0.25 +OP2_OCTAVES:7.0 +OP2_DIVERGENCE_SCALE:1.0 +OP2_OFFSET:0.0 +BPR_555_PERSISTENCE:0.25 +BPR_138_PERSISTENCE:0.35 diff --git a/tests/everest/test_data/snake_oil/jobs/snake_oil_simulator.py b/tests/everest/test_data/snake_oil/jobs/snake_oil_simulator.py new file mode 100755 index 00000000000..ed067ae1ebb --- /dev/null +++ b/tests/everest/test_data/snake_oil/jobs/snake_oil_simulator.py @@ -0,0 +1,189 @@ +#!/usr/bin/env python +from datetime import datetime + +from oil_reservoir_synthesizer import OilSimulator +from resdata.summary import Summary + + +def globalIndex(i, j, k, nx=10, ny=10, nz=10): + return i + nx * (j - 1) + nx * ny * (k - 1) + + +def readParameters(filename): + params = {} + with open(filename, "r", encoding="utf-8") as f: + for line in f: + key, value = line.split(":", 1) + params[key] = value.strip() + + return params + + +def runSimulator(simulator, history_simulator, time_step_count): + """@rtype: Summary""" + res_sum = Summary.writer("SNAKE_OIL_FIELD", datetime(2010, 1, 1), 10, 10, 10) + + res_sum.add_variable("FOPT") + res_sum.add_variable("FOPR") + res_sum.add_variable("FGPT") + res_sum.add_variable("FGPR") + res_sum.add_variable("FWPT") + res_sum.add_variable("FWPR") + res_sum.add_variable("FGOR") + res_sum.add_variable("FWCT") + + res_sum.add_variable("FOPTH") + res_sum.add_variable("FOPRH") + res_sum.add_variable("FGPTH") + res_sum.add_variable("FGPRH") + res_sum.add_variable("FWPTH") + res_sum.add_variable("FWPRH") + res_sum.add_variable("FGORH") + res_sum.add_variable("FWCTH") + + res_sum.add_variable("WOPR", wgname="OP1") + res_sum.add_variable("WOPR", wgname="OP2") + res_sum.add_variable("WWPR", wgname="OP1") + res_sum.add_variable("WWPR", wgname="OP2") + res_sum.add_variable("WGPR", wgname="OP1") + res_sum.add_variable("WGPR", wgname="OP2") + res_sum.add_variable("WGOR", wgname="OP1") + res_sum.add_variable("WGOR", wgname="OP2") + res_sum.add_variable("WWCT", wgname="OP1") + res_sum.add_variable("WWCT", wgname="OP2") + + res_sum.add_variable("WOPRH", wgname="OP1") + res_sum.add_variable("WOPRH", wgname="OP2") + res_sum.add_variable("WWPRH", wgname="OP1") + res_sum.add_variable("WWPRH", wgname="OP2") + res_sum.add_variable("WGPRH", wgname="OP1") + res_sum.add_variable("WGPRH", wgname="OP2") + res_sum.add_variable("WGORH", wgname="OP1") + res_sum.add_variable("WGORH", wgname="OP2") + res_sum.add_variable("WWCTH", wgname="OP1") + res_sum.add_variable("WWCTH", wgname="OP2") + + res_sum.add_variable("BPR", num=globalIndex(5, 5, 5)) + res_sum.add_variable("BPR", num=globalIndex(1, 3, 8)) + + time_map = [] + mini_step_count = 10 + total_step_count = time_step_count * mini_step_count + + for report_step in range(time_step_count): + for mini_step in range(mini_step_count): + t_step = res_sum.add_t_step( + report_step + 1, sim_days=report_step * mini_step_count + mini_step + ) + + time_map.append(t_step.get_sim_time().datetime().strftime("%d/%m/%Y")) + + simulator.step(scale=1.0 / total_step_count) + history_simulator.step(scale=1.0 / total_step_count) + + t_step["FOPR"] = simulator.fopr() + t_step["FOPT"] = simulator.fopt() + t_step["FGPR"] = simulator.fgpr() + t_step["FGPT"] = simulator.fgpt() + t_step["FWPR"] = simulator.fwpr() + t_step["FWPT"] = simulator.fwpt() + t_step["FGOR"] = simulator.fgor() + t_step["FWCT"] = simulator.fwct() + + t_step["WOPR:OP1"] = simulator.opr("OP1") + t_step["WOPR:OP2"] = simulator.opr("OP2") + + t_step["WGPR:OP1"] = simulator.gpr("OP1") + t_step["WGPR:OP2"] = simulator.gpr("OP2") + + t_step["WWPR:OP1"] = simulator.wpr("OP1") + t_step["WWPR:OP2"] = simulator.wpr("OP2") + + t_step["WGOR:OP1"] = simulator.gor("OP1") + t_step["WGOR:OP2"] = simulator.gor("OP2") + + t_step["WWCT:OP1"] = simulator.wct("OP1") + t_step["WWCT:OP2"] = simulator.wct("OP2") + + t_step["BPR:5,5,5"] = simulator.bpr("5,5,5") + t_step["BPR:1,3,8"] = simulator.bpr("1,3,8") + + t_step["FOPRH"] = history_simulator.fopr() + t_step["FOPTH"] = history_simulator.fopt() + t_step["FGPRH"] = history_simulator.fgpr() + t_step["FGPTH"] = history_simulator.fgpt() + t_step["FWPRH"] = history_simulator.fwpr() + t_step["FWPTH"] = history_simulator.fwpt() + t_step["FGORH"] = history_simulator.fgor() + t_step["FWCTH"] = history_simulator.fwct() + + t_step["WOPRH:OP1"] = history_simulator.opr("OP1") + t_step["WOPRH:OP2"] = history_simulator.opr("OP2") + + t_step["WGPRH:OP1"] = history_simulator.gpr("OP1") + t_step["WGPRH:OP2"] = history_simulator.gpr("OP2") + + t_step["WWPRH:OP1"] = history_simulator.wpr("OP1") + t_step["WWPRH:OP2"] = history_simulator.wpr("OP2") + + t_step["WGORH:OP1"] = history_simulator.gor("OP1") + t_step["WGORH:OP2"] = history_simulator.gor("OP2") + + t_step["WWCTH:OP1"] = history_simulator.wct("OP1") + t_step["WWCTH:OP2"] = history_simulator.wct("OP2") + + return res_sum, time_map + + +def roundedInt(value): + return int(round(float(value))) + + +if __name__ == "__main__": + seed = int(readParameters("seed.txt")["SEED"]) + parameters = readParameters("snake_oil_params.txt") + + op1_divergence_scale = float(parameters["OP1_DIVERGENCE_SCALE"]) + op2_divergence_scale = float(parameters["OP2_DIVERGENCE_SCALE"]) + op1_persistence = float(parameters["OP1_PERSISTENCE"]) + op2_persistence = float(parameters["OP2_PERSISTENCE"]) + op1_offset = float(parameters["OP1_OFFSET"]) + op2_offset = float(parameters["OP2_OFFSET"]) + bpr_138_persistence = float(parameters["BPR_138_PERSISTENCE"]) + bpr_555_persistence = float(parameters["BPR_555_PERSISTENCE"]) + + op1_octaves = roundedInt(parameters["OP1_OCTAVES"]) + op2_octaves = roundedInt(parameters["OP2_OCTAVES"]) + + simulator = OilSimulator() + simulator.addWell( + "OP1", + seed * 997, + persistence=op1_persistence, + octaves=op1_octaves, + divergence_scale=op1_divergence_scale, + offset=op1_offset, + ) + simulator.addWell( + "OP2", + seed * 13, + persistence=op2_persistence, + octaves=op2_octaves, + divergence_scale=op2_divergence_scale, + offset=op2_offset, + ) + simulator.addBlock("5,5,5", seed * 37, persistence=bpr_555_persistence) + simulator.addBlock("1,3,8", seed * 31, persistence=bpr_138_persistence) + + history_simulator = OilSimulator() + history_simulator.addWell("OP1", 222118781) + history_simulator.addWell("OP2", 118116362) + + report_step_count = 200 + summary, time_map = runSimulator(simulator, history_simulator, report_step_count) + + summary.fwrite() + + with open("time_map.txt", "w", encoding="utf-8") as f: + for t in time_map: + f.write("%s\n" % t) diff --git a/tests/everest/test_data/spe1case/realization-0/eclipse/model/SPE1.DATA b/tests/everest/test_data/spe1case/realization-0/eclipse/model/SPE1.DATA new file mode 120000 index 00000000000..d68b14f92e6 --- /dev/null +++ b/tests/everest/test_data/spe1case/realization-0/eclipse/model/SPE1.DATA @@ -0,0 +1 @@ +../../../../eclipse/SPE1.DATA \ No newline at end of file diff --git a/tests/everest/test_data/templating/cached_results_config/seba.db b/tests/everest/test_data/templating/cached_results_config/seba.db new file mode 100644 index 00000000000..e79f9956b53 Binary files /dev/null and b/tests/everest/test_data/templating/cached_results_config/seba.db differ diff --git a/tests/everest/test_data/templating/config.yml b/tests/everest/test_data/templating/config.yml new file mode 100644 index 00000000000..b00ffcd1d19 --- /dev/null +++ b/tests/everest/test_data/templating/config.yml @@ -0,0 +1,42 @@ +wells: + - { name: PROD1, drill_time: 30 } + - { name: PROD2, drill_time: 60 } + +controls: + - + name: well_drill + type: well_control + min: 0 + max: 1 + variables: + - { name: PROD1, initial_guess: 1 } + - { name: PROD2, initial_guess: 0.9 } + + +objective_functions: + - + name: objectf_by_tmpl + + +optimization: + algorithm: conmin_mfd + max_iterations: 1 + + +model: + realizations: [0] + +environment: + output_folder: everest_output + simulation_folder: simulations_by_templating + log_level: debug + random_seed: 123 + + +install_templates: + - + template: /templates/well_drill_info.tmpl + output_file: well_drill_info + - + template: /templates/the_optimal_template.tmpl + output_file: objectf_by_tmpl diff --git a/tests/everest/test_data/templating/templates/dual_input.tmpl b/tests/everest/test_data/templating/templates/dual_input.tmpl new file mode 100644 index 00000000000..adb77560d85 --- /dev/null +++ b/tests/everest/test_data/templating/templates/dual_input.tmpl @@ -0,0 +1 @@ +{{ well_drill_north.PROD1 }} vs {{ well_drill_south.PROD1 }} diff --git a/tests/everest/test_data/templating/templates/the_optimal_template.tmpl b/tests/everest/test_data/templating/templates/the_optimal_template.tmpl new file mode 100644 index 00000000000..17558cc1bc4 --- /dev/null +++ b/tests/everest/test_data/templating/templates/the_optimal_template.tmpl @@ -0,0 +1 @@ +{{ well_drill.values() | sum() }} diff --git a/tests/everest/test_data/templating/templates/well_drill_info.tmpl b/tests/everest/test_data/templating/templates/well_drill_info.tmpl new file mode 100644 index 00000000000..bab96e0e2e6 --- /dev/null +++ b/tests/everest/test_data/templating/templates/well_drill_info.tmpl @@ -0,0 +1,6 @@ +PROD1 takes value {{ well_drill.PROD1 }}, implying {{ "on" if well_drill.PROD1 >= 0.5 else "off" }} +PROD2 takes value {{ well_drill.PROD2 }}, implying {{ "on" if well_drill.PROD2 >= 0.5 else "off" }} +---------------------------------- +{%- for well_name, value in well_drill.items() %} +{{ well_name }} takes value {{ value }}, implying {{ "on" if value >= 0.5 else "off"}} +{%- endfor %} diff --git a/tests/everest/test_data/valid_config_file/forward_models/input/configs/drill_planner_config.yml b/tests/everest/test_data/valid_config_file/forward_models/input/configs/drill_planner_config.yml new file mode 100644 index 00000000000..b2e25189936 --- /dev/null +++ b/tests/everest/test_data/valid_config_file/forward_models/input/configs/drill_planner_config.yml @@ -0,0 +1,27 @@ +start_date: 2022-09-03 +end_date: 2030-01-01 +rigs: + - + name: 'A' + wells: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] + slots: ['S1', 'S2', 'S3', 'S4', 'S5', 'S6'] + +slots: + - + name: 'S1' + wells: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] + - + name: 'S2' + wells: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] + - + name: 'S3' + wells: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] + - + name: 'S4' + wells: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] + - + name: 'S5' + wells: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] + - + name: 'S6' + wells: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] diff --git a/tests/everest/test_data/valid_config_file/forward_models/input/configs/r-0/configs/drill_planner_config.yml b/tests/everest/test_data/valid_config_file/forward_models/input/configs/r-0/configs/drill_planner_config.yml new file mode 100644 index 00000000000..b2e25189936 --- /dev/null +++ b/tests/everest/test_data/valid_config_file/forward_models/input/configs/r-0/configs/drill_planner_config.yml @@ -0,0 +1,27 @@ +start_date: 2022-09-03 +end_date: 2030-01-01 +rigs: + - + name: 'A' + wells: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] + slots: ['S1', 'S2', 'S3', 'S4', 'S5', 'S6'] + +slots: + - + name: 'S1' + wells: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] + - + name: 'S2' + wells: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] + - + name: 'S3' + wells: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] + - + name: 'S4' + wells: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] + - + name: 'S5' + wells: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] + - + name: 'S6' + wells: ['A1', 'A2', 'A3', 'A4', 'A5', 'A6'] diff --git a/tests/everest/test_data/valid_config_file/forward_models/input/configs/template_config.yml b/tests/everest/test_data/valid_config_file/forward_models/input/configs/template_config.yml new file mode 100644 index 00000000000..5f0d7987cf6 --- /dev/null +++ b/tests/everest/test_data/valid_config_file/forward_models/input/configs/template_config.yml @@ -0,0 +1,5 @@ +templates: + - + file: './templates/wellopen.jinja' + keys: + opname: open diff --git a/tests/everest/test_data/valid_config_file/forward_models/input/models/WELLSELECT.SCH b/tests/everest/test_data/valid_config_file/forward_models/input/models/WELLSELECT.SCH new file mode 100644 index 00000000000..2dd9750ec53 --- /dev/null +++ b/tests/everest/test_data/valid_config_file/forward_models/input/models/WELLSELECT.SCH @@ -0,0 +1,134 @@ +TUNING + 1* 30 / +/ +/ + +WCONPROD + 'A1' SHUT LRAT 3* 4000 1* 150 / + 'A2' SHUT LRAT 3* 2500 1* 150 / + 'A3' SHUT LRAT 3* 2500 1* 150 / + 'A4' SHUT LRAT 3* 4000 1* 150 / +/ + +WCONINJE + 'A5' WATER SHUT RATE 6500 1* 500 / + 'A6' WATER SHUT RATE 6500 1* 500 / +/ + +DATES + 1 JAN 2023 / +/ + +DATES + 1 APR 2023 / +/ + +DATES + 1 JLY 2023 / +/ + +DATES + 1 OCT 2023 / +/ + +DATES + 1 JAN 2024 / +/ + +DATES + 1 APR 2024 / +/ + +DATES + 1 JLY 2024 / +/ + +DATES + 1 OCT 2024 / +/ + +DATES + 1 JAN 2025 / +/ + +DATES + 1 APR 2025 / +/ + +DATES + 1 JLY 2025 / +/ + +DATES + 1 OCT 2025 / +/ + +DATES + 1 JAN 2026 / +/ + +DATES + 1 APR 2026 / +/ + +DATES + 1 JLY 2026 / +/ + +DATES + 1 OCT 2026 / +/ + +DATES + 1 JAN 2027 / +/ + +DATES + 1 APR 2027 / +/ + +DATES + 1 JLY 2027 / +/ + +DATES + 1 OCT 2027 / +/ + +DATES + 1 JAN 2028 / +/ + +DATES + 1 APR 2028 / +/ + +DATES + 1 JLY 2028 / +/ + +DATES + 1 OCT 2028 / +/ + +DATES + 1 JAN 2029 / +/ + +DATES + 1 APR 2029 / +/ + +DATES + 1 JLY 2029 / +/ + +DATES + 1 OCT 2029 / +/ + +DATES + 1 JAN 2030 / +/ + +END diff --git a/tests/everest/test_data/valid_config_file/forward_models/input/prices.yml b/tests/everest/test_data/valid_config_file/forward_models/input/prices.yml new file mode 100644 index 00000000000..d1df19f79cc --- /dev/null +++ b/tests/everest/test_data/valid_config_file/forward_models/input/prices.yml @@ -0,0 +1,11 @@ +prices: + FOPT: + - { date: 1999-01-01, value: 60, currency: USD } + +well_costs: + - { well: A1, value: 10000000, currency: USD } + - { well: A2, value: 20000000 } + - { well: A3, value: 5000000, currency: USD } + - { well: A4, value: 100000000, currency: GBP } + - { well: A5, value: 1000000 } + - { well: A6, value: 100000, currency: USD } diff --git a/tests/everest/test_data/valid_config_file/forward_models/input/templates/wellopen.jinja b/tests/everest/test_data/valid_config_file/forward_models/input/templates/wellopen.jinja new file mode 100644 index 00000000000..05702862430 --- /dev/null +++ b/tests/everest/test_data/valid_config_file/forward_models/input/templates/wellopen.jinja @@ -0,0 +1,3 @@ +WELOPEN + '{{ name }}' 'OPEN' / +/ diff --git a/tests/everest/test_data/valid_config_file/forward_models/valid_config_maintained_forward_models.yml b/tests/everest/test_data/valid_config_file/forward_models/valid_config_maintained_forward_models.yml new file mode 100644 index 00000000000..4854c20b27e --- /dev/null +++ b/tests/everest/test_data/valid_config_file/forward_models/valid_config_maintained_forward_models.yml @@ -0,0 +1,67 @@ +environment: + simulation_folder: sim_output + log_level: debug + +wells: + - {name: A1, drill_time: 120} + - {name: A2, drill_time: 120} + - {name: A3, drill_time: 120} + - {name: A4, drill_time: 120} + - {name: A5, drill_time: 120} + - {name: A6, drill_time: 120} + +controls: + - + name: well_order + type: well_control + min: 0 + max: 1 + perturbation_magnitude: 0.05 + variables: + - {name: A1, initial_guess: 0.6} + - {name: A2, initial_guess: 0.55} + - {name: A3, initial_guess: 0.5} + - {name: A4, initial_guess: 0.45} + - {name: A5, initial_guess: 0.4} + - {name: A6, initial_guess: 0.35} + + - + name: well_number + type: generic_control + min: 0.0 + max: 1.0 + perturbation_magnitude: 0.1 + variables: + - {name: scaled_number_of_wells , initial_guess: 0.39} + +objective_functions: + - name: not_really_important_for_this_test + +optimization: + algorithm: optpp_q_newton + +model: + realizations: [0] + +install_data: + - + source: input/prices.yml + target: prices.yml + - + source: r{{configpath}}/input/configs/r-r{{realization}}/configs/drill_planner_config.yml + target: drill_planner_config.yml + + - + source: r{{configpath}}/input/configs + target: configs + + - + source: r{{configpath}}/input/templates + target: templates + +forward_model: + - drill_planner -i wells.json -c drill_planner_config.yml -opt well_order.json -o wells_dp_result.json + - select_wells -i wells_dp_result.json -o wells_sw_result.json file well_number.json -r 0 6 -s 0 1 + - add_templates -i wells_sw_result.json -c configs/template_config.yml -o wells_tmpl_result.json + - schmerge -i wells_tmpl_result.json -s input/model/WELLSELECT.SCH -o input/model/SCHEDULE_OPT.SCH + - npv -s something.UNSMRY -o npv_0 -c prices.yml -sd 2022-10-01 -ed 2040-01-01 -i files/a7_readydate.json' diff --git a/tests/everest/test_data/valid_config_file/invalid_yaml_config.yml b/tests/everest/test_data/valid_config_file/invalid_yaml_config.yml new file mode 100644 index 00000000000..6d93a397b23 --- /dev/null +++ b/tests/everest/test_data/valid_config_file/invalid_yaml_config.yml @@ -0,0 +1,31 @@ +controls: + - + name: not_really_important_for_this_test + type: generic_control + min: -1.0 + max: 1.0 + initial_guess: 0 + variables: + - name: x + +objective_functions # line missing ending ":" generates error when loading it was yaml + - + name: not_really_important_for_this_test + +optimization: + algorithm: optpp_q_newton + + +model: + realizations: [0] + +forward_model: + - make_directory created_test_folder + - copy_directory created_test_folder test_folder_copy + - copy_file new_test_file.txt created_test_folder/new_test_file_copy.txt + - move_file new_test_file.txt created_test_folder/new_test_file.txt + - symlink created_test_folder/new_test_file.txt sym_link + +environment: + simulation_folder: sim_output + log_level: debug diff --git a/tests/everest/test_data/valid_config_file/valid_yaml_config.yml b/tests/everest/test_data/valid_config_file/valid_yaml_config.yml new file mode 100644 index 00000000000..45913340bcc --- /dev/null +++ b/tests/everest/test_data/valid_config_file/valid_yaml_config.yml @@ -0,0 +1,31 @@ +controls: + - + name: not_really_important_for_this_test + type: generic_control + min: -1.0 + max: 1.0 + initial_guess: 0 + variables: + - name: x + +objective_functions: + - + name: not_really_important_for_this_test + +optimization: + algorithm: optpp_q_newton + + +model: + realizations: [0] + +forward_model: + - make_directory created_test_folder + - copy_directory created_test_folder test_folder_copy + - copy_file new_test_file.txt created_test_folder/new_test_file_copy.txt + - move_file new_test_file.txt created_test_folder/new_test_file.txt + - symlink created_test_folder/new_test_file.txt sym_link + +environment: + simulation_folder: sim_output + log_level: debug diff --git a/tests/everest/test_data/valid_config_file/valid_yaml_config_no_algorithm.yml b/tests/everest/test_data/valid_config_file/valid_yaml_config_no_algorithm.yml new file mode 100644 index 00000000000..1d372a219a1 --- /dev/null +++ b/tests/everest/test_data/valid_config_file/valid_yaml_config_no_algorithm.yml @@ -0,0 +1,30 @@ +controls: + - + name: not_really_important_for_this_test + type: generic_control + min: -1.0 + max: 1.0 + initial_guess: 0 + variables: + - name: x + +objective_functions: + - + name: not_really_important_for_this_test + +optimization: + backend: dakota + +model: + realizations: [0] + +forward_model: + - make_directory created_test_folder + - copy_directory created_test_folder test_folder_copy + - copy_file new_test_file.txt created_test_folder/new_test_file_copy.txt + - move_file new_test_file.txt created_test_folder/new_test_file.txt + - symlink created_test_folder/new_test_file.txt sym_link + +environment: + simulation_folder: sim_output + log_level: debug diff --git a/tests/everest/test_detached.py b/tests/everest/test_detached.py new file mode 100644 index 00000000000..11774273b4b --- /dev/null +++ b/tests/everest/test_detached.py @@ -0,0 +1,450 @@ +import logging +import os +from collections import namedtuple +from unittest.mock import patch + +import pytest +import requests + +from ert.config import ErtConfig, QueueSystem +from ert.storage import open_storage +from everest.config import EverestConfig +from everest.config.server_config import ServerConfig +from everest.config.simulator_config import SimulatorConfig +from everest.config_keys import ConfigKeys as CK +from everest.detached import ( + _EVERSERVER_JOB_PATH, + PROXY, + ServerStatus, + _find_res_queue_system, + _generate_queue_options, + context_stop_and_wait, + everserver_status, + generate_everserver_ert_config, + server_is_running, + start_server, + stop_server, + update_everserver_status, + wait_for_context, + wait_for_server, + wait_for_server_to_stop, +) +from everest.simulator.everest_to_ert import everest_to_ert_config +from everest.strings import ( + DEFAULT_OUTPUT_DIR, + DETACHED_NODE_DIR, + EVEREST_SERVER_CONFIG, + SIMULATION_DIR, +) +from everest.util import makedirs_if_needed +from tests.everest.utils import relpath, tmpdir + + +class MockContext: + def __init__(self): + pass + + @staticmethod + def has_job_failed(*args): + return True + + @staticmethod + def job_progress(*args): + job = namedtuple("Job", "std_err_file") + job.std_err_file = "error_file.0" + job_progress = namedtuple("JobProgres", ["jobs"]) + job_progress.steps = [job] + return job_progress + + +@pytest.mark.flaky(reruns=5) +@pytest.mark.integration_test +@pytest.mark.fails_on_macos_github_workflow +@pytest.mark.xdist_group(name="starts_everest") +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_https_requests(): + everest_config = EverestConfig.load_file("config_minimal_slow.yml") + + expected_server_status = ServerStatus.never_run + assert expected_server_status == everserver_status(everest_config)["status"] + wait_for_context() + ert_config = ErtConfig.with_plugins().from_dict( + generate_everserver_ert_config(everest_config) + ) + makedirs_if_needed(everest_config.output_dir, roll_if_exists=True) + with open_storage(ert_config.ens_path, "w") as storage: + start_server(everest_config, ert_config, storage) + try: + wait_for_server(everest_config, 120) + except SystemExit as e: + context_stop_and_wait() + raise e + + server_status = everserver_status(everest_config) + assert ServerStatus.running == server_status["status"] + + url, cert, auth = everest_config.server_context + result = requests.get(url, verify=cert, auth=auth, proxies=PROXY) + assert result.status_code == 200 # Request has succeeded + + # Test http request fail + url = url.replace("https", "http") + with pytest.raises(Exception): # noqa B017 + response = requests.get(url, verify=cert, auth=auth, proxies=PROXY) + response.raise_for_status() + + # Test request with wrong password fails + url, cert, _ = everest_config.server_context + usr = "admin" + password = "wrong_password" + with pytest.raises(Exception): # noqa B017 + result = requests.get(url, verify=cert, auth=(usr, password), proxies=PROXY) + result.raise_for_status() + + # Test stopping server + assert server_is_running(everest_config) + + if stop_server(everest_config): + wait_for_server_to_stop(everest_config, 60) + context_stop_and_wait() + server_status = everserver_status(everest_config) + + # Possible the case completed while waiting for the server to stop + assert server_status["status"] in [ + ServerStatus.stopped, + ServerStatus.completed, + ] + assert not server_is_running(everest_config) + else: + context_stop_and_wait() + server_status = everserver_status(everest_config) + assert ServerStatus.stopped == server_status["status"] + + +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_server_status(): + config = EverestConfig.load_file("config_minimal.yml") + + # Check status file does not exist before initial status update + assert not os.path.exists(config.everserver_status_path) + update_everserver_status(config, ServerStatus.starting) + + # Check status file exists after initial status update + assert os.path.exists(config.everserver_status_path) + + # Check we can read the server status from disk + status = everserver_status(config) + assert status["status"] == ServerStatus.starting + assert status["message"] is None + + err_msg_1 = "Danger the universe is preparing for implosion!!!" + update_everserver_status(config, ServerStatus.failed, message=err_msg_1) + status = everserver_status(config) + assert status["status"] == ServerStatus.failed + assert status["message"] == err_msg_1 + + err_msg_2 = "Danger exotic matter detected!!!" + update_everserver_status(config, ServerStatus.failed, message=err_msg_2) + status = everserver_status(config) + assert status["status"] == ServerStatus.failed + assert status["message"] == "{}\n{}".format(err_msg_1, err_msg_2) + + update_everserver_status(config, ServerStatus.completed) + status = everserver_status(config) + assert status["status"] == ServerStatus.completed + assert status["message"] is not None + assert status["message"] == "{}\n{}".format(err_msg_1, err_msg_2) + + +@patch("everest.detached.server_is_running", return_value=False) +@tmpdir(relpath("test_data", "detached")) +def test_wait_for_server(server_is_running_mock, caplog): + config = EverestConfig.load_file("valid_yaml_config.yml") + + with caplog.at_level(logging.DEBUG), pytest.raises(Exception): + wait_for_server(config, timeout=1, context=None) + + assert not caplog.messages + context = MockContext() + with caplog.at_level(logging.DEBUG), pytest.raises(SystemExit): + wait_for_server(config, timeout=120, context=context) + + expected_error_msg = ( + 'Error when parsing config_file:"DISTANCE3" ' + "Keyword:ARGLIST must have at least 1 arguments.\n" + "Error message: ext_joblist_get_job_copy: " + "asked for job:distance3 which does not exist\n" + "Error message: Program received signal:6" + ) + + assert expected_error_msg in "\n".join(caplog.messages) + + server_status = everserver_status(config) + assert server_status["status"] == ServerStatus.failed + assert server_status["message"] == expected_error_msg + + +def _get_reference_config(): + everest_config = EverestConfig.load_file("config_minimal.yml") + reference_config = ErtConfig.read_site_config() + cwd = os.getcwd() + reference_config.update( + { + "INSTALL_JOB": [(EVEREST_SERVER_CONFIG, _EVERSERVER_JOB_PATH)], + "QUEUE_SYSTEM": "LOCAL", + "JOBNAME": EVEREST_SERVER_CONFIG, + "MAX_SUBMIT": 1, + "NUM_REALIZATIONS": 1, + "RUNPATH": os.path.join( + cwd, + DEFAULT_OUTPUT_DIR, + DETACHED_NODE_DIR, + SIMULATION_DIR, + ), + "SIMULATION_JOB": [ + [ + EVEREST_SERVER_CONFIG, + "--config-file", + os.path.join(cwd, "config_minimal.yml"), + ], + ], + "ENSPATH": os.path.join( + cwd, DEFAULT_OUTPUT_DIR, DETACHED_NODE_DIR, EVEREST_SERVER_CONFIG + ), + "RUNPATH_FILE": os.path.join( + cwd, DEFAULT_OUTPUT_DIR, DETACHED_NODE_DIR, ".res_runpath_list" + ), + } + ) + return everest_config, reference_config + + +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_detached_mode_config_base(): + everest_config, reference = _get_reference_config() + ert_config = generate_everserver_ert_config(everest_config) + + assert ert_config is not None + assert ert_config == reference + + +@pytest.mark.parametrize( + "queue_system, cores, name", + [ + ("lsf", 2, None), + ("slurm", 4, None), + ("lsf", 3, "test_lsf"), + ("slurm", 5, "test_slurm"), + ], +) +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_everserver_queue_config_equal_to_run_config(queue_system, cores, name): + everest_config, _ = _get_reference_config() + + simulator_config = {CK.QUEUE_SYSTEM: queue_system, CK.CORES: cores} + + if name is not None: + simulator_config.update({"name": name}) + everest_config.simulator = SimulatorConfig(**simulator_config) + server_ert_config = generate_everserver_ert_config(everest_config) + ert_config = everest_to_ert_config(everest_config) + + server_queue_option = server_ert_config["QUEUE_OPTION"] + run_queue_option = ert_config["QUEUE_OPTION"] + + assert ert_config["QUEUE_SYSTEM"] == server_ert_config["QUEUE_SYSTEM"] + assert ( + next(filter(lambda x: "MAX_RUNNING" in x, reversed(run_queue_option)))[-1] + == cores + ) + assert ( + next(filter(lambda x: "MAX_RUNNING" in x, reversed(server_queue_option)))[-1] + == 1 + ) + if name is not None: + assert next(filter(lambda x: name in x, run_queue_option)) == next( + filter(lambda x: name in x, server_queue_option) + ) + + +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_detached_mode_config_debug(): + everest_config, reference = _get_reference_config() + ert_config = generate_everserver_ert_config(everest_config, debug_mode=True) + + reference["SIMULATION_JOB"][0].append("--debug") + + assert ert_config is not None + assert ert_config == reference + + +@pytest.mark.parametrize("queue_system", ["lsf", "slurm"]) +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_detached_mode_config_only_sim(queue_system): + everest_config, reference = _get_reference_config() + + reference["QUEUE_SYSTEM"] = queue_system.upper() + queue_options = [(queue_system.upper(), "MAX_RUNNING", 1)] + reference.setdefault("QUEUE_OPTION", []).extend(queue_options) + everest_config.simulator = SimulatorConfig(**{CK.QUEUE_SYSTEM: queue_system}) + ert_config = generate_everserver_ert_config(everest_config) + assert ert_config is not None + assert ert_config == reference + + +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_detached_mode_config_error(): + """ + We are not allowing the simulator queue to be local and at the + same time the everserver queue to be something other than local + """ + everest_config, _ = _get_reference_config() + + everest_config.server = ServerConfig(name="server", queue_system="lsf") + with pytest.raises(ValueError): + generate_everserver_ert_config(everest_config) + + +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_detached_mode_config_queue_name(): + everest_config, reference = _get_reference_config() + + queue_name = "put_me_in_the_queue" + reference["QUEUE_SYSTEM"] = QueueSystem.LSF + queue_options = [(QueueSystem.LSF, "LSF_QUEUE", queue_name)] + + reference.setdefault("QUEUE_OPTION", []).extend(queue_options) + everest_config.simulator = SimulatorConfig(queue_system="lsf") + everest_config.server = ServerConfig(queue_system="lsf", name=queue_name) + + ert_config = generate_everserver_ert_config(everest_config) + assert ert_config is not None + assert ert_config == reference + + +@pytest.mark.parametrize( + "config, expected_result", + [ + ( + EverestConfig.with_defaults(**{CK.SIMULATOR: {CK.QUEUE_SYSTEM: "lsf"}}), + "LSF", + ), + ( + EverestConfig.with_defaults( + **{ + CK.SIMULATOR: {CK.QUEUE_SYSTEM: "lsf"}, + CK.EVERSERVER: {CK.QUEUE_SYSTEM: "lsf"}, + } + ), + "LSF", + ), + (EverestConfig.with_defaults(**{}), "LOCAL"), + ( + EverestConfig.with_defaults(**{CK.SIMULATOR: {CK.QUEUE_SYSTEM: "local"}}), + "LOCAL", + ), + ], +) +def test_find_queue_system(config: EverestConfig, expected_result): + result = _find_res_queue_system(config) + + assert result == expected_result + + +def test_find_queue_system_error(): + config = EverestConfig.with_defaults(**{"server": {CK.QUEUE_SYSTEM: "lsf"}}) + + with pytest.raises(ValueError): + _find_res_queue_system(config) + + +@pytest.mark.parametrize("queue_options", [[], [("EVEREST_KEY", "RES_KEY")]]) +@pytest.mark.parametrize("queue_system", ["LSF", "SLURM", "SOME_NEW_QUEUE_SYSTEM"]) +def test_generate_queue_options_no_config(queue_options, queue_system): + config = EverestConfig.with_defaults(**{}) + res_queue_name = "SOME_ERT_KEY" # LSF_QUEUE_KEY for LSF + assert [(queue_system, "MAX_RUNNING", 1)] == _generate_queue_options( + config, queue_options, res_queue_name, queue_system + ) + + +@pytest.mark.parametrize("queue_options", [[], [("exclude_host", "RES_KEY")]]) +@pytest.mark.parametrize("queue_system", ["LSF", "SLURM", "SOME_NEW_QUEUE_SYSTEM"]) +def test_generate_queue_options_only_name(queue_options, queue_system): + config = EverestConfig.with_defaults(**{"server": {"name": "my_custom_queue_name"}}) + res_queue_name = "SOME_ERT_KEY" # LSF_QUEUE_KEY for LSF + assert _generate_queue_options( + config, queue_options, res_queue_name, queue_system + ) == [ + ( + queue_system, + res_queue_name, + "my_custom_queue_name", + ), + ] + + +@pytest.mark.parametrize( + "queue_options, expected_result", + [ + ([], []), + ( + [("options", "RES_KEY")], + [ + ( + "SOME_QUEUE_SYSTEM", + "RES_KEY", + "ever_opt_1", + ), + ], + ), + ], +) +def test_generate_queue_options_only_options(queue_options, expected_result): + config = EverestConfig.with_defaults(**{"server": {"options": "ever_opt_1"}}) + res_queue_name = "NOT_RELEVANT_IN_THIS_CONTEXT" + queue_system = "SOME_QUEUE_SYSTEM" + assert ( + _generate_queue_options(config, queue_options, res_queue_name, queue_system) + == expected_result + ) + + +@pytest.mark.parametrize( + "queue_options, expected_result", + [ + ( + [], + [ + ( + "SLURM", + "MAX_RUNNING", + 1, + ) + ], + ), + ( + [("options", "RES_KEY")], + [ + ( + "SLURM", + "MAX_RUNNING", + 1, + ), + ( + "SLURM", + "RES_KEY", + "ever_opt_1", + ), + ], + ), + ], +) +def test_generate_queue_options_use_simulator_values(queue_options, expected_result): + config = EverestConfig.with_defaults(**{"simulator": {"options": "ever_opt_1"}}) + res_queue_name = "NOT_RELEVANT_IN_THIS_CONTEXT" + queue_system = "SLURM" + assert ( + _generate_queue_options(config, queue_options, res_queue_name, queue_system) + == expected_result + ) diff --git a/tests/everest/test_discrete.py b/tests/everest/test_discrete.py new file mode 100644 index 00000000000..d7adeaff3dd --- /dev/null +++ b/tests/everest/test_discrete.py @@ -0,0 +1,18 @@ +from everest.config import EverestConfig +from everest.suite import _EverestWorkflow +from tests.everest.utils import relpath, tmpdir + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") +CONFIG_DISCRETE = "config_discrete.yml" + + +@tmpdir(CONFIG_PATH) +def test_discrete_optimizer(): + config = EverestConfig.load_file(CONFIG_DISCRETE) + + workflow = _EverestWorkflow(config) + assert workflow is not None + workflow.start_optimization() + + assert workflow.result.controls["point_x"] == 3 + assert workflow.result.controls["point_y"] == 7 diff --git a/tests/everest/test_egg_simulation.py b/tests/everest/test_egg_simulation.py new file mode 100644 index 00000000000..a54ef509643 --- /dev/null +++ b/tests/everest/test_egg_simulation.py @@ -0,0 +1,842 @@ +import json +import os +import shutil + +import pytest + +import everest +from ert.config import ErtConfig, QueueSystem +from everest.config import EverestConfig +from everest.config.export_config import ExportConfig +from everest.config_keys import ConfigKeys +from everest.export import MetaDataColumnNames +from everest.plugins.site_config_env import PluginSiteConfigEnv +from everest.simulator.everest_to_ert import everest_to_ert_config +from tests.everest.utils import ( + everest_default_jobs, + hide_opm, + relpath, + skipif_no_everest_models, + skipif_no_opm, + skipif_no_simulator, + tmpdir, +) + +CONFIG_FILE = "everest/model/config.yml" +SUM_KEYS_NO_OPM = [ + "YEAR", + "YEARSTCPU", + "TCPUDAY", + "MONTH", + "DAY", + "FOPR", + "FOPT", + "FOIR", + "FOIT", + "FWPR", + "FWPT", + "FWIR", + "FWIT", + "FGPR", + "FGPT", + "FGIR", + "FGIT", + "FVPR", + "FVPT", + "FVIR", + "FVIT", + "FWCT", + "FGOR", + "FOIP", + "FOIPL", + "FOIPG", + "FWIP", + "FGIP", + "FGIPL", + "FGIPG", + "FPR", + "FAQR", + "FAQRG", + "FAQT", + "FAQTG", + "FWGR", + "WOPR:PROD4", + "WOPR:PROD3", + "WOPR:INJECT8", + "WOPR:INJECT6", + "WOPR:INJECT7", + "WOPR:INJECT4", + "WOPR:INJECT5", + "WOPR:INJECT2", + "WOPR:INJECT3", + "WOPR:INJECT1", + "WOPR:PROD1", + "WOPR:PROD2", + "WOPRT:PROD4", + "WOPRT:PROD3", + "WOPRT:INJECT8", + "WOPRT:INJECT6", + "WOPRT:INJECT7", + "WOPRT:INJECT4", + "WOPRT:INJECT5", + "WOPRT:INJECT2", + "WOPRT:INJECT3", + "WOPRT:INJECT1", + "WOPRT:PROD1", + "WOPRT:PROD2", + "WOPT:PROD4", + "WOPT:PROD3", + "WOPT:INJECT8", + "WOPT:INJECT6", + "WOPT:INJECT7", + "WOPT:INJECT4", + "WOPT:INJECT5", + "WOPT:INJECT2", + "WOPT:INJECT3", + "WOPT:INJECT1", + "WOPT:PROD1", + "WOPT:PROD2", + "WOIR:PROD4", + "WOIR:PROD3", + "WOIR:INJECT8", + "WOIR:INJECT6", + "WOIR:INJECT7", + "WOIR:INJECT4", + "WOIR:INJECT5", + "WOIR:INJECT2", + "WOIR:INJECT3", + "WOIR:INJECT1", + "WOIR:PROD1", + "WOIR:PROD2", + "WOIRT:PROD4", + "WOIRT:PROD3", + "WOIRT:INJECT8", + "WOIRT:INJECT6", + "WOIRT:INJECT7", + "WOIRT:INJECT4", + "WOIRT:INJECT5", + "WOIRT:INJECT2", + "WOIRT:INJECT3", + "WOIRT:INJECT1", + "WOIRT:PROD1", + "WOIRT:PROD2", + "WOIT:PROD4", + "WOIT:PROD3", + "WOIT:INJECT8", + "WOIT:INJECT6", + "WOIT:INJECT7", + "WOIT:INJECT4", + "WOIT:INJECT5", + "WOIT:INJECT2", + "WOIT:INJECT3", + "WOIT:INJECT1", + "WOIT:PROD1", + "WOIT:PROD2", + "WWPR:PROD4", + "WWPR:PROD3", + "WWPR:INJECT8", + "WWPR:INJECT6", + "WWPR:INJECT7", + "WWPR:INJECT4", + "WWPR:INJECT5", + "WWPR:INJECT2", + "WWPR:INJECT3", + "WWPR:INJECT1", + "WWPR:PROD1", + "WWPR:PROD2", + "WWPRT:PROD4", + "WWPRT:PROD3", + "WWPRT:INJECT8", + "WWPRT:INJECT6", + "WWPRT:INJECT7", + "WWPRT:INJECT4", + "WWPRT:INJECT5", + "WWPRT:INJECT2", + "WWPRT:INJECT3", + "WWPRT:INJECT1", + "WWPRT:PROD1", + "WWPRT:PROD2", + "WWPT:PROD4", + "WWPT:PROD3", + "WWPT:INJECT8", + "WWPT:INJECT6", + "WWPT:INJECT7", + "WWPT:INJECT4", + "WWPT:INJECT5", + "WWPT:INJECT2", + "WWPT:INJECT3", + "WWPT:INJECT1", + "WWPT:PROD1", + "WWPT:PROD2", + "WWIR:PROD4", + "WWIR:PROD3", + "WWIR:INJECT8", + "WWIR:INJECT6", + "WWIR:INJECT7", + "WWIR:INJECT4", + "WWIR:INJECT5", + "WWIR:INJECT2", + "WWIR:INJECT3", + "WWIR:INJECT1", + "WWIR:PROD1", + "WWIR:PROD2", + "WWIRT:PROD4", + "WWIRT:PROD3", + "WWIRT:INJECT8", + "WWIRT:INJECT6", + "WWIRT:INJECT7", + "WWIRT:INJECT4", + "WWIRT:INJECT5", + "WWIRT:INJECT2", + "WWIRT:INJECT3", + "WWIRT:INJECT1", + "WWIRT:PROD1", + "WWIRT:PROD2", + "WWIT:PROD4", + "WWIT:PROD3", + "WWIT:INJECT8", + "WWIT:INJECT6", + "WWIT:INJECT7", + "WWIT:INJECT4", + "WWIT:INJECT5", + "WWIT:INJECT2", + "WWIT:INJECT3", + "WWIT:INJECT1", + "WWIT:PROD1", + "WWIT:PROD2", + "WGPR:PROD4", + "WGPR:PROD3", + "WGPR:INJECT8", + "WGPR:INJECT6", + "WGPR:INJECT7", + "WGPR:INJECT4", + "WGPR:INJECT5", + "WGPR:INJECT2", + "WGPR:INJECT3", + "WGPR:INJECT1", + "WGPR:PROD1", + "WGPR:PROD2", + "WGPRT:PROD4", + "WGPRT:PROD3", + "WGPRT:INJECT8", + "WGPRT:INJECT6", + "WGPRT:INJECT7", + "WGPRT:INJECT4", + "WGPRT:INJECT5", + "WGPRT:INJECT2", + "WGPRT:INJECT3", + "WGPRT:INJECT1", + "WGPRT:PROD1", + "WGPRT:PROD2", + "WGPT:PROD4", + "WGPT:PROD3", + "WGPT:INJECT8", + "WGPT:INJECT6", + "WGPT:INJECT7", + "WGPT:INJECT4", + "WGPT:INJECT5", + "WGPT:INJECT2", + "WGPT:INJECT3", + "WGPT:INJECT1", + "WGPT:PROD1", + "WGPT:PROD2", + "WGIR:PROD4", + "WGIR:PROD3", + "WGIR:INJECT8", + "WGIR:INJECT6", + "WGIR:INJECT7", + "WGIR:INJECT4", + "WGIR:INJECT5", + "WGIR:INJECT2", + "WGIR:INJECT3", + "WGIR:INJECT1", + "WGIR:PROD1", + "WGIR:PROD2", + "WGIRT:PROD4", + "WGIRT:PROD3", + "WGIRT:INJECT8", + "WGIRT:INJECT6", + "WGIRT:INJECT7", + "WGIRT:INJECT4", + "WGIRT:INJECT5", + "WGIRT:INJECT2", + "WGIRT:INJECT3", + "WGIRT:INJECT1", + "WGIRT:PROD1", + "WGIRT:PROD2", + "WGIT:PROD4", + "WGIT:PROD3", + "WGIT:INJECT8", + "WGIT:INJECT6", + "WGIT:INJECT7", + "WGIT:INJECT4", + "WGIT:INJECT5", + "WGIT:INJECT2", + "WGIT:INJECT3", + "WGIT:INJECT1", + "WGIT:PROD1", + "WGIT:PROD2", + "WVPR:PROD4", + "WVPR:PROD3", + "WVPR:INJECT8", + "WVPR:INJECT6", + "WVPR:INJECT7", + "WVPR:INJECT4", + "WVPR:INJECT5", + "WVPR:INJECT2", + "WVPR:INJECT3", + "WVPR:INJECT1", + "WVPR:PROD1", + "WVPR:PROD2", + "WVPRT:PROD4", + "WVPRT:PROD3", + "WVPRT:INJECT8", + "WVPRT:INJECT6", + "WVPRT:INJECT7", + "WVPRT:INJECT4", + "WVPRT:INJECT5", + "WVPRT:INJECT2", + "WVPRT:INJECT3", + "WVPRT:INJECT1", + "WVPRT:PROD1", + "WVPRT:PROD2", + "WVPT:PROD4", + "WVPT:PROD3", + "WVPT:INJECT8", + "WVPT:INJECT6", + "WVPT:INJECT7", + "WVPT:INJECT4", + "WVPT:INJECT5", + "WVPT:INJECT2", + "WVPT:INJECT3", + "WVPT:INJECT1", + "WVPT:PROD1", + "WVPT:PROD2", + "WVIR:PROD4", + "WVIR:PROD3", + "WVIR:INJECT8", + "WVIR:INJECT6", + "WVIR:INJECT7", + "WVIR:INJECT4", + "WVIR:INJECT5", + "WVIR:INJECT2", + "WVIR:INJECT3", + "WVIR:INJECT1", + "WVIR:PROD1", + "WVIR:PROD2", + "WVIRT:PROD4", + "WVIRT:PROD3", + "WVIRT:INJECT8", + "WVIRT:INJECT6", + "WVIRT:INJECT7", + "WVIRT:INJECT4", + "WVIRT:INJECT5", + "WVIRT:INJECT2", + "WVIRT:INJECT3", + "WVIRT:INJECT1", + "WVIRT:PROD1", + "WVIRT:PROD2", + "WVIT:PROD4", + "WVIT:PROD3", + "WVIT:INJECT8", + "WVIT:INJECT6", + "WVIT:INJECT7", + "WVIT:INJECT4", + "WVIT:INJECT5", + "WVIT:INJECT2", + "WVIT:INJECT3", + "WVIT:INJECT1", + "WVIT:PROD1", + "WVIT:PROD2", + "WWCT:PROD4", + "WWCT:PROD3", + "WWCT:INJECT8", + "WWCT:INJECT6", + "WWCT:INJECT7", + "WWCT:INJECT4", + "WWCT:INJECT5", + "WWCT:INJECT2", + "WWCT:INJECT3", + "WWCT:INJECT1", + "WWCT:PROD1", + "WWCT:PROD2", + "WGOR:PROD4", + "WGOR:PROD3", + "WGOR:INJECT8", + "WGOR:INJECT6", + "WGOR:INJECT7", + "WGOR:INJECT4", + "WGOR:INJECT5", + "WGOR:INJECT2", + "WGOR:INJECT3", + "WGOR:INJECT1", + "WGOR:PROD1", + "WGOR:PROD2", + "WWGR:PROD4", + "WWGR:PROD3", + "WWGR:INJECT8", + "WWGR:INJECT6", + "WWGR:INJECT7", + "WWGR:INJECT4", + "WWGR:INJECT5", + "WWGR:INJECT2", + "WWGR:INJECT3", + "WWGR:INJECT1", + "WWGR:PROD1", + "WWGR:PROD2", + "WWGRT:PROD4", + "WWGRT:PROD3", + "WWGRT:INJECT8", + "WWGRT:INJECT6", + "WWGRT:INJECT7", + "WWGRT:INJECT4", + "WWGRT:INJECT5", + "WWGRT:INJECT2", + "WWGRT:INJECT3", + "WWGRT:INJECT1", + "WWGRT:PROD1", + "WWGRT:PROD2", + "WBHP:PROD4", + "WBHP:PROD3", + "WBHP:INJECT8", + "WBHP:INJECT6", + "WBHP:INJECT7", + "WBHP:INJECT4", + "WBHP:INJECT5", + "WBHP:INJECT2", + "WBHP:INJECT3", + "WBHP:INJECT1", + "WBHP:PROD1", + "WBHP:PROD2", + "WTHP:PROD4", + "WTHP:PROD3", + "WTHP:INJECT8", + "WTHP:INJECT6", + "WTHP:INJECT7", + "WTHP:INJECT4", + "WTHP:INJECT5", + "WTHP:INJECT2", + "WTHP:INJECT3", + "WTHP:INJECT1", + "WTHP:PROD1", + "WTHP:PROD2", + "WPI:PROD4", + "WPI:PROD3", + "WPI:INJECT8", + "WPI:INJECT6", + "WPI:INJECT7", + "WPI:INJECT4", + "WPI:INJECT5", + "WPI:INJECT2", + "WPI:INJECT3", + "WPI:INJECT1", + "WPI:PROD1", + "WPI:PROD2", +] +SUM_KEYS = [ + SUM_KEYS_NO_OPM + + [ + vector + ":" + group + for vector in [ + "GGIR", + "GGIT", + "GGOR", + "GGPR", + "GGPT", + "GOIR", + "GOIT", + "GOPR", + "GOPT", + "GVIR", + "GVIT", + "GVPR", + "GVPT", + "GWCT", + "GWGR", + "GWIR", + "GWIT", + "GWPR", + "GWPT", + ] + for group in ["FIELD", "INJECT", "PRODUC"] + ] +] +ROOT = os.path.join("..", "..", "examples", "egg") + + +def sort_res_summary(ert_config): + ert_config["SUMMARY"][0] = sorted(ert_config["SUMMARY"][0]) + + +def _generate_exp_ert_config(config_path, output_dir): + return { + "DEFINE": [("", config_path)], + "INSTALL_JOB": everest_default_jobs(output_dir), + "QUEUE_OPTION": [(QueueSystem.LOCAL, "MAX_RUNNING", 3)], + "QUEUE_SYSTEM": QueueSystem.LOCAL, + "NUM_REALIZATIONS": 10000, + "RUNPATH": os.path.join( + output_dir, + "egg_simulations//geo_realization_/simulation_", + ), + "RUNPATH_FILE": os.path.join( + os.path.realpath("everest/model"), + "everest_output/.res_runpath_list", + ), + "SIMULATION_JOB": [ + ( + "copy_directory", + f"{config_path}/../../eclipse/include/" + "realizations/realization-/eclipse", + "eclipse", + ), + ( + "symlink", + "{config_path}/../input/files".format(config_path=config_path), + "files", + ), + ( + "copy_file", + os.path.realpath( + "everest/model/everest_output/.internal_data/wells.json" + ), + "wells.json", + ), + ( + "well_constraints", + "-i", + "files/well_readydate.json", + "-c", + "files/wc_config.yml", + "-rc", + "well_rate.json", + "-o", + "wc_wells.json", + ), + ( + "add_templates", + "-i", + "wc_wells.json", + "-c", + "files/at_config.yml", + "-o", + "at_wells.json", + ), + ( + "schmerge", + "-s", + "eclipse/include/schedule/schedule.tmpl", + "-i", + "at_wells.json", + "-o", + "eclipse/include/schedule/schedule.sch", + ), + ( + "eclipse100", + "eclipse/model/EGG.DATA", + "--version", + "2020.2", + ), + ( + "strip_dates", + "--summary", + ".UNSMRY", + "--dates", + "2014-05-30", + "2014-08-28", + "2014-11-26", + "2015-02-24", + "2015-05-25", + "2015-08-23", + "2015-11-21", + "2016-02-19", + "2016-05-19", + ), + ("rf", "-s", "eclipse/model/EGG", "-o", "rf"), + ], + "ENSPATH": os.path.join( + os.path.realpath("everest/model"), + "everest_output/simulation_results", + ), + "ECLBASE": "eclipse/model/EGG", + "RANDOM_SEED": 123456, + "SUMMARY": SUM_KEYS, + } + + +@skipif_no_opm +@tmpdir(relpath(ROOT)) +def test_egg_model_convert(): + config = EverestConfig.load_file(CONFIG_FILE) + ert_config = everest_to_ert_config(config) + + # configpath isn't specified in config_file so it should be inferred + # to be at the directory of the config file. + output_dir = config.output_dir + config_path = os.path.dirname(os.path.abspath(CONFIG_FILE)) + exp_ert_config = _generate_exp_ert_config(config_path, output_dir) + sort_res_summary(exp_ert_config) + sort_res_summary(ert_config) + assert exp_ert_config == ert_config + + +@hide_opm +@tmpdir(relpath(ROOT)) +@skipif_no_everest_models +@pytest.mark.everest_models_test +def test_egg_model_convert_no_opm(): + config = EverestConfig.load_file(CONFIG_FILE) + ert_config = everest_to_ert_config(config) + + # configpath isn't specified in config_file so it should be inferred + # to be at the directory of the config file. + output_dir = config.output_dir + config_path = os.path.dirname(os.path.abspath(CONFIG_FILE)) + exp_ert_config = _generate_exp_ert_config(config_path, output_dir) + exp_ert_config["SUMMARY"][0] = SUM_KEYS_NO_OPM + sort_res_summary(exp_ert_config) + sort_res_summary(ert_config) + assert exp_ert_config == ert_config + + +@skipif_no_everest_models +@pytest.mark.everest_models_test +@tmpdir(relpath(ROOT)) +def test_opm_fail_default_summary_keys(): + pytest.importorskip("everest_models") + + config = EverestConfig.load_file(CONFIG_FILE) + # The Everest config file will fail to load as an Eclipse data file + config.model.data_file = os.path.realpath(CONFIG_FILE) + assert len(EverestConfig.lint_config_dict(config.to_dict())) == 0 + + ert_config = everest_to_ert_config(config) + + # configpath isn't specified in config_file so it should be inferred + # to be at the directory of the config file. + output_dir = config.output_dir + config_path = os.path.dirname(os.path.abspath(CONFIG_FILE)) + exp_ert_config = _generate_exp_ert_config(config_path, output_dir) + exp_ert_config["SUMMARY"][0] = filter( + lambda key: not key.startswith("G"), exp_ert_config["SUMMARY"][0] + ) + sort_res_summary(exp_ert_config) + sort_res_summary(ert_config) + assert exp_ert_config == ert_config + + +@skipif_no_everest_models +@pytest.mark.everest_models_test +@skipif_no_opm +@tmpdir(relpath(ROOT)) +def test_opm_fail_explicit_summary_keys(): + extra_sum_keys = [ + "GOIR:PRODUC", + "GOIT:INJECT", + "GOIT:PRODUC", + "GWPR:INJECT", + "GWPR:PRODUC", + "GWPT:INJECT", + "GWPT:PRODUC", + "GWIR:INJECT", + ] + + config = EverestConfig.load_file(CONFIG_FILE) + # The Everest config file will fail to load as an Eclipse data file + config.model.data_file = os.path.realpath(CONFIG_FILE) + if ConfigKeys.EXPORT not in config: + config.export = ExportConfig() + + config.export.keywords = extra_sum_keys + assert len(EverestConfig.lint_config_dict(config.to_dict())) == 0 + + ert_config = everest_to_ert_config(config) + + # configpath isn't specified in config_file so it should be inferred + # to be at the directory of the config file. + output_dir = config.output_dir + config_path = os.path.dirname(os.path.abspath(CONFIG_FILE)) + exp_ert_config = _generate_exp_ert_config(config_path, output_dir) + exp_ert_config["SUMMARY"] = [ + list( + filter( + lambda key: not key.startswith("G"), + exp_ert_config["SUMMARY"][0], + ) + ) + + extra_sum_keys + ] + sort_res_summary(exp_ert_config) + sort_res_summary(ert_config) + assert exp_ert_config == ert_config + + +@skipif_no_everest_models +@pytest.mark.everest_models_test +@pytest.mark.integration_test +@tmpdir(relpath(ROOT)) +def test_init_egg_model(): + config = EverestConfig.load_file(CONFIG_FILE) + ert_config = everest_to_ert_config(config, site_config=ErtConfig.read_site_config()) + ErtConfig.with_plugins().from_dict(config_dict=ert_config) + + +@skipif_no_everest_models +@pytest.mark.everest_models_test +@skipif_no_simulator +@pytest.mark.simulation_test +@tmpdir(relpath(ROOT)) +def test_run_egg_model(): + config = EverestConfig.load_file(CONFIG_FILE) + + # test callback + class CBTracker(object): + def __init__(self): + self.called = False + + def sweetcallbackofmine(self, *args, **kwargs): + self.called = True + + cbtracker = CBTracker() + workflow = everest.suite._EverestWorkflow( + config=config, simulation_callback=cbtracker.sweetcallbackofmine + ) + assert workflow is not None + with PluginSiteConfigEnv(): + workflow.start_optimization() + + assert cbtracker.called + # TODO: The comparison is currently disabled because we know it would + # fail. 0.851423 is indeed the optimal value, but the underlying + # optimization algorithm (newton) is unable to find the optimum for a + # well drill problem. We believe this is because newton is gradient + # based, so it works ok for continuous problems, but well drill is + # highly discontinuous. + # As soon as a solution for this problem is found, this comparison will + # be enabled again; high delta for now. + + # self.assertAlmostEqual(result.total_objective, 0.851423, delta=0.5) + + # Test conversion to pandas DataFrame + df = everest.export(config) + + # Check meta data export + for meta_key in MetaDataColumnNames.get_all(): + assert meta_key in df + + # Check control export + cgname = config.controls[0].name + well_names = [well.name for well in config.wells] + for wname in well_names: + assert "{cg}_{w}-1".format(cg=cgname, w=wname) in df + + # Check objective export + objective_names = [objf.name for objf in config.objective_functions] + for objective_name in objective_names: + assert objective_name in df + + exp_keywords = [ + "FOPT", + "WOPT:PROD4", + "WOPT:PROD3", + "WOPT:INJECT8", + "WOPT:INJECT6", + "WOPT:INJECT7", + "WOPT:INJECT4", + "WOPT:INJECT5", + "WOPT:INJECT2", + "WOPT:INJECT3", + "WOPT:INJECT1", + "WOPT:PROD1", + "WOPT:PROD2", + "well_rate_INJECT5-1", + "well_rate_INJECT4-1", + "well_rate_INJECT7-1", + "well_rate_INJECT6-1", + "well_rate_INJECT1-1", + "well_rate_INJECT3-1", + "rf", + "well_rate_INJECT2-1", + "rf_norm", + "well_rate_INJECT8-1", + "well_rate_PROD3-1", + "well_rate_PROD2-1", + "well_rate_PROD1-1", + "rf_weighted_norm", + "well_rate_PROD4-1", + ] + + # Check summary keys + for summary_key in exp_keywords: + assert summary_key in df + + # Check length + num_dates = len(set(df[MetaDataColumnNames.SIMULATED_DATE])) + assert num_dates > 0 + num_real = len(config.model.realizations) + pert_num = config.optimization.perturbation_num or 5 + assert df.shape[0] >= num_dates * num_real * (1 + pert_num) + + # Check export filter + config.export = ExportConfig(keywords=["*OPT*"]) + + filtered_df = everest.export(config) + + exp_keywords += MetaDataColumnNames.get_all() + columns = sorted(set(filtered_df.columns)) + for expected_key in sorted(set(exp_keywords)): + assert expected_key in columns + + +@skipif_no_everest_models +@pytest.mark.everest_models_test +@skipif_no_opm +@tmpdir(relpath(ROOT)) +def test_egg_model_wells_json_output_no_none(): + config = EverestConfig.load_file(CONFIG_FILE) + _ = everest_to_ert_config(config) + + with open( + os.path.join(config.output_dir, ".internal_data", "wells.json"), + encoding="utf-8", + ) as f: + data = json.load(f) + + assert data + assert data[0]["name"] == "PROD1" + assert all(v for i in data for v in i.values()) + + +@skipif_no_everest_models +@pytest.mark.everest_models_test +@skipif_no_simulator +@pytest.mark.simulation_test +def test_egg_snapshot(tmp_path, snapshot, monkeypatch): + shutil.copytree(relpath(ROOT), tmp_path, dirs_exist_ok=True) + monkeypatch.chdir(tmp_path) + config = EverestConfig.load_file(CONFIG_FILE) + + class CBTracker(object): + def __init__(self): + self.called = False + + def sweetcallbackofmine(self, *args, **kwargs): + self.called = True + + cbtracker = CBTracker() + workflow = everest.suite._EverestWorkflow( + config=config, simulation_callback=cbtracker.sweetcallbackofmine + ) + assert workflow is not None + with PluginSiteConfigEnv(): + workflow.start_optimization() + + assert cbtracker.called + + snapshot.assert_match( + everest.export(config) + .drop(columns=["TCPUDAY", "start_time", "end_time"], axis=1) + .round(6) + .to_csv(), + "egg.csv", + ) diff --git a/tests/everest/test_environment.py b/tests/everest/test_environment.py new file mode 100644 index 00000000000..dbea05ae9df --- /dev/null +++ b/tests/everest/test_environment.py @@ -0,0 +1,37 @@ +import os + +import pytest + +import everest +from everest.config import EverestConfig +from everest.simulator.everest_to_ert import everest_to_ert_config +from tests.everest.utils import relpath, tmpdir + +root = os.path.join("..", "..", "examples", "math_func") +config_file = "config_minimal.yml" + + +@pytest.mark.integration_test +@tmpdir(relpath(root)) +def test_seed(): + random_seed = 42 + config = EverestConfig.load_file(config_file) + config.environment.random_seed = random_seed + + ever_workflow = everest.suite._EverestWorkflow(config) + + assert random_seed == ever_workflow.config.environment.random_seed + + # Res + ert_config = everest_to_ert_config(config) + assert random_seed == ert_config["RANDOM_SEED"] + + +@pytest.mark.integration_test +@tmpdir(relpath(root)) +def test_loglevel(): + config = EverestConfig.load_file(config_file) + config.environment.log_level = "info" + ever_workflow = everest.suite._EverestWorkflow(config) + config = ever_workflow.config + assert len(EverestConfig.lint_config_dict(config.to_dict())) == 0 diff --git a/tests/everest/test_everest_config.py b/tests/everest/test_everest_config.py new file mode 100644 index 00000000000..f4a19c76010 --- /dev/null +++ b/tests/everest/test_everest_config.py @@ -0,0 +1,286 @@ +import logging +from pathlib import Path +from typing import List + +from everest.config import EverestConfig +from everest.config.control_config import ControlConfig +from everest.config.control_variable_config import ControlVariableConfig +from everest.config.cvar_config import CVaRConfig +from everest.config.optimization_config import OptimizationConfig + + +def test_that_control_config_is_initialized_with_control_variables(): + controls_dict = { + "name": "hello", + "type": "generic_control", + "min": 0, + "max": 1, + "variables": [ + { + "name": "var1", + "initial_guess": 0.6, + }, + { + "name": "var2", + "initial_guess": 0.6, + }, + ], + } + + parsed_config = ControlConfig(**controls_dict) + assert isinstance(parsed_config.variables, List) + + [v1, v2] = parsed_config.variables + + assert isinstance(v1, ControlVariableConfig) + assert isinstance(v2, ControlVariableConfig) + + assert v1.name == "var1" + assert v2.name == "var2" + + +def test_that_optimization_config_is_initialized_with_cvar_config(): + optimization_dict = { + "algorithm": "mesh_adaptive_search", + "cvar": {"number_of_realizations": 999999}, + } + + parsed_config = OptimizationConfig(**optimization_dict) + cvar_config = parsed_config.cvar + + assert isinstance(cvar_config, CVaRConfig) + + assert cvar_config.number_of_realizations == 999999 + assert "percentile" not in cvar_config + + +def test_that_get_output_dir_returns_same_for_old_and_new(): + config_src = { + "wells": [ + {"name": "w00"}, + ], + "controls": [ + { + "name": "group_0", + "type": "well_control", + "min": 0, + "max": 0.1, + "variables": [ + {"name": "w00", "initial_guess": 0.0626}, + ], + } + ], + "objective_functions": [{"name": "npv_function"}], + "optimization": { + "algorithm": "optpp_q_newton", + "max_iterations": 2, + "max_function_evaluations": 2, + "perturbation_num": 2, + }, + "model": {"realizations": [0, 1]}, + "environment": { + "output_folder": "everezt_output", + "simulation_folder": "tutorial_simulations", + "random_seed": 999, + }, + } + + config = EverestConfig.with_defaults(**config_src) + + assert Path(config.output_dir) == Path(config_src["environment"]["output_folder"]) + + +def test_that_invalid_keys_are_linted(): + config_src = { + "wells": [ + {"name": "w00"}, + {"naim": "w00", "dirll_date": ""}, + ], + "welz": [], + "controls": [ + { + "name": "group_0", + "type": "well_control", + "inital_guss": "well_control", + "min": 0, + "max": 0.1, + "variables": [ + {"name": "w00"}, + ], + }, + { + "name": "group_0", + "type": "well_control", + "initial_guess": "well_control", + "min": 0, + "max": 0.1, + "variables": [ + {"name": "w00", "inital_guess": 0.0626}, + {"name": "w01", "sampler": {"bakkend": "#DYSNEKTIC"}}, + ], + }, + ], + "controllers": [], + "objective_functions": [{"allias": "ss", "name": "npv_function"}], + "obejctive_fucctions": [], + "optimisation": { + "algorithm": "optpp_q_newton", + "max_iterations": 2, + "max_function_evaluations": 2, + "perturbation_num": 2, + }, + "optimization": { + "allgorithm": "optpp_q_newton", + "max_iterations": 2, + "max_functions": 2, + "perturbation_num": 2, + }, + "model": {"Realizations": [0, 1], "reprot_setps,": []}, + "moddel": {"realizations": [0, 1]}, + "environment": { + "output_folder": "everezt_output", + "input_folder": "whatisthis", + "simulation_folder": "tutorial_simulations", + "random_seed": 999, + }, + "envairånment": { + "output_folder": "everezt_output", + "simulation_folder": "tutorial_simulations", + "random_seed": 999, + }, + "export": {"dicsard_rejjecteded": "Tru"}, + "server": {"extrude_host": 49}, + "simulator": {"core_per_node": 49}, + "output_constraints": [{"name": "oc", "nam": 2}], + "input_constraints": [{"nom": 3}], + "install_data": [{"datta": "durr"}], + "install_jobs": [{"jerb": "jebr"}], + "install_workflow_jobs": [{"nm": "foo"}], + "install_templates": [{"timplat": 2}], + "config_path": "tmpz", + "workflows": {"presimulation": ["job"]}, + "wrkflows": {"pre_simulation": ["job"]}, + } + + lint_result = EverestConfig.lint_config_dict(config_src) + extra_errors_locs = [ + x["loc"] for x in lint_result if x["type"] == "extra_forbidden" + ] + + assert set(extra_errors_locs) == { + ("wells", 1, "dirll_date"), + ("controls", 0, "inital_guss"), + ("controls", 1, "variables", "list[ControlVariableConfig]", 0, "inital_guess"), + ( + "controls", + 1, + "variables", + "list[ControlVariableGuessListConfig]", + 0, + "inital_guess", + ), + ( + "controls", + 1, + "variables", + "list[ControlVariableConfig]", + 1, + "sampler", + "bakkend", + ), + ( + "controls", + 1, + "variables", + "list[ControlVariableGuessListConfig]", + 1, + "sampler", + "bakkend", + ), + ("objective_functions", 0, "allias"), + ("optimization", "allgorithm"), + ("optimization", "max_functions"), + ("model", "Realizations"), + ("model", "reprot_setps,"), + ("environment", "input_folder"), + ("input_constraints", 0, "nom"), + ("output_constraints", 0, "nam"), + ("install_jobs", 0, "jerb"), + ("install_workflow_jobs", 0, "nm"), + ("install_data", 0, "datta"), + ("install_templates", 0, "timplat"), + ("server", "extrude_host"), + ("simulator", "core_per_node"), + ("export", "dicsard_rejjecteded"), + ("controllers",), + ("envairånment",), + ("moddel",), + ("obejctive_fucctions",), + ("optimisation",), + ("wells", 1, "naim"), + ("welz",), + ("workflows", "presimulation"), + ("wrkflows",), + } + + +def test_that_log_level_property_is_consistent_with_environment_log_level(): + """ + Pydantic 1 somehow overrides property setters, and it was necessary + to enforce this behavior by overriding __getattr__. + This test verifies that the computed setter/getter works as intended + """ + config_src = { + "wells": [ + { + "name": "dog", + }, + { + "name": "w01", + }, + ], + "controls": [ + { + "name": "group_0", + "type": "well_control", + "min": 0, + "max": 0.1, + "variables": [ + {"name": "w01", "initial_guess": 0.0626}, + ], + } + ], + "objective_functions": [{"name": "npv_function"}], + "optimization": { + "algorithm": "optpp_q_newton", + "max_iterations": 2, + "max_function_evaluations": 2, + "perturbation_num": 2, + }, + "model": {"realizations": [0, 1]}, + "environment": { + "output_folder": "everezt_output", + "simulation_folder": "tutorial_simulations", + "log_level": "debug", + }, + } + + levels = { + "debug": logging.DEBUG, # 10 + "info": logging.INFO, # 20 + "warning": logging.WARNING, # 30 + "error": logging.ERROR, # 40 + "critical": logging.CRITICAL, # 50 + } + + config = EverestConfig.with_defaults(**config_src) + assert config.logging_level == levels[config.environment.log_level] + + for lvl_str, lvl_int in levels.items(): + config.environment.log_level = lvl_str + assert config.logging_level == lvl_int + + for lvl_str, lvl_int in levels.items(): + config.logging_level = lvl_str + assert config.environment.log_level == lvl_str + assert config.logging_level == lvl_int diff --git a/tests/everest/test_everest_initialization.py b/tests/everest/test_everest_initialization.py new file mode 100644 index 00000000000..7803f6e2b68 --- /dev/null +++ b/tests/everest/test_everest_initialization.py @@ -0,0 +1,36 @@ +import os + +import pytest + +from everest.config import EverestConfig +from everest.suite import _EverestWorkflow +from tests.everest.utils import relpath, tmp + +NO_PROJECT_RES = ( + os.environ.get("NO_PROJECT_RES", False), + "Skipping tests when no access to /project/res", +) + + +@pytest.mark.skipif(NO_PROJECT_RES[0], reason=NO_PROJECT_RES[1]) +def test_init_no_project_res(): + root_dir = relpath("..", "..", "examples", "egg") + config_file = os.path.join("everest", "model", "config.yml") + with tmp(root_dir): + config_dict = EverestConfig.load_file(config_file) + _EverestWorkflow(config_dict) + + +def test_init(): + root_dir = relpath("test_data", "mocked_test_case") + config_file = os.path.join("mocked_test_case.yml") + with tmp(root_dir): + config_dict = EverestConfig.load_file(config_file) + _EverestWorkflow(config_dict) + + +def test_no_config_init(): + with pytest.raises(AttributeError): + _EverestWorkflow(None) # type: ignore + with pytest.raises(AttributeError): + _EverestWorkflow("Frozen bananas") # type: ignore diff --git a/tests/everest/test_everest_output.py b/tests/everest/test_everest_output.py new file mode 100644 index 00000000000..a4a99c70de3 --- /dev/null +++ b/tests/everest/test_everest_output.py @@ -0,0 +1,111 @@ +import fnmatch +import os +import shutil +from unittest.mock import patch + +import pytest + +from ert.config import ErtConfig +from ert.storage import open_storage +from everest.config import EverestConfig +from everest.detached import generate_everserver_ert_config, start_server +from everest.strings import ( + DEFAULT_OUTPUT_DIR, + DETACHED_NODE_DIR, + OPTIMIZATION_OUTPUT_DIR, +) +from everest.suite import _EverestWorkflow +from everest.util import makedirs_if_needed +from tests.everest.utils import relpath, tmpdir + + +@pytest.mark.integration_test +@patch("ert.simulator.BatchSimulator.start", return_value=None) +@tmpdir(relpath("test_data", "mocked_test_case")) +def test_everest_output(start_mock): + config_folder = os.getcwd() + config = EverestConfig.load_file("mocked_test_case.yml") + everest_output_dir = config.output_dir + + (path, folders, files) = next(os.walk(config_folder)) + initial_folders = set(folders) + initial_files = set(files) + + # Tests in this class used to fail when a callback was passed in + # Use a callback just to see that everything works fine, even though + # the callback does nothing + def useless_cb(*args, **kwargs): + pass + + _EverestWorkflow(config, optimization_callback=useless_cb) + # Check the output folder is created when stating the optimization + # in everest workflow + assert DEFAULT_OUTPUT_DIR not in initial_folders + assert os.path.exists(everest_output_dir) + + # Expected ropt and dakota output in a sub-folder from the expected output path + assert OPTIMIZATION_OUTPUT_DIR in os.listdir(everest_output_dir) + + # If output folder is present because of test class setup, remove it + if os.path.exists(everest_output_dir): + shutil.rmtree(everest_output_dir) + + assert "storage" not in initial_folders + assert DETACHED_NODE_DIR not in initial_folders + ert_config = ErtConfig.with_plugins().from_dict( + generate_everserver_ert_config(config) + ) + makedirs_if_needed(config.output_dir, roll_if_exists=True) + with open_storage(ert_config.ens_path, "w") as storage: + start_server(config, ert_config, storage) + start_mock.assert_called_once() + + (path, folders, files) = next(os.walk(config_folder)) + # Check we are looking at the config folder + assert path == config_folder + + final_folders = set(folders) + final_files = set(files) + + new_folders = final_folders.difference(initial_folders) + # Check only the everest output folder was added + assert list(new_folders) == [DEFAULT_OUTPUT_DIR] + # Check no new files were created when starting the server + assert len(final_files.difference(initial_files)) == 0 + # Check storage folder no longer created in the config folder + assert "storage" not in final_folders + makedirs_if_needed(config.output_dir, roll_if_exists=True) + with open_storage(ert_config.ens_path, "w") as storage: + start_server(config, ert_config, storage) + assert start_mock.call_count == 2 + final_files = os.listdir(config_folder) + + # verify two everest_output dirs present + assert len(fnmatch.filter(final_files, "everest_output*")) == 2 + + +@patch("ert.simulator.BatchSimulator.start", return_value=None) +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_save_running_config(start_mock): + file_name = "config_minimal.yml" + config = EverestConfig.load_file(file_name) + ert_config = ErtConfig.with_plugins().from_dict( + generate_everserver_ert_config(config) + ) + makedirs_if_needed(config.output_dir, roll_if_exists=True) + with open_storage(ert_config.ens_path, "w") as storage: + start_server(config, ert_config, storage) + start_mock.assert_called_once() + + saved_config_path = os.path.join(config.output_dir, file_name) + + assert os.path.exists(saved_config_path) + shutil.move(saved_config_path, os.path.join(os.getcwd(), "saved_config.yml")) + + new_config = EverestConfig.load_file("saved_config.yml") + + # Ignore different config names + config.config_path = None + new_config.config_path = None + + assert config == new_config diff --git a/tests/everest/test_everjobs_io.py b/tests/everest/test_everjobs_io.py new file mode 100644 index 00000000000..4207a6fdbed --- /dev/null +++ b/tests/everest/test_everjobs_io.py @@ -0,0 +1,46 @@ +import json +import os + +import pytest +from ruamel.yaml import YAML + +import everest +from tests.everest.utils import tmpdir + + +@tmpdir(None) +def test_safe_open(): + filename = "a/relative/path" + assert not os.path.exists(filename) + + with pytest.raises(IOError), everest.jobs.io.safe_open(filename) as fout: + print(fout.readlines()) + + with everest.jobs.io.safe_open(filename, "w") as fout: + fout.write("testing testing") + + assert os.path.exists(filename) + with everest.jobs.io.safe_open(filename) as fin: + assert "".join(fin.readlines()) == "testing testing" + + +@tmpdir(None) +def test_load_data(): + data = {"secret": "data"} + + json_file = "data.json" + with open(json_file, "w", encoding="utf-8") as f: + json.dump(data, f) + assert data == everest.jobs.io.load_data(json_file) + + yml_file = "data.yml" + with open(yml_file, "w", encoding="utf-8") as f: + YAML(typ="safe", pure=True).dump(data, f) + assert data == everest.jobs.io.load_data(yml_file) + + garbage_file = "garbage.yml" + with open(garbage_file, "w", encoding="utf-8") as f: + f.write("[") + + with pytest.raises(IOError): + everest.jobs.io.load_data(garbage_file) diff --git a/tests/everest/test_everlint.py b/tests/everest/test_everlint.py new file mode 100644 index 00000000000..ae4c9a97ed0 --- /dev/null +++ b/tests/everest/test_everlint.py @@ -0,0 +1,599 @@ +import os +import tempfile +from pathlib import Path + +import pytest + +import everest +from everest import ConfigKeys +from everest.config import EverestConfig +from everest.config_file_loader import yaml_file_to_substituted_config_dict +from everest.util.forward_models import collect_forward_models +from tests.everest.test_config_validation import has_error +from tests.everest.utils import relpath + +REQUIRED_TOP_KEYS = ( + ConfigKeys.OPTIMIZATION, + ConfigKeys.OBJECTIVE_FUNCTIONS, + ConfigKeys.ENVIRONMENT, + ConfigKeys.MODEL, + ConfigKeys.CONTROLS, +) +OPTIONAL_TOP_KEYS = ( + ConfigKeys.OUTPUT_CONSTRAINTS, + ConfigKeys.INPUT_CONSTRAINTS, + ConfigKeys.INSTALL_JOBS, + ConfigKeys.INSTALL_DATA, + ConfigKeys.FORWARD_MODEL, + ConfigKeys.SIMULATOR, + ConfigKeys.DEFINITIONS, +) + + +def _key(lint_msg): + return lint_msg.key + + +def _keys(lint_msgs): + return list(map(_key, lint_msgs)) + + +SNAKE_OIL_CONFIG = relpath("test_data/snake_oil/", "everest/model/snake_oil_all.yml") + + +def test_missing_key(): + for key in REQUIRED_TOP_KEYS: + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + del config[key] + + if key == ConfigKeys.CONTROLS: + del config[ConfigKeys.INPUT_CONSTRAINTS] # avoid ctrl ref err + errors = EverestConfig.lint_config_dict(config) + assert len(errors) == 1 + assert errors[0]["type"] == "missing" + + +def test_removing_optional_key(): + for key in OPTIONAL_TOP_KEYS: + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + + if key in config: + config.pop(key) + + # NOTE: Installing jobs are optional, but not if you want to run + # imported jobs! At least until Everest comes with a default set of + # jobs. + if key == ConfigKeys.INSTALL_JOBS: + config.pop(ConfigKeys.FORWARD_MODEL) + + assert len(EverestConfig.lint_config_dict(config)) == 0 + + +def test_extra_key(): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config["EXTRA_KEY"] = "funcy data for the win" + + errors = EverestConfig.lint_config_dict(config) + assert len(errors) == 1 + has_error(errors, match="extra fields not permitted") + + +def test_no_data(): + # empty required dict + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.OBJECTIVE_FUNCTIONS].append({}) + errors = EverestConfig.lint_config_dict(config) + assert len(errors) > 0 + assert has_error(errors, match="Field required") # no name + + # empty required shallow dict + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.INPUT_CONSTRAINTS][0][ConfigKeys.WEIGHTS] = {} + errors = EverestConfig.lint_config_dict(config) + assert len(errors) > 0 + assert has_error(errors, match="(.*) weight data required for input constraints") + + # empty required list + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.CONTROLS][0][ConfigKeys.VARIABLES] = [] + errors = EverestConfig.lint_config_dict(config) + assert len(errors) > 0 + assert has_error( + errors, match="Value should have at least 1 item after validation, not 0" + ) + + +def test_invalid_shallow_value(): + for invalid_val in [["one", "two"], {"ans": 42}]: + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + input_constr_weights = config[ConfigKeys.INPUT_CONSTRAINTS][0] + input_constr_weights = input_constr_weights[ConfigKeys.WEIGHTS] + input_constr_weights[next(iter(input_constr_weights.keys()))] = invalid_val + + errors = EverestConfig.lint_config_dict(config) + has_error(errors, match="value is not a valid float") + assert len(errors) > 0 + assert len(errors) == 1 + + +def test_invalid_shallow_key(): + invalid_key = ("one", "two") + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + input_constr_weights = config[ConfigKeys.INPUT_CONSTRAINTS][0] + input_constr_weights = input_constr_weights[ConfigKeys.WEIGHTS] + input_constr_weights[invalid_key] = 12 + + errors = EverestConfig.lint_config_dict(config) + assert len(errors) == 1 + has_error(errors, match="str type expected") + + +def test_non_existent_dir(): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + + config[ConfigKeys.CONFIGPATH] = Path( + config[ConfigKeys.CONFIGPATH] + "fndjffdsn/is/no/dir/" + ) + + retrieved_dir = str(config[ConfigKeys.CONFIGPATH].parent) + assert bool(retrieved_dir) + assert not os.path.isdir(retrieved_dir) + + errors = EverestConfig.lint_config_dict(config) + assert len(errors) > 0 + has_error(errors, match="No such file or directory (.*)") + + +def test_non_existent_file(): + non_existing_file = "fndjffdsn/is/no/file" + assert not os.path.isfile(non_existing_file) + + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.INSTALL_TEMPLATES] = [ + { + ConfigKeys.TEMPLATE: non_existing_file, + ConfigKeys.OUTPUT_FILE: "fndjffdsn/whatever/file", + } + ] + + errors = EverestConfig.lint_config_dict(config) + assert len(errors) > 0 + has_error(errors, match="No such file or directory (.*)") + + +def test_invalid_integer(): + invalid_values = [-1, -999, "apekatt"] + exp_errors = 2 * ["(.*)greater than or equal to 0"] + ["(.*) not a valid integer"] + for invalid_value, err in zip(invalid_values, exp_errors): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.MODEL][ConfigKeys.REALIZATIONS][1] = invalid_value + + errors = EverestConfig.lint_config_dict(config) + assert len(errors) > 0 + has_error(errors, match=err) + + +def test_invalid_string(): + invalid_value = ["Who am I?", "Not a string.."] + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.INSTALL_DATA][0][ConfigKeys.TARGET] = invalid_value + + errors = EverestConfig.lint_config_dict(config) + assert len(errors) > 0 + has_error(errors, match="str type expected") + + +def test_no_list(): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.INSTALL_DATA] = None + + errors = EverestConfig.lint_config_dict(config) + assert len(errors) == 0 + + +def test_empty_list(): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.INSTALL_DATA] = [] + + errors = EverestConfig.lint_config_dict(config) + assert len(errors) == 0 + + +def test_malformed_list(): + invalid_values = [["a", "b"], None, "not a file for sure?"] + exp_errs = [ + "str type expected", + "none is not an allowed value", + "No such file or directory (.*)", + ] + + for invalid_val, exp_err in zip(invalid_values, exp_errs): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.INSTALL_DATA][0][ConfigKeys.SOURCE] = invalid_val + + errors = EverestConfig.lint_config_dict(config) + + assert len(errors) > 0 + has_error(errors, match=exp_err) + + +def test_no_installed_jobs(): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config.pop(ConfigKeys.INSTALL_JOBS) + + errors = EverestConfig.lint_config_dict(config) + for err in errors: + has_error([err], match="unknown job (.*)") + + +def test_not_installed_job_in_script(): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + + config[ConfigKeys.FORWARD_MODEL] = ["my_well_drill"] + + errors = EverestConfig.lint_config_dict(config) + has_error(errors, match="unknown job my_well_drill") + + +def test_validator_lint_value_error_msg(): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.MODEL][ConfigKeys.REALIZATIONS][1] = -1 # invalid value + errors = EverestConfig.lint_config_dict(config) + assert len(errors) == 1 + has_error(errors, match="(.*) value is greater than or equal to 0") + + +def test_bool_validation(): + values = [True, False, 0, 1, "True", ["I'm", [True for real in []]]] + exp_errs = 2 * [None] + 4 * ["(.*) could not be parsed to a boolean"] + + for val, exp_err in zip(values, exp_errs): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.INSTALL_DATA][0][ConfigKeys.LINK] = val + + errors = EverestConfig.lint_config_dict(config) + if exp_err is not None: + has_error(errors, match=exp_err) + + +def test_simulation_spec(): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.ENVIRONMENT][ConfigKeys.SIMULATION_FOLDER] = ( + "/usr/bin/unwriteable" + ) + errors = EverestConfig.lint_config_dict(config) + assert len(errors) == 1 + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + has_error(errors, match="User does not have write access (.*)") + + config[ConfigKeys.ENVIRONMENT][ConfigKeys.SIMULATION_FOLDER] = ( + "/tmp/this_everest_folder/is/writeable" + ) + errors = EverestConfig.lint_config_dict(config) + assert not errors + + +def test_existing_path_validation(): + values = [ + SNAKE_OIL_CONFIG, + os.path.split(SNAKE_OIL_CONFIG)[0], + "A super path", + 0, + None, + ["I'm", "a", "path,", "not!"], + ] + + exp_errs = ( + 2 * [None] + + 2 * ["No such file or directory (.*)"] + + ["none is not an allowed value"] + + ["str type expected"] + ) + + for val, exp_err in zip(values, exp_errs): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.INSTALL_DATA][0][ConfigKeys.SOURCE] = val + + errors = EverestConfig.lint_config_dict(config) + if exp_err is None: + assert len(errors) == 0 + else: + has_error(errors, match=exp_err) + + +def test_existing_file_validation(): + well_job = os.path.join( + os.path.dirname(SNAKE_OIL_CONFIG), "..", "..", "jobs/SNAKE_OIL_NPV" + ) + values = [ + well_job, + os.path.split(SNAKE_OIL_CONFIG)[0], + "A super path", + 0, + None, + ["I'm", "a", "path,", "not!"], + ] + exp_errs = ( + [None] + + ["Is not a file (.*)"] + + 2 * ["No such file or directory (.*)"] + + ["none is not an allowed value"] + + ["str type expected"] + ) + + for val, exp_err in zip(values, exp_errs): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + jobs = config[ConfigKeys.INSTALL_JOBS] + jobs[0][ConfigKeys.SOURCE] = val + + errors = EverestConfig.lint_config_dict(config) + if exp_err is None: + assert len(errors) == 0 + else: + has_error(errors, match=exp_err) + + +def test_existing_dir_validation(): + values = [ + SNAKE_OIL_CONFIG, + "I'm not a path!", + ] + + exp_errs = [None, "no such file or directory (.*)"] + + for val, exp_err in zip(values, exp_errs): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.CONFIGPATH] = Path(val) + errors = EverestConfig.lint_config_dict(config) + + if exp_err is None: + assert len(errors) == 0 + else: + has_error(errors, match=exp_err) + + +def test_valid_path_validation(): + values = [ + SNAKE_OIL_CONFIG, + os.path.dirname(SNAKE_OIL_CONFIG), + "A super path", + ("super long path" * 300), + 0, + None, + ["I'm", "a", "path,", "not!"], + "/path/with/" + chr(0) + "embeddedNULL", + ] + + exp_errs = ( + [None, None, None] + + ["File name too long"] + + 3 * ["str type expected"] + + ["embedded null byte"] + ) + + for val, exp_err in zip(values, exp_errs): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.ENVIRONMENT][ConfigKeys.OUTPUT_DIR] = val + + errors = EverestConfig.lint_config_dict(config) + if exp_err is None: + assert len(errors) == 0 + else: + has_error(errors, match=exp_err) + + +def test_valid_filepath_validation(): + values = [ + os.path.dirname(SNAKE_OIL_CONFIG), + os.path.dirname(SNAKE_OIL_CONFIG) + "/export.csv", + "path/to/file.csv", + "path/to/folder/", + ] + + exp_errs = ["Invalid type", None, None, "Invalid type"] + + for val, exp_err in zip(values, exp_errs): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config["export"] = {} + config["export"]["csv_output_filepath"] = val + errors = EverestConfig.lint_config_dict(config) + + if exp_err is None: + assert len(errors) == 0 + else: + has_error(errors, match=exp_err) + + +def test_ert_job_file(): + content = [ + ("ARGUMENT 1\n", "missing EXECUTABLE (.*)"), + ("EXECUTABLE /no/such/path\n", "No such executable (.*)"), + ("EXECUTABLE %s\n" % SNAKE_OIL_CONFIG, "(.*)_oil_all.yml is not executable"), + ] + for cnt, err in content: + with tempfile.NamedTemporaryFile(mode="w", encoding="utf-8") as f: + f.write(cnt) + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.INSTALL_JOBS][0][ConfigKeys.SOURCE] = f.name + + errors = EverestConfig.lint_config_dict(config) + has_error(errors, match=err) + + +def test_well_ref_validation(): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + errors = EverestConfig.lint_config_dict(config) + assert len(errors) == 0 + + variables = config[ConfigKeys.CONTROLS][0][ConfigKeys.VARIABLES] + variables.append({ConfigKeys.NAME: "a.new.well", ConfigKeys.INITIAL_GUESS: 0.2}) + errors = EverestConfig.lint_config_dict(config) + has_error(errors, match="(.*) name can not contain any dots") + + wells = config[ConfigKeys.WELLS] + wells.append({ConfigKeys.NAME: "a.new.well"}) + errors = EverestConfig.lint_config_dict(config) + has_error(errors, match="(.*) name can not contain any dots") + + variables[-1][ConfigKeys.NAME] = "aNewWell" + wells[-1] = {ConfigKeys.NAME: "aNewWell"} + errors = EverestConfig.lint_config_dict(config) + assert len(errors) == 0 + + +def test_control_ref_validation(): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + + errors = EverestConfig.lint_config_dict(config) + assert len(errors) == 0 + + weights = config[ConfigKeys.INPUT_CONSTRAINTS][0][ConfigKeys.WEIGHTS] + weights.pop("group.W1") + + errors = EverestConfig.lint_config_dict(config) + assert len(errors) == 0 + + weights["no_group.W1"] = 1.0 + weights["group.no_ctrl"] = 1.0 + weights["g.n.c.s.w"] = 1.0 + weights["asdasdasd"] = 1.0 + + errors = EverestConfig.lint_config_dict(config) + errors = errors[0]["ctx"]["error"].args[0] + assert len(errors) == 4 + for err in errors: + assert "not match any instance of control_name.variable_name" in err + + +def test_init_context_controls(): + test_configs = [ + "test_data/mocked_test_case/config_input_constraints.yml", + "test_data/mocked_test_case/mocked_test_case.yml", + ] + test_configs = map(relpath, test_configs) + + for config_file in test_configs: + # No initial errors + config = yaml_file_to_substituted_config_dict(config_file) + assert len(EverestConfig.lint_config_dict(config)) == 0 + + # Messed up controls + config = yaml_file_to_substituted_config_dict(config_file) + config.pop(ConfigKeys.CONTROLS) + assert len(EverestConfig.lint_config_dict(config)) > 0 + + config = yaml_file_to_substituted_config_dict(config_file) + config[ConfigKeys.CONTROLS] = "monkey" + assert len(EverestConfig.lint_config_dict(config)) > 0 + + # Messed up control group name + config = yaml_file_to_substituted_config_dict(config_file) + config[ConfigKeys.CONTROLS][0].pop(ConfigKeys.NAME) + assert len(EverestConfig.lint_config_dict(config)) > 0 + + config = yaml_file_to_substituted_config_dict(config_file) + config[ConfigKeys.CONTROLS][0]["name"] = ["my", "name"] + assert len(EverestConfig.lint_config_dict(config)) > 0 + + config = yaml_file_to_substituted_config_dict(config_file) + config[ConfigKeys.CONTROLS][0]["name"] = "my.name" + assert len(EverestConfig.lint_config_dict(config)) > 0 + + # Messed up variables + config = yaml_file_to_substituted_config_dict(config_file) + config[ConfigKeys.CONTROLS][0].pop(ConfigKeys.VARIABLES) + assert len(EverestConfig.lint_config_dict(config)) > 0 + + config = yaml_file_to_substituted_config_dict(config_file) + config[ConfigKeys.CONTROLS][0] = "my vars" + assert len(EverestConfig.lint_config_dict(config)) > 0 + + # Messed up names + config = yaml_file_to_substituted_config_dict(config_file) + variable = config[ConfigKeys.CONTROLS][0][ConfigKeys.VARIABLES][0] + variable.pop(ConfigKeys.NAME) + assert len(EverestConfig.lint_config_dict(config)) > 0 + + config = yaml_file_to_substituted_config_dict(config_file) + variable = config[ConfigKeys.CONTROLS][0][ConfigKeys.VARIABLES][0] + variable[ConfigKeys.NAME] = {"name": True} + assert len(EverestConfig.lint_config_dict(config)) > 0 + + config = yaml_file_to_substituted_config_dict(config_file) + variable = config[ConfigKeys.CONTROLS][0][ConfigKeys.VARIABLES][0] + variable[ConfigKeys.NAME] = "my.name" + assert len(EverestConfig.lint_config_dict(config)) > 0 + + +def test_default_jobs(): + config_file = relpath("test_data/mocked_test_case/mocked_test_case.yml") + config = EverestConfig.load_file(config_file) + config.forward_model += everest.jobs.script_names + assert len(EverestConfig.lint_config_dict(config.to_dict())) == 0 + + +def test_date_type(): + valid_dates = ( + "2000-1-1", + "2010-1-1", + "2018-12-31", + ) + + invalid_dates = ( + "32.01.2000", + "2000-1-32", + "fdsafdas", + "01-01-01", + "...", + None, + {}, + "2000-2-30", + ) + + for date in valid_dates + invalid_dates: + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + config[ConfigKeys.WELLS][0][ConfigKeys.DRILL_DATE] = date + + err = EverestConfig.lint_config_dict(config) + if date in valid_dates: + assert not err + else: + assert len(err) > 0, "%s was wrongly accepted" % date + has_error(err, match=f"malformed date: {date}(.*)") + + +def test_lint_report_steps(): + config_file = relpath("test_data/mocked_test_case/mocked_test_case.yml") + config = EverestConfig.load_file(config_file).to_dict() + # Check initial config file is valid + assert len(EverestConfig.lint_config_dict(config)) == 0 + config[ConfigKeys.MODEL][ConfigKeys.REPORT_STEPS] = [ + "2000-1-1", + "2001-1-1", + "2002-1-1", + "2003-1-1", + ] + # Check config file is valid after report steps have been added + assert len(EverestConfig.lint_config_dict(config)) == 0 + config[ConfigKeys.MODEL][ConfigKeys.REPORT_STEPS].append("invalid_date") + # Check config no longer valid when invalid date is added + errors = EverestConfig.lint_config_dict(config) + has_error(errors, match="malformed date: invalid_date(.*)") + + +@pytest.mark.fails_on_macos_github_workflow +def test_lint_everest_models_jobs(): + pytest.importorskip("everest_models") + config_file = relpath("../../examples/egg/everest/model/config.yml") + config = EverestConfig.load_file(config_file).to_dict() + # Check initial config file is valid + assert len(EverestConfig.lint_config_dict(config)) == 0 + + +def test_overloading_everest_models_names(): + config = yaml_file_to_substituted_config_dict(SNAKE_OIL_CONFIG) + for job in collect_forward_models(): + config["install_jobs"][2]["name"] = job["name"] + config["forward_model"][1] = job["name"] + errors = EverestConfig.lint_config_dict(config) + assert len(errors) == 0, f"Failed for job {job['name']}" diff --git a/tests/everest/test_everserver.py b/tests/everest/test_everserver.py new file mode 100644 index 00000000000..2103da56421 --- /dev/null +++ b/tests/everest/test_everserver.py @@ -0,0 +1,246 @@ +import os +import ssl +from functools import partial +from unittest.mock import patch + +from ropt.enums import OptimizerExitCode +from seba_sqlite.snapshot import SebaSnapshot + +from everest.config import EverestConfig +from everest.detached import ServerStatus, everserver_status +from everest.detached.jobs import everserver +from everest.simulator import JOB_FAILURE, JOB_SUCCESS +from everest.strings import OPT_FAILURE_REALIZATIONS, SIM_PROGRESS_ENDPOINT +from tests.everest.utils import relpath, tmpdir + + +def configure_everserver_logger(*args, **kwargs): + """Mock exception raised""" + raise Exception("Configuring logger failed") + + +def check_status(*args, **kwargs): + status = everserver_status(args[0]) + assert status["status"] == kwargs["status"] + + +def fail_optimization( + config, simulation_callback, optimization_callback, from_ropt=False +): + # Patch start_optimization to raise a failed optimization callback. Also + # call the provided simulation callback, which has access to the shared_data + # variable in the eversever main function. Patch that callback to modify + # shared_data (see set_shared_status() below). + simulation_callback(None, None) + if from_ropt: + return OptimizerExitCode.TOO_FEW_REALIZATIONS + + raise Exception("Failed optimization") + + +def set_shared_status(context_status, event, shared_data, progress): + # Patch _sim_monitor with this to access the shared_data variable in the + # everserver main function. + failed = len( + [job for queue in progress for job in queue if job["status"] == JOB_FAILURE] + ) + + shared_data[SIM_PROGRESS_ENDPOINT] = { + "status": {"failed": failed}, + "progress": progress, + } + + +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_certificate_generation(): + everest_config = EverestConfig.load_file("config_minimal.yml") + cert, key, pw = everserver._generate_certificate(everest_config) + + # check that files are written + assert os.path.exists(cert) + assert os.path.exists(key) + + # check certificate is readable + ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + ctx.load_cert_chain(cert, key, pw) # raise on error + + +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_hostfile_storage(): + config = EverestConfig.load_file("config_minimal.yml") + + expected_result = { + "host": "hostname.1.2.3", + "port": "5000", + "cert": "/a/b/c.cert", + "auth": "1234", + } + everserver._write_hostfile(config, **expected_result) + result = config.server_info + assert result == expected_result + + +@patch("sys.argv", ["name", "--config-file", "config_minimal.yml"]) +@patch( + "everest.detached.jobs.everserver.configure_logger", + side_effect=configure_everserver_logger, +) +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_everserver_status_failure(mf_1): + config_file = "config_minimal.yml" + config = EverestConfig.load_file(config_file) + everserver.main() + status = everserver_status(config) + + assert status["status"] == ServerStatus.failed + assert "Exception: Configuring logger failed" in status["message"] + + +@patch("sys.argv", ["name", "--config-file", "config_minimal.yml"]) +@patch("everest.detached.jobs.everserver.configure_logger") +@patch("everest.detached.jobs.everserver._generate_authentication") +@patch( + "everest.detached.jobs.everserver._generate_certificate", + return_value=(None, None, None), +) +@patch( + "everest.detached.jobs.everserver._find_open_port", + return_value=42, +) +@patch( + "everest.detached.jobs.everserver._write_hostfile", + side_effect=partial(check_status, status=ServerStatus.starting), +) +@patch("everest.detached.jobs.everserver._everserver_thread") +@patch( + "everest.detached.jobs.everserver.start_optimization", + side_effect=partial(check_status, status=ServerStatus.running), +) +@patch("everest.detached.jobs.everserver.validate_export", return_value=([], False)) +@patch( + "everest.detached.jobs.everserver.export_to_csv", + side_effect=partial(check_status, status=ServerStatus.exporting_to_csv), +) +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_everserver_status_running_complete(*args): + config_file = "config_minimal.yml" + config = EverestConfig.load_file(config_file) + everserver.main() + status = everserver_status(config) + + assert status["status"] == ServerStatus.completed + assert status["message"] == "Optimization completed." + + +@patch("sys.argv", ["name", "--config-file", "config_minimal.yml"]) +@patch("everest.detached.jobs.everserver.configure_logger") +@patch("everest.detached.jobs.everserver._generate_authentication") +@patch( + "everest.detached.jobs.everserver._generate_certificate", + return_value=(None, None, None), +) +@patch( + "everest.detached.jobs.everserver._find_open_port", + return_value=42, +) +@patch("everest.detached.jobs.everserver._write_hostfile") +@patch("everest.detached.jobs.everserver._everserver_thread") +@patch( + "everest.detached.jobs.everserver.start_optimization", + side_effect=partial(fail_optimization, from_ropt=True), +) +@patch( + "everest.detached.jobs.everserver._sim_monitor", + side_effect=partial( + set_shared_status, + progress=[ + [ + {"name": "job1", "status": JOB_FAILURE}, + {"name": "job1", "status": JOB_FAILURE}, + ], + [ + {"name": "job2", "status": JOB_SUCCESS}, + {"name": "job2", "status": JOB_FAILURE}, + ], + ], + ), +) +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_everserver_status_failed_job(*args): + config_file = "config_minimal.yml" + config = EverestConfig.load_file(config_file) + everserver.main() + status = everserver_status(config) + + # The server should fail and store a user-friendly message. + assert status["status"] == ServerStatus.failed + assert OPT_FAILURE_REALIZATIONS in status["message"] + assert "3 job failures caused by: job1, job2" in status["message"] + + +@patch("sys.argv", ["name", "--config-file", "config_minimal.yml"]) +@patch("everest.detached.jobs.everserver.configure_logger") +@patch("everest.detached.jobs.everserver._generate_authentication") +@patch( + "everest.detached.jobs.everserver._generate_certificate", + return_value=(None, None, None), +) +@patch( + "everest.detached.jobs.everserver._find_open_port", + return_value=42, +) +@patch("everest.detached.jobs.everserver._write_hostfile") +@patch("everest.detached.jobs.everserver._everserver_thread") +@patch( + "everest.detached.jobs.everserver.start_optimization", + side_effect=fail_optimization, +) +@patch( + "everest.detached.jobs.everserver._sim_monitor", + side_effect=partial(set_shared_status, progress=[]), +) +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_everserver_status_exception(*args): + config_file = "config_minimal.yml" + config = EverestConfig.load_file(config_file) + everserver.main() + status = everserver_status(config) + + # The server should fail, and store the exception that + # start_optimization raised. + assert status["status"] == ServerStatus.failed + assert "Exception: Failed optimization" in status["message"] + + +@patch("sys.argv", ["name", "--config-file", "config_one_batch.yml"]) +@patch("everest.detached.jobs.everserver.configure_logger") +@patch("everest.detached.jobs.everserver._generate_authentication") +@patch( + "everest.detached.jobs.everserver._generate_certificate", + return_value=(None, None, None), +) +@patch( + "everest.detached.jobs.everserver._find_open_port", + return_value=42, +) +@patch("everest.detached.jobs.everserver._write_hostfile") +@patch("everest.detached.jobs.everserver._everserver_thread") +@patch( + "everest.detached.jobs.everserver._sim_monitor", + side_effect=partial(set_shared_status, progress=[]), +) +@tmpdir(relpath("..", "..", "examples", "math_func")) +def test_everserver_status_max_batch_num(*args): + config_file = "config_one_batch.yml" + config = EverestConfig.load_file(config_file) + everserver.main() + status = everserver_status(config) + + # The server should complete without error. + assert status["status"] == ServerStatus.completed + + # Check that there is only one batch. + snapshot = SebaSnapshot(config.optimization_output_dir).get_snapshot( + filter_out_gradient=False, batches=None + ) + assert {data.batch for data in snapshot.simulation_data} == {0} diff --git a/tests/everest/test_export.py b/tests/everest/test_export.py new file mode 100644 index 00000000000..a5d9ca8fce1 --- /dev/null +++ b/tests/everest/test_export.py @@ -0,0 +1,373 @@ +import os +import shutil + +import pandas as pd +import pytest + +from everest import filter_data +from everest.bin.utils import export_with_progress +from everest.config import EverestConfig +from everest.config.export_config import ExportConfig +from everest.export import export, validate_export +from tests.everest.utils import create_cached_mocked_test_case, relpath, tmpdir + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") + +CONFIG_FILE_MOCKED_TEST_CASE = "mocked_multi_batch.yml" +CONFIG_PATH_MOCKED_TEST_CASE = relpath("test_data", "mocked_test_case") +CASHED_RESULTS_FOLDER = relpath("test_data", "cached_results_config_multiobj") +CONFIG_FILE = "config_multiobj.yml" +DATA = pd.DataFrame( + { + "WOPT:WELL0": range(4), + "MONKEY": 4 * [0], + "WCON:WELL1": 4 * [14], + "GOPT:GROUP0": [5, 6, 2, 1], + "WOPT:WELL1": range(4), + } +) + +pytestmark = pytest.mark.xdist_group(name="starts_everest") + + +@pytest.fixture() +def cache_dir(request, monkeypatch): + return create_cached_mocked_test_case(request, monkeypatch) + + +def assertEqualDataFrames(x, y): + assert set(x.columns) == set(y.columns) + for col in x.columns: + assert list(x[col]) == list(y[col]) + + +def test_filter_no_wildcard(): + keywords = ["MONKEY", "Dr. MONKEY", "WOPT:WELL1"] + assertEqualDataFrames(DATA[["MONKEY", "WOPT:WELL1"]], filter_data(DATA, keywords)) + + +def test_filter_leading_wildcard(): + keywords = ["*:WELL1"] + assertEqualDataFrames( + DATA[["WCON:WELL1", "WOPT:WELL1"]], filter_data(DATA, keywords) + ) + + +def test_filter_trailing_wildcard(): + keywords = ["WOPT:*", "MONKEY"] + assertEqualDataFrames( + DATA[["MONKEY", "WOPT:WELL0", "WOPT:WELL1"]], + filter_data(DATA, keywords), + ) + + +def test_filter_double_wildcard(): + keywords = ["*OPT:*0"] + assertEqualDataFrames( + DATA[["WOPT:WELL0", "GOPT:GROUP0"]], filter_data(DATA, keywords) + ) + + +@tmpdir(CONFIG_PATH) +def test_export_only_non_gradient_with_increased_merit(): + config = EverestConfig.load_file(CONFIG_FILE) + os.makedirs(config.optimization_output_dir) + shutil.copy( + os.path.join(CASHED_RESULTS_FOLDER, "seba.db"), + os.path.join(config.optimization_output_dir, "seba.db"), + ) + + # Default export functionality when no export section is defined + df = export(config) + + # Test that the default export functionality generated data frame + # contains only non gradient simulations + for grad_flag in df["is_gradient"].values: + assert grad_flag == 0 + + # Test that the default export functionality generated data frame + # contains only rows with increased merit simulations + for merit_flag in df["increased_merit"].values: + assert merit_flag == 1 + + +@tmpdir(CONFIG_PATH) +def test_export_only_non_gradient(): + config = EverestConfig.load_file(CONFIG_FILE) + os.makedirs(config.optimization_output_dir) + shutil.copy( + os.path.join(CASHED_RESULTS_FOLDER, "seba.db"), + os.path.join(config.optimization_output_dir, "seba.db"), + ) + + # Add export section to config + config.export = ExportConfig(discard_rejected=False) + + df = export(config) + + # Check if only discard rejected key is set to False in the export + # section the export will contain only non-gradient simulations + assert 1 not in df["is_gradient"].values + + # Check the export contains both increased merit and non increased merit + # when discard rejected key is set to False + assert 0 in df["increased_merit"].values + assert 1 in df["increased_merit"].values + + +@tmpdir(CONFIG_PATH) +def test_export_only_increased_merit(): + config = EverestConfig.load_file(CONFIG_FILE) + os.makedirs(config.optimization_output_dir) + shutil.copy( + os.path.join(CASHED_RESULTS_FOLDER, "seba.db"), + os.path.join(config.optimization_output_dir, "seba.db"), + ) + + # Add export section to config + config.export = ExportConfig(discard_gradient=False) + + df = export(config) + + # Check the export contains both gradient and non-gradient simulation + # when discard gradient key is set to False + assert 1 in df["is_gradient"].values + assert 0 in df["is_gradient"].values + + # Check if only discard gradient key is set to False + # the export will contain only increased merit simulations + assert 0 not in df["increased_merit"].values + + +@tmpdir(CONFIG_PATH) +def test_export_all_batches(): + config = EverestConfig.load_file(CONFIG_FILE) + os.makedirs(config.optimization_output_dir) + shutil.copy( + os.path.join(CASHED_RESULTS_FOLDER, "seba.db"), + os.path.join(config.optimization_output_dir, "seba.db"), + ) + + # Add export section to config + config.export = ExportConfig(discard_gradient=False, discard_rejected=False) + + df = export(config) + + # Check the export contains both gradient and non-gradient simulation + assert 1 in df["is_gradient"].values + assert 0 in df["is_gradient"].values + + # Check the export contains both merit and non-merit simulation + assert 1 in df["increased_merit"].values + assert 0 in df["increased_merit"].values + + +@tmpdir(CONFIG_PATH) +def test_export_only_give_batches(): + config = EverestConfig.load_file(CONFIG_FILE) + os.makedirs(config.optimization_output_dir) + shutil.copy( + os.path.join(CASHED_RESULTS_FOLDER, "seba.db"), + os.path.join(config.optimization_output_dir, "seba.db"), + ) + + # Add export section to config + config.export = ExportConfig(discard_gradient=True, batches=[2]) + + df = export(config) + # Check only simulations from given batches are present in export + for id in df["batch"].values: + assert id == 2 + + +@tmpdir(CONFIG_PATH_MOCKED_TEST_CASE) +@pytest.mark.fails_on_macos_github_workflow +def test_export_batches_progress(cache_dir): + config = EverestConfig.load_file(CONFIG_FILE_MOCKED_TEST_CASE) + + shutil.copytree( + cache_dir / "mocked_multi_batch_output", + "mocked_multi_batch_output", + dirs_exist_ok=True, + ) + + # Add export section to config + config.export = ExportConfig(discard_gradient=True, batches=[2]) + + df = export_with_progress(config) + # Check only simulations from given batches are present in export + for id in df["batch"].values: + assert id == 2 + + +@tmpdir(CONFIG_PATH) +def test_export_nothing_for_empty_batch_list(): + config = EverestConfig.load_file(CONFIG_FILE) + os.makedirs(config.optimization_output_dir) + shutil.copy( + os.path.join(CASHED_RESULTS_FOLDER, "seba.db"), + os.path.join(config.optimization_output_dir, "seba.db"), + ) + + # Add discard gradient flag to config file + config.export = ExportConfig( + discard_gradient=True, discard_rejected=True, batches=[] + ) + df = export(config) + + # Check export returns empty data frame + assert df.empty + + +@tmpdir(CONFIG_PATH) +def test_export_nothing(): + config = EverestConfig.load_file(CONFIG_FILE) + os.makedirs(config.optimization_output_dir) + shutil.copy( + os.path.join(CASHED_RESULTS_FOLDER, "seba.db"), + os.path.join(config.optimization_output_dir, "seba.db"), + ) + + # Add discard gradient flag to config file + config.export = ExportConfig( + skip_export=True, discard_gradient=True, discard_rejected=True, batches=[3] + ) + df = export(config) + + # Check export returns empty data frame + assert df.empty + + +@tmpdir(CONFIG_PATH) +def test_get_export_path(): + config = EverestConfig.load_file(CONFIG_FILE) + + # Test default export path when no csv_output_filepath is defined + expected_export_path = os.path.join( + config.output_dir, CONFIG_FILE.replace(".yml", ".csv") + ) + assert expected_export_path == config.export_path + + # Test export path when csv_output_filepath is an absolute path + new_export_folderpath = os.path.join(config.output_dir, "new/folder") + new_export_filepath = os.path.join( + new_export_folderpath, CONFIG_FILE.replace(".yml", ".csv") + ) + + config.export = ExportConfig(csv_output_filepath=new_export_filepath) + + expected_export_path = new_export_filepath + assert expected_export_path == config.export_path + + # Test export path when csv_output_filepath is a relative path + config.export.csv_output_filepath = os.path.join( + "new/folder", CONFIG_FILE.replace(".yml", ".csv") + ) + assert expected_export_path == config.export_path + + # Test export when file does not contain an extension. + config_file_no_extension = os.path.splitext(os.path.basename(CONFIG_FILE))[0] + shutil.copy(CONFIG_FILE, config_file_no_extension) + new_config = EverestConfig.load_file(config_file_no_extension) + expected_export_path = os.path.join( + new_config.output_dir, f"{config_file_no_extension}.csv" + ) + assert expected_export_path == new_config.export_path + + +@tmpdir(CONFIG_PATH_MOCKED_TEST_CASE) +@pytest.mark.fails_on_macos_github_workflow +def test_validate_export(cache_dir): + config = EverestConfig.load_file(CONFIG_FILE_MOCKED_TEST_CASE) + + shutil.copytree( + cache_dir / "mocked_multi_batch_output", + "mocked_multi_batch_output", + dirs_exist_ok=True, + ) + + def check_error(expected_error, reported_errors): + expected_error_msg, expected_export_ecl = expected_error + error_list, export_ecl = reported_errors + # If no error was message provided the list of errors + # should also be empty + if not expected_error_msg: + assert len(error_list) == 0 + assert expected_export_ecl == export_ecl + else: + found = False + for error in error_list: + if expected_error_msg in error: + found = True + break + assert found + assert expected_export_ecl == export_ecl + + # Test export validator outputs no errors when the config file contains + # an empty export section + config.export = None + check_error(("", True), validate_export(config)) + + # Test error when user defines an empty list for the eclipse keywords + config.export = ExportConfig() + config.export.keywords = [] + check_error( + ("No eclipse keywords selected for export", False), validate_export(config) + ) + + # Test error when user defines an empty list for the eclipse keywords + # and empty list of for batches to export + config.export.batches = [] + check_error(("No batches selected for export.", False), validate_export(config)) + + # Test export validator outputs no errors when the config file contains + # only keywords that represent a subset of already internalized keys + config.export.keywords = ["FOPT"] + config.export.batches = None + check_error(("", True), validate_export(config)) + + non_int_key = "STANGE_KEY" + config.export.keywords = [non_int_key, "FOPT"] + check_error( + ( + "Non-internalized ecl keys selected for export '{keys}'." "".format( + keys=non_int_key + ), + False, + ), + validate_export(config), + ) + + # Test that validating the export spots non-valid batches and removes + # them from the list of batches selected for export. + non_valid_batch = 42 + config.export = ExportConfig(batches=[0, non_valid_batch]) + check_error( + ( + "Batch {} not found in optimization results. Skipping for" + " current export".format(non_valid_batch), + True, + ), + validate_export(config), + ) + assert config.export.batches == [0] + + +@tmpdir(CONFIG_PATH) +def test_export_gradients(): + config = EverestConfig.load_file(CONFIG_FILE) + os.makedirs(config.optimization_output_dir) + shutil.copy( + os.path.join(CASHED_RESULTS_FOLDER, "seba.db"), + os.path.join(config.optimization_output_dir, "seba.db"), + ) + + df = export(config) + + for function in config.objective_functions: + for control in config.controls: + for variable in control.variables: + assert ( + f"gradient-{function.name}-{control.name}_{variable.name}" + in df.columns + ) diff --git a/tests/everest/test_export_data_dialog.py b/tests/everest/test_export_data_dialog.py new file mode 100644 index 00000000000..260ecfbce3d --- /dev/null +++ b/tests/everest/test_export_data_dialog.py @@ -0,0 +1,40 @@ +import os +from pathlib import Path + +import pytest +from PyQt5.QtWidgets import QFileDialog, QMessageBox +from qtpy.QtCore import Qt, QTimer + +from everest.config.everest_config import EverestConfig +from ieverest import IEverest +from ieverest.widgets.export_data_dialog import ExportDataDialog +from tests.everest.utils import tmpdir + + +@pytest.mark.ui_test +@pytest.mark.xdist_group(name="starts_everest") +@tmpdir(None) +def test_export_data_dialog(qtbot, monkeypatch): + ieverest = IEverest() + + config = EverestConfig.with_defaults() + dialog = ExportDataDialog(config) + dialog.show() + + dialog.keywords_txt.setText("keyword") + dialog.batches_txt.setText("1,2") + + monkeypatch.setattr( + QFileDialog, "getSaveFileName", lambda parent, caption, dir, filter: (dir, "") + ) + + def handle_message_box(): + qtbot.waitUntil(lambda: ieverest._gui.findChild(QMessageBox) is not None) + widget = ieverest._gui.findChild(QMessageBox) + qtbot.mouseClick(widget.button(QMessageBox.Ok), Qt.MouseButton.LeftButton) + assert "Export completed successfully!" in widget.text() + + QTimer.singleShot(100, handle_message_box) + dialog.export_btn.click() + + assert Path(os.path.join(config.output_dir, "export.csv")).exists() diff --git a/tests/everest/test_fix_control.py b/tests/everest/test_fix_control.py new file mode 100644 index 00000000000..56e96220929 --- /dev/null +++ b/tests/everest/test_fix_control.py @@ -0,0 +1,19 @@ +from everest.config import EverestConfig +from everest.suite import _EverestWorkflow +from tests.everest.utils import relpath, tmpdir + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") +CONFIG_FILE_ADVANCED = "config_advanced_scipy.yml" + + +@tmpdir(CONFIG_PATH) +def test_fix_control(): + config = EverestConfig.load_file(CONFIG_FILE_ADVANCED) + config.controls[0].variables[0].enabled = False + + workflow = _EverestWorkflow(config) + assert workflow is not None + workflow.start_optimization() + + # Check that the first variable remains fixed: + assert workflow.result.controls["point_x-0"] == config.controls[0].initial_guess diff --git a/tests/everest/test_fm_plugins.py b/tests/everest/test_fm_plugins.py new file mode 100644 index 00000000000..be1fae80582 --- /dev/null +++ b/tests/everest/test_fm_plugins.py @@ -0,0 +1,124 @@ +import logging +from itertools import chain +from typing import Callable, Iterator, Sequence, Type + +import pluggy +import pytest +from pydantic import BaseModel + +from everest.plugins import hook_impl, hook_specs, hookimpl +from everest.strings import EVEREST +from everest.util.forward_models import collect_forward_models + + +class MockPluginManager(pluggy.PluginManager): + """A testing plugin manager""" + + def __init__(self): + super().__init__(EVEREST) + self.add_hookspecs(hook_specs) + + +@pytest.fixture +def plugin_manager() -> Iterator[Callable[..., MockPluginManager]]: + pm = MockPluginManager() + + def register_plugin_hooks(*plugins) -> MockPluginManager: + if not plugins: + pm.register(hook_impl) + pm.load_setuptools_entrypoints(EVEREST) + else: + for plugin in plugins: + pm.register(plugin) + return pm + + yield register_plugin_hooks + + +def test_jobs(): + for job in collect_forward_models(): + assert "name" in job + assert "path" in job + + +def test_everest_models_jobs(plugin_manager): + pytest.importorskip("everest_models") + pm = plugin_manager() + assert any( + hook.plugin_name.startswith(EVEREST) + for hook in pm.hook.get_forward_models.get_hookimpls() + ) + + +def test_multiple_plugins(plugin_manager): + _JOBS = [ + {"name": "job1", "path": "/some/path1"}, + {"name": "job2", "path": "/some/path2"}, + ] + + class Plugin1: + @hookimpl + def get_forward_models(self): + return [_JOBS[0]] + + class Plugin2: + @hookimpl + def get_forward_models(self): + return [_JOBS[1]] + + pm = plugin_manager(Plugin1(), Plugin2()) + + jobs = list(chain.from_iterable(pm.hook.get_forward_models())) + for value in _JOBS: + assert value in jobs + + +def test_parse_forward_model_schema(plugin_manager): + class Model(BaseModel): + content: str + + class Plugin: + @hookimpl + def parse_forward_model_schema(self, path: str, schema: Type[BaseModel]): + return schema.model_validate({"content": path}) + + pm = plugin_manager(Plugin()) + + assert next( + chain.from_iterable( + pm.hook.parse_forward_model_schema(path="/path/to/config.yml", schema=Model) + ) + ) == ("content", "/path/to/config.yml") + + +def test_lint_forward_model_hook(plugin_manager): + class Plugin: + @hookimpl + def lint_forward_model(self, job: str, args: Sequence[str]): + return [[f"Mocked error message: {job} -> {args}"]] + + pm = plugin_manager(Plugin()) + + assert ( + next( + chain.from_iterable( + pm.hook.lint_forward_model( + job="some_forward_model", + args=["--config", "path/to/somewhere"], + ) + ) + ) + == "Mocked error message: some_forward_model -> ['--config', 'path/to/somewhere']" + ) + + +def test_add_logging_handle(plugin_manager): + handle = logging.StreamHandler() + + class Plugin: + @hookimpl + def add_log_handle_to_root(self): + return handle + + pm = plugin_manager(Plugin()) + assert pm.hook.add_log_handle_to_root() == [handle] diff --git a/tests/everest/test_input_constraints_config.py b/tests/everest/test_input_constraints_config.py new file mode 100644 index 00000000000..50237199ea4 --- /dev/null +++ b/tests/everest/test_input_constraints_config.py @@ -0,0 +1,34 @@ +from everest import ConfigKeys +from everest.config import EverestConfig +from tests.everest.utils import relpath + + +def test_input_constraint_initialization(): + cfg_dir = relpath("test_data", "mocked_test_case") + cfg = relpath(cfg_dir, "config_input_constraints.yml") + config = EverestConfig.load_file(cfg) + # Check that an input constraint has been defined + assert config.input_constraints is not None + # Check that it is a list with two values + assert isinstance(config.input_constraints, list) + assert len(config.input_constraints) == 2 + # Get the first input constraint + input_constraint = config.input_constraints[0] + # Check that this defines both upper and lower bounds + exp_operations = {ConfigKeys.UPPER_BOUND, ConfigKeys.LOWER_BOUND} + assert ( + exp_operations.intersection(input_constraint.model_dump(exclude_none=True)) + == exp_operations + ) + # Check both rhs + exp_rhs = [1, 0] + assert [ + input_constraint.upper_bound, + input_constraint.lower_bound, + ] == exp_rhs + # Check the variables + exp_vars = ["group.w00", "group.w01", "group.w02"] + assert set(exp_vars) == set(input_constraint.weights.keys()) + # Check the weights + exp_weights = [0.1, 0.2, 0.3] + assert exp_weights == [input_constraint.weights[v] for v in exp_vars] diff --git a/tests/everest/test_logging.py b/tests/everest/test_logging.py new file mode 100644 index 00000000000..c18b9cd0eb3 --- /dev/null +++ b/tests/everest/test_logging.py @@ -0,0 +1,88 @@ +import os + +import pytest + +from ert.config import ErtConfig +from ert.storage import open_storage +from everest.config import EverestConfig +from everest.detached import ( + context_stop_and_wait, + generate_everserver_ert_config, + start_server, + wait_for_context, + wait_for_server, +) +from everest.util import makedirs_if_needed +from tests.everest.utils import relpath, tmpdir + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") +CONFIG_FILE = "config_fm_failure.yml" + + +def string_exists_in_file(file_path, string): + with open(file_path, "r", encoding="utf-8") as f: + txt = f.read() + return string in txt + + +@pytest.mark.flaky(reruns=5) +@pytest.mark.integration_test +@pytest.mark.xdist_group(name="starts_everest") +@pytest.mark.fails_on_macos_github_workflow +@tmpdir(CONFIG_PATH) +def test_logging_setup(): + everest_config = EverestConfig.load_file(CONFIG_FILE) + + wait_for_context() + ert_config = ErtConfig.with_plugins().from_dict( + generate_everserver_ert_config(everest_config, True) + ) + makedirs_if_needed(everest_config.output_dir, roll_if_exists=True) + with open_storage(ert_config.ens_path, "w") as storage: + start_server(everest_config, ert_config, storage) + try: + wait_for_server(everest_config, 120) + wait_for_context() + except SystemExit as e: + context_stop_and_wait() + raise e + everest_output_path = os.path.join(os.getcwd(), "everest_output") + + everest_logs_dir_path = everest_config.log_dir + + detached_node_dir = everest_config.detached_node_dir + endpoint_log_path = os.path.join(detached_node_dir, "endpoint.log") + + everest_log_path = os.path.join(everest_logs_dir_path, "everest.log") + forward_model_log_path = os.path.join(everest_logs_dir_path, "forward_models.log") + simulation_log_path = os.path.join(everest_logs_dir_path, "simulations.log") + everest_server_stderr_path = os.path.join( + everest_logs_dir_path, "everest_server.stderr.0" + ) + everest_server_stdout_path = os.path.join( + everest_logs_dir_path, "everest_server.stdout.0" + ) + + assert os.path.exists(everest_output_path) + assert os.path.exists(everest_logs_dir_path) + assert os.path.exists(forward_model_log_path) + assert os.path.exists(simulation_log_path) + assert os.path.exists(everest_log_path) + assert os.path.exists(everest_server_stderr_path) + assert os.path.exists(everest_server_stdout_path) + assert os.path.exists(endpoint_log_path) + + assert string_exists_in_file(everest_log_path, "everest DEBUG:") + assert string_exists_in_file( + forward_model_log_path, + "forward_models ERROR: Batch: 0 Realization: 0 Simulation: 2 " + "Job: toggle_failure Failed Error: 0", + ) + assert string_exists_in_file( + forward_model_log_path, "Exception: Failing simulation_2" " by request!" + ) + + assert string_exists_in_file( + endpoint_log_path, + "everserver INFO: / entered from", + ) diff --git a/tests/everest/test_math_func.py b/tests/everest/test_math_func.py new file mode 100644 index 00000000000..040cea1b862 --- /dev/null +++ b/tests/everest/test_math_func.py @@ -0,0 +1,363 @@ +import itertools +import os + +import numpy as np +import pandas as pd +import pytest + +from everest import ConfigKeys as CK +from everest.config import EverestConfig +from everest.config.export_config import ExportConfig +from everest.export import export +from everest.suite import _EverestWorkflow +from everest.util import makedirs_if_needed +from tests.everest.utils import relpath, tmpdir + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") + +CONFIG_FILE_MINIMAL = "config_minimal.yml" +CONFIG_FILE_IN_CONSTR = "config_in_constr.yml" +CONFIG_FILE_OUT_CONSTR = "config_out_constr.yml" +CONFIG_FILE_MULTIOBJ = "config_multiobj.yml" +CONFIG_FILE_ADVANCED = "config_advanced.yml" +CONFIG_AUTO_SCALED_CONTROLS = "config_auto_scaled_controls.yml" +CONFIG_FILE_REMOVE_RUN_PATH = "config_remove_run_path.yml" + + +@pytest.mark.redundant_test # superseded by test_math_func_advanced and _multiobj +@tmpdir(CONFIG_PATH) +def test_math_func_minimal(): + config = EverestConfig.load_file(CONFIG_FILE_MINIMAL) + workflow = _EverestWorkflow(config) + assert workflow is not None + + workflow.start_optimization() + + # Check resulting points + x, y, z = (workflow.result.controls["point_" + p] for p in ("x", "y", "z")) + assert x == pytest.approx(0.5, abs=0.05) + assert y == pytest.approx(0.5, abs=0.05) + assert z == pytest.approx(0.5, abs=0.05) + + # Check the optimum value + assert workflow.result.total_objective == pytest.approx(0.0, abs=0.005) + + # Test conversion to pandas DataFrame + df = export(config) + + # find first and last sims that succeeded and not a gradient + ok_evals = df[(df["is_gradient"] == 0) & (df["success"] == 1)] + first = ok_evals.iloc[0] + best = ok_evals.iloc[-1] + assert first["point_x"] == 0.1 + assert first["point_y"] == 0.1 + assert first["point_z"] == 0.1 + assert first["distance"] == pytest.approx(-(0.4 * 0.4 * 3)) + assert best["point_x"] == pytest.approx(x) + assert best["point_y"] == pytest.approx(y) + assert best["point_z"] == pytest.approx(z) + assert best["distance"] == pytest.approx(workflow.result.total_objective) + assert first["realization_weight"] == 1.0 + assert best["realization_weight"] == 1.0 + + +@pytest.mark.redundant_test # superseded by test_math_func_advanced and _multiobj +@tmpdir(CONFIG_PATH) +def test_math_func_in_constr(): + config = EverestConfig.load_file(CONFIG_FILE_IN_CONSTR) + workflow = _EverestWorkflow(config) + assert workflow is not None + + workflow.start_optimization() + + # Check resulting points + x, y, z = (workflow.result.controls["point_" + p] for p in ("x", "y", "z")) + assert x == pytest.approx(0.25, abs=0.1) + assert y == pytest.approx(0.25, abs=0.1) + assert z == pytest.approx(0.50, abs=0.1) + + # Check optimum value + optim = -workflow.result.total_objective # distance is provided as -distance + assert pytest.approx(optim, abs=0.1) == 0.25**2 + 0.25**2 + expected_dist = (x - 0.5) ** 2 + (y - 0.5) ** 2 + (z - 0.5) ** 2 + assert expected_dist == pytest.approx(optim, abs=0.001) + + # Test conversion to pandas DataFrame + df = export(config) + ok_evals = df[(df["is_gradient"] == 0) & (df["success"] == 1)] + best = ok_evals.iloc[-1] + assert best["point_x"] == pytest.approx(x) + assert best["point_y"] == pytest.approx(y) + assert best["point_z"] == pytest.approx(z) + assert best["distance"] == pytest.approx(workflow.result.total_objective) + assert best["realization_weight"] == 1.0 + + +@pytest.mark.redundant_test # superseded by test_math_func_advanced and _multiobj +@tmpdir(CONFIG_PATH) +def test_math_func_out_constr(): + config = EverestConfig.load_file(CONFIG_FILE_OUT_CONSTR) + workflow = _EverestWorkflow(config) + assert workflow is not None + + workflow.start_optimization() + + # Check resulting points + x, y, z = (workflow.result.controls["point_" + p] for p in ("x", "y", "z")) + assert x == pytest.approx(0.5, abs=0.1) + assert y == pytest.approx(0.5, abs=0.1) + assert z == pytest.approx(0.3, abs=0.1) + + # Check optimum value + optim = -workflow.result.total_objective # distance is provided as -distance + assert pytest.approx(optim, abs=0.1) == 0.2 * 0.2 + expected_dist = (x - 0.5) ** 2 + (y - 0.5) ** 2 + (z - 0.5) ** 2 + assert expected_dist == pytest.approx(optim, abs=0.001) + + # Test conversion to pandas DataFrame + df = export(config) + ok_evals = df[(df["is_gradient"] == 0) & (df["success"] == 1)] + + # All points in this case are increasing the merit + assert len(ok_evals) == len(ok_evals[ok_evals["increased_merit"] == 1]) + + best = ok_evals.iloc[-1] + assert best["point_x"] == pytest.approx(x) + assert best["point_y"] == pytest.approx(y) + assert best["point_z"] == pytest.approx(z) + assert best["distance"] == pytest.approx(workflow.result.total_objective) + assert best["realization_weight"] == 1.0 + + +@pytest.mark.integration_test +@tmpdir(CONFIG_PATH) +def test_math_func_multiobj(): + config = EverestConfig.load_file(CONFIG_FILE_MULTIOBJ) + + workflow = _EverestWorkflow(config) + assert workflow is not None + workflow.start_optimization() + + # Check resulting points + x, y, z = (workflow.result.controls["point_" + p] for p in ("x", "y", "z")) + assert x == pytest.approx(0.0, abs=0.05) + assert y == pytest.approx(0.0, abs=0.05) + assert z == pytest.approx(0.5, abs=0.05) + + # Check the optimum values for each object. + optim_p = workflow.result.expected_objectives["distance_p"] + optim_q = workflow.result.expected_objectives["distance_q"] + assert optim_p == pytest.approx(-0.5, abs=0.05) + assert optim_q == pytest.approx(-4.5, abs=0.05) + + # The overall optimum is a weighted average of the objectives + assert workflow.result.total_objective == pytest.approx( + (-0.5 * (2.0 / 3.0) * 1.5) + (-4.5 * (1.0 / 3.0) * 1.0), abs=0.01 + ) + + # Test conversion to pandas DataFrame + if config.export is None: + config.export = ExportConfig(discard_rejected=False) + + df = export(config) + ok_evals = df[(df["is_gradient"] == 0) & (df["success"] == 1)] + + # Three points in this case are increasing the merit + assert len(ok_evals[ok_evals["increased_merit"] == 1]) == 2 + + first = ok_evals.iloc[0] + best = ok_evals.iloc[-1] + assert first["point_x"] == 0 + assert first["point_y"] == 0 + assert first["point_z"] == 0 + assert first["distance_p"] == -(0.5 * 0.5 * 3) + assert first["distance_q"] == -(1.5 * 1.5 * 2 + 0.5 * 0.5) + assert first["sim_avg_obj"] == (-0.75 * (2.0 / 3.0) * 1.5) + ( + -4.75 * (1.0 / 3.0) * 1.0 + ) + + assert best["point_x"] == pytest.approx(x) + assert best["point_y"] == pytest.approx(y) + assert best["point_z"] == pytest.approx(z) + assert best["distance_p"] == pytest.approx(optim_p) + assert best["distance_q"] == pytest.approx(optim_q) + assert best["sim_avg_obj"] == pytest.approx(workflow.result.total_objective) + + test_space = itertools.product( + (first, best), + ( + ("distance_p", 2.0 / 3, 1.5), + ("distance_q", 1.0 / 3, 1), + ), + ) + for row, (obj_name, weight, norm) in test_space: + assert row[obj_name] * norm == row[obj_name + "_norm"] + assert row[obj_name] * weight * norm == pytest.approx( + row[obj_name + "_weighted_norm"] + ) + + assert first["realization_weight"] == 1.0 + assert best["realization_weight"] == 1.0 + + # check exported sim_avg_obj against dakota_tabular + dt = pd.read_csv( + os.path.join(config.optimization_output_dir, "dakota", "dakota_tabular.dat"), + sep=" +", + engine="python", + ) + dt.sort_values(by=["%eval_id"], inplace=True) + ok_evals = ok_evals.sort_values(by=["batch"]) + for a, b in zip( + dt["obj_fn"], # pylint: disable=unsubscriptable-object + ok_evals["sim_avg_obj"], + ): + # Opposite, because ropt negates values before passing to dakota + assert -a == pytest.approx(b) + + +@pytest.mark.integration_test +@tmpdir(CONFIG_PATH) +def test_math_func_advanced(): + config = EverestConfig.load_file(CONFIG_FILE_ADVANCED) + + workflow = _EverestWorkflow(config) + assert workflow is not None + workflow.start_optimization() + + point_names = ["x-0", "x-1", "x-2"] + # Check resulting points + x0, x1, x2 = (workflow.result.controls["point_" + p] for p in point_names) + assert x0 == pytest.approx(0.1, abs=0.05) + assert x1 == pytest.approx(0.0, abs=0.05) + assert x2 == pytest.approx(0.4, abs=0.05) + + # Check optimum value + assert pytest.approx(workflow.result.total_objective, abs=0.1) == -( + 0.25 * (1.6**2 + 1.5**2 + 0.1**2) + 0.75 * (0.4**2 + 0.5**2 + 0.1**2) + ) + # Expected distance is the weighted average of the (squared) distances + # from (x, y, z) to (-1.5, -1.5, 0.5) and (0.5, 0.5, 0.5) + w = config.model.realizations_weights + assert w == [0.25, 0.75] + dist_0 = (x0 + 1.5) ** 2 + (x1 + 1.5) ** 2 + (x2 - 0.5) ** 2 + dist_1 = (x0 - 0.5) ** 2 + (x1 - 0.5) ** 2 + (x2 - 0.5) ** 2 + expected_opt = -(w[0] * (dist_0) + w[1] * (dist_1)) + assert expected_opt == pytest.approx(workflow.result.total_objective, abs=0.001) + + # Test conversion to pandas DataFrame + df = export(config) + ok_evals = df[(df["is_gradient"] == 0) & (df["success"] == 1)] + + ok_evals_0 = ok_evals[ok_evals["realization"] == 0] + best_0 = ok_evals_0.iloc[-1] + assert best_0["point_{}".format(point_names[0])] == pytest.approx(x0) + assert best_0["point_{}".format(point_names[1])] == pytest.approx(x1) + assert best_0["point_{}".format(point_names[2])] == pytest.approx(x2) + assert best_0["distance"] == pytest.approx(-dist_0, abs=0.001) + assert best_0["real_avg_obj"] == pytest.approx( + workflow.result.total_objective, abs=0.001 + ) + assert best_0["realization_weight"] == 0.25 + + ok_evals_1 = ok_evals[ok_evals["realization"] == 2] + best_1 = ok_evals_1.iloc[-1] + assert best_1["point_{}".format(point_names[0])] == pytest.approx(x0) + assert best_1["point_{}".format(point_names[1])] == pytest.approx(x1) + assert best_1["point_{}".format(point_names[2])] == pytest.approx(x2) + assert best_1["distance"] == pytest.approx(-dist_1, abs=0.001) + assert best_1["real_avg_obj"] == pytest.approx( + workflow.result.total_objective, abs=0.001 + ) + assert best_1["realization_weight"] == 0.75 + + # check functionality of export batch filtering + if CK.EXPORT not in config: + config.export = ExportConfig() + + exp_nunique = 2 + batches_list = [0, 2] + config.export.batches = batches_list + + batch_filtered_df = export(config) + n_unique_batches = batch_filtered_df["batch"].nunique() + unique_batches = np.sort(batch_filtered_df["batch"].unique()).tolist() + + assert exp_nunique == n_unique_batches + assert batches_list == unique_batches + + +@pytest.mark.integration_test +@tmpdir(CONFIG_PATH) +def test_remove_run_path(): + config = EverestConfig.load_file(CONFIG_FILE_REMOVE_RUN_PATH) + + simulation_should_fail = "simulation_2" + # Add to the config dictionary what simulation needs to fail + config.forward_model[config.forward_model.index("toggle_failure")] = ( + "toggle_failure --fail %s" % simulation_should_fail + ) + + simulation_dir = config.simulation_dir + + _EverestWorkflow(config).start_optimization() + + # Check the failed simulation folder still exists + assert os.path.exists( + os.path.join(simulation_dir, "batch_0/geo_realization_0/simulation_2") + ), "Simulation folder should be there, something went wrong and was removed!" + + # Check the successful simulation folders do not exist + assert not os.path.exists( + os.path.join(simulation_dir, "batch_0/geo_realization_0/simulation_0") + ), "Simulation folder should not be there, something went wrong!" + + assert not os.path.exists( + os.path.join(simulation_dir, "batch_0/geo_realization_0/simulation_1") + ), "Simulation folder should not be there, something went wrong!" + + # Manually rolling the output folder between two runs + makedirs_if_needed(config.output_dir, roll_if_exists=True) + + config.simulator = None + _EverestWorkflow(config).start_optimization() + + # Check the all simulation folder exist when delete_run_path is set to False + assert os.path.exists( + os.path.join(simulation_dir, "batch_0/geo_realization_0/simulation_2") + ), "Simulation folder should be there, something went wrong and was removed!" + + assert os.path.exists( + os.path.join(simulation_dir, "batch_0/geo_realization_0/simulation_0") + ), "Simulation folder should be there, something went wrong and was removed" + + assert os.path.exists( + os.path.join(simulation_dir, "batch_0/geo_realization_0/simulation_1") + ), "Simulation folder should be there, something went wrong and was removed" + + +@tmpdir(CONFIG_PATH) +def test_math_func_auto_scaled_controls(): + mn = -1 + mx = 1 + ex = (0.25 - mn) / (mx - mn) * 0.4 + 0.3 + ey = (0.25 - mn) / (mx - mn) * 0.4 + 0.3 + ez = (0.5 - mn) / (mx - mn) * 0.4 + 0.3 + + config = EverestConfig.load_file(CONFIG_AUTO_SCALED_CONTROLS) + + workflow = _EverestWorkflow(config) + assert workflow is not None + workflow.start_optimization() + + # Check resulting points + x, y, z = (workflow.result.controls["point_" + p] for p in ("x", "y", "z")) + + assert x == pytest.approx(ex, abs=0.05) + assert y == pytest.approx(ey, abs=0.05) + assert z == pytest.approx(ez, abs=0.05) + + # Check optimum value + optim = -workflow.result.total_objective # distance is provided as -distance + expected_dist = 0.25**2 + 0.25**2 + assert expected_dist == pytest.approx(optim, abs=0.05) + assert expected_dist == pytest.approx(optim, abs=0.05) diff --git a/tests/everest/test_multiobjective.py b/tests/everest/test_multiobjective.py new file mode 100644 index 00000000000..d743a07c1f9 --- /dev/null +++ b/tests/everest/test_multiobjective.py @@ -0,0 +1,115 @@ +import pytest +from ropt.config.enopt import EnOptConfig + +from ert.config import ErtConfig +from everest.config import EverestConfig +from everest.optimizer.everest2ropt import everest2ropt +from everest.simulator.everest_to_ert import everest_to_ert_config +from everest.suite import _EverestWorkflow +from tests.everest.test_config_validation import has_error +from tests.everest.utils import relpath, tmpdir + +CONFIG_DIR = relpath("test_data", "mocked_test_case") +CONFIG_FILE = "config_multi_objectives.yml" + + +@tmpdir(CONFIG_DIR) +def test_config_multi_objectives(): + config = EverestConfig.load_file(CONFIG_FILE) + config_dict = config.to_dict() + + obj_funcs = config_dict["objective_functions"] + assert len(obj_funcs) == 2 + + obj_funcs[0]["weight"] = 1.0 + assert has_error( + EverestConfig.lint_config_dict(config_dict), + match="Weight should be given either for all of the" + " objectives or for none of them", + ) # weight given only for some obj + + obj_funcs[1]["weight"] = 3 + assert ( + len(EverestConfig.lint_config_dict(config_dict)) == 0 + ) # weight given for all the objectivs + + obj_funcs.append({"weight": 1, "normalization": 1}) + assert has_error( + EverestConfig.lint_config_dict(config_dict), + match="Field required", + ) # no name + + obj_funcs[-1]["name"] = " test_obj" + obj_funcs[-1]["weight"] = -0.3 + assert has_error( + EverestConfig.lint_config_dict(config_dict), + match="Input should be greater than 0", + ) # negative weight + + obj_funcs[-1]["weight"] = 0 + assert has_error( + EverestConfig.lint_config_dict(config_dict), + match="Input should be greater than 0", + ) # 0 weight + + obj_funcs[-1]["weight"] = 1 + obj_funcs[-1]["normalization"] = 0 + assert has_error( + EverestConfig.lint_config_dict(config_dict), + match="Normalization value cannot be zero", + ) # 0 normalization + + obj_funcs[-1]["normalization"] = -125 + assert ( + len(EverestConfig.lint_config_dict(config_dict)) == 0 + ) # negative normalization is ok) + + obj_funcs.pop() + assert len(EverestConfig.lint_config_dict(config_dict)) == 0 + + # test everest initialization + _EverestWorkflow(config) + + +@tmpdir(CONFIG_DIR) +def test_multi_objectives2res(): + config = EverestConfig.load_file(CONFIG_FILE) + res = everest_to_ert_config(config, site_config=ErtConfig.read_site_config()) + ErtConfig.with_plugins().from_dict(config_dict=res) + + +@tmpdir(CONFIG_DIR) +def test_multi_objectives2ropt(): + # pylint: disable=unbalanced-tuple-unpacking + config = EverestConfig.load_file(CONFIG_FILE) + config_dict = config.to_dict() + ever_objs = config_dict["objective_functions"] + ever_objs[0]["weight"] = 1.33 + ever_objs[0]["normalization"] = 1 + ever_objs[1]["weight"] = 3.1 + assert len(EverestConfig.lint_config_dict(config_dict)) == 0 + + norm = ever_objs[0]["weight"] + ever_objs[1]["weight"] + + enopt_config = EnOptConfig.model_validate( + everest2ropt(EverestConfig.model_validate(config_dict)) + ) + assert len(enopt_config.objective_functions.names) == 2 + assert enopt_config.objective_functions.names[1] == ever_objs[1]["name"] + assert enopt_config.objective_functions.weights[1] == ever_objs[1]["weight"] / norm + assert enopt_config.objective_functions.names[0] == ever_objs[0]["name"] + assert enopt_config.objective_functions.weights[0] == ever_objs[0]["weight"] / norm + assert enopt_config.objective_functions.scales[0] == ever_objs[0]["normalization"] + + +@pytest.mark.integration_test +@tmpdir(CONFIG_DIR) +def test_multi_objectives_run(): + config = EverestConfig.load_file(CONFIG_FILE) + workflow = _EverestWorkflow(config) + workflow.start_optimization() + + # Loop through objective functions in config and ensure they are in the + # result object + for obj in config.objective_functions: + assert obj.name in workflow.result.expected_objectives diff --git a/tests/everest/test_objective_type.py b/tests/everest/test_objective_type.py new file mode 100644 index 00000000000..d98df4afd52 --- /dev/null +++ b/tests/everest/test_objective_type.py @@ -0,0 +1,25 @@ +import pytest + +from everest.config import EverestConfig +from everest.suite import _EverestWorkflow +from tests.everest.utils import relpath, tmpdir + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") +CONFIG_FILE_STDDEV = "config_stddev.yml" + + +@tmpdir(CONFIG_PATH) +def test_mathfunc_stddev(): + config = EverestConfig.load_file(CONFIG_FILE_STDDEV) + + workflow = _EverestWorkflow(config) + assert workflow is not None + workflow.start_optimization() + + # Check resulting points + x0, x1, x2 = (workflow.result.controls["point_" + p] for p in ["x", "y", "z"]) + assert x0 == pytest.approx(0.5, abs=0.025) + assert x1 == pytest.approx(0.5, abs=0.025) + assert x2 == pytest.approx(0.5, abs=0.025) + + assert workflow.result.total_objective < 0.0 diff --git a/tests/everest/test_optimization_config.py b/tests/everest/test_optimization_config.py new file mode 100644 index 00000000000..d7cb30caf88 --- /dev/null +++ b/tests/everest/test_optimization_config.py @@ -0,0 +1,34 @@ +import os + +import pytest + +from everest.config import EverestConfig +from tests.everest.utils import relpath, tmpdir + + +@tmpdir(relpath("test_data")) +def test_optimization_config(): + config_directory = "mocked_test_case" + cfg = os.path.join(config_directory, "config_full_gradient_info.yml") + full_config_dict = EverestConfig.load_file(cfg) + + optim_config = full_config_dict.optimization + assert optim_config.algorithm == "conmin_mfd" + assert optim_config.perturbation_num == 20 + assert optim_config.max_iterations == 10 + assert optim_config.max_function_evaluations == 1000 + assert optim_config.max_batch_num == 10 + assert optim_config.convergence_tolerance == pytest.approx(1.0e-7) + assert optim_config.constraint_tolerance == pytest.approx(1.0e-7) + assert optim_config.speculative is False + assert optim_config.options == [ + "131.3 = No", + "LOG HIGH", + "Dostuff: 1", + "speculate", + ] + + assert full_config_dict.model.realizations is not None + realizations = full_config_dict.model.realizations + + assert realizations == [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] diff --git a/tests/everest/test_output_constraints.py b/tests/everest/test_output_constraints.py new file mode 100644 index 00000000000..a1239468457 --- /dev/null +++ b/tests/everest/test_output_constraints.py @@ -0,0 +1,245 @@ +import os + +import pytest +from ropt.config.enopt import EnOptConfig +from ropt.enums import ConstraintType + +from everest import ConfigKeys +from everest.config import EverestConfig +from everest.optimizer.everest2ropt import everest2ropt +from everest.suite import _EverestWorkflow + +from .test_config_validation import has_error +from .utils import relpath, tmpdir + +CONFIG_DIR = relpath("test_data", "mocked_test_case") +CONFIG_FILE = "config_output_constraints.yml" + + +@tmpdir(CONFIG_DIR) +def test_constraints_init(): + config = EverestConfig.load_file(CONFIG_FILE) + constr = list(config.output_constraints or []) + + constr_names = [cn.name for cn in constr] + assert constr_names == [ + "oil_prod_rate_000", + "oil_prod_rate_001", + "oil_prod_rate_002", + "oil_prod_rate_003", + "oil_prod_rate_004", + "oil_prod_rate_005", + "oil_prod_rate_006", + "oil_prod_rate_007", + "oil_prod_rate_008", + "oil_prod_rate_009", + "oil_prod_rate_010", + "oil_prod_rate_011", + "oil_prod_rate_012", + "oil_prod_rate_013", + "oil_prod_rate_014", + "oil_prod_rate_015", + ] + + assert [cn.upper_bound for cn in constr] == 16 * [5000] + assert [cn.scale for cn in constr] == 16 * [7500] + + +@tmpdir(CONFIG_DIR) +def test_wrong_output_constr_def(): + # No RHS + errors = EverestConfig.lint_config_dict( + { + "wells": [{"name": "w07"}], + "output_constraints": [ + {"name": "some_name"}, + ], + "config_path": "/", + "forward_model": [], + "controls": [ + { + "name": "well_order", + "type": "well_control", + "min": 0, + "max": 1, + "variables": [{"name": "w07", "initial_guess": 0.0633}], + } + ], + "environment": {ConfigKeys.SIMULATION_FOLDER: "/tmp/everest"}, + "optimization": {ConfigKeys.ALGORITHM: "optpp_q_newton"}, + "model": {ConfigKeys.REALIZATIONS: [0]}, + "objective_functions": [{"name": "npv_function"}], + } + ) + + assert has_error( + errors, match="Output constraints must have only one of the following" + ) + + # Same name + errors = EverestConfig.lint_config_dict( + { + "wells": [{"name": "w07"}], + "output_constraints": [ + {"name": "same_name", "upper_bound": 5000}, + {"name": "same_name", "upper_bound": 5000}, + ], + "config_path": "/", + "forward_model": [], + "controls": [ + { + "name": "well_order", + "type": "well_control", + "min": 0, + "max": 1, + "variables": [{"name": "w07", "initial_guess": 0.0633}], + } + ], + "environment": {ConfigKeys.SIMULATION_FOLDER: "/tmp/everest"}, + "optimization": {ConfigKeys.ALGORITHM: "optpp_q_newton"}, + "model": {ConfigKeys.REALIZATIONS: [0]}, + "objective_functions": [{"name": "npv_function"}], + } + ) + assert has_error(errors, match="Output constraint names must be unique") + + # Two RHS + errors = EverestConfig.lint_config_dict( + { + "wells": [{"name": "w07"}], + "output_constraints": [ + {"name": "some_name", "upper_bound": 5000, "target": 5000}, + ], + "config_path": "/", + "forward_model": [], + "controls": [ + { + "name": "well_order", + "type": "well_control", + "min": 0, + "max": 1, + "variables": [{"name": "w07", "initial_guess": 0.0633}], + } + ], + "environment": {ConfigKeys.SIMULATION_FOLDER: "/tmp/everest"}, + "optimization": {ConfigKeys.ALGORITHM: "optpp_q_newton"}, + "model": {ConfigKeys.REALIZATIONS: [0]}, + "objective_functions": [{"name": "npv_function"}], + } + ) + assert has_error( + errors, + match="Output constraints must have only one of the following:" + " { target }, or { upper and/or lower bound }", + ) + + # Wrong RHS attribute + wrong_rhs_config = { + "wells": [{"name": "w07"}], + "output_constraints": [ + {"name": "some_name", "target": 2}, + ], + "config_path": "/", + "forward_model": [], + "controls": [ + { + "name": "well_order", + "type": "well_control", + "min": 0, + "max": 1, + "variables": [{"name": "w07", "initial_guess": 0.0633}], + } + ], + "environment": {ConfigKeys.SIMULATION_FOLDER: "/tmp/everest"}, + "optimization": {ConfigKeys.ALGORITHM: "optpp_q_newton"}, + "model": {ConfigKeys.REALIZATIONS: [0]}, + "objective_functions": [{"name": "npv_function"}], + } + + wrong_rhs_config["output_constraints"][0]["upper_bund"] = 5000 + + errors = EverestConfig.lint_config_dict(wrong_rhs_config) + assert has_error(errors, match="Extra inputs are not permitted") + + # Wrong RHS type + errors = EverestConfig.lint_config_dict( + { + "wells": [{"name": "w07"}], + "output_constraints": [ + {"name": "some_name", "upper_bound": "2ooo"}, + ], + "config_path": "/", + "forward_model": [], + "controls": [ + { + "name": "well_order", + "type": "well_control", + "min": 0, + "max": 1, + "variables": [{"name": "w07", "initial_guess": 0.0633}], + } + ], + "environment": {ConfigKeys.SIMULATION_FOLDER: "/tmp/everest"}, + "optimization": {ConfigKeys.ALGORITHM: "optpp_q_newton"}, + "model": {ConfigKeys.REALIZATIONS: [0]}, + "objective_functions": [{"name": "npv_function"}], + } + ) + assert has_error(errors, "unable to parse string as a number") + + +@tmpdir(CONFIG_DIR) +def test_upper_bound_output_constraint_def(): + with open("conf_file", "w", encoding="utf-8") as f: + f.write(" ") + + config = EverestConfig.with_defaults( + **{ + "wells": [{"name": "w07"}], + "output_constraints": [ + {"name": "some_name", "upper_bound": 5000, "scale": 1.0}, + ], + "config_path": os.getcwd() + "/conf_file", + "forward_model": [], + "controls": [ + { + "name": "group_0", + "type": "well_control", + "min": 0, + "max": 1, + "variables": [{"name": "w07", "initial_guess": 0.0633}], + } + ], + "environment": {ConfigKeys.SIMULATION_FOLDER: "/tmp/everest"}, + "optimization": {ConfigKeys.ALGORITHM: "optpp_q_newton"}, + "model": {ConfigKeys.REALIZATIONS: [0]}, + "objective_functions": [{"name": "npv_function"}], + } + ) + + # Check ropt conversion + ropt_conf = EnOptConfig.model_validate(everest2ropt(config)) + + expected = { + "scale": 1.0, + "name": "some_name", + "rhs_value": [5000], + "type": ConstraintType.LE, + } + + assert expected["scale"] == 1.0 / ropt_conf.nonlinear_constraints.scales[0] + assert expected["name"] == ropt_conf.nonlinear_constraints.names[0] + assert expected["rhs_value"] == ropt_conf.nonlinear_constraints.rhs_values[0] + assert expected["type"] == ropt_conf.nonlinear_constraints.types[0] + + workflow = _EverestWorkflow(config) + assert workflow is not None + + +@pytest.mark.integration_test +@tmpdir(CONFIG_DIR) +def test_sim_output_constraints(): + config = EverestConfig.load_file(CONFIG_FILE) + workflow = _EverestWorkflow(config) + assert workflow is not None + workflow.start_optimization() diff --git a/tests/everest/test_qt_dialogs_output.py b/tests/everest/test_qt_dialogs_output.py new file mode 100644 index 00000000000..fa7703c7019 --- /dev/null +++ b/tests/everest/test_qt_dialogs_output.py @@ -0,0 +1,62 @@ +import pytest +from PyQt5.QtWidgets import QMessageBox +from qtpy.QtCore import Qt, QTimer + +from everest.detached import ( + context_stop_and_wait, + wait_for_context, +) +from ieverest import IEverest +from ieverest.utils import APP_OUT_DIALOGS, app_output + + +@pytest.mark.ui_test +@pytest.mark.xdist_group(name="starts_everest") +def test_qt_dialogs(qtbot): + wait_for_context() + + ieverest = IEverest() + + def handle_message_box(message): + qtbot.waitUntil(lambda: ieverest._gui.findChild(QMessageBox) is not None) + widget = ieverest._gui.findChild(QMessageBox) + qtbot.mouseClick(widget.button(QMessageBox.Ok), Qt.MouseButton.LeftButton) + assert message in widget.text() + + QTimer.singleShot(100, lambda: handle_message_box("info message")) + app_output().info( + "info message", + channels=[ + APP_OUT_DIALOGS, + ], + force=True, + ) + + QTimer.singleShot(100, lambda: handle_message_box("critical message")) + app_output().critical( + "critical message", + channels=[ + APP_OUT_DIALOGS, + ], + force=True, + ) + + QTimer.singleShot(100, lambda: handle_message_box("warning message")) + app_output().warning( + "warning message", + channels=[ + APP_OUT_DIALOGS, + ], + force=True, + ) + + QTimer.singleShot(100, lambda: handle_message_box("debug message")) + app_output().debug( + "debug message", + channels=[ + APP_OUT_DIALOGS, + ], + force=True, + ) + + context_stop_and_wait() diff --git a/tests/everest/test_queue_driver.py b/tests/everest/test_queue_driver.py new file mode 100644 index 00000000000..940e883c886 --- /dev/null +++ b/tests/everest/test_queue_driver.py @@ -0,0 +1,40 @@ +from unittest.mock import Mock + +import pytest + +from everest.config import EverestConfig +from everest.queue_driver import queue_driver +from everest.queue_driver.queue_driver import _extract_queue_system + + +@pytest.mark.parametrize( + "input_config,queue_system,expected_result", + [ + ( + EverestConfig.with_defaults(**{}), + "local", + {"QUEUE_SYSTEM": "LOCAL", "QUEUE_OPTION": []}, + ), + ( + EverestConfig.with_defaults(**{"simulator": {"queue_system": "lsf"}}), + "lsf", + {"QUEUE_SYSTEM": "LSF", "QUEUE_OPTION": []}, + ), + ( + EverestConfig.with_defaults(**{"simulator": {"queue_system": "slurm"}}), + "slurm", + {"QUEUE_SYSTEM": "SLURM", "QUEUE_OPTION": []}, + ), + ], +) +def test_extract_queue_system(monkeypatch, input_config, queue_system, expected_result): + extract_options_mock = Mock(return_value=[]) + monkeypatch.setattr( + queue_driver, + "_extract_ert_queue_options_from_simulator_config", + extract_options_mock, + ) + ert_config = {} + _extract_queue_system(input_config, ert_config) + assert ert_config == expected_result + extract_options_mock.assert_called_once_with(input_config.simulator, queue_system) diff --git a/tests/everest/test_repo_configs.py b/tests/everest/test_repo_configs.py new file mode 100644 index 00000000000..f848c0b808e --- /dev/null +++ b/tests/everest/test_repo_configs.py @@ -0,0 +1,53 @@ +import os + +from ropt.exceptions import ConfigError as ROptConfigError + +from everest.config_file_loader import yaml_file_to_substituted_config_dict +from everest.optimizer.utils import get_ropt_plugin_manager + + +def _get_all_files(folder): + return [ + os.path.join(root, filename) + for root, _, files in os.walk(folder) + for filename in files + ] + + +def test_all_repo_configs(): + repo_dir = os.path.join(os.path.dirname(__file__), "..") + repo_dir = os.path.realpath(repo_dir) + + data_folders = ( + "examples/egg/everest/input", + "everest/data", + ) + + config_folders = ( + "examples", + "everest", + "tests", + ) + # pylint: disable=unnecessary-lambda-assignment + config_folders = map(lambda fn: os.path.join(repo_dir, fn), config_folders) # noqa E731 + + is_yaml = lambda fn: fn.endswith(".yml") + is_data = lambda fn: any((df in fn for df in data_folders)) + + def is_config(fn): + return is_yaml(fn) and not is_data(fn) and "invalid" not in fn + + config_files = [fn for cdir in config_folders for fn in _get_all_files(cdir)] + config_files = filter(is_config, config_files) + + if os.environ.get("NO_PROJECT_RES", False): + config_files = [f for f in config_files if "examples/egg" not in f] + try: + get_ropt_plugin_manager().get_plugin("optimizer", "scipy/default") + except ROptConfigError: + config_files = [f for f in config_files if "scipy" not in f] + + config_files = list(config_files) + for config_file in config_files: + config = yaml_file_to_substituted_config_dict(config_file) + assert config is not None diff --git a/tests/everest/test_res_initialization.py b/tests/everest/test_res_initialization.py new file mode 100644 index 00000000000..b71421151ef --- /dev/null +++ b/tests/everest/test_res_initialization.py @@ -0,0 +1,610 @@ +import itertools +import os +from unittest.mock import patch + +import pytest + +import everest +from ert.config import ErtConfig +from everest import ConfigKeys +from everest.config import EverestConfig +from everest.config.install_data_config import InstallDataConfig +from everest.config.install_job_config import InstallJobConfig +from everest.config.well_config import WellConfig +from everest.config.workflow_config import WorkflowConfig +from everest.simulator.everest_to_ert import everest_to_ert_config +from everest.util.forward_models import collect_forward_models +from tests.everest.utils import ( + everest_default_jobs, + hide_opm, + relpath, + skipif_no_everest_models, + skipif_no_opm, + tmp, + tmpdir, +) + +NO_PROJECT_RES = ( + os.environ.get("NO_PROJECT_RES", False), + "Skipping tests when no access to /project/res", +) + +SNAKE_CONFIG_DIR = "snake_oil/everest/model" +SNAKE_CONFIG_PATH = os.path.join(SNAKE_CONFIG_DIR, "snake_oil.yml") +TUTORIAL_CONFIG_DIR = "mocked_test_case" + + +def build_snake_dict(output_dir, queue_system, report_steps=False): + # This is a tested config from ert corresponding to the + # snake_oil + + def simulation_jobs(): + sim_jobs = [ + ( + "copy_file", + os.path.realpath( + "snake_oil/everest/model/everest_output/" + ".internal_data/wells.json" + ), + "wells.json", + ), + ("snake_oil_simulator",), + ("snake_oil_npv",), + ("snake_oil_diff",), + ] + if report_steps: + sim_jobs.insert(2, ("eclipse100",)) + sim_jobs.insert( + 3, + ( + "strip_dates", + "--summary", + ".UNSMRY", + "--dates", + "2000-1-1", + "2001-1-2", + "2002-1-1", + ), + ) + return sim_jobs + + def install_jobs(): + jobs = [ + ( + "snake_oil_diff", + os.path.join( + os.path.abspath(SNAKE_CONFIG_DIR), "../../jobs/SNAKE_OIL_DIFF" + ), + ), + ( + "snake_oil_simulator", + os.path.join( + os.path.abspath(SNAKE_CONFIG_DIR), "../../jobs/SNAKE_OIL_SIMULATOR" + ), + ), + ( + "snake_oil_npv", + os.path.join( + os.path.abspath(SNAKE_CONFIG_DIR), "../../jobs/SNAKE_OIL_NPV" + ), + ), + *everest_default_jobs(output_dir), + ] + + return jobs + + def local_queue_system(): + return { + "QUEUE_SYSTEM": "LOCAL", + "QUEUE_OPTION": [ + ("LOCAL", "MAX_RUNNING", 8), + ], + } + + # For the test comparison to succeed the elements in the QUEUE_OPTION list must + # come in the same order as the options in the _extract_slurm_options() function + # in everest_to_ert_config. + def slurm_queue_system(): + return { + "QUEUE_SYSTEM": "SLURM", + "QUEUE_OPTION": [ + ( + "SLURM", + "PARTITION", + "default-queue", + ), + ( + "SLURM", + "MEMORY", + "1000M", + ), + ( + "SLURM", + "EXCLUDE_HOST", + "host1,host2,host3,host4", + ), + ( + "SLURM", + "INCLUDE_HOST", + "host5,host6,host7,host8", + ), + ], + } + + def make_queue_system(queue_system): + if queue_system == ConfigKeys.LOCAL: + return local_queue_system() + elif queue_system == ConfigKeys.SLURM: + return slurm_queue_system() + + ert_config = { + "DEFINE": [("", os.path.abspath(SNAKE_CONFIG_DIR))], + "RUNPATH": os.path.join( + output_dir, + "simulations//geo_realization_/simulation_", + ), + "RUNPATH_FILE": os.path.join( + os.path.realpath("snake_oil/everest/model"), + "everest_output/.res_runpath_list", + ), + "NUM_REALIZATIONS": 10000, + "MAX_RUNTIME": 3600, + "ECLBASE": "eclipse/ECL", + "INSTALL_JOB": install_jobs(), + "SIMULATION_JOB": simulation_jobs(), + "ENSPATH": os.path.join( + os.path.realpath("snake_oil/everest/model"), + "everest_output/simulation_results", + ), + } + ert_config.update(make_queue_system(queue_system)) + return ert_config + + +def build_tutorial_dict(config_dir, output_dir): + # Expected config extracted from unittest.mocked_test_case.yml + return { + "DEFINE": [("", config_dir)], + "NUM_REALIZATIONS": 10000, + "MAX_RUNTIME": 3600, + "ECLBASE": "eclipse/ECL", + "RUNPATH": os.path.join( + output_dir, + "simulations_{}".format(os.environ.get("USER")), + "", + "geo_realization_", + "simulation_", + ), + "RUNPATH_FILE": os.path.join( + os.path.realpath("mocked_test_case"), + "everest_output/.res_runpath_list", + ), + "RANDOM_SEED": 999, + "INSTALL_JOB": [ + ("well_order", os.path.join(config_dir, "jobs/WELL_ORDER_MOCK")), + ("res_mock", os.path.join(config_dir, "jobs/RES_MOCK")), + ("npv_function", os.path.join(config_dir, "jobs/NPV_FUNCTION_MOCK")), + *everest_default_jobs(output_dir), + ], + "SIMULATION_JOB": [ + ( + "copy_file", + os.path.realpath( + "mocked_test_case/everest_output/" ".internal_data/wells.json" + ), + "wells.json", + ), + ( + "well_order", + "well_order.json", + "SCHEDULE.INC", + "ordered_wells.json", + ), + ("res_mock", "MOCKED_TEST_CASE"), + ("npv_function", "MOCKED_TEST_CASE", "npv_function"), + ], + # Defaulted + "QUEUE_SYSTEM": "LOCAL", + "QUEUE_OPTION": [("LOCAL", "MAX_RUNNING", 8)], + "ENSPATH": os.path.join( + os.path.realpath("mocked_test_case"), + "everest_output/simulation_results", + ), + } + + +@tmpdir(relpath("test_data")) +def test_snake_everest_to_ert(): + # Load config file + ever_config_dict = EverestConfig.load_file(SNAKE_CONFIG_PATH) + + output_dir = ever_config_dict.output_dir + snake_dict = build_snake_dict(output_dir, ConfigKeys.LOCAL) + + # Transform to res dict and verify equality + ert_config_dict = everest_to_ert_config(ever_config_dict) + assert snake_dict == ert_config_dict + + # Instantiate res + ErtConfig.with_plugins().from_dict( + config_dict=everest_to_ert_config( + ever_config_dict, site_config=ErtConfig.read_site_config() + ) + ) + + +@tmpdir(relpath("test_data")) +def test_snake_everest_to_ert_slurm(): + snake_slurm_config_path = os.path.join(SNAKE_CONFIG_DIR, "snake_oil_slurm.yml") + # Load config file + ever_config_dict = EverestConfig.load_file(snake_slurm_config_path) + + output_dir = ever_config_dict.output_dir + snake_dict = build_snake_dict(output_dir, ConfigKeys.SLURM) + + # Transform to res dict and verify equality + ert_config_dict = everest_to_ert_config(ever_config_dict) + assert snake_dict == ert_config_dict + + # Instantiate res + ErtConfig.with_plugins().from_dict( + config_dict=everest_to_ert_config( + ever_config_dict, site_config=ErtConfig.read_site_config() + ) + ) + + +@patch.dict("os.environ", {"USER": "NO_USERNAME"}) +@tmpdir(relpath("test_data")) +def test_tutorial_everest_to_ert(): + tutorial_config_path = os.path.join(TUTORIAL_CONFIG_DIR, "mocked_test_case.yml") + # Load config file + ever_config_dict = EverestConfig.load_file(tutorial_config_path) + + output_dir = ever_config_dict.output_dir + tutorial_dict = build_tutorial_dict( + os.path.abspath(TUTORIAL_CONFIG_DIR), output_dir + ) + + # Transform to res dict and verify equality + ert_config_dict = everest_to_ert_config(ever_config_dict) + assert tutorial_dict == ert_config_dict + + # Instantiate res + ErtConfig.with_plugins().from_dict( + config_dict=everest_to_ert_config( + ever_config_dict, site_config=ErtConfig.read_site_config() + ) + ) + + +@skipif_no_opm +@tmpdir(relpath("test_data")) +def test_combined_wells_everest_to_ert(): + config_mocked_multi_batch = os.path.join( + TUTORIAL_CONFIG_DIR, "mocked_multi_batch.yml" + ) + # Load config file + ever_config_dict = EverestConfig.load_file(config_mocked_multi_batch) + + # Add a dummy well name to the everest config + assert ever_config_dict.wells is not None + ever_config_dict.wells.append(WellConfig(name="fakename")) + ert_config_dict = everest_to_ert_config(ever_config_dict) + + # Check whether dummy name is in the summary keys + fakename_in_strings = [ + "fakename" in string for string in ert_config_dict["SUMMARY"][0] + ] + assert any(fakename_in_strings) + + # Check whether data file specific well is in the summary keys + inj_in_strings = ["INJ" in string for string in ert_config_dict["SUMMARY"][0]] + assert any(inj_in_strings) + + +@tmpdir(relpath("test_data")) +def test_lsf_queue_system(): + snake_all_path = os.path.join(SNAKE_CONFIG_DIR, "snake_oil_all.yml") + ever_config = EverestConfig.load_file(snake_all_path) + + assert ever_config.simulator.queue_system == ConfigKeys.LSF + + ert_config = everest_to_ert_config(ever_config) + + queue_system = ert_config["QUEUE_SYSTEM"] + assert queue_system == "LSF" + + +@tmpdir(relpath("test_data")) +def test_queue_configuration(): + snake_all_path = os.path.join(SNAKE_CONFIG_DIR, "snake_oil_all.yml") + ever_config = EverestConfig.load_file(snake_all_path) + + assert ever_config.simulator.cores == 3 + + ert_config = everest_to_ert_config(ever_config) + + assert ert_config["MAX_SUBMIT"] == 17 + 1 + + expected_options = [ + ("LSF", "MAX_RUNNING", 3), + ("LSF", "LSF_QUEUE", "mr"), + ("LSF", "LSF_SERVER", "lx-fastserver01"), + ("LSF", "LSF_RESOURCE", "span = 1 && select[x86 and GNU/Linux]"), + ] + + options = ert_config["QUEUE_OPTION"] + assert options == expected_options + + +def test_queue_config(): + config_file = relpath("test_data/snake_oil/", "everest/model/snake_oil_all.yml") + + config = EverestConfig.load_file(config_file) + + assert config.simulator.name == "mr" + assert config.simulator.resubmit_limit == 17 + assert config.simulator.cores == 3 + assert config.simulator.queue_system == "lsf" + assert config.simulator.server == "lx-fastserver01" + opts = "span = 1 && select[x86 and GNU/Linux]" + assert opts == config.simulator.options + + +@patch.dict("os.environ", {"USER": "NO_USERNAME"}) +def test_install_data_no_init(): + """ + TODO: When default jobs are handled in Everest this test should be + deleted as it is superseded by test_install_data. + """ + sources = 2 * ["eclipse/refcase/TNO_REEK.SMSPEC"] + 2 * ["eclipse/refcase"] + targets = 2 * ["REEK.SMSPEC"] + 2 * ["tno_refcase"] + links = [True, False, True, False] + cmd_list = ["symlink", "copy_file", "symlink", "copy_directory"] + test_base = list(zip(sources, targets, links, cmd_list)) + tutorial_config_path = os.path.join(TUTORIAL_CONFIG_DIR, "mocked_test_case.yml") + for source, target, link, cmd in test_base[1:2]: + with tmp(relpath("test_data")): + ever_config = EverestConfig.load_file(tutorial_config_path) + + if ever_config.install_data is None: + ever_config.install_data = [] + + ever_config.install_data.append( + InstallDataConfig( + source=source, + target=target, + link=link, + ) + ) + + errors = EverestConfig.lint_config_dict(ever_config.to_dict()) + assert len(errors) == 0 + + ert_config_dict = everest_to_ert_config(ever_config) + + output_dir = ever_config.output_dir + tutorial_dict = build_tutorial_dict( + os.path.abspath(TUTORIAL_CONFIG_DIR), output_dir + ) + + config_dir = ever_config.config_directory + tutorial_dict["SIMULATION_JOB"].insert( + 0, + (cmd, os.path.join(config_dir, source), target), + ) + assert tutorial_dict == ert_config_dict + + +@skipif_no_opm +@skipif_no_everest_models +@pytest.mark.everest_models_test +@pytest.mark.integration_test +@tmpdir(relpath("../../examples/egg")) +def test_summary_default(): + config_dir = "everest/model" + config_file = os.path.join(config_dir, "config.yml") + everconf = EverestConfig.load_file(config_file) + + data_file = everconf.model.data_file + if not os.path.isabs(data_file): + data_file = os.path.join(config_dir, data_file) + data_file = data_file.replace("", "0") + + wells = everest.util.read_wellnames(data_file) + groups = everest.util.read_groupnames(data_file) + + sum_keys = list(everest.simulator.DEFAULT_DATA_SUMMARY_KEYS) + list( + everest.simulator.DEFAULT_FIELD_SUMMARY_KEYS + ) + + key_name_lists = ( + (everest.simulator.DEFAULT_GROUP_SUMMARY_KEYS, groups), + (everest.simulator.DEFAULT_WELL_SUMMARY_KEYS, wells), + ) + for keys, names in key_name_lists: + sum_keys += [f"{key}:{name}" for key, name in itertools.product(keys, names)] + + res_conf = everest_to_ert_config(everconf) + assert set(sum_keys) == set(res_conf["SUMMARY"][0]) + + +@pytest.mark.integration_test +@hide_opm +@skipif_no_everest_models +@pytest.mark.everest_models_test +@pytest.mark.fails_on_macos_github_workflow +@tmpdir(relpath("../../examples/egg")) +def test_summary_default_no_opm(): + config_dir = "everest/model" + config_file = os.path.join(config_dir, "config.yml") + everconf = EverestConfig.load_file(config_file) + + # Read wells from the config instead of using opm + wells = [w.name for w in everconf.wells] + sum_keys = ( + list(everest.simulator.DEFAULT_DATA_SUMMARY_KEYS) + + list(everest.simulator.DEFAULT_FIELD_SUMMARY_KEYS) + + [ + "{}:{}".format(k, w) + for k, w in itertools.product( + everest.simulator.DEFAULT_WELL_SUMMARY_KEYS, wells + ) + ] + ) + sum_keys = [list(set(sum_keys))] + res_conf = everest_to_ert_config(everconf) + + assert set(sum_keys[0]) == set(res_conf["SUMMARY"][0]) + + +@pytest.mark.simulation_test +def test_install_data(): + """ + TODO: When default jobs are handled in Everest this test should not + be a simulation test. + """ + + sources = 2 * ["eclipse/refcase/TNO_REEK.SMSPEC"] + 2 * ["eclipse/refcase"] + targets = 2 * ["REEK.SMSPEC"] + 2 * ["tno_refcase"] + links = [True, False, True, False] + cmds = ["symlink", "copy_file", "symlink", "copy_directory"] + test_base = zip(sources, targets, links, cmds) + tutorial_config_path = os.path.join(TUTORIAL_CONFIG_DIR, "mocked_test_case.yml") + for source, target, link, cmd in test_base: + with tmp(relpath("test_data")): + ever_config = EverestConfig.load_file(tutorial_config_path) + + if ever_config.install_data is None: + ever_config.install_data = [] + + ever_config.install_data.append( + InstallDataConfig( + source=source, + target=target, + link=link, + ) + ) + + errors = EverestConfig.lint_config_dict(ever_config.to_dict()) + assert len(errors) == 0 + + ert_config_dict = everest_to_ert_config(ever_config) + + output_dir = ever_config.output_dir + tutorial_dict = build_tutorial_dict( + os.path.abspath(TUTORIAL_CONFIG_DIR), output_dir + ) + config_dir = ever_config.config_directory + tutorial_dict["SIMULATION_JOB"].insert( + 0, + (cmd, os.path.join(config_dir, source), target), + ) + assert tutorial_dict == ert_config_dict + + # Instantiate res + ErtConfig.with_plugins().from_dict( + config_dict=everest_to_ert_config( + ever_config, site_config=ErtConfig.read_site_config() + ) + ) + + +@tmpdir(relpath("test_data")) +def test_strip_date_job_insertion(): + # Load config file + ever_config = EverestConfig.load_file(SNAKE_CONFIG_PATH) + ever_config.model.report_steps = [ + "2000-1-1", + "2001-1-2", + "2002-1-1", + ] + ever_config.forward_model.insert(1, "eclipse100") + + output_dir = ever_config.output_dir + snake_dict = build_snake_dict(output_dir, ConfigKeys.LOCAL, report_steps=True) + + # Transform to res dict and verify equality + ert_config_dict = everest_to_ert_config(ever_config) + assert snake_dict == ert_config_dict + + +@tmpdir(relpath("test_data")) +def test_forward_model_job_insertion(): + # Load config file + ever_config = EverestConfig.load_file(SNAKE_CONFIG_PATH) + + # Transform to res dict + ert_config_dict = everest_to_ert_config(ever_config) + + jobs = ert_config_dict["INSTALL_JOB"] + for job in collect_forward_models(): + res_job = (job["name"], job["path"]) + assert res_job in jobs + + +@tmpdir(relpath("test_data")) +def test_workflow_job(): + workflow_jobs = [{"name": "test", "source": "jobs/TEST"}] + ever_config = EverestConfig.load_file(SNAKE_CONFIG_PATH) + ever_config.install_workflow_jobs = workflow_jobs + ert_config_dict = everest_to_ert_config(ever_config) + jobs = ert_config_dict.get("LOAD_WORKFLOW_JOB") + assert jobs is not None + assert jobs[0] == ( + os.path.join(ever_config.config_directory, workflow_jobs[0]["source"]), + workflow_jobs[0]["name"], + ) + + +@tmpdir(relpath("test_data")) +def test_workflows(): + workflow_jobs = [{"name": "test", "source": "jobs/TEST"}] + ever_config = EverestConfig.load_file(SNAKE_CONFIG_PATH) + ever_config.install_workflow_jobs = workflow_jobs + ever_config.workflows = WorkflowConfig.model_validate( + {"pre_simulation": ["test -i in -o out"]} + ) + ert_config_dict = everest_to_ert_config(ever_config) + workflows = ert_config_dict.get("LOAD_WORKFLOW") + assert workflows is not None + name = os.path.join(ever_config.config_directory, ".pre_simulation.workflow") + assert os.path.exists(name) + assert workflows[0] == (name, "pre_simulation") + hooks = ert_config_dict.get("HOOK_WORKFLOW") + assert hooks is not None + assert hooks[0] == ("pre_simulation", "PRE_SIMULATION") + + +@tmpdir(relpath("test_data")) +def test_user_config_jobs_precedence(): + # Load config file + ever_config = EverestConfig.load_file(SNAKE_CONFIG_PATH) + first_job = everest.jobs.script_names[0] + + existing_standard_job = InstallJobConfig(name=first_job, source="expected_source") + ever_config.install_jobs.append(existing_standard_job) + config_dir = ever_config.config_directory + # Transform to res dict + ert_config_dict = everest_to_ert_config(ever_config) + + job = [job for job in ert_config_dict["INSTALL_JOB"] if job[0] == first_job] + assert len(job) == 1 + assert job[0][1] == os.path.join(config_dir, "expected_source") + + +@tmpdir(relpath("test_data")) +def test_user_config_num_cpu(): + # Load config file + ever_config = EverestConfig.load_file(SNAKE_CONFIG_PATH) + + # Transform to res dict + ert_config_dict = everest_to_ert_config(ever_config) + assert "NUM_CPU" not in ert_config_dict + + ever_config.simulator.cores_per_node = 2 + # Transform to res dict + ert_config_dict = everest_to_ert_config(ever_config) + assert "NUM_CPU" in ert_config_dict + assert ert_config_dict["NUM_CPU"] == 2 diff --git a/tests/everest/test_restart.py b/tests/everest/test_restart.py new file mode 100644 index 00000000000..6c3fe546831 --- /dev/null +++ b/tests/everest/test_restart.py @@ -0,0 +1,28 @@ +import pytest + +from everest.config import EverestConfig +from everest.suite import _EverestWorkflow +from tests.everest.utils import relpath, tmpdir + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") +CONFIG_FILE_RESTART = "config_restart.yml" + + +@tmpdir(CONFIG_PATH) +def test_restart_optimizer(): + config = EverestConfig.load_file(CONFIG_FILE_RESTART) + + workflow = _EverestWorkflow(config) + assert workflow is not None + workflow.start_optimization() + + point_names = ["x-0", "x-1", "x-2"] + # Check resulting points + x0, x1, x2 = (workflow.result.controls["point_" + p] for p in point_names) + assert x0 == pytest.approx(0.1, abs=0.025) + assert x1 == pytest.approx(0.0, abs=0.025) + assert x2 == pytest.approx(0.4, abs=0.025) + + # Since we restarted once, we have twice the number of + # max_function_evaluations: + assert workflow.result.batch == 5 diff --git a/tests/everest/test_samplers.py b/tests/everest/test_samplers.py new file mode 100644 index 00000000000..3a22f569fee --- /dev/null +++ b/tests/everest/test_samplers.py @@ -0,0 +1,74 @@ +import pytest + +from everest.config import EverestConfig +from everest.config.sampler_config import SamplerConfig +from everest.suite import _EverestWorkflow +from tests.everest.utils import relpath, tmpdir + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") +CONFIG_FILE_ADVANCED = "config_advanced_scipy.yml" + + +@tmpdir(CONFIG_PATH) +def test_sampler_uniform(): + config = EverestConfig.load_file(CONFIG_FILE_ADVANCED) + config.controls[0].sampler = SamplerConfig(**{"method": "uniform"}) + + workflow = _EverestWorkflow(config) + assert workflow is not None + workflow.start_optimization() + + point_names = ["x-0", "x-1", "x-2"] + # Check resulting points + x0, x1, x2 = (workflow.result.controls["point_" + p] for p in point_names) + assert x0 == pytest.approx(0.1, abs=0.025) + assert x1 == pytest.approx(0.0, abs=0.025) + assert x2 == pytest.approx(0.4, abs=0.025) + + # Check optimum value + assert pytest.approx(workflow.result.total_objective, abs=0.01) == -( + 0.25 * (1.6**2 + 1.5**2 + 0.1**2) + 0.75 * (0.4**2 + 0.5**2 + 0.1**2) + ) + # Expected distance is the weighted average of the (squared) distances + # from (x, y, z) to (-1.5, -1.5, 0.5) and (0.5, 0.5, 0.5) + w = config.model.realizations_weights + assert w == [0.25, 0.75] + dist_0 = (x0 + 1.5) ** 2 + (x1 + 1.5) ** 2 + (x2 - 0.5) ** 2 + dist_1 = (x0 - 0.5) ** 2 + (x1 - 0.5) ** 2 + (x2 - 0.5) ** 2 + expected_opt = -(w[0] * (dist_0) + w[1] * (dist_1)) + assert expected_opt == pytest.approx(workflow.result.total_objective, abs=0.001) + + +@tmpdir(CONFIG_PATH) +def test_sampler_mixed(): + config = EverestConfig.load_file(CONFIG_FILE_ADVANCED) + config.controls[0].variables[0].sampler = SamplerConfig(**{"method": "uniform"}) + config.controls[0].variables[1].sampler = SamplerConfig(**{"method": "norm"}) + config.controls[0].variables[2].sampler = SamplerConfig(**{"method": "uniform"}) + + workflow = _EverestWorkflow(config) + assert workflow is not None + workflow.start_optimization() + + point_names = ["x-0", "x-1", "x-2"] + # Check resulting points + x0, x1, x2 = (workflow.result.controls["point_" + p] for p in point_names) + assert x0 == pytest.approx(0.1, abs=0.025) + assert x1 == pytest.approx(0.0, abs=0.025) + assert x2 == pytest.approx(0.4, abs=0.025) + + # Check optimum value + assert pytest.approx(workflow.result.total_objective, abs=0.01) == -( + 0.25 * (1.6**2 + 1.5**2 + 0.1**2) + 0.75 * (0.4**2 + 0.5**2 + 0.1**2) + ) + # Expected distance is the weighted average of the (squared) distances + # from (x, y, z) to (-1.5, -1.5, 0.5) and (0.5, 0.5, 0.5) + w = config.model.realizations_weights + assert w == [0.25, 0.75] + dist_0 = (x0 + 1.5) ** 2 + (x1 + 1.5) ** 2 + (x2 - 0.5) ** 2 + dist_1 = (x0 - 0.5) ** 2 + (x1 - 0.5) ** 2 + (x2 - 0.5) ** 2 + expected_opt = -(w[0] * (dist_0) + w[1] * (dist_1)) + assert expected_opt == pytest.approx( + workflow.result.total_objective, + abs=0.001, + ) diff --git a/tests/everest/test_seba_initialization.py b/tests/everest/test_seba_initialization.py new file mode 100644 index 00000000000..4216709b154 --- /dev/null +++ b/tests/everest/test_seba_initialization.py @@ -0,0 +1,273 @@ +import os.path + +import numpy +import pytest +from pydantic import ValidationError +from ropt.config.enopt import EnOptConfig +from ropt.enums import ConstraintType + +from everest.config import EverestConfig +from everest.config_file_loader import yaml_file_to_substituted_config_dict +from everest.optimizer.everest2ropt import everest2ropt +from tests.everest.utils import relpath, tmpdir + +_CONFIG_DIR = relpath("test_data/mocked_test_case") +_CONFIG_FILE = "mocked_test_case.yml" + + +@tmpdir(_CONFIG_DIR) +def test_tutorial_everest2ropt(): + ever_config = EverestConfig.load_file(_CONFIG_FILE) + + ropt_config = EnOptConfig.model_validate(everest2ropt(ever_config)) + + realizations = ropt_config.realizations + + assert len(realizations.names) == 2 + assert realizations.names[0] == 0 + assert realizations.weights[0] == 0.5 + + +@tmpdir(relpath("test_data")) +def test_everest2ropt_controls(): + config = EverestConfig.load_file( + os.path.join("mocked_test_case", "mocked_test_case.yml") + ) + + controls = config.controls + assert len(controls) == 1 + + ropt_config = EnOptConfig.model_validate(everest2ropt(config)) + + assert len(ropt_config.variables.lower_bounds) == 16 + assert len(ropt_config.variables.upper_bounds) == 16 + + +@tmpdir(relpath("test_data")) +def test_everest2ropt_controls_auto_scale(): + config = EverestConfig.load_file( + os.path.join("mocked_test_case", "mocked_test_case.yml") + ) + controls = config.controls + controls[0].auto_scale = True + controls[0].scaled_range = [0.3, 0.7] + ropt_config = EnOptConfig.model_validate(everest2ropt(config)) + assert numpy.allclose(ropt_config.variables.lower_bounds, 0.3) + assert numpy.allclose(ropt_config.variables.upper_bounds, 0.7) + + +@tmpdir(relpath("test_data")) +def test_everest2ropt_variables_auto_scale(): + config = EverestConfig.load_file( + os.path.join("mocked_test_case", "mocked_test_case.yml") + ) + controls = config.controls + controls[0].variables[1].auto_scale = True + controls[0].variables[1].scaled_range = [0.3, 0.7] + ropt_config = EnOptConfig.model_validate(everest2ropt(config)) + assert ropt_config.variables.lower_bounds[0] == 0.0 + assert ropt_config.variables.upper_bounds[0] == 0.1 + assert ropt_config.variables.lower_bounds[1] == 0.3 + assert ropt_config.variables.upper_bounds[1] == 0.7 + assert numpy.allclose(ropt_config.variables.lower_bounds[2:], 0.0) + assert numpy.allclose(ropt_config.variables.upper_bounds[2:], 0.1) + + +@tmpdir(relpath("test_data")) +def test_everest2ropt_controls_input_constraint(): + config = EverestConfig.load_file( + os.path.join("mocked_test_case", "config_input_constraints.yml") + ) + input_constraints_ever_config = config.input_constraints + # Check that there are two input constraints entries in the config + assert len(input_constraints_ever_config) == 2 + + ropt_config = EnOptConfig.model_validate(everest2ropt(config)) + + # The input has two constraints: one two-sided inequality constraint, + # and an equality constraint. The first is converted into LE and GE + # constraints by Everest, so the ropt input should contain three + # constraints: LE, GE and EQ. + + # Check that the config is defining three input constraints. + assert ropt_config.linear_constraints.coefficients.shape[0] == 3 + + # Check the input constraint types + exp_type = [ConstraintType.LE, ConstraintType.GE, ConstraintType.EQ] + assert exp_type == list(ropt_config.linear_constraints.types) + # Check the rhs + exp_rhs = [1.0, 0.0, 1.0] + assert exp_rhs == ropt_config.linear_constraints.rhs_values.tolist() + + +@tmpdir(relpath("test_data")) +def test_everest2ropt_controls_input_constraint_auto_scale(): + config = EverestConfig.load_file( + os.path.join("mocked_test_case", "config_input_constraints.yml") + ) + input_constraints_ever_config = config.input_constraints + # Check that there are two input constraints entries in the config + assert len(input_constraints_ever_config) == 2 + + ropt_config = EnOptConfig.model_validate(everest2ropt(config)) + min_values = ropt_config.variables.lower_bounds.copy() + max_values = ropt_config.variables.upper_bounds.copy() + coefficients = ropt_config.linear_constraints.coefficients + rhs_values = ropt_config.linear_constraints.rhs_values + + controls = config.controls + min_values[1] = -1.0 + max_values[1] = 1.0 + for idx in range(3): + controls[0].variables[idx].min = min_values[idx] + controls[0].variables[idx].max = max_values[idx] + controls[0].auto_scale = True + controls[0].scaled_range = [0.3, 0.7] + + scaled_rhs_values = rhs_values - numpy.matmul( + coefficients, min_values - 0.3 * (max_values - min_values) / 0.4 + ) + coefficients /= 0.4 + scaled_coefficients = coefficients * (max_values - min_values) + scaled_coefficients[:2, 1] = coefficients[:2, 1] * 2.0 + + ropt_config = EnOptConfig.model_validate(everest2ropt(config)) + assert numpy.allclose( + ropt_config.linear_constraints.coefficients, + scaled_coefficients, + ) + assert numpy.allclose( + ropt_config.linear_constraints.rhs_values[0], + scaled_rhs_values[0], + ) + + +@tmpdir(relpath("test_data")) +def test_everest2ropt_controls_optimizer_setting(): + config = os.path.join("mocked_test_case", "config_full_gradient_info.yml") + + config = EverestConfig.load_file(config) + ropt_config = EnOptConfig.model_validate(everest2ropt(config)) + assert len(ropt_config.realizations.names) == 15 + assert ropt_config.optimizer.method == "dakota/conmin_mfd" + assert ropt_config.gradient.number_of_perturbations == 20 + assert ropt_config.realizations.names == tuple(range(15)) + + +@tmpdir(relpath("test_data")) +def test_everest2ropt_constraints(): + config = os.path.join("mocked_test_case", "config_output_constraints.yml") + config = EverestConfig.load_file(config) + + ropt_config = EnOptConfig.model_validate(everest2ropt(config)) + + assert len(ropt_config.nonlinear_constraints.names) == 16 + + +@tmpdir(relpath("test_data")) +def test_everest2ropt_backend_options(): + config = os.path.join("mocked_test_case", "config_output_constraints.yml") + config = EverestConfig.load_file(config) + + config.optimization.options = ["test = 1"] + ropt_config = EnOptConfig.model_validate(everest2ropt(config)) + assert ropt_config.optimizer.options == ["test = 1"] + + config.optimization.backend = "scipy" + config.optimization.backend_options = {"test": 1} + with pytest.raises(RuntimeError): + _ = EnOptConfig.model_validate(everest2ropt(config)) + + config.optimization.options = None + ropt_config = EnOptConfig.model_validate(everest2ropt(config)) + assert ropt_config.optimizer.options["test"] == 1 + + +@tmpdir(relpath("test_data")) +def test_everest2ropt_samplers(): + config = os.path.join("mocked_test_case", "config_samplers.yml") + config = EverestConfig.load_file(config) + + ropt_config = EnOptConfig.model_validate(everest2ropt(config)) + + assert len(ropt_config.samplers) == 5 + assert ropt_config.gradient.samplers.tolist() == [0, 0, 1, 2, 3, 4] + assert ropt_config.samplers[0].method == "scipy/norm" + assert ropt_config.samplers[1].method == "scipy/norm" + assert ropt_config.samplers[2].method == "scipy/uniform" + assert ropt_config.samplers[3].method == "scipy/norm" + assert ropt_config.samplers[4].method == "scipy/uniform" + for idx in range(5): + if idx == 1: + assert ropt_config.samplers[idx].shared + else: + assert not ropt_config.samplers[idx].shared + + +@tmpdir(_CONFIG_DIR) +def test_everest2ropt_cvar(): + config_dict = yaml_file_to_substituted_config_dict(_CONFIG_FILE) + + config_dict["optimization"]["cvar"] = {} + + with pytest.raises(ValidationError, match="Invalid CVaR section"): + EverestConfig.model_validate(config_dict) + + config_dict["optimization"]["cvar"] = { + "percentile": 0.1, + "number_of_realizations": 1, + } + + with pytest.raises(ValidationError, match=".*Invalid CVaR section.*"): + EverestConfig.model_validate(config_dict) + + config_dict["optimization"]["cvar"] = { + "number_of_realizations": 1, + } + + ropt_config = EnOptConfig.model_validate( + everest2ropt(EverestConfig.model_validate(config_dict)) + ) + + assert ropt_config.objective_functions.realization_filters == [0] + assert len(ropt_config.realization_filters) == 1 + assert ropt_config.realization_filters[0].method == "sort-objective" + assert ropt_config.realization_filters[0].options["sort"] == [0] + assert ropt_config.realization_filters[0].options["first"] == 0 + assert ropt_config.realization_filters[0].options["last"] == 0 + + config_dict["optimization"]["cvar"] = { + "percentile": 0.3, + } + + ropt_config = EnOptConfig.model_validate( + everest2ropt(EverestConfig.model_validate(config_dict)) + ) + assert ropt_config.objective_functions.realization_filters == [0] + assert len(ropt_config.realization_filters) == 1 + assert ropt_config.realization_filters[0].method == "cvar-objective" + assert ropt_config.realization_filters[0].options["sort"] == [0] + assert ropt_config.realization_filters[0].options["percentile"] == 0.3 + + +@tmpdir(relpath("test_data")) +def test_everest2ropt_arbitrary_backend_options(): + config = EverestConfig.load_file( + os.path.join("mocked_test_case", "mocked_test_case.yml") + ) + config.optimization.backend_options = {"a": [1]} + + ropt_config = EnOptConfig.model_validate(everest2ropt(config)) + assert "a" in ropt_config.optimizer.options + assert ropt_config.optimizer.options["a"] == [1] + + +@tmpdir(relpath("test_data")) +def test_everest2ropt_no_algorithm_name(): + config = EverestConfig.load_file( + os.path.join("valid_config_file", "valid_yaml_config_no_algorithm.yml") + ) + + config.optimization.algorithm = None + ropt_config = EnOptConfig.model_validate(everest2ropt(config)) + assert ropt_config.optimizer.method == "dakota/default" diff --git a/tests/everest/test_shell_scripts.py b/tests/everest/test_shell_scripts.py new file mode 100644 index 00000000000..251e44fac0a --- /dev/null +++ b/tests/everest/test_shell_scripts.py @@ -0,0 +1,18 @@ +from everest.config.everest_config import EverestConfig, get_system_installed_jobs +from everest.jobs import shell_commands +from tests.everest.utils import relpath + + +def test_everest_shell_commands_list(): + # Check list of defined shell commands are part of the list of ert + # installed system jobs + system_installed_jobs = get_system_installed_jobs() + for command_name in shell_commands: + assert command_name in system_installed_jobs + + +def test_default_shell_scripts(): + config_path = relpath("test_data", "shell_commands", "config_shell_commands.yml") + # Check that a config file containing default shell jobs as part of the + # forward-model section is valid + EverestConfig.load_file(config_path) diff --git a/tests/everest/test_site_config_env.py b/tests/everest/test_site_config_env.py new file mode 100644 index 00000000000..614a3bddd5e --- /dev/null +++ b/tests/everest/test_site_config_env.py @@ -0,0 +1,131 @@ +import os +import shutil +from unittest.mock import patch + +import pytest + +from everest.plugins import hook_impl as everest_implementation +from everest.plugins import hookimpl +from everest.plugins.hook_manager import EverestPluginManager +from everest.plugins.plugin_response import plugin_response +from everest.plugins.site_config_env import PluginSiteConfigEnv + + +class DummyPlugin2: + @hookimpl + @plugin_response(plugin_name="Dummy2") # pylint: disable=no-value-for-parameter + def site_config_lines(self): + return ["-- dummy site config from plugin 2", ""] + + @hookimpl + @plugin_response(plugin_name="Dummy2") # pylint: disable=no-value-for-parameter + def installable_workflow_jobs(self): + return {"dummy_job": "dummy/workflow/job/path"} + + +class DummyPlugin: + @hookimpl + @plugin_response(plugin_name="Dummy") # pylint: disable=no-value-for-parameter + def site_config_lines(self): + return ["-- dummy site config", ""] + + @hookimpl + @plugin_response(plugin_name="Dummy") # pylint: disable=no-value-for-parameter + def ecl100_config_path(self): + return "dummy/ecl100_config_path" + + @hookimpl + @plugin_response(plugin_name="Dummy") # pylint: disable=no-value-for-parameter + def ecl300_config_path(self): + return "dummy/ecl300_config_path" + + @hookimpl + @plugin_response(plugin_name="Dummy") # pylint: disable=no-value-for-parameter + def flow_config_path(self): + return "dummy/flow_config_path" + + +@pytest.fixture +def mocked_env(mocker): + @patch( + "everest.plugins.site_config_env.EverestPluginManager", + return_value=EverestPluginManager( + [DummyPlugin(), DummyPlugin2(), everest_implementation] + ), + ) + def get_env(*args): + return PluginSiteConfigEnv() + + return get_env() + + +expected_env_lines = [ + "SETENV ECL100_SITE_CONFIG dummy/ecl100_config_path", + "SETENV ECL300_SITE_CONFIG dummy/ecl300_config_path", + "SETENV FLOW_SITE_CONFIG dummy/flow_config_path", + "", +] + +expected_site_config_extra = [ + "JOB_SCRIPT job_dispatch.py", + "QUEUE_OPTION LOCAL MAX_RUNNING 1", + "", +] + +expected_site_config_content = ( + "\n".join( + [ + *expected_site_config_extra, + "-- dummy site config", + "", + "-- dummy site config from plugin 2", + "", + *expected_env_lines, + "LOAD_WORKFLOW_JOB dummy/workflow/job/path", + "", + ] + ) + + "\n" +) + + +def test_add_config_env_vars(mocked_env): + result = mocked_env._config_env_vars() + assert result == expected_env_lines + + +def test_get_temp_site_config_path(mocked_env): + result = mocked_env._get_temp_site_config_path() + expected = os.path.join(mocked_env.tmp_dir, "site-config") + assert result == expected + if mocked_env.tmp_dir is not None: + shutil.rmtree(mocked_env.tmp_dir) + + +def test_get_site_config_content(mocked_env): + result = mocked_env._get_site_config_content() + assert result == expected_site_config_content + + +def test_write_tmp_site_config_file(tmpdir, mocked_env): + with tmpdir.as_cwd(): + site_conf_path = "test-site-config" + assert not os.path.exists(site_conf_path) + mocked_env._write_tmp_site_config_file( + path=site_conf_path, content="test content" + ) + assert os.path.exists("test-site-config") + with open(site_conf_path, "r", encoding="utf-8") as f: + assert f.read() == "test content" + + +def test_env_context(mocked_env): + assert os.environ.get("ERT_SITE_CONFIG", "NOT_SET") == "NOT_SET" + with mocked_env: + site_config_path = os.path.join(mocked_env.tmp_dir, "site-config") + assert os.environ.get("ERT_SITE_CONFIG", "NOT_SET") == site_config_path + os.path.exists(site_config_path) + with open(site_config_path, "r", encoding="utf-8") as f: + assert expected_site_config_content == f.read() + assert not os.path.exists(mocked_env.tmp_dir) + assert os.environ.get("ERT_SITE_CONFIG", "NOT_SET") == "NOT_SET" diff --git a/tests/everest/test_templating.py b/tests/everest/test_templating.py new file mode 100644 index 00000000000..080160260ce --- /dev/null +++ b/tests/everest/test_templating.py @@ -0,0 +1,246 @@ +import json +import os +import subprocess + +import pytest +from ruamel.yaml import YAML + +import everest +from everest.config import EverestConfig +from tests.everest.utils import relpath, tmpdir + +TMPL_TEST_PATH = os.path.join("test_data", "templating") +TMPL_CONFIG_FILE = "config.yml" +TMPL_WELL_DRILL_FILE = os.path.join("templates", "well_drill_info.tmpl") +TMPL_DUAL_INPUT_FILE = os.path.join("templates", "dual_input.tmpl") + +MATH_TEST_PATH = relpath("..", "..", "examples", "math_func") +MATH_CONFIG_FILE = "config_minimal.yml" + + +@tmpdir(relpath(TMPL_TEST_PATH)) +def test_render_invalid(): + render = everest.jobs.templating.render + + prod_wells = {"PROD%d" % idx: 0.3 * idx for idx in range(4)} + prod_in = "well_drill_prod.json" + with open(prod_in, "w", encoding="utf-8") as fout: + json.dump(prod_wells, fout) + + wells_out = "wells.out" + + with pytest.raises(TypeError): + render(None, TMPL_WELL_DRILL_FILE, wells_out) + + with pytest.raises(ValueError): + render(2 * prod_in, TMPL_WELL_DRILL_FILE, wells_out) + + with pytest.raises(TypeError): + render(prod_in, None, wells_out) + + with pytest.raises(ValueError): + render(prod_in, TMPL_WELL_DRILL_FILE + "nogo", wells_out) + + with pytest.raises(TypeError): + render(prod_in, TMPL_WELL_DRILL_FILE, None) + + +@tmpdir(relpath(TMPL_TEST_PATH)) +def test_render(): + render = everest.jobs.templating.render + + wells = {"PROD%d" % idx: 0.2 * idx for idx in range(1, 5)} + wells.update({"INJ%d" % idx: 1 - 0.2 * idx for idx in range(1, 5)}) + wells_in = "well_drill.json" + with open(wells_in, "w", encoding="utf-8") as fout: + json.dump(wells, fout) + + wells_out = "wells.out" + render(wells_in, TMPL_WELL_DRILL_FILE, wells_out) + + with open(wells_out, encoding="utf-8") as fin: + output = fin.readlines() + + for idx, line in enumerate(output): + split = line.split(" ") + if len(split) == 1: + assert idx == 2 + assert line == "----------------------------------\n" + else: + on_off = "on" if wells[split[0]] >= 0.5 else "off" + expected_string = "{} takes value {}, implying {}\n".format( + split[0], wells[split[0]], on_off + ) + if idx == len(output) - 1: + expected_string = expected_string[:-1] + assert expected_string == line + + +@tmpdir(relpath(TMPL_TEST_PATH)) +def test_render_multiple_input(): + render = everest.jobs.templating.render + + wells_north = {"PROD%d" % idx: 0.2 * idx for idx in range(1, 5)} + wells_north_in = "well_drill_north.json" + with open(wells_north_in, "w", encoding="utf-8") as fout: + json.dump(wells_north, fout) + + wells_south = {"PROD%d" % idx: 1 - 0.2 * idx for idx in range(1, 5)} + wells_south_in = "well_drill_south.json" + with open(wells_south_in, "w", encoding="utf-8") as fout: + json.dump(wells_south, fout) + + wells_out = "sub_folder/wells.out" + render((wells_north_in, wells_south_in), TMPL_DUAL_INPUT_FILE, wells_out) + + with open(wells_out, encoding="utf-8") as fin: + output = fin.readlines() + + assert output == ["0.2 vs 0.8"] + + +@tmpdir(relpath(TMPL_TEST_PATH)) +def test_render_executable(): + assert os.access(everest.jobs.render, os.X_OK) + + # Dump input + wells_north = {"PROD%d" % idx: 0.2 * idx for idx in range(1, 5)} + wells_north_in = "well_drill_north.json" + with open(wells_north_in, "w", encoding="utf-8") as fout: + json.dump(wells_north, fout) + + wells_south = {"PROD%d" % idx: 1 - 0.2 * idx for idx in range(1, 5)} + wells_south_in = "well_drill_south.json" + with open(wells_south_in, "w", encoding="utf-8") as fout: + json.dump(wells_south, fout) + + # Format command + output_file = "render_out" + cmd_fmt = "{render} --output {fout} --template {tmpl} --input_files {fin}" + cmd = cmd_fmt.format( + render=everest.jobs.render, + tmpl=TMPL_DUAL_INPUT_FILE, + fout=output_file, + fin=" ".join((wells_north_in, wells_south_in)), + ) + + subprocess.check_call(cmd, shell=True) + + # Verify result + with open(output_file, encoding="utf-8") as fout: + assert "\n".join(fout.readlines()) == "0.2 vs 0.8" + + +@pytest.mark.integration_test +@tmpdir(relpath(TMPL_TEST_PATH)) +def test_install_template(): + config = EverestConfig.load_file(TMPL_CONFIG_FILE) + workflow = everest.suite._EverestWorkflow(config) + workflow.start_optimization() + + +@tmpdir(None) +def test_well_order_template(): + order_tmpl = everest.templates.fetch_template("well_order.tmpl") + + well_order = { + "PROD1": 0.3, + "PROD2": 0.1, + "PROD3": 0.2, + "INJECT1": 0.5, + "INJECT2": 0.01, + "SUPER_WELL1": 1, + "YET_ANOTHER_WELL": 1, + } + + data_file = "well_order.json" + with open(data_file, "w", encoding="utf-8") as fout: + json.dump(well_order, fout) + + output_file = "well_order_list.json" + everest.jobs.templating.render( + data_file, + order_tmpl, + output_file, + ) + + with open(output_file, encoding="utf-8") as fin: + order = json.load(fin) + + assert len(well_order) == len(order) + for idx in range(len(order) - 1): + assert well_order[order[idx]] <= well_order[order[idx + 1]] + + +@pytest.mark.integration_test +@tmpdir(relpath(MATH_TEST_PATH)) +def test_user_specified_data_n_template(): + """ + Ensure that a user specifying a data resource and an installed_template + with "extra_data", the results of that template will be passed to the + directory for each consecutive simulation + """ + + config = EverestConfig.load_file(MATH_CONFIG_FILE) + + # Write out some constants to a yaml file; doing it here, so config + # test (TestRepoConfigs) doesn't try to lint this yaml file. + yaml = YAML(typ="safe", pure=True) + with open("my_constants.yml", "w", encoding="utf-8") as f: + yaml.dump({"CONST1": "VALUE1", "CONST2": "VALUE2"}, f) + + # Write out the template to which takes the constants above + with open("my_constants.tmpl", "w", encoding="utf-8") as f: + f.write("{{ my_constants.CONST1 }}+{{ my_constants.CONST2 }}") + + # Modify the minimal config with template and constants + updated_config_dict = config.to_dict() + updated_config_dict.update( + { + "optimization": { + "algorithm": "optpp_q_newton", + "convergence_tolerance": 0.005, + "max_iterations": 1, + "perturbation_num": 1, + "max_function_evaluations": 1, + }, + "install_data": [ + { + "source": "/my_constants.yml", + "target": "my_constants.yml", + } + ], + "install_templates": [ + { + "template": "/my_constants.tmpl", + "output_file": "well_drill_constants.json", + "extra_data": "my_constants.yml", + } + ], + } + ) + + config = EverestConfig.with_defaults(**updated_config_dict) + + workflow = everest.suite._EverestWorkflow(config) + assert workflow is not None + + workflow.start_optimization() + + # The data should have been loaded and passed through template to file. + expected_file = os.path.join( + "everest_output", + "sim_output", + "batch_0", + "geo_realization_0", + "simulation_1", + "well_drill_constants.json", + ) + assert os.path.isfile(expected_file) + + # Check expected contents of file + with open(expected_file, "r", encoding="utf-8") as f: + contents = f.read() + assert ( + contents == "VALUE1+VALUE2" + ), 'Expected contents: "VALUE1+VALUE2", found: {}'.format(contents) diff --git a/tests/everest/test_ui_run.py b/tests/everest/test_ui_run.py new file mode 100644 index 00000000000..555718b4d70 --- /dev/null +++ b/tests/everest/test_ui_run.py @@ -0,0 +1,37 @@ +import pytest +from qtpy.QtCore import Qt + +from ieverest import IEverest +from tests.everest.dialogs_mocker import mock_dialogs_all +from tests.everest.utils import relpath, tmpdir + +CASE_DIR = relpath("test_data", "mocked_test_case") +CONFIG_FILE = "mocked_test_case.yml" + + +@pytest.mark.ui_test +@tmpdir(CASE_DIR) +def test_load_run(qapp, qtbot, mocker): + """Load a configuration and run it from the UI""" + + qapp.setAttribute(Qt.AA_X11InitThreads) + qapp.setOrganizationName("Equinor/TNO") + qapp.setApplicationName("IEverest") + ieverest = IEverest() + + # Load the configuration + mock_dialogs_all(mocker, open_file_name=CONFIG_FILE) + + start_server_mock = mocker.patch("ieverest.ieverest.start_server") + wait_for_server_mock = mocker.patch("ieverest.ieverest.wait_for_server") + start_monitor_mock = mocker.patch("ieverest.ieverest.start_monitor") + + qtbot.mouseClick(ieverest._gui._startup_gui.open_btn, Qt.LeftButton) + # Start the mocked optimization + qtbot.mouseClick(ieverest._gui.monitor_gui.start_btn, Qt.LeftButton) + qtbot.waitUntil(lambda: ieverest.server_monitor is not None, timeout=10 * 1e3) + qtbot.waitUntil(lambda: ieverest.server_monitor is None, timeout=10 * 1e3) + + start_server_mock.assert_called_once() + wait_for_server_mock.assert_called_once() + start_monitor_mock.assert_called_once() diff --git a/tests/everest/test_util.py b/tests/everest/test_util.py new file mode 100644 index 00000000000..f084c1cb0cc --- /dev/null +++ b/tests/everest/test_util.py @@ -0,0 +1,164 @@ +import os.path +from pathlib import Path +from unittest.mock import patch + +import pytest + +from everest import util +from everest.bin.utils import report_on_previous_run +from everest.config import EverestConfig +from everest.config.everest_config import get_system_installed_jobs +from everest.config_keys import ConfigKeys +from everest.detached import ServerStatus +from everest.strings import SERVER_STATUS +from tests.everest.utils import ( + capture_streams, + hide_opm, + relpath, + skipif_no_opm, + tmpdir, +) + +EGG_DATA = relpath( + "../../examples/egg/eclipse/include/", + "realizations/realization-0/eclipse/model/EGG.DATA", +) +SPE1_DATA = relpath("test_data/eclipse/SPE1.DATA") + +CONFIG_PATH = relpath("..", "..", "examples", "math_func") + + +@skipif_no_opm +def test_loadwells(): + wells = util.read_wellnames(SPE1_DATA) + assert wells == ["PROD", "INJ"] + + +@skipif_no_opm +def test_loadgroups(): + groups = util.read_groupnames(EGG_DATA) + assert {"FIELD", "PRODUC", "INJECT"} == set(groups) + + +@hide_opm +def test_loadwells_no_opm(): + with pytest.raises(RuntimeError): + util.read_wellnames(SPE1_DATA) + + +@hide_opm +def test_loadgroups_no_opm(): + with pytest.raises(RuntimeError): + util.read_groupnames(EGG_DATA) + + +@tmpdir(None) +def test_get_values(): + exp_dir = "the_config_directory" + exp_file = "the_config_file" + rel_out_dir = "the_output_directory" + abs_out_dir = "/the_output_directory" + os.makedirs(exp_dir) + with open(os.path.join(exp_dir, exp_file), "w", encoding="utf-8") as f: + f.write(" ") + + config = EverestConfig.with_defaults( + **{ + ConfigKeys.ENVIRONMENT: { + ConfigKeys.OUTPUT_DIR: abs_out_dir, + ConfigKeys.SIMULATION_FOLDER: "simulation_folder", + }, + ConfigKeys.CONFIGPATH: Path(os.path.join(exp_dir, exp_file)), + } + ) + + config.environment.output_folder = rel_out_dir + + +@tmpdir(None) +def test_makedirs(): + output_dir = os.path.join("unittest_everest_output") + cwd = os.getcwd() + + # assert output dir (/tmp/tmpXXXX) is empty + assert not os.path.isdir(output_dir) + assert len(os.listdir(cwd)) == 0 + + # create output folder + util.makedirs_if_needed(output_dir) + + # assert output folder created + assert os.path.isdir(output_dir) + assert len(os.listdir(cwd)) == 1 + + +@tmpdir(None) +def test_makedirs_already_exists(): + output_dir = os.path.join("unittest_everest_output") + cwd = os.getcwd() + + # create outputfolder and verify it's existing + util.makedirs_if_needed(output_dir) + assert os.path.isdir(output_dir) + assert len(os.listdir(cwd)) == 1 + + # run makedirs_if_needed again, verify nothing happened + util.makedirs_if_needed(output_dir) + assert os.path.isdir(output_dir) + assert len(os.listdir(cwd)) == 1 + + +@tmpdir(None) +def test_makedirs_roll_existing(): + output_dir = os.path.join("unittest_everest_output") + cwd = os.getcwd() + + # create outputfolder and verify it's existing + util.makedirs_if_needed(output_dir) + assert os.path.isdir(output_dir) + assert len(os.listdir(cwd)) == 1 + + # run makedirs_if_needed again, verify old dir rolled + util.makedirs_if_needed(output_dir, True) + assert os.path.isdir(output_dir) + assert len(os.listdir(cwd)) == 2 + + # run makedirs_if_needed again, verify old dir rolled + util.makedirs_if_needed(output_dir, True) + assert os.path.isdir(output_dir) + assert len(os.listdir(cwd)) == 3 + + +@tmpdir(CONFIG_PATH) +def test_get_everserver_status_path(): + config = EverestConfig.load_file("config_minimal.yml") + cwd = os.getcwd() + session_path = os.path.join( + cwd, "everest_output", "detached_node_output", ".session" + ) + path = config.everserver_status_path + expected_path = os.path.join(session_path, SERVER_STATUS) + + assert path == expected_path + + +def test_get_system_installed_job_names(): + job_names = get_system_installed_jobs() + assert job_names is not None + assert isinstance(job_names, list) + assert len(job_names) > 0 + + +@patch( + "everest.bin.utils.everserver_status", + return_value={"status": ServerStatus.failed, "message": "mock error"}, +) +@tmpdir(None) +def test_report_on_previous_run(_): + with open("config_file", "w", encoding="utf-8") as f: + f.write(" ") + config = EverestConfig.with_defaults(**{ConfigKeys.CONFIGPATH: "config_file"}) + with capture_streams() as (out, _): + report_on_previous_run(config) + lines = [line.strip() for line in out.getvalue().split("\n")] + assert lines[0] == "Optimization run failed, with error: mock error" diff --git a/tests/everest/test_well_tools.py b/tests/everest/test_well_tools.py new file mode 100644 index 00000000000..ae1be8d0872 --- /dev/null +++ b/tests/everest/test_well_tools.py @@ -0,0 +1,688 @@ +import json +import os +import subprocess + +import pytest +from ruamel.yaml import YAML + +import everest +from tests.everest.utils import tmpdir + + +def _dump_sort_data(well_data_file, well_order_file): + name = everest.ConfigKeys.NAME + drill_time = everest.ConfigKeys.DRILL_TIME + + well_data = [ + {name: "PROD1", drill_time: 14}, + {name: "PROD2", drill_time: 11}, + {name: "INJECT1", drill_time: 1}, + {name: "INJECT2", drill_time: 114}, + ] + + with open(well_data_file, "w", encoding="utf-8") as f: + json.dump(well_data, f) + + well_order = [ + "INJECT1", + "PROD2", + "INJECT2", + "PROD1", + ] + + with open(well_order_file, "w", encoding="utf-8") as f: + json.dump(well_order, f) + + return [ + {name: "INJECT1", drill_time: 1}, + {name: "PROD2", drill_time: 11}, + {name: "INJECT2", drill_time: 114}, + {name: "PROD1", drill_time: 14}, + ] + + +@tmpdir(None) +def test_well_reorder(): + well_data_file = "well_data.json" + well_order_file = "well_order.yml" + output_file = "ordered_well_data.json" + + ordered_well_data = _dump_sort_data( + well_data_file, + well_order_file, + ) + + everest.jobs.well_tools.well_reorder( + well_data_file, + well_order_file, + output_file, + ) + + with open(output_file, encoding="utf-8") as f: + assert ordered_well_data == json.load(f) + + +@pytest.mark.integration_test +@tmpdir(None) +def test_well_reorder_script(): + assert os.access(everest.jobs.wdreorder, os.X_OK) + + well_data_file = "well_data.json" + well_order_file = "well_order.yml" + output_file = "ordered_well_data.json" + + ordered_well_data = _dump_sort_data( + well_data_file, + well_order_file, + ) + + cmd_fmt = "{well_reorder} --well_data {well_data} --order {order} --output {output}" + cmd = cmd_fmt.format( + well_reorder=everest.jobs.wdreorder, + well_data=well_data_file, + order=well_order_file, + output=output_file, + ) + + subprocess.check_call(cmd, shell=True) + + with open(output_file, encoding="utf-8") as f: + assert ordered_well_data == json.load(f) + + +def _dump_filter_data(well_data_file, well_filter_file): + name = everest.ConfigKeys.NAME + drill_time = everest.ConfigKeys.DRILL_TIME + + well_data = [ + {name: "PROD1", drill_time: 14}, + {name: "PROD2", drill_time: 11}, + {name: "INJECT1", drill_time: 1}, + {name: "INJECT2", drill_time: 114}, + ] + + with open(well_data_file, "w", encoding="utf-8") as f: + json.dump(well_data, f) + + well_filter = [ + "INJECT1", + "PROD2", + "PROD1", + ] + + with open(well_filter_file, "w", encoding="utf-8") as f: + json.dump(well_filter, f) + + return [ + {name: "PROD1", drill_time: 14}, + {name: "PROD2", drill_time: 11}, + {name: "INJECT1", drill_time: 1}, + ] + + +@tmpdir(None) +def test_well_filter(): + well_data_file = "well_data.yml" + well_filter_file = "well_filter.json" + output_file = "ordered_well_data.json" + + destilled_well_data = _dump_filter_data( + well_data_file, + well_filter_file, + ) + + everest.jobs.well_tools.well_filter( + well_data_file, + well_filter_file, + output_file, + ) + + with open(output_file, encoding="utf-8") as f: + assert destilled_well_data == json.load(f) + + +@pytest.mark.integration_test +@tmpdir(None) +def test_well_filter_script(): + assert os.access(everest.jobs.wdfilter, os.X_OK) + + well_data_file = "well_data.json" + well_filter_file = "well_filter.yml" + output_file = "ordered_well_data.json" + + destilled_well_data = _dump_filter_data( + well_data_file, + well_filter_file, + ) + + cmd_fmt = ( + "{well_filter} --well_data {well_data} --filter {wfilter} --output {output}" + ) + cmd = cmd_fmt.format( + well_filter=everest.jobs.wdfilter, + well_data=well_data_file, + wfilter=well_filter_file, + output=output_file, + ) + + subprocess.check_call(cmd, shell=True) + + with open(output_file, encoding="utf-8") as f: + assert destilled_well_data == json.load(f) + + +def _dump_merge_data(well_data_file, additional_data_files): + name = everest.ConfigKeys.NAME + drill_time = everest.ConfigKeys.DRILL_TIME + + well_data = [ + {name: "PROD1", drill_time: 14}, + {name: "PROD2", drill_time: 11}, + {name: "INJECT1", drill_time: 1}, + {name: "INJECT2", drill_time: 114}, + ] + + with open(well_data_file, "w", encoding="utf-8") as f: + json.dump(well_data, f) + + merged_data = [ + {name: "PROD1", drill_time: 14}, + {name: "PROD2", drill_time: 11}, + {name: "INJECT1", drill_time: 1}, + {name: "INJECT2", drill_time: 114}, + ] + + for idx, add_data_file in enumerate(additional_data_files): + prop = "property_{}".format(idx) + add_data = [ + {name: "PROD2", prop: idx * 100 + 11}, + {name: "INJECT1", prop: idx * 100 + 1}, + {name: "PROD1", prop: idx * 100 + 14}, + {name: "INJECT2", prop: idx * 100 + 114}, + ] + + yaml = YAML(typ="safe", pure=True) + with open(add_data_file, "w", encoding="utf-8") as f: + yaml.dump(add_data, f) + + merged_data[1][prop] = idx * 100 + 11 + merged_data[2][prop] = idx * 100 + 1 + merged_data[0][prop] = idx * 100 + 14 + merged_data[3][prop] = idx * 100 + 114 + + return merged_data + + +@pytest.mark.integration_test +@tmpdir(None) +def test_well_update(): + assert os.access(everest.jobs.wdupdate, os.X_OK) + + well_data_file = "well_data.json" + additional_data_files = ( + "well_prop_0.yml", + "well_prop_1.yml", + "well_prop_2.yml", + ) + output_file = "ordered_well_data.json" + + for idx, _ in enumerate(additional_data_files): + add_data_files = additional_data_files[: idx + 1] + merge_well_data = _dump_merge_data( + well_data_file, + add_data_files, + ) + + cmd_fmt = ( + "{well_update} --well_data {well_data} " + "--add_data {add_data} --output {output}" + ) + cmd = cmd_fmt.format( + well_update=everest.jobs.wdupdate, + well_data=well_data_file, + add_data=" ".join(add_data_files), + output=output_file, + ) + + subprocess.check_call(cmd, shell=True) + + with open(output_file, encoding="utf-8") as f: + load_data = json.load(f) + assert merge_well_data == load_data + + +@tmpdir(None) +def test_well_set_invalid_data_length(): + name = everest.ConfigKeys.NAME + + well_data_file = "well_data.yml" + well_data = [ + {name: "W1", "a": 1, "b": 2}, + {name: "W3", "a": 2, "b": 1}, + {name: "W2", "a": 7, "b": 5}, + ] + yaml = YAML(typ="safe", pure=True) + with open(well_data_file, "w", encoding="utf-8") as f: + yaml.dump(well_data, f) + + new_data_file = "new_data.json" + with open(new_data_file, "w", encoding="utf-8") as f: + json.dump(new_data_file, f) + + output_file = "extended_well_data.json" + with pytest.raises(ValueError): + everest.jobs.well_tools.well_set( + well_data_file, + new_data_file, + output_file, + ) + + +@tmpdir(None) +def test_well_set_too_many_entries(): + name = everest.ConfigKeys.NAME + + well_data_file = "well_data.yml" + well_data = [ + {name: "W1", "a": 1, "b": 2}, + {name: "W3", "a": 2, "b": 1}, + {name: "W2", "a": 7, "b": 5}, + ] + yaml = YAML(typ="safe", pure=True) + with open(well_data_file, "w", encoding="utf-8") as f: + yaml.dump(well_data, f) + + new_data_file = "new_data.json" + with open(new_data_file, "w", encoding="utf-8") as f: + json.dump(new_data_file, f) + + output_file = "extended_well_data.json" + with pytest.raises(ValueError): + everest.jobs.well_tools.well_set( + well_data_file, + new_data_file, + output_file, + ) + + +@tmpdir(None) +def test_well_set_new_entry(): + name = everest.ConfigKeys.NAME + + well_data_file = "well_data.yml" + well_data = [ + {name: "W1", "a": 1, "b": 2}, + {name: "W3", "a": 2, "b": 1}, + {name: "W2", "a": 7, "b": 5}, + ] + yaml = YAML(typ="safe", pure=True) + with open(well_data_file, "w", encoding="utf-8") as f: + yaml.dump(well_data, f) + + new_data_file = "new_data.json" + new_data = {"c": [4, 8, 12]} + with open(new_data_file, "w", encoding="utf-8") as f: + json.dump(new_data, f) + + output_file = "extended_well_data.json" + everest.jobs.well_tools.well_set( + well_data_file, + new_data_file, + output_file, + ) + + set_well_data = [ + {name: "W1", "a": 1, "b": 2, "c": 4}, + {name: "W3", "a": 2, "b": 1, "c": 8}, + {name: "W2", "a": 7, "b": 5, "c": 12}, + ] + + with open(output_file, encoding="utf-8") as f: + assert set_well_data == json.load(f) + + +@tmpdir(None) +def test_well_set_entry(): + name = everest.ConfigKeys.NAME + + well_data_file = "well_data.yml" + well_data = [ + {name: "W1", "a": 1, "b": 2}, + {name: "W3", "a": 2, "b": 1, "c": 100}, + {name: "W2", "a": 7, "b": 5}, + ] + yaml = YAML(typ="safe", pure=True) + with open(well_data_file, "w", encoding="utf-8") as f: + yaml.dump(well_data, f) + + new_data_file = "new_data.json" + new_data = {"c": [4, 8, 12]} + with open(new_data_file, "w", encoding="utf-8") as f: + json.dump(new_data, f) + + output_file = "extended_well_data.json" + everest.jobs.well_tools.well_set( + well_data_file, + new_data_file, + output_file, + ) + + set_well_data = [ + {name: "W1", "a": 1, "b": 2, "c": 4}, + {name: "W3", "a": 2, "b": 1, "c": 8}, + {name: "W2", "a": 7, "b": 5, "c": 12}, + ] + + with open(output_file, encoding="utf-8") as f: + assert set_well_data == json.load(f) + + +@pytest.mark.integration_test +@tmpdir(None) +def test_well_set_script(): + assert os.access(everest.jobs.wdset, os.X_OK) + name = everest.ConfigKeys.NAME + + well_data_file = "well_data.yml" + well_data = [ + {name: "W1", "a": 1, "b": 2}, + {name: "W3", "a": 2, "b": 1}, + {name: "W2", "a": 7, "b": 5}, + ] + yaml = YAML(typ="safe", pure=True) + with open(well_data_file, "w", encoding="utf-8") as f: + yaml.dump(well_data, f) + + new_data_file = "new_data.json" + new_data = {"c": [4, 8, 12]} + with open(new_data_file, "w", encoding="utf-8") as f: + json.dump(new_data, f) + + output_file = "extended_well_data.json" + + cmd_fmt = "{well_set} --well_data {well_data} --entry {entry} --output {output}" + cmd = cmd_fmt.format( + well_set=everest.jobs.wdset, + well_data=well_data_file, + entry=new_data_file, + output=output_file, + ) + + subprocess.check_call(cmd, shell=True) + + set_well_data = [ + {name: "W1", "a": 1, "b": 2, "c": 4}, + {name: "W3", "a": 2, "b": 1, "c": 8}, + {name: "W2", "a": 7, "b": 5, "c": 12}, + ] + + with open(output_file, encoding="utf-8") as f: + assert set_well_data == json.load(f) + + +def _dump_completion_data(well_data_file, start_date): + name = everest.ConfigKeys.NAME + drill_time = everest.ConfigKeys.DRILL_TIME + drill_date = everest.ConfigKeys.DRILL_DATE + drill_delay = everest.ConfigKeys.DRILL_DELAY + completion_date = everest.ConfigKeys.COMPLETION_DATE + + well_data = [ + {name: "PROD1", drill_time: 30, drill_date: "2001-01-01"}, + {name: "PROD2", drill_time: 40, drill_date: "2001-01-01"}, + {name: "PROD3", drill_time: 2, drill_date: "2001-03-01"}, + {name: "INJECT1", drill_date: "2001-03-01"}, + {name: "INJECT2", drill_time: 400, drill_date: "2002-01-01"}, + {name: "INJECT3", drill_time: 30, drill_date: "2003-01-01"}, + {name: "INJECT4", drill_time: 30}, + {name: "INJECT5", drill_time: 1, drill_delay: 3}, + {name: "INJECT6", drill_time: 1, drill_delay: 4, drill_date: "2003-04-15"}, + ] + + yaml = YAML(typ="safe", pure=True) + with open(well_data_file, "w", encoding="utf-8") as f: + yaml.dump(well_data, f) + + return [ + { + name: "PROD1", + drill_time: 30, + drill_date: "2001-01-01", + completion_date: "2001-02-01", + }, + { + name: "PROD2", + drill_time: 40, + drill_date: "2001-01-01", + completion_date: "2001-03-13", + }, + { + name: "PROD3", + drill_time: 2, + drill_date: "2001-03-01", + completion_date: "2001-03-15", + }, + { + name: "INJECT1", + drill_date: "2001-03-01", + completion_date: "2001-03-15", + }, + { + name: "INJECT2", + drill_time: 400, + drill_date: "2002-01-01", + completion_date: "2003-02-05", + }, + { + name: "INJECT3", + drill_time: 30, + drill_date: "2003-01-01", + completion_date: "2003-03-07", + }, + { + name: "INJECT4", + drill_time: 30, + completion_date: "2003-04-06", + }, + { + name: "INJECT5", + drill_time: 1, + drill_delay: 3, + completion_date: "2003-04-10", + }, + { + name: "INJECT6", + drill_time: 1, + drill_delay: 4, + drill_date: "2003-04-15", + completion_date: "2003-04-16", + }, + ] + + +@tmpdir(None) +def test_add_completion_date(): + well_data_file = "well_data.yml" + output_file = "humble_wells.json" + start_date = "2001-01-02" + + completion_data = _dump_completion_data( + well_data_file, + start_date, + ) + + everest.jobs.well_tools.add_completion_date( + well_data_file, + start_date, + output_file, + ) + + with open(output_file, encoding="utf-8") as f: + assert completion_data == json.load(f) + + +@pytest.mark.integration_test +@tmpdir(None) +def test_completion_date_script(): + assert os.access(everest.jobs.wdcompl, os.X_OK) + + well_data_file = "well_data.yml" + output_file = "humble_wells.json" + + start_date = "2001-01-02" + completion_data = _dump_completion_data( + well_data_file, + start_date, + ) + + cmd_fmt = ( + "{add_completion_date} --well_data {well_data} " + "--start_date {start_date} --output {output}" + ) + cmd = cmd_fmt.format( + add_completion_date=everest.jobs.wdcompl, + well_data=well_data_file, + start_date=start_date, + output=output_file, + ) + + subprocess.check_call(cmd, shell=True) + + with open(output_file, encoding="utf-8") as f: + assert completion_data == json.load(f) + + +def _dump_compl_filter_data(well_data_file): + name = everest.ConfigKeys.NAME + drill_time = everest.ConfigKeys.DRILL_TIME + drill_date = everest.ConfigKeys.DRILL_DATE + completion_date = everest.ConfigKeys.COMPLETION_DATE + + well_data = [ + { + name: "PROD1", + drill_time: 30, + drill_date: "2001-01-01", + completion_date: "2001-02-01", + }, + { + name: "PROD2", + drill_time: 40, + drill_date: "2001-01-01", + completion_date: "2001-03-13", + }, + { + name: "PROD3", + drill_time: 2, + drill_date: "2001-03-01", + completion_date: "2001-03-15", + }, + { + name: "INJECT1", + drill_date: "2001-03-01", + completion_date: "2001-03-15", + }, + { + name: "INJECT2", + drill_time: 400, + drill_date: "2002-01-01", + completion_date: "2003-02-05", + }, + { + name: "INJECT3", + drill_time: 30, + drill_date: "2003-01-01", + completion_date: "2003-03-07", + }, + { + name: "INJECT4", + drill_time: 30, + completion_date: "2003-04-06", + }, + ] + + yaml = YAML(typ="safe", pure=True) + with open(well_data_file, "w", encoding="utf-8") as f: + yaml.dump(well_data, f) + + filtered_well_data = [ + { + name: "PROD2", + drill_time: 40, + drill_date: "2001-01-01", + completion_date: "2001-03-13", + }, + { + name: "PROD3", + drill_time: 2, + drill_date: "2001-03-01", + completion_date: "2001-03-15", + }, + { + name: "INJECT1", + drill_date: "2001-03-01", + completion_date: "2001-03-15", + }, + { + name: "INJECT2", + drill_time: 400, + drill_date: "2002-01-01", + completion_date: "2003-02-05", + }, + { + name: "INJECT3", + drill_time: 30, + drill_date: "2003-01-01", + completion_date: "2003-03-07", + }, + ] + + return filtered_well_data, "2001-01-30", "2003-03-07" + + +@tmpdir(None) +def test_filter_completion_date(): + well_data_file = "well_data.yml" + output_file = "filtered_well_data.json" + + case_data = _dump_compl_filter_data(well_data_file) + filtered_data, start_date, end_date = case_data + + everest.jobs.well_tools.well_opdate_filter( + well_data_file, + start_date, + end_date, + output_file, + ) + + with open(output_file, encoding="utf-8") as f: + assert filtered_data == json.load(f) + + +@pytest.mark.integration_test +@tmpdir(None) +def test_filter_completion_date_script(): + assert os.access(everest.jobs.wddatefilter, os.X_OK) + + well_data_file = "well_data.yml" + output_file = "filtered_well_data.json" + + case_data = _dump_compl_filter_data(well_data_file) + filtered_data, start_date, end_date = case_data + + cmd_fmt = ( + "{datefilter} --well_data {well_data} --start_date {start_date} " + "--end_date={end_date} --output {output}" + ) + cmd = cmd_fmt.format( + datefilter=everest.jobs.wddatefilter, + well_data=well_data_file, + start_date=start_date, + end_date=end_date, + output=output_file, + ) + + subprocess.check_call(cmd, shell=True) + + with open(output_file, encoding="utf-8") as f: + assert filtered_data == json.load(f) diff --git a/tests/everest/test_wells.py b/tests/everest/test_wells.py new file mode 100644 index 00000000000..b93245cf957 --- /dev/null +++ b/tests/everest/test_wells.py @@ -0,0 +1,96 @@ +import pytest + +from everest.config import EverestConfig +from everest.config_file_loader import yaml_file_to_substituted_config_dict +from tests.everest.test_config_validation import has_error +from tests.everest.utils import relpath + + +@pytest.fixture +def mocked_config(): + return yaml_file_to_substituted_config_dict( + relpath("test_data", "mocked_test_case", "mocked_test_case.yml") + ) + + +def test_lint_mocked_config(mocked_config): + EverestConfig(**mocked_config) + + +def test_unrecognized_keys(mocked_config): + config = mocked_config + wells = config["wells"] + + wells[0]["unexpected_key"] = 7 + assert has_error( + EverestConfig.lint_config_dict(config), match="Extra inputs are not permitted" + ) + wells[0].pop("unexpected_key") + wells[0][14] = 7 + assert has_error( + EverestConfig.lint_config_dict(config), match=".*Keys should be strings" + ) + + wells[0].pop(14) + assert len(EverestConfig.lint_config_dict(config)) == 0 + + +def test_well_names(mocked_config): + config = mocked_config + wells = config["wells"] + assert len(wells) == 16 + + well_name_0 = wells[0]["name"] + well_name_1 = wells[1]["name"] + + # Make sure controls do not interfere with error checking + controls = config["controls"][0]["variables"] + for i, ctrl in enumerate(controls): + if ctrl["name"] == well_name_0: + del controls[i] + break + + wells[0].pop("name") # empty well definition + assert has_error(EverestConfig.lint_config_dict(config), match="Field required") + + wells[0]["drill_time"] = 1 # incomplete well definition + assert has_error(EverestConfig.lint_config_dict(config), match="Field required") + + wells[0]["name"] = well_name_1 # not unique name + assert has_error( + EverestConfig.lint_config_dict(config), match="Well names must be unique" + ) + + wells[0]["name"] = "a.b" # can't have dots in well name + assert has_error( + EverestConfig.lint_config_dict(config), + match="Well name can not contain any dots (.)", + ) + + wells[0]["name"] = well_name_0 + assert not EverestConfig.lint_config_dict(config) + + +def test_well_drilling_times(mocked_config): + config = mocked_config + wells = config["wells"] + + wells[0]["drill_time"] = -4 + assert has_error( + EverestConfig.lint_config_dict(config), + match="Drill time must be a positive number", + ) + + wells[0]["drill_time"] = 0 + assert has_error( + EverestConfig.lint_config_dict(config), + match="Drill time must be a positive number", + ) + wells[0]["drill_time"] = "seventeen" + assert has_error( + EverestConfig.lint_config_dict(config), + match="Input should be a valid number", + ) + + wells[0]["drill_time"] = 3.7 + assert not EverestConfig.lint_config_dict(config) diff --git a/tests/everest/test_workflows.py b/tests/everest/test_workflows.py new file mode 100644 index 00000000000..4869a1c4796 --- /dev/null +++ b/tests/everest/test_workflows.py @@ -0,0 +1,43 @@ +from pathlib import Path +from typing import Callable, Optional + +import pytest + +from everest.config import EverestConfig +from everest.suite import _EverestWorkflow +from tests.everest.utils import relpath, skipif_no_everest_models, tmpdir + +CONFIG_DIR = relpath("test_data", "mocked_test_case") +CONFIG_FILE = "config_workflow.yml" + + +@pytest.mark.integration_test +@tmpdir(CONFIG_DIR) +def test_workflow_run(): + config = EverestConfig.load_file(CONFIG_FILE) + workflow = _EverestWorkflow(config) + + workflow.start_optimization() + + for name in ("pre_simulation", "post_simulation"): + path = Path.cwd() / f"{name}.txt" + assert path.exists() + with path.open("r", encoding="utf-8") as file_obj: + runpath = file_obj.readline() + assert Path(runpath.strip()).exists() + + +@pytest.mark.integration_test +@pytest.mark.everest_models_test +@skipif_no_everest_models +@pytest.mark.parametrize("config", ("array", "index")) +def test_state_modifier_workflow_run( + config: str, copy_testdata_tmpdir: Callable[[Optional[str]], Path] +) -> None: + cwd = copy_testdata_tmpdir("open_shut_state_modifier") + _EverestWorkflow( + config=EverestConfig.load_file(f"everest/model/{config}.yml") + ).start_optimization() + + for path in Path.cwd().glob("**/simulation_0/RESULT.SCH"): + assert path.read_bytes() == (cwd / "eclipse/model/EXPECTED.SCH").read_bytes() diff --git a/tests/everest/test_yaml_parser.py b/tests/everest/test_yaml_parser.py new file mode 100644 index 00000000000..69ff586fbaf --- /dev/null +++ b/tests/everest/test_yaml_parser.py @@ -0,0 +1,130 @@ +import os +from pathlib import Path + +import pytest +from ruamel.yaml import YAML + +import everest +from everest import ConfigKeys +from everest.config import EverestConfig +from everest.simulator.everest_to_ert import everest_to_ert_config +from tests.everest.utils import MockParser, relpath, skipif_no_everest_models, tmpdir + +snake_oil_folder = relpath("test_data", "snake_oil") + + +@pytest.mark.integration_test +@tmpdir(snake_oil_folder) +def test_default_seed(): + config_file = os.path.join("everest/model", "snake_oil_all.yml") + config = EverestConfig.load_file(config_file) + assert config.environment.random_seed is None + + ever_workflow = everest.suite._EverestWorkflow(config) + config = ever_workflow.config + + random_seed = config.environment.random_seed + assert isinstance(random_seed, int) + # Res + ert_config = everest_to_ert_config(config) + assert random_seed == ert_config["RANDOM_SEED"] + + +def test_read_file(): + config_file = relpath("test_data/snake_oil/", "everest/model/snake_oil_all.yml") + everest_config = EverestConfig.load_file(config_file) + keys = [ + ConfigKeys.WELLS, + ConfigKeys.CONTROLS, + ConfigKeys.INPUT_CONSTRAINTS, + ConfigKeys.OBJECTIVE_FUNCTIONS, + ConfigKeys.INSTALL_JOBS, + ConfigKeys.ENVIRONMENT, + ConfigKeys.MODEL, + ConfigKeys.SIMULATOR, + ConfigKeys.OPTIMIZATION, + ConfigKeys.FORWARD_MODEL, + ConfigKeys.INSTALL_DATA, + ConfigKeys.DEFINITIONS, + ConfigKeys.CONFIGPATH, + ] + assert sorted(keys) == sorted(everest_config.to_dict().keys()) + + exp_dir, exp_fn = os.path.split(os.path.realpath(config_file)) + assert exp_dir == everest_config.config_directory + assert exp_fn == everest_config.config_file + + +@tmpdir(relpath("test_data", "valid_config_file")) +def test_valid_config_file(): + # pylint: disable=unsupported-membership-test + parser = MockParser() + + config = EverestConfig.load_file_with_argparser( + "valid_yaml_config.yml", parser=parser + ) + # Check no error is generated when loading a valid config file + assert parser.get_error() is None + + yaml = YAML(typ="safe", pure=True) + with open("test", "w", encoding="utf-8") as f: + yaml.dump(config.to_dict(), f) + + assert EverestConfig.load_file_with_argparser("test", parser=parser) is not None + + config.environment = None + yaml = YAML(typ="safe", pure=True) + with open("test", "w", encoding="utf-8") as f: + yaml.dump(config.to_dict(), f) + + # Check a valid config file is also linted + assert EverestConfig.load_file_with_argparser("test", parser=parser) is None + assert "environment" in parser.get_error() + assert "Field required" in parser.get_error() + + # Check a invalid yaml errors are reported to the parser + assert ( + EverestConfig.load_file_with_argparser( + config_path="invalid_yaml_config.yml", parser=parser + ) + is None + ) + assert ( + "The config file: contains invalid YAML syntax:" + in parser.get_error() + ) + assert "could not find expected ':'" in parser.get_error() + + +@tmpdir(relpath("test_data", "valid_config_file", "forward_models")) +@pytest.mark.fails_on_macos_github_workflow +@skipif_no_everest_models +@pytest.mark.everest_models_test +def test_valid_forward_model_config_files(): + parser = MockParser() + EverestConfig.load_file_with_argparser( + "valid_config_maintained_forward_models.yml", parser=parser + ) + + assert parser.get_error() is None + + +@tmpdir(relpath("test_data", "valid_config_file", "forward_models")) +@skipif_no_everest_models +@pytest.mark.everest_models_test +@pytest.mark.fails_on_macos_github_workflow +def test_invalid_forward_model_config_files(): + parser = MockParser() + next((Path.cwd() / "input" / "templates").glob("*")).unlink() + EverestConfig.load_file_with_argparser( + "valid_config_maintained_forward_models.yml", parser=parser + ) + template_config_path = "configs/template_config.yml" + config_file = "valid_config_maintained_forward_models.yml" + template_path = "./templates/wellopen.jinja" + assert f"""Loading config file <{config_file}> failed with: +Found 1 validation error: + + + * Value error, job = 'add_templates'\t-c/--config = {template_config_path} +\t\ttemplates: {template_path} -> Path does not point to a file (type=value_error)""" in parser.get_error() # pylint: disable=E1135 diff --git a/tests/everest/unit/everest/bin/test_everload.py b/tests/everest/unit/everest/bin/test_everload.py new file mode 100644 index 00000000000..02b4137ff6d --- /dev/null +++ b/tests/everest/unit/everest/bin/test_everload.py @@ -0,0 +1,191 @@ +import os +import shutil +from unittest.mock import patch + +import pandas as pd +import pytest +from tests.everest.utils import ( + capture_streams, + create_cached_mocked_test_case, + relpath, + tmpdir, +) + +from ert.config import ErtConfig +from everest import MetaDataColumnNames as MDCN +from everest import export +from everest.bin.everload_script import everload_entry +from everest.config import EverestConfig +from everest.strings import STORAGE_DIR + +CONFIG_PATH = relpath("test_data", "mocked_test_case") +CONFIG_FILE = "mocked_multi_batch.yml" + +pytestmark = pytest.mark.xdist_group(name="starts_everest") + + +@pytest.fixture +def cache_dir(request, monkeypatch): + return create_cached_mocked_test_case(request, monkeypatch) + + +def get_config(cache_dir): + shutil.copytree( + cache_dir / "mocked_multi_batch_output", "mocked_multi_batch_output" + ) + config = EverestConfig.load_file(CONFIG_FILE) + simdir = config.simulation_dir + + # Assume there is already a storage + assert os.path.isdir(config.storage_dir) + + # Create the simulation folder + if not os.path.isdir(simdir): + os.makedirs(simdir) + + return config + + +def assertInternalizeCalls(batch_ids, mocked_internalize): + for i, b_id in enumerate(batch_ids): + config, bid, data = mocked_internalize.call_args_list[i].args + assert isinstance(config, ErtConfig) + assert isinstance(data, pd.DataFrame) + assert bid == b_id + + +def assertBackup(config: EverestConfig): + backupdir = [ + d for d in os.listdir(config.output_dir) if d.startswith(STORAGE_DIR + "__") + ] + assert backupdir != [] + + +@patch("everest.bin.everload_script._internalize_batch") +@tmpdir(CONFIG_PATH) +@pytest.mark.fails_on_macos_github_workflow +def test_everload_entry_run(mocked_internalize, cache_dir): + """Test running everload on an optimization case""" + config = get_config(cache_dir) + everload_entry([CONFIG_FILE, "-s"]) + + df = export(config, export_ecl=False) + batch_ids = set(df[MDCN.BATCH]) + assertInternalizeCalls(batch_ids, mocked_internalize) + assertBackup(config) + + +@patch("everest.bin.everload_script._internalize_batch") +@tmpdir(CONFIG_PATH) +@pytest.mark.fails_on_macos_github_workflow +def test_everload_entry_run_empty_batch_list(_): + """Test running everload on an optimization case""" + with pytest.raises(SystemExit), capture_streams() as (_, err): + everload_entry([CONFIG_FILE, "-s", "-b"]) + assert ( + "error: argument -b/--batches: expected at least one argument" + in err.getvalue() + ) + + +@patch("everest.bin.everload_script._internalize_batch") +@tmpdir(CONFIG_PATH) +@pytest.mark.fails_on_macos_github_workflow +def test_everload_entry_missing_folders(mocked_internalize, cache_dir): + """Test running everload when output folders are missing""" + config = get_config(cache_dir) + shutil.rmtree(config.simulation_dir) + with pytest.raises(RuntimeError, match="simulation"): + everload_entry([CONFIG_FILE, "-s"]) + shutil.rmtree(config.output_dir) + with pytest.raises(RuntimeError, match="never run"): + everload_entry([CONFIG_FILE, "-s"]) + mocked_internalize.assert_not_called() + + +@patch("everest.bin.everload_script._internalize_batch") +@tmpdir(CONFIG_PATH) +@pytest.mark.fails_on_macos_github_workflow +def test_everload_entry_batches(mocked_internalize, cache_dir): + """Test running everload with a selection of batches""" + config = get_config(cache_dir) + # pick every second batch (assume there are at least 2) + df = export(config, export_ecl=False) + batch_ids = list(set(df[MDCN.BATCH])) + assert len(batch_ids) > 1 + batch_ids = batch_ids[::2] + + everload_entry([CONFIG_FILE, "-s", "-b"] + [str(b) for b in batch_ids]) + + assertInternalizeCalls(batch_ids, mocked_internalize) + assertBackup(config) + + +@patch("everest.bin.everload_script._internalize_batch") +@tmpdir(CONFIG_PATH) +@pytest.mark.fails_on_macos_github_workflow +def test_everload_entry_invalid_batches(mocked_internalize): + """Test running everload with no or wrong batches""" + with pytest.raises(SystemExit), capture_streams() as (_, err): + everload_entry([CONFIG_FILE, "-s", "-b", "-2", "5412"]) + assert "error: Invalid batch given: '-2'" in err.getvalue() + + with pytest.raises(SystemExit), capture_streams() as (_, err): + everload_entry([CONFIG_FILE, "-s", "-b", "0123"]) + assert "error: Invalid batch given: '0123'" in err.getvalue() + + mocked_internalize.assert_not_called() + + +@patch("everest.bin.everload_script._internalize_batch") +@tmpdir(CONFIG_PATH) +@pytest.mark.fails_on_macos_github_workflow +def test_everload_entry_overwrite(mocked_internalize, cache_dir): + """Test running everload with the --overwrite flag""" + config = get_config(cache_dir) + everload_entry([CONFIG_FILE, "-s", "--overwrite"]) + + df = export(config, export_ecl=False) + batch_ids = set(df[MDCN.BATCH]) + assertInternalizeCalls(batch_ids, mocked_internalize) + + # Note that, as we are mocking the entire ert related part, the + # internalization does not take place, so no new storage dir is created + backupdir = [d for d in os.listdir(config.output_dir) if d.startswith(STORAGE_DIR)] + assert backupdir == [] + + +@patch("everest.bin.everload_script._internalize_batch") +@tmpdir(CONFIG_PATH) +@pytest.mark.fails_on_macos_github_workflow +def test_everload_entry_not_silent(mocked_internalize, cache_dir): + """Test running everload without the -s flag""" + config = get_config(cache_dir) + + no = lambda _: "n" # pylint:disable=unnecessary-lambda-assignment + yes = lambda _: "y" # pylint:disable=unnecessary-lambda-assignment + + with capture_streams() as (stdout, _): + with patch("everest.bin.everload_script.input", side_effect=no): + everload_entry([CONFIG_FILE]) + assert "backed up" in stdout.getvalue() + mocked_internalize.assert_not_called() + + with capture_streams() as (stdout, _): + with patch("everest.bin.everload_script.input", side_effect=no): + everload_entry([CONFIG_FILE, "--overwrite"]) + assert "WARNING" in stdout.getvalue() + mocked_internalize.assert_not_called() + + with capture_streams() as (stdout, _): + with patch("everest.bin.everload_script.input", side_effect=yes): + everload_entry([CONFIG_FILE]) + assert len(stdout.getvalue()) > 0 + df = export(config, export_ecl=False) + batch_ids = set(df[MDCN.BATCH]) + assertInternalizeCalls(batch_ids, mocked_internalize) + + df = export(config, export_ecl=False) + batch_ids = set(df[MDCN.BATCH]) + assertInternalizeCalls(batch_ids, mocked_internalize) + assertBackup(config) diff --git a/tests/everest/utils/__init__.py b/tests/everest/utils/__init__.py new file mode 100644 index 00000000000..d5b62a23b17 --- /dev/null +++ b/tests/everest/utils/__init__.py @@ -0,0 +1,204 @@ +import contextlib +import importlib.util +import logging +import os +import pathlib +import shutil +import sys +import tempfile +from io import StringIO +from unittest import mock + +import decorator +import pytest + +from everest.bin.main import start_everest +from everest.config import EverestConfig +from everest.detached import ServerStatus, everserver_status +from everest.jobs import script_names +from everest.util import has_opm +from everest.util.forward_models import collect_forward_models + + +def skipif_no_opm(function): + """Decorator to skip a test if opm is not available + + If this decorator is used on a test, there should be a corresponding + test that verifies the expected behavior in case opm is not available + (use the hide_opm decorator) + """ + return pytest.mark.skipif(not has_opm(), reason="OPM not found")(function) + + +def skipif_no_simulator(function): + """Decorator to skip a test if no project res is available is not available""" + return pytest.mark.skipif( + condition=os.environ.get("NO_PROJECT_RES", False), + reason="Skipping tests when no access to /project/res", + )(function) + + +def skipif_no_everest_models(function): + """Decorator to skip a test if everest-models is not available""" + spec = importlib.util.find_spec("everest_models") + not_found = spec is None + return pytest.mark.skipif(not_found, reason="everest-models not found")(function) + + +def hide_opm(function): + """Decorator for faking that the opm module is not present""" + + def wrapper(function, *args, **kwargs): + with mock.patch("everest.util.has_opm", return_value=False): + return function(*args, **kwargs) + + return decorator.decorator(wrapper, function) + + +def relpath(*path): + return os.path.join(os.path.dirname(os.path.dirname(__file__)), *path) + + +def tmpdir(path, teardown=True): + """Decorator based on the `tmp` context""" + + def real_decorator(function): + def wrapper(function, *args, **kwargs): + with tmp(path, teardown=teardown): + return function(*args, **kwargs) + + return decorator.decorator(wrapper, function) + + return real_decorator + + +@contextlib.contextmanager +def tmp(path=None, teardown=True): + """Create and go into tmp directory, returns the path. + + This function creates a temporary directory and enters that directory. The + returned object is the path to the created directory. + + If @path is not specified, we create an empty directory, otherwise, it must + be a path to an existing directory. In that case, the directory will be + copied into the temporary directory. + + If @teardown is True (defaults to True), the directory is (attempted) + deleted after context, otherwise it is kept as is. + + """ + cwd = os.getcwd() + fname = tempfile.NamedTemporaryFile().name # noqa: SIM115 + + if path: + if not os.path.isdir(path): + logging.debug("tmp:raise no such path") + raise IOError("No such directory: %s" % path) + shutil.copytree(path, fname) + else: + # no path to copy, create empty dir + os.mkdir(fname) + + os.chdir(fname) + + yield fname # give control to caller scope + + os.chdir(cwd) + + if teardown: + try: + shutil.rmtree(fname) + except OSError as oserr: + logging.debug("tmp:rmtree failed %s (%s)" % (fname, oserr)) + shutil.rmtree(fname, ignore_errors=True) + + +@contextlib.contextmanager +def capture_streams(): + """Context that allows capturing text sent to stdout and stderr + + Use as follow: + with capture_streams() as (out, err): + foo() + assert( 'output of foo' in out.getvalue()) + """ + new_out, new_err = StringIO(), StringIO() + old_out, old_err = sys.stdout, sys.stderr + try: + sys.stdout, sys.stderr = new_out, new_err + yield new_out, new_err + finally: + sys.stdout, sys.stderr = old_out, old_err + + +def satisfy(predicate): + """Return a class that equals to an obj if predicate(obj) is True + + This method is expected to be used with `assert_called_with()` on mocks. + An example can be found in `test_everest_entry.test_everest_run` + Inspired by + https://stackoverflow.com/questions/21611559/assert-that-a-method-was-called-with-one-argument-out-of-several + """ + + class _PredicateChecker(object): + def __eq__(self, obj): + return predicate(obj) + + return _PredicateChecker() + + +def satisfy_type(the_type): + """Specialization of satisfy for checking object type""" + return satisfy(lambda obj: isinstance(obj, the_type)) + + +def satisfy_callable(): + """Specialization of satisfy for checking that object is callable""" + return satisfy(callable) + + +class MockParser(object): + """ + Small class that contains the necessary functions in order to test custom + validation functions used with the argparse module + """ + + def __init__(self): + self.error_msg = None + + def get_error(self): + return self.error_msg + + def error(self, value=None): + self.error_msg = value + + +def everest_default_jobs(output_dir): + return [ + ( + script_name, + os.path.join(output_dir, ".jobs", "_%s" % script_name), + ) + for script_name in script_names + ] + [(job["name"], job["path"]) for job in collect_forward_models()] + + +def create_cached_mocked_test_case(request, monkeypatch) -> pathlib.Path: + """This function will run everest to create some mocked data, + this is quite slow, but the results will be cached. If something comes + out of sync, clear the cache and start again. (rm -fr .pytest_cache/) + """ + config_file = "mocked_multi_batch.yml" + config_path = relpath("test_data", "mocked_test_case") + cache_path = request.config.cache.mkdir( + "snake_oil_data" + os.environ.get("PYTEST_XDIST_WORKER", "") + ) + if not os.path.exists(cache_path / "mocked_run"): + monkeypatch.chdir(cache_path) + shutil.copytree(config_path, "mocked_run") + monkeypatch.chdir("mocked_run") + start_everest(["everest", "run", config_file]) + config = EverestConfig.load_file(config_file) + status = everserver_status(config) + assert status["status"] == ServerStatus.completed + return cache_path / "mocked_run" diff --git a/tests/everest/utils/test_pydantic_doc_generation.py b/tests/everest/utils/test_pydantic_doc_generation.py new file mode 100644 index 00000000000..4e3455b56c9 --- /dev/null +++ b/tests/everest/utils/test_pydantic_doc_generation.py @@ -0,0 +1,26 @@ +import sys + +import pytest + +from everest.docs.generate_docs_from_config_spec import generate_docs_pydantic_to_rst +from tests.everest.utils import relpath + + +@pytest.mark.skipif(sys.version_info < (3, 10), reason="python version less than 3.11") +def test_generated_doc(): + """Python 3.9 and below interprets annotations differently than 3.11 and above. + 3.8 will also soon be dropped so it's better to support only the updated interpretation. + thus I limit this test to run for versions with the updated annotations handler + """ + error_msg = """ + The generated documentation for the configuration file is + out of date. Run `python -m everest.docs` to re-generate. + """ + + committed_file = relpath("..", "..", "docs", "everest", "config_generated.rst") + with open(committed_file, "r", encoding="utf-8") as fp: + committed_text = fp.read() + + generated_rst = generate_docs_pydantic_to_rst() + + assert committed_text.strip() == generated_rst.strip(), error_msg